Урок по 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» в редакторе.  

Прикрепленные файлы:

Добавить комментарий

Ваш адрес email не будет опубликован.