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 Vlaskin

MR>>>> ðÏ ËÒÁÊÎÅÊ ÍÅÒÅ, ÚÁÓÔÁ×ÉÔØ ÅÇÏ ÒÁÂÏÔÁÔØ ËÒÏÍÅ ËÁË × ÒÅÖÉÍÁÈ "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