Рассмотрим настройку ШИМ на микроконтроллере 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;