ШИМ-сигнал содержит постоянную составляющую D · U и гармоники частоты ШИМ. Фильтр нижних частот пропускает постоянную составляющую и подавляет гармоники — так из цифрового вывода микроконтроллера получается простой ЦАП.
Формулы
Среднее напряжение и размах пульсаций после одного RC-звена в установившемся режиме:
где T — период ШИМ, τ = RC. Когда τ много больше T, формула упрощается:
Время установления после скачка до точности ε: t = τ · ln(1/ε). Для точности в один шаг n-битного ШИМ ε = 2−n, и t = τ · n · ln 2.
Компромисс
- Пульсации обратно пропорциональны τ и частоте ШИМ.
- Быстродействие обратно пропорционально τ: каждое изменение заполнения выход отрабатывает за несколько τ.
- Разрешение таймерного ШИМ — fclk / (N · fШИМ) шагов: чем выше частота ШИМ, тем меньше шагов.
Пример: 16 МГц, предделитель 64, ШИМ 1 кГц — 250 шагов, почти 8 бит. С фильтром 10 кОм и 10 мкФ (τ = 0,1 с) пульсации при 50 % составляют 12,5 мВ — около 0,6 шага, но установление до шага занимает 0,55 с. ШИМ на 62,5 кГц без предделителя даёт 256 шагов, и уже фильтр с τ = 1 мс оставляет пульсации 20 мВ — около одного шага — при установлении за 6 мс, почти в 100 раз быстрее.
Второе звено и буфер
Если одного RC мало, ставят два звена подряд: второе ослабляет пульсации ещё примерно во столько же раз, а время установления растёт меньше, чем при одном звене с той же итоговой фильтрацией. Резистор второго звена берут в 10 раз больше первого, чтобы оно не нагружало первое.
Выход RC-фильтра высокоомный. Если ЦАП нагружен, после фильтра ставят повторитель на ОУ — подробнее в статье об операционном усилителе. Частоту среза одного звена удобно проверить в калькуляторе RC-фильтра, настройку таймера под нужную частоту ШИМ — в калькуляторе таймеров.
Частые вопросы
Как получить аналоговое напряжение из ШИМ?
Пропустить ШИМ через фильтр нижних частот, обычно RC: на выходе останется среднее значение D · U, где D — коэффициент заполнения, U — амплитуда. Частота среза фильтра должна быть намного ниже частоты ШИМ, тогда пульсации малы. Нагружать такой ЦАП нельзя: выход RC-цепи высокоомный, при нагрузке ставят повторитель на ОУ.
Как выбрать R и C для фильтра ШИМ?
Чем больше постоянная времени τ = RC по сравнению с периодом ШИМ, тем меньше пульсации, но тем медленнее выход следует за изменением заполнения. При 50 % заполнения размах пульсаций примерно U · T / (4τ): для 5 В, 1 кГц и τ = 0,1 с это 12,5 мВ, а установление до шага 8-битного ШИМ займёт около 0,55 с. Если нужно и быстро, и гладко, поднимают частоту ШИМ или ставят второе RC-звено.
Какое разрешение у ШИМ микроконтроллера?
Число шагов — тактовая частота, делённая на предделитель и на частоту ШИМ. При 16 МГц без предделителя на частоте 62,5 кГц это 256 шагов — 8 бит; чтобы получить 10 бит, частоту ШИМ придётся снизить вчетверо. Отсюда главный компромисс ЦАП на ШИМ: разрешение против частоты, а значит, против пульсаций.
Почему пульсации максимальны при 50 % заполнения?
При τ ≫ T размах пульсаций пропорционален D · (1 − D): конденсатор заряжается часть периода D и разряжается часть 1 − D. Произведение наибольшее при D = 0,5 и падает до нуля при 0 и 100 %, когда ШИМ превращается в постоянный уровень.
Источники
- Microchip. AN538: Using PWM to Generate Analog Output — ЦАП на ШИМ микроконтроллера с RC-фильтром, выбор частоты и фильтра
- Texas Instruments. SPRAA88: Using PWM Output as a Digital-to-Analog Converter on a TMS320F280x DSP — спектр ШИМ, пульсации после фильтра и компромисс между пульсациями и быстродействием
Встроить калькулятор на свой сайт
Скопируйте код и вставьте его в HTML страницы, статьи или вики. Виджет бесплатный, без рекламы, счётчиков и cookie. Условие одно — ссылка на GAW под рамкой остаётся на месте. Подробнее о виджетах
<iframe src="https://gaw.ru/embed/pwm/" title="ЦАП на ШИМ: расчёт RC-фильтра" width="100%" height="640" style="border:1px solid #e3e5e9;border-radius:8px" loading="lazy" allow="clipboard-write"></iframe>
<p style="margin:6px 0 0;font-size:14px">Калькулятор: <a href="https://gaw.ru/tools/pwm/">ЦАП на ШИМ: расчёт RC-фильтра</a> — GAW.ru</p>Автоподстройка высоты рамки
Если сайт разрешает скрипты, добавьте этот код один раз в любом месте страницы: рамка будет менять высоту вместе с результатом расчёта.
<script>window.addEventListener("message",function(e){if(e.origin!=="https://gaw.ru"||!e.data||e.data.type!=="gaw:embed-height")return;var f=document.querySelectorAll('iframe[src^="https://gaw.ru/embed/"]');for(var i=0;i<f.length;i++)if(f[i].contentWindow===e.source)f[i].style.height=e.data.height+"px"})</script>Обновлено . Нашли ошибку в расчёте? Напишите нам.