Sida 1 av 1
Jag förstår inte PWM i AVR asm *skäms*
Postat: 7 januari 2009, 13:13:04
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!

Re: Jag förstår inte PWM i AVR asm *skäms*
Postat: 7 januari 2009, 13:17:28
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!
Re: Jag förstår inte PWM i AVR asm *skäms*
Postat: 7 januari 2009, 13:20:48
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?
Re: Jag förstår inte PWM i AVR asm *skäms*
Postat: 7 januari 2009, 13:24:24
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.
Re: Jag förstår inte PWM i AVR asm *skäms*
Postat: 7 januari 2009, 13:37:46
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)
Re: Jag förstår inte PWM i AVR asm *skäms*
Postat: 7 januari 2009, 13:40:23
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.
Re: Jag förstår inte PWM i AVR asm *skäms*
Postat: 7 januari 2009, 13:43:47
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!

Re: Jag förstår inte PWM i AVR asm *skäms*
Postat: 7 januari 2009, 13:47:29
av stekern
Jo, det verkar som du greppat det korrekt nu

Re: Jag förstår inte PWM i AVR asm *skäms*
Postat: 7 januari 2009, 13:47:53
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.
Re: Jag förstår inte PWM i AVR asm *skäms*
Postat: 7 januari 2009, 13:51:01
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...
Re: Jag förstår inte PWM i AVR asm *skäms*
Postat: 7 januari 2009, 13:52:29
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.
Re: Jag förstår inte PWM i AVR asm *skäms*
Postat: 7 januari 2009, 14:09:36
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) ?
Re: Jag förstår inte PWM i AVR asm *skäms*
Postat: 7 januari 2009, 14:34:37
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).
Re: Jag förstår inte PWM i AVR asm *skäms*
Postat: 7 januari 2009, 15:21:37
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!!
