Eigenlijk ben ik al een poosje bezig om een goede regeling te maken voor het dimmen van leds. Hier even kort een samenvatting van wat ik tot nu toe bij elkaar heb gekregen.
Wat is het probleem bij het dimmen van een led
In eerste instantie lijkt het dimmen van een led niet zo moeilijk: met een voorschakelweerstand die varieert in waarde wordt de overeenkomstige lichtopbrengst geregeld.
Het nadeel is echter dat een led geen gloeilamp is, en zich ook niet zo vloeiend laat regelen. Dus bij een kleine variatie is al een enorm effect.
Via pusbreedte modulatie (PWM)
Beperken we ons niet tot de passieve elektronica, dan zijn er al meer mogelijkheden. Een van die dingen is pulsbreedte. Het principe is stuur een blokgolf met een vaste frequentie, maar varieer de aan/uit tijd (duty cycle). Daarmee is de LED een deel van de tijd aan en een deel van de tijd uit. De verhouding tussen beide, bepaalt dan de lichtopbrengst. Een tamelijk hoge frequentie is wel nodig, omdat je anders een ongewenst knipper effect krijgt.
In de praktijk laat het geheel zich regelen tussen de 2% en de 98%. Je kunt de led iets zwaarder belasten (= meer stroom door heen laten stromen) om kunstmatig op de 100% uit te komen. Want omdat de led bij 98% ook 2% uit is, heeft deze even de tijd om af te koelen.
Ik heb een poging gedaan om een goede PWM routine te maken voor de micro controller die ik gebruik, maar ben er niet zo tevreden over. Want het blijkt dat voor het fade toch echt de 0% en verder een veel beter resultaat geeft, dan pas starten bij 2%. Zeker met leds waar al heel veel mcd?s uit komen, is 2% gewoon al veel licht. Omdat je een hoge frequentie nodig hebt, is de micro controller ook heel hard bezig, en heeft dus niet veel tijd over voor andere dingen. Voor mij een nadeel. Kortom: voor mij viel het af.
Natuurlijk had ik allerlei kunsten uit kunnen halen, maar ik vond het wel de sport om met de bestaande controller en de printjes die ik heb toch een goede regeling te maken. Dus verder op mijn zoektocht.
Bit Amplitude Modulatie
Een ietwat onbekende vorm is bitamplitude modulatie. Een variant op pulscode modulatie. Het eenvoudige idee is dat je niet de constante hebt in de aan/uit verhouding, maar dat je een weging maakt in de verhouding. Dus als je de regeling in 8 bits opknipt (bits 8-1) heeft bit 8 de helft van de tijd, bit 7 een kwart van de tijd etc. tot je bij bit 1 bent. Bij de kleinste waarde hoort dan de kortste aan tijd. Tel je op: een half, een kwart, een achtste etc. kom je precies weer op 1 uit. En dat is dan ook de kracht: je hebt nu een regeling die van vrijwel 0% tot 100% loopt. De grap is dat je de led een pulstrein aanbiedt met daarin de overeenkomstige waarden van de intensiteit. Deze worden in serie aangeboden. Een de kleinste waarde zal dan dus 000.0001 zijn, de hoogste waarde 1111.1111. De waarde 3, zal dan bestaan uit waarde twee en waarde een, dus 000.0011.
Waarom maakt het efficiƫnter gebruik van de beschikbare tijd van de micro controller
Stel dat je een PWM signaal hebt van 100 Hz. Dat betekent dat je ieder stukje van die 100 Hz in aan/uit tijd in 256 stukjes op moet knippen. Dus iedere 39 uSec iets moet doen. Dat is veel! Bij een vergelijkbare oplossing met bit amplitude modulatie heb je alleen voor de kortste cycle 39 uSec nodig, voor nummer 2 is dat al 78 uSec, voor drie 156, voor vier 625, voor vijf 1250 voor zes 2500 en voor zeven 5000 uSec. Dat geeft dus een reductie van ruimt 800% in belasting! Met andere woorden: de micro controller heeft veel tijd over om nog andere dingen te doen.
Een ander bijkomend voordeel is, dat je geen vaste frequentie hebt bij BAM, zoals je dat wel bij PWM hebt. Voor onze hobby niet echt van belang, maar bijvoorbeeld bij het dimmen van led verlichting in industrie omgeving met draaiend materiaal (draailbanken etc.) kan je bij PWM nog last hebben van ?stilstaande werkstukken? terwijl dat bij BAM niet het geval is.
Te mooi om waar zijn?
Nou is dit geen verkoopverhaal, want er valt niks te verkopen. Het probeert alleen wat inzicht te geven in hoe het werkt en op welke manier je met bestaande middelen het maximale haalt uit de spullen die je al hebt. Nadelen zijn er eigenlijk niet. De software is iets ingewikkelder dan die van PWM, maar ook niet heel veel. En als de software eenmaal werkt, dan is deze factor ook niet meer van belang
De software
Het principe is erg simpel. Een micro controller heeft van alles aan boord, zo ook een aantal timers. Ik maak gebruik van Timer 1, dat is een 16 bit timer, dus ruim genoeg voor alle standen van de aansturing. De timer werkt als volgt: vul hem met een waarde en hij begint met aftellen. Zodra hij bij 0 komt, geeft hij een interrupt af. In het afhandelen van interrupt wordt de volgende waarde (die dus 2 x zo hoog is) geladen en vervolgens gaat dat dan zo door, totdat de 8 bereikt is. Steeds wordt de overeenkomstige waarde van de bit op de uitgang gezet. Dat is alles!
In de hoofdlus kan elke waarde tussen de 0 en 255 in de variabele gezet die voor uitgang 1-3 gereserveerd zijn. Vervolgens zorgt de IRQ handler helemaal zelfstandig voor het afhandelen van het dimmen van de LED. Dat maakt het gebruik erg eenvoudig.
Nu nog wat kunstjes
Om het geheel nog effectiever te maken, schuif ik in de software eerst van hoog naar laag en dan van laag naar hoog. Met andere woorden: dan is de waarde van het laagste bit 2 x direct achter elkaar aan de beurt. In woorden ziet de bitstroom er dan als volgt uit: 8765432112345678 en is het byte waarde de dimwaarde in staat dus 2 x aan de uitgang gepresenteerd. Omdat er twee keer hetzelfde bit opgestuurd wordt, is er dan wat optimalisatie mogelijk: geef niet 2 x 1 interrupt, maar gebruik de tijd effectiever, zodat er een nog hogere frequentie gebruikt kan worden. Met deze truuc lukt het om een ogenschijnlijke afhandeling te krijgen van 15 uSec. De totale periode is dan 3825 uSec, wat overeenkomt met een frequentie van zo?n 260 Hz. Ik stuur dan 3 uitgangen individueel aan.
De regeling loopt van 0-100% met een stapgrootte van 0,39% (dat komt overeen met 1 gedeeld door 255, wat de resolutie is van de aansturing).
Al me al ben ik nu wel tevreden met hoe de aansturing verloopt.
En waar is dit alles goed voor
Goede vraag. Ik gebruik deze schakeling voor het nabootsen van het gloeien van het materiaal in het ?bosbrand? gebied op mijn baan. En voor de dag/nacht schakeling, waarbij het daglicht ?over fade? via het avondrood, naar de nacht.
En dan nu geen woorden, maar plaatjes
Hier het beeld van de scope, met daarop de aansturing. Wat je ziet is de drie uitgangen 0, 1 en 2. Daarop staat een intensiteit van resp. 126, 1 en 170. Dat komt overeen met resp. 01111110, 00000001 en 10101010. Dat is wat je op de bovenste 3 lijnen ziet. Je ziet dan tevens ook de symmetrie die er inzit. De onderste regel, die verbonden is met de GP4 uitgang, wordt gebruikt om de scope te triggeren. Bij het starten van elke cyclus wordt op deze uitgang even een puls gegeven, om zo het beeld stil te krijgen.
Binnenkort ook nog een filmpje met de schakeling van de dag nacht verlichting.
Heeft het ook zin voor gloeilampjes en motorregelingen?
Nee, dat niet. De verlichtingscurve van een gloeilamp is niet erg lineair dus het aansturen daarvan hoeft ook niet lineair te gebeuren. Bij een aansturing van 0,39% gebeurt er echt helemaal niets, maar 0,39% van 15.000 Mcd van een led is altijd nog altijd bijna 600 Mcd..
Voor motoren ligt het nog weer een beetje anders: daar biedt PWM de kracht omdat die zich via de duty cycle aanbiedt. Zou je daar BAM voor gebruiken, dan draait de motor wel, maar is er weinig kracht (koppel) meer over.
Al met al misschien best wel een ietwat hoogdravend stukje, wat niet voor iedereen even toegankelijk is. Maar ach, als is er maar iemand die er iets aan heeft, dan is het al mooi?
Groet,
Leendert