Minsta switch frekvens på LED-array???
Minsta switch frekvens på LED-array???
Jag har en liten LED-array (6 x 4) som jag har kopplat till en PIC och skall switcha dem.
Jag tänder 4 LEDs åt gången som sitter i en kolunm, vilket innebär att jag har 6 rader som tänds en åt gången efter varandra.
Nu vill jag switcha dessa med så lågfast frekvens som möjligt utan att de blinkar för männskliga ögat och ändå kunda ändra deras ljusstyrka genom att ändra duty cycle.
Anledningen till varför jag vill ha en lågfastfrekvens är för att det är viktigt att tiden är lika lång oberoende av ljusstyrka på LED och att det skall vara strömsnålt (Kommer troligtvis att köras på batteri!). Samt att imellan switchningarna så kommer PICen att göra andra grejor i processorn.
Tanken är att man skall kunna välja tre olika ljusstyrker på LED-arrayn de är enligt följande: Lyser starkt, Normal och Svagt!
/
Jeppsson
Jag tänder 4 LEDs åt gången som sitter i en kolunm, vilket innebär att jag har 6 rader som tänds en åt gången efter varandra.
Nu vill jag switcha dessa med så lågfast frekvens som möjligt utan att de blinkar för männskliga ögat och ändå kunda ändra deras ljusstyrka genom att ändra duty cycle.
Anledningen till varför jag vill ha en lågfastfrekvens är för att det är viktigt att tiden är lika lång oberoende av ljusstyrka på LED och att det skall vara strömsnålt (Kommer troligtvis att köras på batteri!). Samt att imellan switchningarna så kommer PICen att göra andra grejor i processorn.
Tanken är att man skall kunna välja tre olika ljusstyrker på LED-arrayn de är enligt följande: Lyser starkt, Normal och Svagt!
/
Jeppsson
Frekvensen där man upplever blinkandet som störande är även
till viss del beroende på hur "snabbt" det som blinkar är.
T.ex en vanlig glödlampa (som är rellativt långsam) är OK för
de flesta även vid 50 Hz. För LED däremot (som är väldigt snabb
i jämförelse) måste man upp längre. Allt mellan 60 och 100 Hz
anges beroende på vem man frågar.
Men, det intressanta i *ditt* fall, är att *strömförbrukningen* har väldigt
lite med multiplexfrekvensen att göra. Genomsnittsförbrukningen
blir densamma oavsett hur snabbt/långsamt du växlar diod(er).
*Pulsbredden* (dutycycle) däremot påverkar både upplevd ljusstyrka och
strömförbruknigen direkt. Och den (pulsbredden) är i princip oberoende av
multiplexfrekvensen...
Det ända som vore intressant var om du tänkte lägga processorn
i "sleep" mellan varje byte av diod(er), men det lät inte så.
Betydligt viktigre är att välja s.k högeffektiva LED's som ger bra med
ljus redan vid en eller ett par mA.
Om vi säger 100 Hz och 6 rader, så behöver du byta rad med 600 Hz, eller
att varje rad kommer att vara "on" under ca 1.6 ms. Sedan skall dioderna
släckas efter ett variabel tid mellan 0 och 1.6 ms beroende på vilken
ljusstyrka som önskas.
Eftersom du bara vill ha tre ljusstyrkor blir det ingen avancerad matematik.
Du kan t.ex ha alternativen 1.6/0, 1.0/0.6, 0.4/1.2 (tänd/släckt). Sedan
räknar man om detta till timer värden och kör. Timer ISR'en får sedan
hålla redan på vilken rad och vilen "fas" (tänd eller släckt) som den just
passerade tiden var avsedd för, samt vilket nytt värde som timern ska
laddas med.
till viss del beroende på hur "snabbt" det som blinkar är.
T.ex en vanlig glödlampa (som är rellativt långsam) är OK för
de flesta även vid 50 Hz. För LED däremot (som är väldigt snabb
i jämförelse) måste man upp längre. Allt mellan 60 och 100 Hz
anges beroende på vem man frågar.
Men, det intressanta i *ditt* fall, är att *strömförbrukningen* har väldigt
lite med multiplexfrekvensen att göra. Genomsnittsförbrukningen
blir densamma oavsett hur snabbt/långsamt du växlar diod(er).
*Pulsbredden* (dutycycle) däremot påverkar både upplevd ljusstyrka och
strömförbruknigen direkt. Och den (pulsbredden) är i princip oberoende av
multiplexfrekvensen...
Det ända som vore intressant var om du tänkte lägga processorn
i "sleep" mellan varje byte av diod(er), men det lät inte så.
Betydligt viktigre är att välja s.k högeffektiva LED's som ger bra med
ljus redan vid en eller ett par mA.
Om vi säger 100 Hz och 6 rader, så behöver du byta rad med 600 Hz, eller
att varje rad kommer att vara "on" under ca 1.6 ms. Sedan skall dioderna
släckas efter ett variabel tid mellan 0 och 1.6 ms beroende på vilken
ljusstyrka som önskas.
Eftersom du bara vill ha tre ljusstyrkor blir det ingen avancerad matematik.
Du kan t.ex ha alternativen 1.6/0, 1.0/0.6, 0.4/1.2 (tänd/släckt). Sedan
räknar man om detta till timer värden och kör. Timer ISR'en får sedan
hålla redan på vilken rad och vilen "fas" (tänd eller släckt) som den just
passerade tiden var avsedd för, samt vilket nytt värde som timern ska
laddas med.
Tackar så mycket för all hjälp om någon har något mer att tilllägga så är det välkommet...
Självklart kan man lägga processorn i "sleep mode" under delar av tiden, vet inte än hur processorkrävande uträkningarna mellan tända arrayn kommer att vara...
En annan fråga som jag har inom detta projektet är angående PIC Assembler programmering.
Kan man på något sätt förvara och ändra i en variabel vilket ben man vill skriva ut på? Något liknande mitt exempel nedan?
Variabelen heter "ben" i mitt exempel.
Jag har problem att få detta att fungera... Är det någon som kan hjälpa mig med en bra lösning eller har andra förslag på hur jag kan göra detta med så lite kod som möjligt?
/
Jeppsson
Självklart kan man lägga processorn i "sleep mode" under delar av tiden, vet inte än hur processorkrävande uträkningarna mellan tända arrayn kommer att vara...
En annan fråga som jag har inom detta projektet är angående PIC Assembler programmering.
Kan man på något sätt förvara och ändra i en variabel vilket ben man vill skriva ut på? Något liknande mitt exempel nedan?
Variabelen heter "ben" i mitt exempel.
Kod: Markera allt
movlw h'00' ;Skriv ut på kolumn 1 som ligger på RA0
call print
movlw h'03' ;Skrivut på kolumn 2 som ligger på RA3
call print
movlw h'02' ;Skrivut på kolumn 3 som ligger på RA2
call print
movlw h'01' ;Skrivut på kolumn 4 som ligger på RA1
call print
osv...
Annan kod
; *** Subrutinen Print ***
print
movwf ben
bsf PORTA,ben
"delay rutin"
bcf PORTA,ben
"delay rutin"
return
/
Jeppsson
Om man går ett steg längre med användandet av iorwf så kan det bli så här.
Otestad kod för Pic16.
sodjan, En glödlampa som drivs med 50Hz växelström blinkar med 100Hz.
[EDIT] Och nu kommer sodjan svara att han inte syftade på en 230V-glödlampa med 50Hz växelström utan en glödlampa med en blinkfrekvens på 50Hz.
Otestad kod för Pic16.
Kod: Markera allt
movlw 1 ;Första benet längst till höger
movwf Ben
movlw 6 ;6st ben
movwf Counter
Loopa:
movf Ben,w
iorwf PORTA ;Sätt utgång till 1
"delay rutin"
comf Ben,w
andwf PORTA ;Sätt utgång till 0
"delay rutin"
bcf STATUS,C ;Clear Carry
rlf Ben ;Välj nästa ben
decfsz Counter
goto Loopa
[EDIT] Och nu kommer sodjan svara att han inte syftade på en 230V-glödlampa med 50Hz växelström utan en glödlampa med en blinkfrekvens på 50Hz.
Ingenstans där en "literal" är parameter till en instruktion kan en "variabel" användas istället. T.ex för BCF/BSF. Bitnummer lagras fast i instruktionen
vid assembleringen. Går att komma runt med t.ex olika OR/AND instruktioner
som Chribbe76 föreslår.
Exakt hur beror lite på vilket "problem" som det ska lösa.
OK, 100 Hz då...
vid assembleringen. Går att komma runt med t.ex olika OR/AND instruktioner
som Chribbe76 föreslår.
Exakt hur beror lite på vilket "problem" som det ska lösa.
OK, 100 Hz då...

