Главная » Микроконтроллеры
Призовой фонд
на июль 2019 г.
1. 1000 руб
Паяльник
2. Регулируемый паяльник 60 Вт
Паяльник
3. 100 руб.
От пользователей

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

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

Теги:

Опубликована: 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (3) | Я собрал (0) | Подписаться

+1
Виталий #
Добрый день. Отличная статья, но конструкцию
for currDuty:=-255 to 0 do begin //Цикл от -255 до 0
PWM2_set_duty(abs(currDuty)); //Выставляем значение ШИМ в модуль currDuty
можно заменить на
for currDuty:=255 downto 0 do begin //Цикл от -255 до 0
PWM2_set_duty(currDuty); //Выставляем значение ШИМ в модуль currDuty
Что более доступно для понимания. Или тут такая конструкция не прокатит?
Ответить
0

[Автор]
Евгений Веч #
Точно, так даже лучше. Просто забыл про downto.
Отредактирован 28.10.2014 19:10
Ответить
0
Igor Smovdyr #
Atmega8 есть 3 выхода для ШИМ как установить порт PB1? Я пробовал менять бит порта, но все равно ШИМ идет на PB3
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется сила тока?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

AVR-программатор USB ASP
AVR-программатор USB ASP
DC-DC регулируемый преобразователь 1.5-37В 2А с индикатором ELM327 OBD II — адаптер с поддержкой CAN
вверх