Рассмотрим настройку ШИМ на микроконтроллере Atmega8. В этом примере подключим к микроконтроллеру светодиод и с помощью «шима» будем изменять интенсивность (яркость) его свечения. На микроконтроллере Atmega8 существуют три выхода которые можно использовать в качестве "ШИМа" это выводы с 1 по 3-й порта B. В нашем случае мы настраиваем первый вывод порта. Ширина или длительность импульса на нем будет зависеть от значения, которое записано в регистр сравнения OCR1A.
Для настройки ШИМА необходимо сначала настроить делитель частоты, это делается с помощью регистра TCCR1B, где первые три бита для этого и предназначены. Сначала включаем «ШИМ» для этого необходимо записать единицу в первые два бита регистра TCCR1A с помощью следующей конструкции: TCCR1A=(1<<1)|(1<<0).
Далее «говорим» нашему таймеру что нужно сделать на выходе 1 порта B при совпадении счетного регистра с регистром OCR1A. Это делается с помощью 7-го и 6-го бита (COM1A на рисунке). Когда эти биты установлены в нули, то первый пин нашего порта отключен от таймера. Когда эти биты выставлены в единицу. То наш вывод изменяет свое состояние с низкого на высокое.
Ниже представлен рисунок регистров таймера TIMET_COUNTER1 .
В таймере TIMET_COUNTER1 микроконтроллера Atmega8 существует шестнадцати разрядный регистр TCNT1. Этот регистр считает и живет внутри нашего таймера. При совпадении значения этого таймера и таймера OCR1A происходит изменение состояния на выходе микроконтроллера, который привязан к данному таймеру в нашем случае это первый вывод порта B.
#include <avr/io.h> #include <avr/interrupt.h> ISR (TIMER1_OVF_vect) { asm("nop"); } ISR (TIMER1_COMPA_vect) {} int main(void) { // Настраиваем работу ножки порта на выход DDRB|=0b00000010; OCR1A=100; TCCR1A |=(1<<0); TCCR1A =(1<<1)|(1<<0); TCCR1A =TCCR1A|(1<<7)|(1<<6); TCCR1B =(1<<0); TIMSK =(1<<OCIE1A); asm("sei"); while(1) { asm("sei"); } }
Комментарии
DDRB |= (1
DDRB |= 0b00000010;
ПРОГРАММА НЕ РАБОТАЛА из-за DDRB |= 0b00000010;