Ускорение работы ЦАП на базе ШИМ

Дузан Пониквар (Dusan Ponikvar)

Если вам нужен аналоговый вывод из микроконтроллера, у которого нет цифро-аналогового преобразователя (ЦАП), вы можете подключить внешнюю микросхему ЦАП. Но для получения более дешёвого решения можно использовать выход широтно-импульсной модуляции (ШИМ) и добавить фильтр нижних частот (ФНЧ), чтобы получить среднее значение, которое равно скважности сигнала ШИМ (рисунок 1).

 RC ФНЧ формирует среднее значение сигнала ШИМ

Рисунок 1. RC ФНЧ формирует среднее значение сигнала ШИМ

RC-фильтр удаляет переменные составляющие тока; то, что остаётся, является сигналом среднего значения UOUT. Если период T сигнала ШИМ равен 63 тактовым сигналам, то сигнал UOUT может иметь одно из 64 дискретных значений (от 0 до 63, 6-битовое разрешение).

 Выход фильтра (синий) должен иметь пульсации меньше одного LSb

Рисунок 2. Выход фильтра (синий) должен иметь пульсации меньше одного LSb

Постоянная времени τ RC-фильтра нижних частот должна быть достаточно большой, чтобы сглаживать выходной сигнал UOUT. Пульсации ΔUOUT должны быть меньше одного младшего бита (LSb). Наихудший случай возникает при скважности, равной 50% (рисунок 2). Если τ значительно больше периода T, тогда заряжающий конденсатор ток IC и изменение ΔUOUT можно аппроксимировать следующим образом:

Формула

Для 6-битового ЦАП ΔUOUT должно быть меньше VCC/64, что требует от фильтра τ = RC ≥ 16 × T.

Некоторые полезные числа: в микропроцессорах низкой мощности часто используется кварцевый генератор частоты 32 768 Гц, и этот тактовый сигнал используется для блока ШИМ. При 6-битовой ШИМ период T составляет 64/32768 ≈ 2 мс, требуя постоянной времени, равной 32 мс. Нужно подождать 5 τ (160 мс), чтобы 6-битовый преобразователь перешёл в установившийся режим. Это довольно медленно. Данная конструкторская идея объясняет, как можно ускорить процесс.

 Объединение двух выходов ЦАП на базе ШИМ

Рисунок 3. Объединение двух выходов ЦАП на базе ШИМ

Блоки ШИМ в микроконтроллерах обычно могут генерировать более одного сигнала ШИМ. Рассмотрим суммирование выходов от двух 3-битовых ЦАП на базе ШИМ (ЦАПВ и ЦАПН), где выход ЦАПН сводится к одной восьмой амплитуды перед суммированием (рисунок 3). Результирующий сигнал действует как 6-битовый ЦАП, но с важным преимуществом перед простым вариантом: период T составляет только восемь периодов тактовых импульсов для такого же разрешения, а требуемая постоянная времени τ составляет 1/8 от предыдущей, ускоряя время успокоения в восемь раз. Такую схему легко реализовать с помощью резисторов в RC-фильтре для двух сигналов ШИМ (ШИМВ (PWMH), ШИМН (PWML)):

Выходной сигнал UOUT задаётся уравнением:

Формула

Так этот метод реализован в микроконтроллере TI MSP430F5132. Пример программы инициализации и записи в 6-битовый (3+3) ЦАП на базе ШИМ:

// configure PWM - 32 kHz / 8 = 4 kHz::
6 bit in two PWMs, done only once on power-up (конфигурировать ШИМ — 32 кГц / 8 = 4 кГц, 6 бит в двух ШИМ, выполняется один раз при включении питания)
TA0CCR0 = 7; // count up to 7 (including)
TA0CTL = TASSEL__ACLK | MC_1 | TACLR;
TA0CCR1 = 0; TA0CCTL1 = OUTMOD_6; // toggle/set
TA0CCR2 = 0; TA0CCTL2 = OUTMOD_6; // toggle/set
// use:: write to PWM block to achieve the desired DAC output (записать в блок ШИМ для получения нужного выхода ЦАП)
DAClevel++; // next DAC level, DAClevel is a char
TA0CCR1 = (DAClevel >> 3) & 7; // set PWMH: MSB 3 bits
TA0CCR2 = (DAClevel) & 7; // set PWML: LSB 3 bits

 Выходные сигналы 6-битовых ЦАП на базе ШИМ

Рисунок 4. Выходные сигналы 6-битовых ЦАП на базе ШИМ. Синяя кривая — реализация, как на рисунке 1 (160 мс успокоения); фиолетовая кривая — реализация, как на рисунке 3 (20 мс успокоения)

7-битовый ЦАП можно реализовать с использованием 1% резисторов (рисунок 5). На этот раз два сигнала ШИМ используются для создания двух трёхбитовых ЦАП, всего шесть битов, а старший бит (MSb) просто устанавливается в 0 или 1 на P3.7.

 Реализация семибитового ЦАП на базе ШИМ

Рисунок 5. Реализация семибитового ЦАП на базе ШИМ

Программа инициализации и записи в 7-битовый (3+3+1) ЦАП на базе ШИМ:

// configure PWM — 32 kHz / 8 = 4 kHz::
7 bit in two PWMs and one digital pin, done only once on power-up
// is the same as given in configure section in figure 5
// use:: write to Timer comparators to achieve the desired DAC output
DAClevel++; // next DAC level, DAClevel is a char
TA0CCR1 = (DAClevel >> 3) & 7; // set PWMH, MSB, 3 bits
TA0CCR2 = (DAClevel) & 7; // set PWML, LSB, 3 bits
if (DAClevel & BIT6) P3OUT |= BIT7;
else P3OUT &= ~BIT7; // set MSB, no PWM

Здесь повышение скорости даже заметнее. Простой ЦАП на базе ШИМ должен будет иметь период, равный 128 периодам тактовой частоты (128/32768 s-1 = 3,9 мс), давая в результате τ, равное 32×Т = 125 мс и время успокоения, равное 5×125 мс = 625 мс. На рисунке 6 успокоение происходит за 40 мс — в 16 раз быстрее. ФНЧ более высокого порядка также помог бы сократить время успокоения.

 Выходной сигнал схемы, показанной на рисунке 5;

Рисунок 6. Выходной сигнал схемы, показанной на рисунке 5; отметьте хорошую линейность

Литература

  1. Stephen Woodward: Fast-settling synchronous-PWM-DAC filter has almost no ripple.
  2. David M. Alter: Using PWM Output as a Digital-to-Analog Converter on a TMS320F280x Digital Signal Controller.
  3. Mike Mitchell: Using PWM Timer_B as a DAC.
  4. Amar Palacherla: AN538: Using PWM to Generate Analog Output.