Nieuws:

Kom gezellig een keertje bij jouw lokale Stichting 3rail Stamtafel lekker kletsen over treintjes en nog veel meer!

Het dimmen van leds met behulp van een microcontroller

Gestart door leendert maandag 01 november 2010, 13:30:07

0 leden en 1 gast bekijken dit board.
Het dimmen van leds met behulp van een microcontroller
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
Re:Het dimmen van leds met behulp van een microcontroller
Hoi Leendert,

Interessant verhaal, maar misschien hoort dit toch meer op "circuitsonline.net" thuis? (daar ben ik ook lid van, en heb zo'n vermoeden dat het daar beter past).

Temeer omdat je geen compleet project ter beschikking stelt met een werkende microprocessor / code / PCB. Dit gaat denk ik aan de meeste forumleden voorbij.

Dus uitdaging voor jou: maak een schema (vreemd dat dat mist), een pcb en stel je HEX file beschikbaar. Dan hebben andere er wat aan.

Groet Matthijs

Ps. Je vermeldt niet hoe de PWM freq. in te stellen is van buitenaf. UART? Of ADC?

Re:Het dimmen van leds met behulp van een microcontroller
Citaat van: matthijsfh op maandag 01 november 2010, 15:13:07
Hoi Leendert,

Interessant verhaal, maar misschien hoort dit toch meer op "circuitsonline.net" thuis? (daar ben ik ook lid van, en heb zo'n vermoeden dat het daar beter past).

Temeer omdat je geen compleet project ter beschikking stelt met een werkende microprocessor / code / PCB. Dit gaat denk ik aan de meeste forumleden voorbij.

Dus uitdaging voor jou: maak een schema (vreemd dat dat mist), een pcb en stel je HEX file beschikbaar. Dan hebben andere er wat aan.

Groet Matthijs

Ps. Je vermeldt niet hoe de PWM freq. in te stellen is van buitenaf. UART? Of ADC?



Matthijs,

Het verwijst naar de andere topics die al bij de electrotechniek staan. Die heb je kennelijk nog even gemist. Daar staan ook de schema's. En er valt geen PWM frequentie in te stellen, omdat het met bit amplitude werkt. Daarbij pakt de processor alle capaciteit die beschikbaar is en zo dus de maximale frequentie scoort. Niks instellen.

De hex files zijn ook beschikbaar, sterker nog voor menig forumlid heb ik al een microcontroller geprogrammeerd en opgestuurd  :D

Groet,
Leendert
Re:Het dimmen van leds met behulp van een microcontroller
wat dacht je ervan om een trimpotmeter aan een ADC ingang te hangen?
dan kan je hiermee de duty-cycle vav je PWM signaal bepalen.
(heb dit al gedaan bij AVR's, Hardware timer zorgt dat de processor amper belast wordt)

kan je geen printjes laten maken bij seeedstudio ofzo?
gelijk voor de bliksemflitsen.
mvg,
Re:Het dimmen van leds met behulp van een microcontroller
Ik vind het principe dat je de bit stroom omdraait erg leuk gevonden. Daarmee voorkom je dat je aan het einde van de kortste puls hoeft te schakelen en win je een factor twee in resolutie (of frequentie, die zijn uitwisselbaar). De reden dat ik nooit iets met BAM heb gedaan, is omdat je toch voor de minst significante bits, toch de snelheid moet hebben om heel kort te schakelen. Die minst significante bits zijn enorm belangrijk omdat het verschil tussen 0 en 1 op een schaal die tot 255 loopt, immens is. Wat je eigenlijk wilt is een nog veel grotere resolutie, die via een gamma curve wordt vertaald naar een schaal van 0-255. Dus 0->0, 1->1, 2->3, 3->6, 4->9, .... 255->65535 (bijvoorbeeld)

Overigens zou ik altijd voor PWM kiezen als de microcontroller dit als hardware peripheral aan biedt, en dat geldt eigenlijk wel voor de meeste zichzelf respecterende microcontrollers. En zelfs als je geen PWM in hardware hebt, kan je PWM in software doen met twee interrupts per cycle. Bij BAM heb je er acht nodig. Het probleem van de minst significante bits zal je dan anders moeten oplossen (bijvoorbeeld door het buiten interrupt context te doen) wat je met BAM er gratis bij krijgt.
Re:Het dimmen van leds met behulp van een microcontroller
Citaat van: Henk K op dinsdag 02 november 2010, 09:01:57
..  Die minst significante bits zijn enorm belangrijk omdat het verschil tussen 0 en 1 op een schaal die tot 255 loopt, immens is. Wat je eigenlijk wilt is een nog veel grotere resolutie, die via een gamma curve wordt vertaald naar een schaal van 0-255. Dus 0->0, 1->1, 2->3, 3->6, 4->9, .... 255->65535 (bijvoorbeeld)

Hi Henk,

Heerlijk, een kenner aan het woord! Ik ga hier nog even verder op induiken! Want ik had dit ook al geconstateerd. Ik dacht zelf nog iets te doen met een logarithmische schaal of zo. Maar dit klinkt veel beter. Thanks!

Omdat het maar hobby is, en vrije tijd toch geen geld kost :-) wil ik graag het maximale halen uit mijn 12F629. Die heeft al veel aan boord en ik heb er een berg printjes van liggen, dus voor de fun haal ik er alles uit wat er in zit. En nee, daar zit dus geen PWM in...
@gamesbond: de duty cycle instellen (vast) met een adc (die op de 629 overigens niet zit, wel weer op de 675, die pin compatibel is). Wat de bedoeling is, dat het faden automatisch gebeurt, bv in een doorlooptijd van 1 minuut voor de schemerfase van de dag/nacht schakeling.

Groet,
leendert
Re:Het dimmen van leds met behulp van een microcontroller
Citaat van: Henk K op dinsdag 02 november 2010, 09:01:57
Die minst significante bits zijn enorm belangrijk omdat het verschil tussen 0 en 1 op een schaal die tot 255 loopt, immens is. Wat je eigenlijk wilt is een nog veel grotere resolutie, die via een gamma curve wordt vertaald naar een schaal van 0-255. Dus 0->0, 1->1, 2->3, 3->6, 4->9, .... 255->65535 (bijvoorbeeld)

Kijk, dat is nou het leuke van het forum: er is zoveel kennis aanwezig, dat deze opmerking me enorm inspireerde, want ik vond 'mijn' regelbereik al wat mager. Kees gaf in een PB de formule aan output = input^2 gedeeld door 255. Daar krijg je dan een prachtige gamma curve van. En met wat puzzelen, lukt het me om deze formule in 10 instructies voor elkaar te krijgen, dus kost het ook vrijwel niets qua belasting van de MC. Gaat wellicht erg ver om die code hier neer te zetten, maar wie wil, laat maar weten. Hoe zo'n curve er uitziet, heb ik even in excel in een plaatje gezet.

Nu ben ik nog even bezig om in (een veelvoud van) 255 x waardes de waarde van het beginpunt naar het eindpunt vloeiend te laten verlopen. Dan kan ik bv in 15 seconde gelijdelijk van waarde 20 naar waarde 40. Dat lijkt verdacht veel op het tekeken (en berekenen) van een lijn, iets wat 'we' vroeger leerden op school als y=a.x +b. Ik heb gekozen om dit met een Bressenham algoritme te doen. Ook dit is eigenlijk best eenvoudig te implementeren in een MC. Ik had uit the good old days nog een routine liggen uit mijn 6502 microprocessor dagen.

Al met al begint het er zo behoorlijk op te lijken maar is het mede door de input hier nog veel beter aan het worden dan ik ooit had gedacht! Heerlijk zo'n forum.

Groet,
Leendert
Re:Het dimmen van leds met behulp van een microcontroller
Voor hen die dit allemaal erg theoretisch vonden, hierbij de link http://forum.3rail.nl/index.php?topic=17594.0 met de toepassing. Dat zegt vast veel meer.

Groet,
Leendert
Re:Het dimmen van leds met behulp van een microcontroller
Citaat van: leendert op zaterdag 04 december 2010, 22:53:42
Voor hen die dit allemaal erg theoretisch vonden, hierbij de link http://forum.3rail.nl/index.php?topic=17594.0 met de toepassing. Dat zegt vast veel meer.

Groet,
Leendert

Gelukkig dat er bij het andere topic ook een filmpje laat zien wat dit betekent.
Anders had ik er helemaal niets van begrepen! :roll: :wink:

Maar wel geweldig dat je dit met ons allemaal wilt delen, het resultaat is prachtig!

Vriendelijke groeten,
AlbertJan.
Re:Het dimmen van leds met behulp van een microcontroller
Hoi Leendert,

net als AlbertJan begrijp ik er ook geen snars van maar dit ziet er wel goed uit :D

Groetjes, John