Здравствуйте снова))) Сейчас изучаю таймеры и их режим ШИМ.
Контроллер ATMega48PA
вот даташит: http://www.atmel.com...ges/doc2545.pdf
Я так понял ШИМом можно назвать все то, что ограничивает выходящий ток за счет разной длительности нулевых и высоких уровней напряжений (1 и 0). Т.е. когда я пробовал моргать светодиодом и сделал задержку в 0.1 мс и у меня диод горел тускло - это и был примитивный ШИМ)) Только программный без таймеров и прерываний.
Теперь тоже самое нужно повторить с прерываниями от таймера. Из курса АЦП я знаю, что таймер нужно настроить и для этого есть соответствующие регистры.
В даташите написано, что для выходного сигнала таймера можно использовать portB(биты 1,2,3).
Я возьму бит3 OC2
Ещё чуток литературы (Ефстифеева) и я узнал за что отвечает каждый бит управляющих регистров.
Но вот до конца представить структуру программы не могу.
Все что мне нужно вот:
1) регистр прерываний TIMSK
2) счетный регистр TCNT0 (в PWM будет работать как счетчик)
3) регистр управления TCCR0
4) регистр сравнения OCR0
5) регистр TIFR
правильно? Это ведь все регистры настройки?
Такс. Значит мне нужно первым делом определится какой счетчик использовать Т0Т1 вроде Т3 у меня нету(((
Далее для этого счетчика с генерировать TIMSK.
После чего нужно установить желаемое напряжение с расчетом что 255 - 100% опорного и 00 - 0%. А устанавливать я буду в регистр сравнения TCNT0. Теперь когда таймер дойдет до этого числа с генерируется флаг прерывания в регистре TIFR.
Так?
Как будет вести себя ОС0(ОС2) можно найтроить при помощи регистра TCCR0 вроде как.
Как бы мне систематизировать теперь это все?)))
Я попробовал взглянуть на готовую программу написанную хз кем:
но нефига не понял. Автор не использовал некоторые перечисленные мною регистры. С чем это связанно?
P.S. мдя)) Учится самому тяжко. Последнее время стал больше ценить то, что рассказывают преподаватели)))
Раздел: AVR
Контроллер ATMega48PA
вот даташит: http://www.atmel.com...ges/doc2545.pdf
Я так понял ШИМом можно назвать все то, что ограничивает выходящий ток за счет разной длительности нулевых и высоких уровней напряжений (1 и 0). Т.е. когда я пробовал моргать светодиодом и сделал задержку в 0.1 мс и у меня диод горел тускло - это и был примитивный ШИМ)) Только программный без таймеров и прерываний.
Теперь тоже самое нужно повторить с прерываниями от таймера. Из курса АЦП я знаю, что таймер нужно настроить и для этого есть соответствующие регистры.
В даташите написано, что для выходного сигнала таймера можно использовать portB(биты 1,2,3).
Я возьму бит3 OC2
Ещё чуток литературы (Ефстифеева) и я узнал за что отвечает каждый бит управляющих регистров.
Но вот до конца представить структуру программы не могу.
Все что мне нужно вот:
1) регистр прерываний TIMSK
2) счетный регистр TCNT0 (в PWM будет работать как счетчик)
3) регистр управления TCCR0
4) регистр сравнения OCR0
5) регистр TIFR
правильно? Это ведь все регистры настройки?
Такс. Значит мне нужно первым делом определится какой счетчик использовать Т0Т1 вроде Т3 у меня нету(((
Далее для этого счетчика с генерировать TIMSK.
После чего нужно установить желаемое напряжение с расчетом что 255 - 100% опорного и 00 - 0%. А устанавливать я буду в регистр сравнения TCNT0. Теперь когда таймер дойдет до этого числа с генерируется флаг прерывания в регистре TIFR.
Так?
Как будет вести себя ОС0(ОС2) можно найтроить при помощи регистра TCCR0 вроде как.
Как бы мне систематизировать теперь это все?)))
Я попробовал взглянуть на готовую программу написанную хз кем:
#include <avr/io.h>
#include <util/delay.h>
void InitPWM()
{
/*
TCCR0 - Timer Counter Control Register (TIMER0)
-----------------------------------------------
BITS DESCRIPTION
NO: NAME DESCRIPTION
--------------------------
BIT 7 : FOC0 Force Output Compare [Not used in this example]
BIT 6 : WGM00 Wave form generartion mode [SET to 1]
BIT 5 : COM01 Compare Output Mode [SET to 1]
BIT 4 : COM00 Compare Output Mode [SET to 0]
BIT 3 : WGM01 Wave form generartion mode [SET to 1]
BIT 2 : CS02 Clock Select [SET to 0]
BIT 1 : CS01 Clock Select [SET to 0]
BIT 0 : CS00 Clock Select [SET to 1]
The above settings are for
--------------------------
Timer Clock = CPU Clock (No Prescalling)
Mode = Fast PWM
PWM Output = Non Inverted
*/
TCCR0|=(1<<WGM00)|(1<<WGM01)|(1<<COM01)|(1<<CS00);
//Set OC0 PIN as output. It is PB3 on ATmega16 ATmega32
DDRB|=(1<<PB3);
}
/******************************************************************
Sets the duty cycle of output.
Arguments
---------
duty: Between 0 - 255
0= 0%
255= 100%
The Function sets the duty cycle of pwm output generated on OC0 PIN
The average voltage on this output pin will be
duty
Vout= ------ x 5v
255
This can be used to control the brightness of LED or Speed of Motor.
*********************************************************************/
void SetPWMOutput(uint8_t duty)
{
OCR0=duty;
}
/********************************************************************
Simple Wait Loop
*********************************************************************/
void Wait()
{
_delay_loop_2(3200);
}
void main()
{
uint8_t brightness=0;
//Initialize PWM Channel 0
InitPWM();
//Do this forever
while(1)
{
//Now Loop with increasing brightness
for(brightness=0;brightness<255;brightness++)
{
//Now Set The Brighness using PWM
SetPWMOutput(brightness);
//Now Wait For Some Time
Wait();
}
//Now Loop with decreasing brightness
for(brightness=255;brightness>0;brightness--)
{
//Now Set The Brighness using PWM
SetPWMOutput(brightness);
//Now Wait For Some Time
Wait();
}
}
}
но нефига не понял. Автор не использовал некоторые перечисленные мною регистры. С чем это связанно?
P.S. мдя)) Учится самому тяжко. Последнее время стал больше ценить то, что рассказывают преподаватели)))
Раздел: AVR