Jag förstår inte PWM i AVR asm *skäms*

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
laban12
Inlägg: 1199
Blev medlem: 17 april 2008, 16:01:56
Ort: Stockholm

Jag förstår inte PWM i AVR asm *skäms*

Inlägg av laban12 »

Jag känner mig så dum men nu har jag letat kodexempel och läst datablad hela förmiddagen...
Jag trodde jag var hyffsat bra på assemblerprogrammering och AVR men nu tycks det mig som att det mest fundamentala fattas mig. Jag drog mig för att posta här också, eftersom det känns som en jävulskt dum frågeställning... men nu MÅSTE jag krypa till korset. :(
Och jag VET ju att här sitter experter som har koll.

Jag trodde en åtta bitars PWM timer cyklade från 0% dutycycle 00h till 100% dutycycle FFh, men jag börjar tvivla på att det är så!? Hur fasen fungerar det?

Min egentliga frågor är väl:
1) hur "lång" är en "cycle" i antal bitar för en åtta bitars räknare i PWM läge? (Jag trodde det var åtta bitar? men ÄR det så?)
2) hur räknar jag ut min PWM frekvens? Det hänger ju lite ihop med hur många bitar en cykel är...

Jag tycker databladet är obegripligt. Jag hade förväntat mig att se pulslängder men det presenterar bara triangelvågor!?
Databladen har jag annars alltid använt för att få koll på hur saker hänger ihop, det har fungerat sedan 2003 men nu har jag slagit huvudet i väggen.

Ursäkta min dumma fråga! :oops:
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: Jag förstår inte PWM i AVR asm *skäms*

Inlägg av vfr »

Jo, jag tolkar det som att du förstått alldeles riktigt. En 8-bitars PWM kan variera sin dutycykel från 0/256 till 255/256. Kan du peka på vad i textförklaringarna som motsäger din bild av hur det fungerar, så kan vi nog hjälp till mer att räta ut frågetecknen!
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: Jag förstår inte PWM i AVR asm *skäms*

Inlägg av stekern »

Det beror lite på hur du ställer in den.
Triangelvågorna du ser i databladet beror på att räknaren med den inställningen räknar upp och ner och slår på och av PWM'en vid ett givet värde.
Topvärdet (dvs till vilket värde du vill att räknaren skall räkna till) går även det att ställa in på en del AVRer.

Vilken AVR är det du pillar med?
laban12
Inlägg: 1199
Blev medlem: 17 april 2008, 16:01:56
Ort: Stockholm

Re: Jag förstår inte PWM i AVR asm *skäms*

Inlägg av laban12 »

Om vi lämnar databladets knasiga triangelvågor för tillfället och tittar på följande kodexempel som jag hittat, för att dimma upp en lysdiod:

Kod: Markera allt

UP1:		inc pw1					; Increase the pulse width
			out OCR1AL,pw1			; Output to CompareRegister1A which will set the puls width
			rcall delay				; Delay of 0.01s
			cpi pw1,255				; Check if pulse width is max
			brne UP1
			ret
Då räknar man alltså upp från 0d till 255d och jämför mot ett register... Det ger intrycket av att det skulle finnas 255 nivåer mellan 0d och 255d, men med åtta bitar kan man ju (väl) bara få åtta nivåer?
Alltså, man räknar från 0d till 7d och får output: 0000 0000b, 0000 0001b, 0000 0011b, 0000 0111b, etc.

??

EDIT: använder ATmega32 i det här fallet men jag misstänker att alla deras pwm fungerar i grunden lika.
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: Jag förstår inte PWM i AVR asm *skäms*

Inlägg av stekern »

Jag tror du missuppfattat lite hur man använder PWM'en.
Låt oss säga att du vill använda Timer2. (OCR1AL hör ju till en 16-bits timer)
Du gör så att du ställer in WGM21:0 så att du får en sån PWM som du vill ha, och efter det du sagt verkar det som du vill ha
fast PWM mode.
Alltså:
WGM21:0 = 3
Sen startar du timer2
Sen ställer du in pulslängden med OCR2
Sen kommer PWM'et automatiskt ut på OC2 (dvs PD7)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Jag förstår inte PWM i AVR asm *skäms*

Inlägg av sodjan »

