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.

Three square-wave traces stacked vertically, each at the same frequency. The top wave is high for 25 % of each period and low for 75 %. The middle wave is high and low for half the period each. The bottom wave is high for 75 % and low for 25 %.

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 через фільтр низьких частот – ту саму комбінацію резистора і конденсатора, що використовується для усунення дребезгу контактів у Усунення брязкоту.

A PWM pin connects through a series resistor R to an output node. A capacitor C from that node to ground completes the low-pass filter; the smoothed voltage appears at V_out.

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 , C = 1 µF – дають f_c = 1 / (2π × 1.6 × 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) і прийміть більші пульсації.