ЦАП на ШИМ

 

dac mini

В данной статье будет описан способ сделать из ШИМ-сигнала с микроконтроллера ЦАП с неплохим качеством. Данный способ может быть использован для многих микроконтроллеров, в том числе AVR и ARM для управления аналоговой нагрузкой, а также генерации аналогового сигнала заданной частоты.

 

Стоит сразу отметить, что в основе схеме - ФНЧ (фильтр низких частот). Выходной сигнал ШИМ поступает на ФНЧ и получается аналоговый сигнал, от скважности напрямую зависит величина выходного напряжения. Как известно, простейший ФНЧ - это RC-цепь, в которой через "ограничивающий" резистор то заряжается, то разряжается конденсатор, таким образом "сглаживая" ШИМ сигнал и получая аналоговый, это и есть простейший ЦАП, всего на двух элементах. Но такая схема из простой RC-цепи имеет много недостатков: зависит от выходной нагрузки, имеет плохие частотные характеристики, да и вообще является фильтром первого порядка, т.е. плохое ослабление частотного сигнала. Но в ряде случаев можно применить и такую систему, если, например, на выход ставить усилительный каскад и нет жестких требований к качеству сигнала (например, измерить тестером эффективное текущее значение).

Задача обстоит сложнее, если надо получить сигнал неплохого качества, за небольшие деньги, да еще и с амплитудой, например, 10-12 вольт, при питающем для контроллера 3 вольта. Для этого модернизируем схему и теперь сделаем RC-фильтр активным, для этого введем операционный усилитель.

dac

 

Как видно из схемы, модернизация оказалась довольно сложной. Поэтому будем разбираться в ней по частям. Номера элементов не подгонял, а взял из реального работающего проекта. Итак, в правой части у нас первый каскад ФНЧ первого порядка. R33 и C15 это уже знакомые нам элементы RC цепи, после которых по сути стоит повторитель напряжения (буферный ОУ), выполняя роль согласователя нагрузки. Это ФНЧ первого порядка, добавился только согласователь по сути. С14 это обычный конденсатор по питанию для ОУ. R31 - обычная перемычка на случай, если мы захотим убрать этот каскад фильтрации.

Теперь немного о главном - выборе номиналов. Номиналы выбираются таким образом, чтобы эффективно фильтровать частоту ШИМ и при этом чтобы частота среза фильтра была намного выше частоты аналогово сигнала (намного выше скорости изменения аналогово сигнала).  По-хорошему стоит выбирать так, чтобы частота среза фильтра (которая кстати равна 1/ (2*3.14*R*C) ) была на порядок ниже частоты ШИМ и на порядок выше частоты аналогово сигнала. Конечно это упрощенный подсчет, но в большинстве случаев хватает и такого подсчета. Какие можно сделать выводы из таких ограничений? Первое, самое важное, чем выше мы хотим получить частоту аналогово сигнала, тем больше нужна частота ШИМ. Но тут тоже есть ограничение - нельзя бесконечно увеличивать частоту ШИМ, надо еще помнить про частоту пропускания ОУ и возможности самого микроконтроллера. да и в ряде случаев задирание частоты ШИМ необоснованно, т.к. растет количество переходных процессов, например.

Возвращаясь к схеме, можно видеть, что слева стоит ФНЧ второго порядка, еще и с усилением. Данную схему можно использовать без первой части для получения сигнала ЦАП (запаяв R31, например) нужно амплитуды. "Делитель" R16 R19 задают как раз коэффициент усиления, остальные элементы рассчитываются как для обычного ФНЧ на ОУ второго порядка. Стоит учитывать, что выходной сигнал со схемы не может превышать напряжение питания ОУ как это ни странно звучит. Поэтому если мы хотим получить сигнал амплитудой, например. в 12 вольт, то питание ОУ должно быть минимум 12 вольт при условии, что усилитель rail-to-rail (опция, дает возможность достигать выходных значений с ОУ очень близких по величине к значению питания ОУ). Питание контроллера остается 3.3 или 5 вольт соответственно, для согласования уровней используется усиление схемы.

Еще один совет, получившийся ЦАП необходимо калибровать. Для этой цели либо калибруется вручную и калибровочные значения (две точки в простейшем случае) записываются в энергонезависимую память (eeprom или flash), но есть еще один способ - АЦПировать выходной сигнал. Т.е. загоняем на АЦП все, что получили с ЦАП, потом сравниваем с АЦПированным значением эталонного напряжения и пересчитываем калибровку. С одной стороны, это труднее реализовать программисту, но с другой стороны, намного меньше проблем при "уплывании" значений и легче делать производство.