Styra flera 100W LED och "mixa" ljuset till max 100W totalt

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
Användarvisningsbild
007sweden
Inlägg: 3500
Blev medlem: 3 mars 2005, 20:18:12
Skype: oo7sweden

Re: Styra flera 100W LED och "mixa" ljuset till max 100W tot

Inlägg av 007sweden »

Icecap: Kolla gärna upp Arduino UNO'n innan du antar saker, av vad jag förstått så finns det 6 pinnar man indeviduellt kan ställa PWM, De 6 pinnarna styrs av 3st timer-moduler med 2 utgångar vardera. Länk till UNO'n.

Funktionen som är vanligast att använda är analogWrite().

Följande saxningar och exempelkod är från den sidan.
The frequency of the PWM signal is approximately 490 Hz.

Kod: Markera allt

Sets the output to the LED proportional to the value read from the potentiometer.

 
int ledPin = 9;      // LED connected to digital pin 9
int analogPin = 3;   // potentiometer connected to analog pin 3
int val = 0;         // variable to store the read value

void setup()
{
  pinMode(ledPin, OUTPUT);   // sets the pin as output
}

void loop()
{
  val = analogRead(analogPin);   // read the input pin
  analogWrite(ledPin, val / 4);  // analogRead values go from 0 to 1023, analogWrite values from 0 to 255
}

Håller även själv på med ett litet projekt där jag styr en timermodul själv utan den förenklade funktionen, kan ställa pwm-frekvens och dutycycle relativt fritt. :)
Användarvisningsbild
Icecap
Inlägg: 26801
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Styra flera 100W LED och "mixa" ljuset till max 100W tot

Inlägg av Icecap »

Men OK, då finns det stöd för hårdvara-PWM. Det kan dock ändå bli lite problem...

Alltså:
Det ska styras 3 st LED á 100W.
Nätdelen är på 100W.
Alla 3 lampor ska styras så att de inte överlappar i styrningen.

Det siste är problemet. OK, man startar 3 st PWM som sedan styr var sin lampa. Inget problem.
Men hur säkrar man att de inte alla slår på samtidig och av samtidig på samma tidpunkter? Detta skulle då betyda att lasten varierar mellan 0W och 300W med 490Hz och jag har en känsla av att nätdelen nog kan finna det besvärligt...

Alltså måste styrningen se till att sekvensen är:
- Lampa A tänds, lampa B & C är släckta. Sedan går det en viss tid.
- Lampa B tänds, lampa A & C är släckta. Lite tid här med.
- Lampa C tänds, lampa A & B är släckta. Lite tid här med.
Sedan upprepas detta.

Detta gör att hårdvaru-PWM blir svår att få till att fungera, såklart kan det fungera men då måste man ha några rediga elektrolytkondensatorer på matningen.
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Re: Styra flera 100W LED och "mixa" ljuset till max 100W tot

Inlägg av Andax »

Enkelt med en timer interrupt där man ändrar tiden vid varje interrupt enl en sekvens. Summan av tiderna i sekvensen motsvarar pwm cykeltid.
Användarvisningsbild
Icecap
Inlägg: 26801
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Styra flera 100W LED och "mixa" ljuset till max 100W tot

Inlägg av Icecap »

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
krilar
Inlägg: 4
Blev medlem: 17 juli 2012, 00:24:36

Re: Styra flera 100W LED och "mixa" ljuset till max 100W tot

Inlägg av krilar »

@Icecap (och även andra som svarat). Stort tack för hjälpen. Ska försöka mig på detta snart.
Skriv svar