Когда вам потребуется аналоговый выход при отсутствии у микроконтроллера встроенного цифро-аналогового преобразователя, вы можете подключить к нему внешнюю микросхему ЦАП. Но для более дешевых решений используются ШИМ выход контроллера и дополнительный фильтр нижних частот (ФНЧ), выделяющий из последовательности импульсов среднее значение, пропорциональное коэффициенту заполнения (Рисунок 1).
![]() |
||
Рисунок 1. | RC-фильтр нижних частот выделяет среднее значение сигнала ШИМ. |
RC-фильтр удаляет все непостоянные компоненты, в результате чего остается среднее значение сигнала UOUT. Если период T импульсов ШИМ равен 63 периодам тактовой частоты, постоянное напряжение UOUT может иметь одно из 64 дискретных значений от 0 до 63, что соответствует 6-битному разрешению.
![]() |
||
Рисунок 2. | Размах пульсаций на выходе фильтра (синяя кривая) должен быть меньше веса LSB. |
Чтобы сгладить выходной сигнал UOUT, постоянная времени t RC-фильтра нижних частот должна быть достаточно большой. Пульсации ∆UOUT должны быть меньше веса младшего значащего бита (LSB). Наихудшему случаю соответствует коэффициент заполнения 50% (Рисунок 2). Если постоянная времени t намного больше периода повторения импульсов T, для тока заряда конденсатора IC и изменения напряжения на конденсаторе ∆UOUT будут приближенно справедливы следующие соотношения:
и из равенства
получим, что
Для 6-битного ЦАП напряжение ∆UOUT должно быть меньше VCC/64, что потребует фильтра с постоянной времени t = RC ≥ 16×T.
Небольшой численный пример. В маломощных микроконтроллерах часто используется кварцевый генератор 32768 Гц, и эта частота взята для синхронизации блока ШИМ. При 6-битной ШИМ период T равен 64/32768 ≈ 2 мс, что требует постоянной времени 32 мс. Установления напряжения 6-битного ЦАП надо ждать 5t (160 мс). Очень медленно. В этой статье объясняется, как можно ускорить процесс.
Как правило, блоки ШИМ микроконтроллеров могут формировать более одного сигнала ШИМ. Посмотрим, что получится, если суммировать выходы двух 3-битных ЦАП на основе ШИМ (DACH и DACL), где амплитуда выхода DACL перед точкой суммирования уменьшена в восемь раз. Результирующий сигнал действует как 6-битный ЦАП, но с одним важным преимуществом перед обычным вариантом: период T будет равен лишь восьми периодам тактовой частоты, и требуемая постоянная времени t равна 1/8 от прежней, что ускоряет установление выходного напряжения в восемь раз. Это легко сделать с помощью резисторов RC-фильтра для двух сигналов ШИМ (PWMH и PWML) (Рисунок 3).
![]() |
||
Рисунок 3. | Комбинация двух ЦАП на основе ШИМ. |
Выходной сигнал UOUT определяется выражением
где
DPWMH – коэффициент заполнения импульсов PWMH,
DPWML – коэффициент заполнения импульсов PWML.
Идея была реализована на микроконтроллере MSP430F5132 компании Texas Instruments (Листинг 1).
Листинг 1. Коды инициализации и записи в 6-битный (3+3) ЦАП на основе ШИМ.
// конфигурирование ШИМ - 32 кГц / 8 = 4 кГц :: 6 бит в двух ШИМ, выполняется только раз при включении питания
TA0CCR0 = 7; // считать до 7 (включительно)
TA0CTL = TASSEL__ACLK | MC_1 | TACLR;
TA0CCR1 = 0; TA0CCTL1 = OUTMOD_6; // переключение/установка
TA0CCR2 = 0; TA0CCTL2 = OUTMOD_6; // переключение/установка
// использование :: запись в блок ШИМ для получения требуемого выходного значения ЦАП
DAClevel++; // следующий уровень ЦАП, DAClevel типа char
TA0CCR1 = (DAClevel >> 3) & 7; // установка PWMH: MSB 3 бита
TA0CCR2 = (DAClevel ) & 7; // установка PWML: LSB 3 бита
![]() |
||
Рисунок 4. | Осциллограммы сигналов на выходе ЦАП, основанных на ШИМ. Синий: для схемы на Рисунке 1 (время установления 160 мс) Фиолетовый: для схемы на Рисунке 3 (время установления 20 мс). |
Используя резисторы с допуском 1%, можно сделать 7-битный ЦАП (Рисунок 5). На этот раз шестибитный ЦАП образован сигналами двух трехбитных ШИМ, а значение старшего значащего бита (MSB) просто устанавливается записью «0» и «1» в порт P3.7 (Листинг 2).
![]() |
||
Рисунок 5. | Реализация 7-битного ЦАП на основе ШИМ. |
Листинг 2. Коды инициализации и записи в 7-битный (3+3+1) ЦАП на основе ШИМ.
// конфигурирование ШИМ - 32 кГц / 8 = 4 кГц :: 7 бит в двух ШИМ и одном цифровой выводе, выполняется только раз при включении питания
// то же, что в секции настройки конфигурации Листинга 1
// назначение :: запись в компараторы Таймеров значений, необходимых для установки требуемого напряжения на выходе ЦАП
DAClevel++; // следующий уровень ЦАП, DAClevel типа char
TA0CCR1 = (DAClevel >> 3) & 7; // установка PWMH, MSB, 3 бита
TA0CCR2 = (DAClevel ) & 7; // установка PWML, LSB, 3 бита
if (DAClevel & BIT6) P3OUT |= BIT7; else P3OUT &= ~BIT7; // установка MSB, не ШИМ
Здесь скорость увеличилась еще больше. Простой ЦАП на основе ШИМ имел бы период, равный 128 периодам тактовой частоты (128/32768 Гц = 3.9 мс), и требовал бы фильтра с постоянной времени t = 32·T = 125 мс и временем установления 5×125 мс = 625 мс. Как видно из осциллограммы на Рисунке 6, установление происходит за 40 мс – в 16 раз быстрее. Дальнейшего сокращения времени установления можно добиться, используя ФНЧ более высокого порядка.
![]() |
||
Рисунок 6. | Осциллограммы сигналов на выходе схемы на Рисунке 5; видна хорошая линейность. |