Stap 4: controle?
Ik wilde een algoritme van de Vermogenssturing generieke genoeg voor het verwerken van patronen/sequenties en ook controleren, de helderheid en kleur van de LED.
Controle van de LEDs heb ik te sturen naar het MCP23016 één frame van 4bytes (1 byte = 8-bits). Één byte met het adres van de correspondent van de IC naar de kleur, 1 byte met de opdracht 'schrijven' en 2 bytes met de waarde van de 16bits (LED's). De IC is aangesloten op de LEDs als "sink", wat betekent, een logische waarde 0 op de pin brandt de LED.
En nu het uitdagende deel, hoe maak je PWM controle voor 48 LEDs?
Let's studie PWM voor één LED! PWM uitgelegd @ Wikipedia.
Als ik wil de helderheid van de LED op 50%, is mijn PWM-waarde 50%. Dit betekent dat de LED, in een periode van tijd, moet op de zelfde hoeveelheid als vrije tijd.
Laten we eens een periode van 1 seconde. PWM van 50% betekent dat in deze 1 seconde, het op tijd 0,5 seconden is en de weg 0,5 seconden is. PWM 80%? 0,2 seconden af, 0.8 seconden op!
Makkelijk, toch?
In de digitale wereld: met periode van 10 klokcycli, 50% betekent dat voor 5 cycli van de LED brandt, en voor een ander 5 cycli de LED is uitgeschakeld. 20%? 2 cycli op, 8 cycli af. 45%? Nou, we kunnen niet echt krijg 45%... Aangezien de periode in cycli is en we slechts 10 cycli hebben, kunnen we alleen het indelen van de PWM in stappen van 10%.
Dit houdt de evolutie van de pin moet zijn, voor 50%: 1,1,1,1,1,0,0,0,0,0; Of zelfs 1,0,1,0,1,0,1,0,1,0;
In de programmering kunnen we deze opeenvolging van het op en uitschakelen van een matrix. Waren dat de cyclus is voor elke cyclus die we uitvoer naar de PIN-code de waarde van de index.
Ik zinvol tot nu toe?
Als we willen LED0 50%, en LED1 20%, kunnen we het toevoegen van beide arrays.
Voor het besturen van de LED0 pin: 1,1,1,1,1,0,0,0,0,0;
Voor het besturen van de LED1 pin: 2,2,0,0,0,0,0,0,0,0;
Resulterend in LED0 + LED0: 3,3,1,1,1,0,0,0,0,0;
Outputing deze volgorde van de nummers in de haven expander IC, we zouden de LED0 met 50% helderheid en LED1 krijgen met 20%!
Eenvoudig voor 2 LEDs, recht? Nu hebben we te maken dit for 16 LEDs, voor elke kleur!
Voor elk van deze matrices hebben we een combinatie van helderheid voor elke kleur (16 LEDs)
Elke keer als we willen dat een andere combinatie van kleuren, moeten we veranderen van deze array.