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

Широтно-імпульсна модуляція (ШІМ) або Pulse-width modulation (PWM) - управління середнім значенням напруги шляхом зміни скважності імпульсів, що керують ключем. Існує аналогова ШІМ та цифрова ШІМ. Аналогову ми торкатися не будемо, оскільки в мікроконтролерах використовується цифрова. У цифровій ШІМ середнє значення напруги отримується шляхом ділення періоду на частини та заповнення їх прямокутними імпульсами. Середнє значення залежить від кількості прямокутних імпульсів.

Приклад роботи цифрової ШІМ.

Приклад роботи цифрової ШІМ

Отже, з теорією розібралися, тепер перейдемо до практики. Для програмування мікроконтролерів я використовую mikroPascal for AVR фірми mikroelektronika, оскільки це зручне та досить функціональне середовище програмування МК. У ньому великий набір бібліотек і прикладів. Є, звичайно, і один мінус - програма платна, є безкоштовна версія з обмеженням у 2кб, як з цим боротися можна знайти в інтернеті. Детальніше про mikroPascal for AVR можна прочитати на даній сторінці

Отже, відкриваємо mikroPascal і створюємо новий проект, для цього в меню перейдіть "File" - "New" - "New project", або відповідною кнопкою на тулбарі.

Бачимо таке вікно. Натискаємо "Next".

Тепер у вікні вводимо назву проекту, шлях до папки проекту, тип мікроконтролера та його тактову частоту.

У наступному вікні нас просять додати файли в проект, натискаємо "Next", оскільки підключати нам поки нічого.

Останній етап - підключення бібліотек. Залишаємо Include All, оскільки програма сама підключить потрібні бібліотеки.

Ну і в наступному вікні нас вітають з тим, що ми успішно створили проект. Натискаємо "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" в редакторі.  

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

Top