Широтно — импульсная модуляция ШИМ / PWM

   Широтно-импульсная модуляция (ШИМ, англ. pulse-width modulation (PWM)) — процесс управления мощностью, подводимой к нагрузке, путём изменения скважности импульсов, при постоянной частоте. Различают аналоговую ШИМ и цифровую ШИМ, двоичную (двухуровневую) ШИМ и троичную (трёхуровневую) ШИМ.

Аналоговая ШИМ

shim1

   Один из методов двухуровневой ШИМ, формируемой с помощью аналогового компаратора. На один из входов компаратора подаётся пилообразное напряжение от вспомогательного генератора, на другой вход — модулирующее напряжение. Состояние выхода компаратора — ШИ-модуляция. На рис.: сверху — результат ШИМ, снизу — пилообразный сигнал и модулирующее напряжение. ШИМ-сигнал генерируется аналоговым компаратором, на один вход которого подаётся вспомогательный опорный пилообразный или треугольный сигнал, значительно большей частоты, чем частота модулирующего сигнала, а на другой — модулирующий непрерывный аналоговый сигнал. Частота повторения выходных импульсов ШИМ равна частоте пилообразного или треугольного напряжения. В ту часть периода пилообразного напряжения, когда сигнал на инвертирующем входе компаратора выше сигнала на неинвертирующем входе, куда подается модулирующий сигнал, на выходе получается отрицательное напряжение, в другой части периода, когда сигнал на инвертирующем входе компаратора ниже сигнала на неинвертирующем входе — будет положительное напряжение.

На выходе компаратора образуются периодические прямоугольные импульсы с переменной шириной, скважность которых изменяется по закону модулирующего сигнала, а частота равна частоте треугольного или пилообразного сигнала и обычно постоянна. Аналоговая ШИМ применяется в усилителях низкой частоты класса «D».


Цифровая ШИМ

   В двоичной цифровой технике, выходы в которой могут принимать только одно из двух значений, приближение желаемого среднего уровня выхода при помощи ШИМ является совершенно естественным. Схема настолько же проста: пилообразный сигнал генерируется N-битным счётчиком. Цифровые устройства (ЦШИП) работают на фиксированной частоте, обычно намного превышающей реакцию управляемых установок (передискретизация). В периоды между фронтами тактовых импульсов выход ЦШИП остаётся стабильным, на нём действует либо низкий уровень, либо высокий, в зависимости от выхода цифрового компаратора, сравнивающего значение счётчика с уровнем приближаемого цифрового сигнала V(n). Выход за много тактов можно трактовать как череду импульсов с двумя возможными значениями 0 и 1, сменяющими друг друга каждый такт T. Частота появления единичных импульсов получается пропорциональной уровню приближаемого сигнала ~V(n). Единицы, следующие одна за другой, формируют контур одного, более широкого импульса. Длительности полученных импульсов переменной ширины ~V(n) кратны периоду тактирования T, а частота равна 1/(T*2N). Низкая частота означает длительные, относительно T, периоды постоянства сигнала одного уровня, что даёт невысокую равномерность распределения импульсов. Описанная цифровая схема генерации подпадает под определение однобитной (двухуровневой) импульсно-кодовой модуляции (ИКМ). 1-битную ИКМ можно рассматривать в терминах ШИМ как серию импульсов частотой 1/T и шириной 0 либо T. Добиться усреднения за менее короткий промежуток времени позволяет имеющаяся передискретизация. Высоким качеством обладает такая разновидность однобитной ИКМ, как импульсно-плотностная модуляция, которая ещё именуется импульсно-частотной модуляцией.


Алгоритм формирования ШИМ описан для понимания принципа управления некоторых узлов, применяемых в Ардуино. Один из которых — сервопривод. Сервопривод Sg90 9 г, MG995. Размер: 22 мм x 11.5 мм x 22.5 мм. Вес нетто: 9 г. Рабочая скорость: 0.12 секунд/60 градусов (4.8 В без нагрузки) Крутящий момент (4.8 В): 17.5 унц./в (1 кг/см). Температурный диапазон: от-30 до + 60. Рабочее напряжение: 3.0 В ~ 7.2 В Подходит для всех видов радиоуправляемой игрушки. Разъем Длина провода 150 мм.

servo1

   Широтно-импульсная модуляция или PWM — это метод получения аналоговых результатов с помощью цифровых средств. Цифровое управление используется для создания прямоугольного сигнала (меандра). Длительность «по времени» называется шириной импульса, а отношение длительности к периоду — скважностью импульса. Чтобы получить различные аналоговые значения, меняется ширина (скважность) импульса. На графике ниже, зеленые линии отмечают фиксированный период времени. Эта длительность или период является обратной величине частоты ШИМ. Другими словами, частота ШИМ Arduino около 500 Гц, зеленые линии-маркеры отстоят через 2 мс друг от друга. Вызов analogWrite() имеет диапазон устанавливаемых от 0 до 255(0xFF), так что функция analogWrite(N, 255) устанавливает скважность 100% (всегда включен), а analogWrite(N, 127) — это скважность 50%. Таким образом, меняя скважность (длительность) импульса, можно управлять яркостью светодиода или углом поворота сервопривода. Необходимо помнить, что для управления ШИМ на плате UNO или Nano (mini) используется только 6 цифровых выводов — D3, D5, D6, D9, D10, D11 !!! Подключение к другим выводам платы выход ШИМ импульсов в используемые цепи не даст.


 