Appro på duty cycle...
Om jag kör med en LED som vill har 20mA vid normal användning och 5 volt så blir serie motståndet på 25 ohm.
Sen med tanke på att jag kommer att switch fram 6 rader så kommer aldrig duty cyclen att komma upp på 100% för den enskillde LEDen. Kan man då istället köra med ett lägre motsånd för att få LEDen att lysa starkare utan att förstöra den?
Men en helt annan sak är att PICen inte kan lämna mer än 25mA per ben!?
Om jag kör med en LED som vill har 20mA vid normal användning och 5 volt så blir serie motståndet på 25 ohm.
Sen med tanke på att jag kommer att switch fram 6 rader så kommer aldrig duty cyclen att komma upp på 100% för den enskillde LEDen. Kan man då istället köra med ett lägre motsånd för att få LEDen att lysa starkare utan att förstöra den?
Men en helt annan sak är att PICen inte kan lämna mer än 25mA per ben!?

Ja, man kan ha lägre resistans för att få högre ljus-styrka men 25 Ohm måste vara felräknat?
Hur mycket mer ström en lysdiod tål är olika, 4X max ström klarar nog alla lysdioder.
Jag tror att medel-strömmen bör ligga en bra bit under led'ens specade max-ström när man muxar, typ 15mA istället för 20mA.
Tänk på att ett fel i programmet/hängning kan bränna dina lysdioder (jodå, det har jag provat).
Om du skaffar bra lysdioder (kan vara svårt att veta vilka som är bra) så behövs det inte mer än en medel-ström på 5mA för hyffsat starkt ljus.
Hur mycket mer ström en lysdiod tål är olika, 4X max ström klarar nog alla lysdioder.
Jag tror att medel-strömmen bör ligga en bra bit under led'ens specade max-ström när man muxar, typ 15mA istället för 20mA.
Tänk på att ett fel i programmet/hängning kan bränna dina lysdioder (jodå, det har jag provat).
Om du skaffar bra lysdioder (kan vara svårt att veta vilka som är bra) så behövs det inte mer än en medel-ström på 5mA för hyffsat starkt ljus.
Självklart så menar jag 250 ohm glömde en nollaChribbe76 skrev:Ja, man kan ha lägre resistans för att få högre ljus-styrka men 25 Ohm måste vara felräknat?

