Широтно-импульсная модуляция(ШИМ) или 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" в редакторе.
Прикрепленные файлы:
- Шим на AVR.zip (83 Кб)
Комментарии (3)
|
Я собрал (0) |
Подписаться
Для добавления Вашей сборки необходима регистрация
PWM2_set_duty(abs(currDuty)); //Выставляем значение ШИМ в модуль currDuty
PWM2_set_duty(currDuty); //Выставляем значение ШИМ в модуль currDuty
[Автор]