Урок 13. Апаратний ШИМ на мікроконтролері

У цьому уроці ми навчимося реалізовувати ШІМ сигнал на мікроконтролері AVR за допомогою BASCOM-AVR. У мікроконтролерах AVR, ШІМ можна реалізувати за допомогою таймерів, для цієї мети в мікроконтролері є ШІМ виходи на портах введення/виведення. Наприклад, у мікроконтролері Attiny13 є один таймер (Timer0) і два канали виводу ШІМ Pwm0a та Pwm0b, які знаходяться на портах PB.0 і PB.1. У документації на мікроконтролер ШІМ канали підписуються так: OC0A – ШІМ канал A на таймері 0, OC0B – ШІМ канал B на таймері 0, OC1A – ШІМ канал A на таймері 1, OC1B – ШІМ канал B на таймері 1 і т.д.

Робота з ШІМ у мікроконтролері
Для початку роботи потрібно сконфігурувати таймер на роботу ШІМ, для цього є команда:
Config Timer1 = Pwm, Pwm = Розрядність, Compare A Pwm = Стан канала A, Compare B Pwm = Стан канала B, Prescale = Частота ШІМ
Розрядність можна задати 8, тоді буде скважність ШІМ від 0 до 255. Для Timer1 розрядність можна задати 9 або 10. Стан канала A або B можна задати Clear Up – скважність при 0 = логічної 1 і Clear Down – скважність при 0 = логічної 0. Частоту ШІМ можна задати: 1, 8, 64, 256 і 1024.
Приклад команди конфігурування: Config Timer0 = Pwm , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 8
Після конфігурування таймера потрібно сконфігурувати порти ШІМ на вивід командою Config порт = Output, наприклад: Config Portb.0 = Output
Потім потрібно запустити таймер командою Start таймер, наприклад: Start Timer0.
Тепер можна записати скважність у ШІМ канал для канала A таймера 0 це можна зробити так: Pwm0a = скважність, наприклад: Pwm0a = 150

Практичний приклад

Тепер давайте спробуємо попрацювати з ШІМ на практиці, зробимо просту моргалку, яка буде плавно запалювати і гасити світлодіоди. За основу візьмемо мікроконтролер Attiny13 і два світлодіоди, зберемо просту схему:

Розпіновка роз’єму клавіатури PS2

Тепер напишемо просту програму на BASCOM-AVR, застосовуючи отримані знання:

$regfile = "attiny13.dat"
$crystal = 9600000
Config Timer0 = Pwm , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 8
Config Portb.0 = Output
Config Portb.1 = Output
Start Timer0
Do
Incr Pwm0a
Decr Pwm0b
Waitms 5
Loop
End

Скомпілюємо її, прош’ємо мікроконтролер і встановимо ф’юз біти мікроконтролера на тактування від внутрішнього тактового генератора на 9.6 МГц без дільника на 8. Приклад встановлення ф’юз бітів у програмі SinaProg:

Ф’юз біти

Я використовував свою налагоджувальну плату і ось що вийшло:

Плата

Завантажити файли для уроку (проект у Proteus, вихідний код, прошивка) ви можете нижче

Список радіоелементів

Позначення Тип Номінал Кількість Примітка
U1 МК AVR 8-біт
ATtiny13
1
R1, R2 Резистор
150 Ом
2
R3 Резистор
10 кОм
1
D1, D2 Світлодіод 2
Додати всі

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

Top