Урок по 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" в редакторі.
Прикріплені файли:
- Шим на AVR.zip (83 Кб)