3.13. Генерация аналогового сигнала с помощью PWM и RC-фильтра¶
ADC считывает напряжения на выводе. Обратная задача – получение промежуточного напряжения между 0 В и Vcc на выводе – сложнее, потому что выход GPIO умеет лишь подавать одну из двух своих шин. Стандартная замена – переключать вывод между шинами достаточно быстро, чтобы важным становилось среднее напряжение.
3.13.1. Широтно-импульсная модуляция¶
Сигнал широтно-импульсной модуляции (PWM) – это прямоугольная волна фиксированной частоты, время высокого уровня которой – доля каждого цикла, проведённая на Vcc вместо земли, – задаётся в программе. Эта доля называется скважностью. Среднее напряжение волны равно скважности, умноженной на Vcc:
V_avg = duty × Vcc
Скважность 25 % даёт в среднем Vcc / 4; скважность 50 % – Vcc / 2; скважность 75 % – 3 × Vcc / 4.
PWM со скважностью 25 %, 50 % и 75 %. Среднее напряжение отслеживает скважность.¶
Частота задаётся при настройке PWM; скважность – это то, что программа изменяет на лету. Класс machine.PWM оборачивает аппаратный канал таймера, который генерирует волну без участия процессора – после настройки сигнал продолжается на выбранной частоте и скважности до тех пор, пока его не изменят.
3.13.2. Класс machine.PWM¶
Создайте экземпляр PWM с указанием вывода, а также начальной частоты и скважности:
from machine import PWM, Pin
pwm = PWM(Pin("P7"), freq=20_000, duty_u16=32768)
Это запускает прямоугольную волну 20 кГц со скважностью 50 % на P7. Два метода изменяют выход на лету:
pwm.duty_u16(16384) # change to 25 % (16384 / 65535)
pwm.freq(5_000) # change to 5 kHz
duty_u16() принимает беззнаковое 16-битное целое число, отображая 0 в «всегда низкий», а 65535 в «всегда высокий». freq() задаёт несущую частоту в герцах.
Примечание
Каждый канал PWM на одном и том же аппаратном таймере разделяет его частоту. Вызов freq() на одном канале изменяет каждый другой канал, привязанный к этому таймеру. Используйте каналы разных таймеров, когда выходы должны работать на разных частотах.
Вызовите deinit(), чтобы освободить канал таймера, когда выход больше не нужен.
3.13.3. Усреднение с помощью RC-фильтра нижних частот¶
Необработанный PWM не является плавным напряжением; это прямоугольная волна, среднее значение которой нам нужно. Чтобы извлечь это среднее, пропустите PWM через фильтр нижних частот – ту же комбинацию резистора и конденсатора, что используется для устранения дребезга переключателя в Подавление дребезга.
PWM через RC-фильтр нижних частот: конденсатор усредняет прямоугольную волну в постоянное напряжение, пропорциональное скважности.¶
Частота среза фильтра – граница между частотами, которые он пропускает, и теми, которые блокирует, – задаётся тем же произведением RC, которое давало постоянную времени для схемы устранения дребезга:
f_c = 1 / (2π × R × C)
Чтобы фильтр извлекал из входного PWM чистое постоянное напряжение, частота среза должна быть намного ниже самой частоты PWM. Постоянная составляющая (частота 0) проходит без изменений; основная гармоника PWM (на частоте PWM) ослабляется примерно на f_c / f_PWM. Отношение 1 / 200 уменьшает остаточные пульсации на выходе примерно до 0.5 % от размаха входа.
Разумная отправная точка для медленно меняющейся уставки:
Частота PWM
f_PWM = 20 kHz– значительно выше звукового диапазона и легко генерируется таймером без искажений.Параметры фильтра
R = 1.6 kΩ,C = 1 µF– дающиеf_c = 1 / (2π × 1.6 kΩ × 1 µF) ≈ 100 Hz.
200-кратное подавление на несущей уменьшает полный размах PWM примерно до Vcc / 200 остаточных пульсаций на V_out – около 16 мВ при 3,3 В.
Два практических замечания:
Выходной импеданс фильтра примерно равен
R. Любая нагрузка ниже по цепи, потребляющая ток, превращаетRи нагрузку в делитель, который притягиваетV_outниже идеального среднего, в точности как делитель на странице Чтение аналогового сигнала с помощью ADC. Питайте вывод ADC или высокоимпедансный буфер, а не нагрузку, потребляющую миллиамперы.Конденсатору требуется около
5 × R × C ≈ 8 msдля установления при изменении скважности;V_outотстаёт от настройки скважности на это время. Для уставки, которую нужно обновлять быстрее, повысьте частоту среза (меньшиеRилиC) и смиритесь с большими пульсациями.