PWM-arduino

Схема подключения светодиода и потенциометра.


Текст кода программы:

/* Управление яркостью светодиода через потенциометр */

int potpin = 0;  // на вывод А0 подключаем потенциометр
int val;         // переменная для чтения значения от АЦП

void setup() {}

void loop() {
val = analogRead(potpin);  // читаем значение потенциометра (диапазон от 0 до 1023)
analogWrite(9, val/4);  // выводим на вывод D9  PWM с скважностью => val/4
delay(15);   // даем задержку для отработки
}


Приведенная выше схема дает понятие об аналоговом управлении цифровыми элементами, но при этом серьезной смысловой нагрузки не несет — такое применение хоть и встречается в схемотехнике, но используется крайне редко — в основном в декор-светильниках, рекламных лайт — боксах или елочных гирляндах. Чаще встречаются схемы управления электродвигателями постоянного тока посредством ШИМ. При работе с большими нагрузками выходные цепи Ардуино плат необходимо умощнять ключевыми транзисторами, как указано на схеме ниже.

PWM-двигатель ардуино

Использование силового транзистора для управления мощной нагрузкой.

Программа для этой схемы не приводится — она аналогична выше указанной, необходимо только изменить номер вывода на D11. Остается рассмотреть пример подключения сервопривода к плате ардуино для управления в режиме ШИМ. Cервопривод подключается тремя проводами: питание (Vcc), «земля» (Gnd) и сигнальный (С). Питание– красный провод, он может быть подключен к +5 В внешнего источника питания, черны (или коричневый) провод – «земля» – подключается к GND-выводу Arduino GND, сигнальный (оранжевый/желтый/белый) провод подключается к цифровому выводу контроллера Arduino. Для питания сервопривода используем отдельный блок питания +5 В. Для управления сервоприводом в Arduino имеется стандартная библиотека Servo. На платах, отличных от Mega, использование библиотеки отключает возможность применения analogWrite() (ШИМ) на пинах 9 и 10 (вне зависимости, подключены к этим пинам сервы или нет). На платах Mega до 12 сервоприводов могут использоваться без влияния на функциональность ШИМ, но использование от 12 до 23 сервомашинок отключит PWM ШИМ на пинах 11 и 12.

PWM-SERVO ардуино

servo_internal_structureСтруктура сервопривода: 1-разъем подключения; 2-плата управления; 3-датчик угла(потенциометр); 4-электродвигатель; 5-редуктор с выходным валом.


Текст кода программы:

/* Управление сервоприводом через потенциометр с использованием библиотеки Servo.h  */

#include <Servo.h>
Servo myservo;  // создается объект Servo для управления через библиотеку
int potpin = 0;  // на вывод А0 подключаем потенциометр
int val;                  // переменная для чтения значения от АЦП

void setup()
{
  myservo.attach(9);  // активируется вывод 9 для управления сервоприводом
}

void loop()
{
val = analogRead(potpin);     // читаем значение потенциометра (диапазон от 0 до 1023)
val = map(val, 0, 1023, 5, 175); // ремасштабируем val в градусы (угол от 5 до 175)
myservo.write(val);                       // запись значения в сервопривод
delay(15);                                           // задержка для отработки сервоприводом
}


Текст кода программы:

/* Непрерывное сканирование сервоприводом от 5 до 175 градусов и обратно
может применятьсяв ультразвуковых и лазерных сканерах пространства */

#include <Servo.h>
Servo myservo; 
void setup()
{
myservo.attach(9);
}

void loop()
{
for (int i=0; i < 1023; i+=10){
val = map(i, 0, 1023, 5, 175);    
myservo.write(val);                
delay(15);                          
}
for (int i=1022; i>0; i-=10){
val = map(i, 0, 1023, 5, 175);
myservo.write(val);
delay(15);
}
}


   В первом примере сервоприводом управляет потенциометр, код которого преобразуется с помощью функции map в угловые значения от 5 до 175 градусов. Во втором примере циклы с увеличенным шагом отрабатывают углы поворота от 5 до 175 градусов непрерывно. Значения углов отличных от 0 и 180 взяты не случайно — сервопривод не может работать при отсутствии импульсов ШИМа, а в граничных точках 0 и 1023 именно это и происходит. Чтобы исключить рывки в конечных точках значение в градусах взято чуть меньше. Практическое применение сервоприводов будет описано позже…

Ардуино и текстовые индикаторы

К оглавлению