Sida 3 av 5

Re: PWM-Kanaler AVR

Postat: 9 augusti 2009, 18:59:26
av sodjan
> Jag menade alltså Skiftregistrets 16 bitar.

Och vad snackar du om *nu* ??? Är det ett externt shiftregister ?
I så fall kan du helt och hållet glömma PWM modulerna i processorn...

Du rör till hela diskusionen väldigt mycket. Håll isär saker och ting och
var tydlig i dina frågor (som generellt är för "tunna" och ger för stora
möjlighter till feltolkining och missförstånd).

Antingen diskuterar vi att köra PWM mot utgångar i ett externt 16-bitars
shiftregister (så som tråden började). *Eller* så diskuterar vi hur den
interna PWM modulen i en AVR fungerar. Men rör inte ihop det, det är
två väldigt olika saker.

Re: PWM-Kanaler AVR

Postat: 9 augusti 2009, 19:18:56
av victor_passe
Gildebrand skrev:Jag har läst lite om BAM, det verkar ju som att det är mer lämpat för min applikation än PWM. Gissar på att det är svårare att få till också?
Nja, det beror på.
Hårdvaru PWM är lättare men mjukvaru PWM är ju typ samma som BAM i svårighet.

Jag slänger ihop någon C - interrupt rutin bara för att se hur det blir.

Kod: Markera allt

#define BAM_level 127 //50%
#define FREQ_CONSTANT 10000 //Bara något random värde, vad det blir får man ju räkna fram beroende på sin applikation.
unsigned short interrupt_cntr=0; //Räknare som räknar interrupterna.


void interrupt()
{
 if(BAM_level && 1<<interrupt_cntr) //Kolla om den aktuella biten är 1:a eller 0:a
 {
  BAM_pin=1;
 }
 else
 {
  BAM_pin=0;
 } 
 timer1.value=FREQ_CONSTANT/(2<<interrupt_cntr); //Antar att timern räknar ner.
 interrupt_cntr++;
 if(interrupt_cntr==8)interrupt_cntr=0; //Vi vill ju ha 8-bitars BAM
}

Re: PWM-Kanaler AVR

Postat: 9 augusti 2009, 19:41:22
av Gildebrand
Sodjan, hela tiden har jag snackat om ett externt skiftregister.

Re: PWM-Kanaler AVR

Postat: 9 augusti 2009, 19:47:50
av sodjan
OK, bra. Då kan vi för den här tråden i alla fall skippa frågorna kring AVR'ernas
PWM modul. Den är ju inte till någon hjälp i alla fall.

Hur som helst, vad är det för oklart kring att PWM'a utgångarna på ett externt
shiftregister ? Det är som sagt bara att "räkna på det". Hur snabbt måste du
uppdattera o.s.v för att få det antal utgångar du vill ha, den PWM upplösning
(antal "steg") som du vill ha samt den PWM frekvens som du vill ha. Det finns
tidigt i tråden några exempel kring detta.

Re: PWM-Kanaler AVR

Postat: 9 augusti 2009, 20:04:39
av Gildebrand
En ledmatris med 4 x 8 pixlar, varje pixel är RGB. 4*8*3 = 96
Jag vet att jag kommer vilja ha 14 Bitars upplösning, så då är det lika bra att jag räknar på det från början.

Maxfrekvensen för de flesta AVRer i ATMega serien är 20MHZ, eller hur?

Med PWM, om en utgång på det externa skiftregistret går till en färg i en diod, så det väl bli något sånt här. Det blir alltså lite svårt, om jag inte kopplar på något annat sätt.
(20 Mhz) / (96 * (2^14)) = 12.7156576 hertz

Med BAM borde det väl bli såhär
(150 khz) / (96 * 14) = 111.607143 hertz

Re: PWM-Kanaler AVR

Postat: 9 augusti 2009, 20:36:51
av victor_passe
Behöver du verkligen 14-bitars upplösning och inte 14 lägen?
Det är ju 16 tusen nivåer, det kan inte bli mycket synlig skillnad mellan stegen. Kanske i de lägsta 10%.

Och om du ska använda BAM kommer du inte kunna ändra intensitet mjukt.
Då behöver du köra MIBAM.
PWM=2^n
BAM=n
MIBAM=2n

Re: PWM-Kanaler AVR

Postat: 9 augusti 2009, 21:55:20
av E85
Det går inte räkna på maxfrekvensen för mikrokontrollern eftersom den inte klarar föra över datat så snabbt seriellt.

Re: PWM-Kanaler AVR

Postat: 9 augusti 2009, 22:14:58
av bearing
Kortaste möjliga bit-tid blir ju tiden det tar att föra över 16 bitar till shiftregistret. Blinkperioden blir 2^upplösning gånger den tiden. Snabbast möjliga överföringstid är 16 cykler. Då blir 14-bit-flimmerfrekvens: 20MHz / (16 * 2^14) = 76 Hz. Tiden för att beräkna en bit och föra över den är nog dock betydligt högre än 16 cykler, så jag tror inte det är möjligt med 14 bitars upplösning flimmerfritt.

