Урок по PWM (ШИМ) для mikroPascal for AVR

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

Пример работы цифровой ШИМ.

Пример работы цифровой ШИМ

Итак с теорией разобрались теперь перейдём к практике. Для программирования микроконтроллеров я использую mikroPascal for AVR фирмы mikroelektronika т.к это удобная и довольно функциональная среда программирования МК. В ней большой набор библиотек и примеров. Есть конечно и один минус — программа платная, есть бесплатная версия с ограничением в 2кб, как с этим бороться можно найти в интернете. Подробнее о mikroPascal for AVR можно почитать на данной странице

Итак открываем mikropascal и создаём новый проект, для этого в меню перейдите «File» — «New» — «New project», либо соответствующей кнопкой на тулбаре.

Видим такое окно. Жмём «Next».

Теперь в окне вводим название проекта, путь к папке проекта, тип микроконтроллера и его тактовую частоту.

В следующем окне нас просят добавить файлы в проект,  жмём «Next» , т.к подключать нам пока нечего.

Последний этап — подключение библиотек. Оставляем Include Аll т.к программа сама подключит нужные библиотеки.

Ну и в следующем окне нас поздравляют с тем, что мы успешно создали проект.Жмём «Finish».

После создания проекта нам открывается шикарный вид на пустой шаблон. Думаю если вы наткнулись на это статью вы уже имеете хоть какое-то представление о программировании и о языке «Паскаль». Поэтому переходим к коду.

Вот текст нашей программы: 

 program pwmtest;                                                        //Название программы var                                                                     //Объявление переменных    currDuty:integer;                                                    //Переменная в которую мы будем записывать состояние ШИМ  begin   DDB3_bit:=1;                                                          //Порт 3Б на выход   pwm2_init(_PWM2_FAST_MODE,_PWM2_PRESCALER_8,_PWM2_NON_INVERTED,0);    //Инициализация ШИМ   while true do begin                                                   //Бесконечный цикл       for currDuty:=-255 to 0 do begin                                  //Цикл от -255 до 0           PWM2_set_duty(abs(currDuty));                                 //Выставляем значение ШИМ в модуль currDuty           delay_ms(10);                                                 //Задержка в 10мс       end;                                                              //Конец цикла   end;                                                                  //Конец бесконечного цикла end.                                                                    //Конец программы

Разберём некоторые строки нашей программы.

Строка: pwm2_init(_PWM2_FAST_MODE,_PWM2_PRESCALER_8,_PWM2_NON_INVERTED,0); — это инициализация ШИМ. _PWM2_FAST_MODE — это тип волны,_PWM2_PRESCALER_8 — показатель предварительного делителя частоты,_PWM2_NON_INVERTED — будет ли сигнал инвертированным и 0 это начальное значение ШИМ.

Значение ШИМ может быть в пределах от 0 до 255.То есть 0 это 0%, 127 — 50%, 255 — 100%.

Теперь компилируем проект, сворачиваем mikroPascal и идём в Proteus. Делаем такую схему:

Показания вольтметра плавно переходят от 5В до 0.9В. На осциллографе видим:

Всё работает, но если мы подключим DC вольтметр то он будет быстро скакать от 0 до 5В. Эта проблема легко решается: добавляем электролитический конденсатор между землёй и выходом, получаем:

На осциллографе видим практически постоянный ток и показатель вольтметра переходит от 5 до 0В:

Ну вот, мой первый урок подошёл к концу, скажу лишь, что больше информации можно узнать нажав «F1» в редакторе.