ATmega8(L) PWM
Jan 22, 2005
11 Replies
Есть эти биты в ATmega8. В даташите на стр. 97.
Не знаю. У меня работает в Normal, Phase correct и Fast PWM. WGM12:0 и WGM13:0 живут в другом регистре, в TCCR1B, может в этом дело?
Кто? ;-)
С уважением, Сергей Борщ
Greetings, Vladislav!
ðÏÓÍÏÔÒÅÌ Ñ ÍÅÓÓÁÇÕ, ÐÏÓÌÁÎÎÕÀ Vladislav Baliasov Ë Ilja Vlaskin, É ÒÅÛÉÌ ÏÔ×ÅÔÉÔØ: [skip]IV>> HÅÔÕ ÜÔÉÈ ÂÉÔÏ× × ATmege8. HÅ ÚÎÁÀ ÏÔËÕÄÁ ÔÙ ÉÈ ×ÚÑÌ. VB> ëÁË ÔÁË ? åÝÅ ×ÞÅÒÁ ÔÏÞÎÏ ÂÙÌÉ. ëÔÏ ÕÐÅÒ ?
üÔÏ Ñ ÓÇÏpÑÞÁ ÇÌÑÎÕÌ × ÓÅËÃÉÀ Ó ÏÐÉÓÁÎÉÅÍ ÔÁÊÍÅpÁ2 ×ÍÅÓÔÏ ÔÁÊÍÅpÁ1 :)C ÎÁÉÌÕÞÛÉÍÉ ÐÏÖÅÌÁÎÉÑÍÉ Ilja aka éì-2 (ilja_vlaskin$mail.ru)
... óÉÖÕ, ÎÉËÏÇÏ ÎÅ ÔÒÏÇÁÀ, ÐÒÉÍÕÓ ÐÏÞÉÎÑÀ :)
Hello, Sergey!
25.01 11:08 Sergey A. Borshch -> Ilja VlaskinMR>>>> ðÏ ËÒÁÊÎÅÊ ÍÅÒÅ, ÚÁÓÔÁ×ÉÔØ ÅÇÏ ÒÁÂÏÔÁÔØ ËÒÏÍÅ ËÁË × ÒÅÖÉÍÁÈ "Normal" É MR>>>> "Phase Correct PWM" Ó ÆÉËÓÉÒÏ×ÁÎÎÙÍ ÒÁÚÒÅÛÅÎÉÅÍ y ÍÅÎÑ ÎÅ ÐÏÌÕÞÉÌÏÓØ. MR>>>> :-( üÔÏ Ñ ÞÔÏ-ÔÏ ÎÅ ÔÁË ÄÅÌÁÀ, ÉÌÉ?... SAB> HÅ ÚÎÁÀ. õ ÍÅÎÑ ÒÁÂÏÔÁÅÔ × Normal, Phase correct É Fast PWM. WGM12:0 É SAB> WGM13:0 ÖÉ×ÕÔ × ÄÒÕÇÏÍ ÒÅÇÉÓÔÒÅ, × TCCR1B, ÍÏÖÅÔ × ÜÔÏÍ ÄÅÌÏ?
ëÏÌÉ ÒÁÂÏÔÁÀÔ, ÍÏÖÎÏ ÐÏÓÍÏÔÒÅÔØ ÚÁ×ÅÄÏÍÏ ÐÒÁ×ÉÌØÎÙÊ ÐÒÉÍÅÒ? éÎÔÅÒÅÓÕÅÔ Phase correct PWM Ó TOP=ICR1. éÌÉ Fast PWM 8-bit.|V|uxau/\
Greetings, Igor!
ðÏÓÍÏÔÒÅÌ Ñ ÍÅÓÓÁÇÕ, ÐÏÓÌÁÎÎÕÀ Igor Ulanov Ë Michael Ryazanov, É ÒÅÛÉÌ ÏÔ×ÅÔÉÔØ: [skip]IU> óÁÍ ÐÅpÅÏÄÉÞÅÓËÉ ÔpÁÈÁÀÓØ Ó ÔÁÊÍÅpÁÍÉ. ðpÏÇpÁÍÍÉpyÀÔÓÑ ÏÎÉ ÎÅ ÔÁË IU> ËÁË × ÄÏËÁÈ. ðpÏ 8-yÀ yÖÅ ÎÅ ÐÏÍÎÀ, Á ×ÏÔ y 16È ÂÉÔÙ ËÏÎÆÉÇypÁÃÉÉ IU> ÔÏÞÎÏ ÎÁÐyÔÁÎÙ. ÷ÓÅ ÓÏÂÉpÁÀÓØ ÓÔÁÔÉÓÔÉËy ÎÁÂpÁÔØ, ÎÏ ÐÏÓÌÅ ÐÏÂÅÄÙ yÖÅ IU> ÎÅ ÄÏ ÜÔÏÇÏ. ñ ÐÏÓÌÅÄÎÉÊ pÁÚ ËÏÇÄÁ ÓÔÏÌËÎyÌÓÑ Ó ÚÁÇ×ÏÚÄËÏÊ IU> ÐpÏÇpÁÍÍÉpÏ×ÁÎÉÑ ËÁËÏÇÏ-ÔÏ pÅÖÉÍÁ, ÐpÏÓÔÏ ÓÔÁÌ ÐÅpÅÂÉpÁÔØ ×ÓÅ
õ ATmeg ÅÓÔØ ÉÎÔÅpÅÓÎÁÑ ÏÓÏÂÅÎÎÏÓÔØ ôÁÊÍÅpÁ0 (É ôÁÊÍÅpÁ 2 ÄÌÑ ATmega8) ÷ pÅÇÉÓÔpÅ TCCRx (x=0,2) × 6-Í ÂÉÔÅ ÎÁÈÏÄÉÔÓÑ WGMx0, Á × 3-Í ÂÉÔÅ - WGMx1 !!! èÏÔÑ ÌÏÇÉÞÎÏ ÂÙÌÏ ÂÙ ÓÄÅÌÁÔØ ÎÁÏÂÏpÏÔ :-) ðpÉÞÅÍ ÜÔÏ ÏÔpÁÖÅÎÏ ÔÏÌØËÏ ÎÁ pÉÓÕÎËÅ (ÇÄÅ pÁÚpÉÓÏ×ÁÎÙ ÂÉÔÙ pÅÇÉÓÔpÁ), Á × ÏÐÉÓÁÎÉÉ ÎÁÐÉÓÁÎÏ: Bit 6,3 - WGMx1:0 Waveform Generation Mode... ô.Å. ÌÀÂÏÊ ÎÏpÍÁÌØÎÙÊ ÞÅÌÏ×ÅË, ÐpÏÞÉÔÁ× ÏÐÉÓÁÎÉÅ É ÍÅÌØËÏÍ ×ÚÇÌÑÎÕ× ÎÁ pÉÓÕÎÏË, ÚÁÐpÏÓÔÏ ÜÔÉ ÂÉÔÙ ÐÅpÅÐÕÔÁÅÔ. ìÉÞÎÏ Ñ ÐÅp×ÙÊ pÁÚ ÄÏÌÇÏ Ó ÎÉÍÉ Ôp$%#ÓÑ, ÐÏËÁ ÍÅÎÑ ÎÅ ÐpÏÎÑÌÏ :-)C ÎÁÉÌÕÞÛÉÍÉ ÐÏÖÅÌÁÎÉÑÍÉ Ilja aka éì-2 (ilja_vlaskin$mail.ru)
... é Ô×ÏÑ ÇÏÌÏ×Á ×ÓÅÇÄÁ × ÏÔ×ÅÔÅ ÚÁ ÔÏ ËÕÄÁ ÓÑÄÅÔ Ô×ÏÊ ÚÁÄ.
А как именно у тебя не работают?
Вот Phase and Frequency correct. Я ошибся, Phase Correct не пользовал - то письмо писал из дома а исходники на работе были.
#define KHz *1000L #define OSC (12800 KHz) #define PWMFreq (100 KHz) #define PWM OCR1B #define PWM_IE (1<<TOIE1)
#define PWMTicks (((OSC / PWMFreq) / 2) * 2) #define Amplitude ((PWMTicks/4 - 1)*0.8) #define Offset (PWMTicks/4)
char __low_level_init() { PORTB = (0<<7)|(0<<6)|(1<<5)|(0<<4)|(0<<3)|(0<<2)|(0<<1)|(0<<0); DDRB = (0<<7)|(0<<6)|(1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(1<<0);
// use CC-B as PWM generator TCCR1A = (0<<COM1A1)|(0<<COM1A0)|(1<<COM1B1)|(1<<COM1B0)|(0<<WGM11)|(0<<WGM10); TCCR1B = (0<<ICNC1)|(0<<ICES1)|(1<<WGM13)|(0<<WGM12)|(0<<CS12)|(0<<CS11)|(1<<CS10); ICR1 = PWMTicks / 2; // Set PWM frequency PWM = PWMTicks / 4; // generate 0.5 Vcc level
return 1; }
static unsigned char Phase=0, Step=1;
#pragma vector = TIMER1_OVF_vect __root __interrupt void FFSK_PWM_Handler (void) { // sinus generator unsigned char Tmp; Tmp = Phase + Step; // next phase if(Tmp >= SinTableLen) { // overflow Tmp -= SinTableLen; // get reminder Phase = Tmp; // store phase Tmp = SinTable[Tmp]; // read table Tmp = Offset + Tmp; // add offset PWM =Tmp; // set new duty }
Ну примерно так. Это я выдрал из большой программы, вроде ошибок не наделал.
С уважением, Сергей Борщ
ðpÉ×ÅÔ Ilja!
28 ñÎ× 05 00:01, Ilja Vlaskin -> Igor Ulanov:
IV> ìÉÞÎÏ Ñ ÐÅp×ÙÊ pÁÚ ÄÏÌÇÏ Ó ÎÉÍÉ Ôp$%#ÓÑ, ÐÏËÁ ÍÅÎÑ ÎÅ ÐpÏÎÑÌÏ :-)
äÁ. óÐÁÓÉÂÏ. ôÁËÖÅ yÖÅ ÐÏÚÁÄÉ. ôÅÐÅpØ ÏÐÉÓÙ×ÁÀ ËÁÖÄÙÊ ÂÉÔ, ÔÁË ÖÅ ËÁË ÐÏËÁÚÁÎÏ × ÐpÉÍÅpÁÈ × ÄÁÔÁÛÉÔÁÈ.Igor
Hello Sergey.
28 Jan 05 16:43, you wrote to Michael Ryazanov:SB> #define KHz *1000L SB> #define OSC (12800 KHz) SB> #define PWMFreq (100 KHz)
ñ ÔÏÖÅ ÔÁË ÐÒÏÂÏ×ÁÌ ÄÅÌÁÔØ. ðÒÉËÏÌØÎÏ. HÏ ÐÏÔÏÍ ×ÓÅ ÔÁËÉ ÏÔËÁÚÁÌÓÑ.SB> char __low_level_init() { SB> PORTB = (0<<7)|(0<<6)|(1<<5)|(0<<4)|(0<<3)|(0<<2)|(0<<1)|(0<<0); SB> DDRB = (0<<7)|(0<<6)|(1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(1<<0);
æÉ. ëÁË ÐÏÓÌÅ ÐÒÅÐÒÏÃÅÓÓÏÒÁ. ñ ÓÎÁÞÁÌÁ ÍÏÒÏÞÉÌ ÓÅÂÅ ÇÏÌÏ×Õ, Á ÐÏÔÏÍ ÓÄÅÌÁÌ ÆÁÊÌ bitdef.h Ó ÓÏÄÅÒÖÁÎÉÅÍ ÔÉÐÁ:#define _00000000 0 #define _00000001 1 ... #define _11111110 254 #define _11111111 255
é ÎÅ ÖÁÌÅÀ. ôÅÐÅÒØ ËÏÄ ×ÙÇÌÑÄÉÔ ÔÁË:PORTB = _11010110; DDRB = _11001000;
SB> // use CC-B as PWM generator SB> TCCR1A = SB> (0<<COM1A1)|(0<<COM1A0)|(1<<COM1B1)|(1<<COM1B0)|(0<<WGM11)|(0<<WGM10); SB> TCCR1B = SB> (0<<ICNC1)|(0<<ICES1)|(1<<WGM13)|(0<<WGM12)|(0<<CS12)|(0<<CS11)|(1<<CS
äÌÑ ÔÁËÏÊ ÛÔÕËÉ × avr-libc ÓÄÅÌÁÌÉ ÍÁËÒÏÓ: #define BV(x) (1<<(x))HÕ Ñ ÉÍ É ÐÏÌØÚÕÀÓØ. ôÏÇÄÁ: TCCR1A = BV(COM1B1) | BV(COM1B0);
éÍÈÏ ÔÁË ÐÏÎÑÔÎÅÅ.Alexey
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required