Микроконтроллеры

Настройка ШИМ на микроконтроллере Atmega8

Рассмотрим настройку ШИМ на микроконтроллере Atmega8. В этом примере подключим к микроконтроллеру светодиод и с помощью «шима» будем изменять интенсивность (яркость) его свечения. На микроконтроллере Atmega8 существуют три выхода которые можно использовать в качестве "ШИМа" это выводы с 1 по 3-й порта B. В нашем случае мы настраиваем первый вывод порта. Ширина или длительность импульса на нем будет зависеть от значения, которое записано в регистр сравнения OCR1A.

Для настройки ШИМА необходимо сначала настроить делитель частоты, это делается с помощью регистра TCCR1B, где первые три бита для этого и предназначены. Сначала включаем «ШИМ» для этого необходимо записать единицу в первые два бита регистра TCCR1A с помощью следующей конструкции: TCCR1A=(1<<1)|(1<<0).

Далее «говорим» нашему таймеру что нужно сделать на выходе 1 порта B при совпадении счетного регистра с регистром OCR1A. Это делается с помощью 7-го и 6-го бита (COM1A на рисунке). Когда эти биты установлены в нули, то первый пин нашего порта отключен от таймера. Когда эти биты выставлены в единицу. То наш вывод изменяет свое состояние с низкого на высокое.

Ниже представлен рисунок регистров таймера TIMET_COUNTER1 .

Регистры для настройки ШИМА Atmega8

Настройка ШИМ на микроконтроллере Atmega8

В таймере TIMET_COUNTER1 микроконтроллера Atmega8 существует шестнадцати разрядный регистр TCNT1. Этот регистр считает и живет внутри нашего таймера. При совпадении значения этого таймера и таймера OCR1A происходит изменение состояния на выходе микроконтроллера, который привязан к данному таймеру в нашем случае это первый вывод порта B.

Вот собсвенно сам код, написанный в AtmelStudio

#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");
     }
}

 

Комментарии  

 
#1 Pavel 18.02.2014 17:32
Для того чтобы увеличить точность таймера необходимо прицепить внешний кварц! К примеру если мы возьмем часовой кварц 8.192 МГц. то можно получить период прерывания в 0.25мс.
Цитировать
 
 
#2 timeon 08.01.2015 17:31
Не забудьте настроить ножку ШИМ на выход:
DDRB |= (1
Цитировать
 
 
#3 timeon 08.01.2015 17:32
[quote name="timeon"]Н е забудьте настроить ножку ШИМ на выход:
DDRB |= 0b00000010;
Цитировать
 
 
#4 vah 29.01.2015 14:10
да елки. на комментарий не обратил внимание и два дня промучался.
ПРОГРАММА НЕ РАБОТАЛА из-за DDRB |= 0b00000010;
Цитировать
 
 
#5 Антон 17.06.2015 16:23
Ура у меня тоже заработало!!))Б уду сервопривод подключать)
Цитировать
 

Добавить комментарий


Защитный код
Обновить

Последние комментарии

Последнии темы форума

  • Нет сообщений для показа