Helt rätt men efter vad jag kan förstå av TS's beskrivning av sina programmeringskundskaper blir det problem...
Men funktionen som sådan är ganska enkel:
- I minnet ska det finnas 3 variabler som beskriver tiden lampa A, B & C ska lysa. Dessa kallar jag Lamptid[x] där X kan vara 0-3. Just att det är 4 värden återkommer jag till, det är egentligen fel men är ett litet programmeringstrick.
- I Timer-ISR'n lägger man en statisk variabel som används för att räkna tid (Lamp_Timer). Man behöver även en statisk indexeringsvariabel (Lamp_Index) i BYTE-storlek (eller uint_8).
- Starta en timerinterrupt med lagom frekvens.
- I Timer-ISR'n kollas det:
Kod: Markera allt
const BYTE Lamp_Bits[] = {0x01, 0x02, 0x04, 0x00}; // De binära mönster frö lamporna, sista MÅSTE vara "alla av"!!!
if(Lamp_Timer) Lamp_Timer--;
else
{
if(++Lamp_Index >= sizeof(Lamp_Bits)) Lamp_Index = 0; // Räkna de 4 tider eller hur många lampor man vill styra
// Nu ska rätt lampa slås på, om alla är kopplade på samma port brukar jag använda en tabell eller liknande.
// OBS: Vid Lamp_Index == 3 ska INGEN lampa tändas, då ska alla släckas!
Lamp_Timer = Lamptid[Lamp_Index];
if(Lamp_Timer) Lamp_Port = Lamp_Bits[Lamp_Index]; // Ett enkelt sätt att slå på och av lamporna
else Lamp_Port = Lamp_Bits[sizeof(Lamp_Bits) - 1]; // Ingen tid här, stäng av helt!
}
Då är Timer-ISR'n klar med sin del.
När man sedan ställer styrkan mellan de olika lampor använder man dels förhållandet mellan deras värde SAMT det extra värde som anges i Lamptid[].
Ser man till att styra deras inbördes förhållanden och har en timer-interrupt som går snabbt nog har man inget blinkande, deras belysning är alltid sekventiell så de inte drar dubbel ström och själva intensiteten kan aldrig överstiga 100%.
Det är skrivit utan större eftertanke, rent omedelbart kan man inte stänga ner någon lampa alls, de kommer MINST att lysa en timer-period per PWM-cykel men man kan ta bort det om man vill. EDIT: ändrade så de kan släckas helt.
Om Lamptid[0] == Lamptid[1] == Lamptid[2] kommer alla 3 lampor att lysa lika kraftigt, deras totala effekt kan justeras vid att justera Lamptid[3] i förhållanden till de andra. Är alla 4 tider långa kommer PWM-frekvensen att gå ner och det vill man inte under en viss gräns iaf. så man kan ju säga att det ska finnas en konstant som avgör en del:
Konstant_X
Följande regler gäller:
- Lamptid[0] + Lamptid[1] + Lamptid[2] <= Konstant_X. Alltid!
- Lamptid[3] = Konstant_X - (Lamptid[0] + Lamptid[1] + Lamptid[2])
Vill man ha 100Hz PWM-frekvens och kunde ställa intensiteten i steg om 5% blir det alltså till följande:
- Timer-interrupt frekvens ska vara 2.300Hz
- Konstant_X ska vara 20