Det kommer att vara röda ytmonterade 0805 LEDar som jag skall använda i arrayn, troligtvis så köper jag dem från Elfa då jag skall ha lite andra grejor från dem oxå...
Men vilka LEDar som jag skall köpa är än inte bestämt, kom gärna med förslag! (Finns inte så många att välja på)
Jag har nog inte nämnt det men det är en PIC16F648A som jag kommer att kör med.
En dump från databladet.

Med tanke på att jag bara matar 4 LEDar (max 4 * 25 = 100mA) åt gången och väljer kolumn via en transistor så borde jag inte kunna komma upp i skadliga värde för PICen (max 200mA för både PORTA och PORTB samtidigt).
En dump från databladet.
Med tanke på att jag bara matar 4 LEDar (max 4 * 25 = 100mA) åt gången och väljer kolumn via en transistor så borde jag inte kunna komma upp i skadliga värde för PICen (max 200mA för både PORTA och PORTB samtidigt).
Bra val med ytmonterade LED!Jeppsson skrev:Det kommer att vara röda ytmonterade 0805 LEDar som jag skall använda i arrayn, troligtvis så köper jag dem från Elfa då jag skall ha lite andra grejor från dem oxå...
Men vilka LEDar som jag skall köpa är än inte bestämt, kom gärna med förslag! (Finns inte så många att välja på)

Då slipper du nämligen misstaget att du köper "högintensiva" (hålmonterade) lysdioder, vilket oftast innebär att de har väldigt smal strålningsvnkel. Detta vill du ju inte ha om du bygger en array som ska visa grafik som du vill att folk ska se. Ytmonterade lysdioder har nämligen oftast stor strålningsvikel, de flesta kan man se lysa tydligt rakt från sidan! Iom den höga strålningsvinkeln så följer det att de har mycket lägre ljusintensitet (mätt i mCd). Bli inte lurad av detta, det totala ljusflödet är nog så stort ändå jämört med en hålmonterad superduper-intensiv LED.
Appropå switchfrekvens. 60 Hz tycker jag är i minsta laget. 100 Hz är bekvämt att titta på. Tänk på att periferiseendet är mycket känsligare för flimmer än vad direktseendet är!