Реклама ⓘ
Главная » Микроконтроллеры
Призовой фонд
на апрель 2024 г.
1. 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
Лазерный модуль 650нм 5мВт Arduino UNO
вверх