> Alltså, man räknar från 0d till 7d och får output: 0000 0000b, 0000 0001b, 0000 0011b, 0000 0111b, etc.

Märkligt, varför skulle det fungera så ?
Det borde vara :

Alltså, man räknar från 0d till 255d och får output: 0000 0000b, 0000 0001b, 0000 0010b, 0000 0011b, etc.

D.v.s helt normal binär uppräkning.
laban12
Inlägg: 1199
Blev medlem: 17 april 2008, 16:01:56
Ort: Stockholm

Re: Jag förstår inte PWM i AVR asm *skäms*

Inlägg av laban12 »

Det som förvirrar mig är nog att jag endast bit-bangat PWM tidigare, dvs ladda register med pulsform (ex 0011 1111b) och shifta ut det en bit i taget på en port. ut, rotera, ut, rotera... 8 bitar.

Men här är alltså utgången hög så länge som räknaren räknar, upp till ocr2, och går sedan låg? Då får man ju faktiskt en mycket högre upplösning - om jag nu förstår det rätt?

Och PWM frekvensen blir 1/(tiden räknaren tar på sig att räkna 0d till 255d) ?

EDIT: så vad jag menar med att man räknar 0000 0001b till 0000 0011b är alltså egentligen sett som ett pulståg på EN pinne. Jag säger ju att jag är förvirrad! ;)
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: Jag förstår inte PWM i AVR asm *skäms*

Inlägg av stekern »

Jo, det verkar som du greppat det korrekt nu ;)
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: Jag förstår inte PWM i AVR asm *skäms*

Inlägg av vfr »

Det låter som en udda variant på bitbangad PWM. En mjukvaru-PWM fungerar egentligen på precis samma sätt som en i hårdvara. PWM-värdet är ett referensvärde där räknaren skall slå ifrån. Den räknar från 0 till maxvärde med så många bitar som finns tillgängliga. 0-255 för en 8-bitars. När då inställt värde uppnås så återställs utgången. Principen gäller både mjukvaru-PWM och hårdvaru-PWM.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Jag förstår inte PWM i AVR asm *skäms*

Inlägg av sodjan »

> Det som förvirrar mig är nog att jag endast bit-bangat PWM tidigare,

Det görs ju på exakt samma sätt (normalt, i alla fall :-) ).
Fast med kod istället för hårdvara...
bearing
Inlägg: 11677
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Jag förstår inte PWM i AVR asm *skäms*

Inlägg av bearing »

"Psuedokoden" för en PWM-modul är såhär:

Kod: Markera allt

for (counter = 0; counter < limit; counter++)
{
    if (counter < pulsewidth)
        pinne = 1;
    else
        pinne = 0;
}
Du laddar helt enkelt pulsewidth (alltså OCRXX) och lutar dig sedan tillbaka, njutandes av att få pulsbreddsmodulerad fyrkantsvåg på vald pinne.
laban12
Inlägg: 1199
Blev medlem: 17 april 2008, 16:01:56
Ort: Stockholm

Re: Jag förstår inte PWM i AVR asm *skäms*

Inlägg av laban12 »

Tack.

För att klargöra då, så att jag verkligen förstått ;)

1) Upplösningen på en 8bitars pwm är 255 olika nivåer?
2) PWM frekvensen är 1/(tiden för att räkna 0d till 255d) ?
bearing
Inlägg: 11677
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Jag förstår inte PWM i AVR asm *skäms*

Inlägg av bearing »

Nja, vissa har en ställbar övre gräns vilket kan minska antalet nivåer men öka frekvensen. 256 nivåer borde det bli som mest med 8 bitars upplösning.

Frekvensen blir: Klockfrekvens / Prescaler / (Övre gräns + 1).
laban12
Inlägg: 1199
Blev medlem: 17 april 2008, 16:01:56
Ort: Stockholm

Re: Jag förstår inte PWM i AVR asm *skäms*

Inlägg av laban12 »

Stort tack! Jag fattar inte att jag inte lyckades greppa det här på egen hand.

Men jag fastnade i mitt resonemang att timerns 8 bitar var som ett skiftregister som skiftade ut en bit i taget, och det skulle bli max 8 nivåer med 8 bitar.
Jaja... *hehe* Man kan inte kunna allt!! ;)
Skriv svar