EDIT: kom på att det var flera shiftregister, så antalet register måste ju med i nämnaren i formeln ovan.
Om detta dessutom är en matris måste väl även antalet rader i matrisen vara med i nämnaren?

Re: PWM-Kanaler AVR

Postat: 9 augusti 2009, 22:22:20
av sodjan
Jag vet inte riktigt hur du (Gildebrand) räknar, men jag skulle fundera så här...

Säg 100 Hz grundfrekvens på LED'arna (för att det inte ska blinka).

Dessa ska sedan ha ett pulsförhållande med ca 16.000 olika värden (alltså 2^14).

Det ger att varje LED måste kunna tändas/släckas med en upplösning på 100 x 16.000
gånger per sekund, eller ca 1.6 M gånger per sekund.

Så 1.6 M gånger per sekund så måste hela shiftregistret laddas om och "latchas". Eller om
man ser på varje bit i shiftregistret, så måste i snitt en ny bit laddas in ca 25 M gånger
per sekund (med ett shiftregister på 16 bitar, 1.6 x 16).

Om vi räknar lågt med att det skulle kunna gå på 4 instruktioner/bit, så får vi att du
måste köra processorn med minst 100 MIPS för att klara detta i programvaran.

Ett sådant överslag ger ju ganska tydligt att du knappast har fart nog i en AVR för att
köra programvaru PWM på 16 dioder med 14 bitars.

Eller var det 96 LEDs som det handlar om ? Tja, då kan du ju bara räkna om
ovanstående med "96" istället för "16" och det blir än mer orimligt...

Bearing har ungefär samma resultat, men räknar med att det ska räcka med 16
cykler för att överföra alla 16 bitarna, hur nu det ska gå till med att sätta datalinjen
och toggla klocklinjen för varje bit...

Re: PWM-Kanaler AVR

Postat: 9 augusti 2009, 22:34:30
av bearing
Jag tänkte att seriemodulen (Universal Serial Interface (USI) tror jag den heter på AVR) som kan används för att kommunicera med i2c eller SPI skulle kunna användas för att ladda registrena.
Gildebrand skrev:En ledmatris med 4 x 8 pixlar, varje pixel är RGB
Det borde väl räcka med 4*3 + 8 = 20 utgångar? En vanlig 28-pinnars borde alltså räcka.
EDIT: Om modulen är kopplad på annat vis så krävs 8*3 + 4 = 28 utgångar.

Re: PWM-Kanaler AVR

Postat: 9 augusti 2009, 22:39:43
av Gildebrand
bearing, hur kopplar jag då?

Re: PWM-Kanaler AVR

Postat: 9 augusti 2009, 22:40:46
av sodjan
> Jag tänkte att seriemodulen

Finns ingen information om att "shiftregistret" är kompatibelt med I2C eller SPI.
Det kanske det är, men det är inget jag förutsatte.

Sen verkar du räkna med multiplexning. PWM hanteringen är svårt nog redan... :-)

Nej, ska man ha den graden av upplösning (d.v.s *14* bitar på varje färg i RGB !?)
så krävs det säkert helt andra lösningar. Någon dedikerad hårdvara som laddas med
"färgvärden" från AVR'en och sedan sköter PWM hanteringen. Antingen någon de
färdiga drivkretsarna från t.ex Maxim eller någon egen lösning.

Det som är lite märkligt i det hela är varför det behövs 14 bitars upplösning
på varje RGB färg...

Re: PWM-Kanaler AVR

Postat: 9 augusti 2009, 22:50:57
av bearing
Jag vet inte hur den här matrisen är kopplad, men matriserna brukar väl vara kopplade så att dom måste multiplexas?
Alltså att det bara finns anslutning till rad och kolumn och inte två egna ben för varje LED.
Gildebrand skrev:bearing, hur kopplar jag då?
Enligt den här principen:
http://www.winpicprog.co.uk/graphics/led_matrix.gif

Med några latchar(?) behövs färra utgångar.
http://www.ke4nyv.com/picoctal.jpg

Re: PWM-Kanaler AVR

Postat: 9 augusti 2009, 22:55:33
av sodjan
> ...men matriserna brukar väl vara kopplade...

Det vet vi inte ett smack om i det här fallet.. Har det framgått att det är en av de där
vanliga matriserna som man kan köpa ? Eller om det är något hemmasnickrat med direkt
drivning till varje LED (så har jag tolkat det) ?

Men som sagt, ska det även multiplexas förrutom PWM så blir det knappast enklare...

Re: PWM-Kanaler AVR

Postat: 9 augusti 2009, 23:05:47
av Gildebrand
Jag är inte säker på att det behövs så mycket som 14 bitar, men jag vill inte att man ska se stegen när man gör långsamma förändringar vid låga värden.

Och du skrev ju, sodjan, att en AVR inte skulle klara av att hantera 14 bitar PWM för såpass många "kanaler", men vad skulle problemet med att köra BAM eller MIBAM vara? Det kräver ju 3% utav prestandan som PWM kräver.

Jag kör inte med multiplex, tänkte att det bara skulle krångla till det ytterligare

Varje LED drivs alltså direkt

Hittade den här fina sidan om MIBAM, tyvärr hade de bara kod för PIC men var intressant ändå.