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) і прийміть більші пульсації.