LEDs mit 2Khz ansteuern

Ich habe eine Arduinoschaltung aufgebaut, bei der ich RGB LED-Stripes ansteuere.
Sie sollen wie man im Programm sehen kann mit dem Fadeffekt ein und ausgeschaltet werden. Das funktioniert alles auch soweit.

Das schwierige ist allerdings die LEDs mit 2Khz angesteuert werden müssen.

Könnt ihr mir dabei helfen wie man das programmieren kann?

Hier ist der Code:

	#define REDPIN 5
	#define GREENPIN 6
	#define BLUEPIN 3	 

 
        int Belastung = 7;
        int Tuer = 2;
        int val = 0;
        int fadeGruen = 0;
        int fadeBlau = 0;
        unsigned long previousMillis = 0;   // Speichert, wann die LED zum letzten mal geupdatet  
        const long interval = 10;           //Timer für die Fadegeschwindigkeit
        
	void setup() {
	  pinMode(REDPIN, OUTPUT);
	  pinMode(GREENPIN, OUTPUT);
	  pinMode(BLUEPIN, OUTPUT);

          pinMode(Belastung, INPUT);
	  }
	 
	 
	void loop() {

	  int r, g, b;
          unsigned long currentMillis = millis();

        if (digitalRead(Tuer) == HIGH)             //Die Beleuchtung wird erst eingeschaltet, wenn der Schalter auf HIGH ist.
        {
          if (currentMillis - previousMillis >= interval) {    //Timer für die Fadegeschwindigkeit
              previousMillis = currentMillis;                  
                   
                if(fadeBlau <= 254)
                {
                fadeBlau++;                    //Wenn der Schalter HIGH wird, wird blau eingeschaltet ...
                
                }
                analogWrite(3, fadeBlau);    
        

            }
            }
              
            else {
                if (currentMillis - previousMillis >= interval) {
                    previousMillis = currentMillis;
                if(fadeBlau >= 1)  
                {
                fadeBlau--;                            //Wenn der Schalter auf LOW ist, wird Blau ausgeschaltet.
                }
                analogWrite(BLUEPIN, fadeBlau);   


                }
                }
                }

makertom:
Das schwierige ist allerdings die LEDs mit 2Khz angesteuert werden müssen.

Warum? Sehen kannst du den Unterschied zwischen 490Hz und 2kHz nicht.

Aber wenns denn sein muss, findest du Hinweise hier:
Tutorial: SecretsOfArduinoPWM

Wenn du ein sauberes Faden hinbekommen willst musst du von 8 Bit PWM (256 Schritte) auf 10 Bit PWM (1024 Schritte) gehen. Mit 8Bit sind die Helligkeitsstufen am unteren Ende doch sehr grob.

Auch das ist in den SecretsOfArduinoPWM beschrieben.

Wenn dir das alles zu kryptisch ist, kann die TimerOne Library gute Dienste leisten.

Es sind nur wenige Frequenzen möglich. Siehe: https://arduino-info.wikispaces.com/Arduino-PWM-Frequency

Grüße Uwe

uwefed:
Es sind nur wenige Frequenzen möglich. Siehe: https://arduino-info.wikispaces.com/Arduino-PWM-Frequency

In der Arduino Welt mag das stimmen.
Aber der ATMega kann es. Man muss dazu aber direkt die Register entsprechend setzen.

Wer sich einlesen will:
Marcel Jakobs, Uni Koblenz, Proseminar: Timer/Counter und PWM beim ATMega16 Mikrocontroller

oder: mikrocontroller.net: AVR-Tutorial: PWM

Aber die grundsätzliche Frage ist an der Stelle wirklich: Wofür 2kHz?

Hallo,

unter Umständen kann man "beim seitlichen Augenschwenk" ein flimmern wahr nehmen. Ungewöhnlich aber möglich. Die Leute erhöhen dann auf 1kHz. 2kHz sind bestimmt nicht notwendig. Je höher die Frequenz umso mehr kannste dir andere Probleme einhandeln.

Nimm Timer 1 und tobe dich damit aus. Mit dem Ding habe ich mich gerade beschäftigt. Wenn man den begriffen hat, versteht man alle. Versuch es mal. Sonst weist du ja wo wir sind. :slight_smile:

Und dann mußte dich noch mit der Helligkeitsanpassung befassen. Das Auge hat ein anderes Helligkeitsempfinden wie die LED Stromkurve. Ich bin mit Gammakorrekturfaktor 3 glücklich. 2,2 war mir noch zu steil.

Je langsamer das Fading sein soll, umso eine höhere Auflösung benötigst du. Das gilt verstärkt im dunklen Bereich. Also wie guntherb schon sagte.

Danke für eure Hilfe!

Ich habe rausgefunden dass die LED - Stripes bei 2 Khz etwas energiesparender sind. Mein Ausbilder will jetzt, dass ich sie so ansteuere.

@Doc_Arduino
Ändert die Libary auch die dauer der Funktion "delay" oder "millis" ?

Das Programm soll später Teil eines "großen" Programms werden. Da wäre solch eine Veränderung nicht gut.

Ich habe rausgefunden dass die LED - Stripes bei 2 Khz etwas energiesparender sind.

Wie denn das? :fearful: Habt Ihr ein neues physikalisches Gesetz entdeckt? :wink:

Bitte mal mit einem analogen Messgerät (oder einem digitalen mit funktionierendem True-RMS) gegentesten - ich vermute einen Messfehler.

Gruß,

Helmuth

makertom:
Ich habe rausgefunden dass die LED - Stripes bei 2 Khz etwas energiesparender sind. Mein Ausbilder will jetzt, dass ich sie so ansteuere.

Das mit dem Energiesparen halte ich auch für unwahr.

aber wenn es der Ausbilder will, dann kann man sicherlich nichts dagegen machen.
Ich würde aber versuchen von den 2kHz wegzukommen, die sind aufwändig und schwierig.

Geh' lieber auf 1Khz (bereits verfügbar auf D5 und D6, genauer: 980Hz) oder 4kHz (genauer: 3.9kHz) das ist durch Änderung des Prescalers möglich).

Damit (besonders mit 1kHz) wird es deutlich einfacher für dich.

@guntherb

Ist es also garnicht möglich alle PWM-Ausgänge mit der gleichen Frequenz anzusteuern?

Timer0 läuft in einem anderen Modus (Fast PWM), deshalb ist die Frequenz da doppelt so hoch wie auf Timer1 und Timer2:
http://playground.arduino.cc/Main/TimerPWMCheatsheet
Außerdem hat Timer2 mehr Prescaler Optionen als die anderen

4 x 980Hz geht mit Pins 5, 6, 3 und 11
4 x 3,9kHz geht mit Pins 9, 10, 3 und 11

makertom:
@guntherb

Ist es also garnicht möglich alle PWM-Ausgänge mit der gleichen Frequenz anzusteuern?

Die Pins hängen auf unterschiedlichen Timern, entsprechend unterschiedlich auch die Frequenzen.
die Standard-Configuration ist in Reference: AnalogWrite (PWM) beschrieben: The frequency of the PWM signal on most pins is approximately 490 Hz. On the Uno and similar boards, pins 5 and 6 have a frequency of approximately 980 Hz Mit anderen Worten: alle ausser D5 und D6 (am UNO) laufen mit 490Hz.

Nur mal als genereller Hinweis:
Ich kenne den Umfang deines Projektes nicht, aber:

  • andere Frequenzen als die Standard zu verwenden ist aufwändig.
  • "krumme" Frequenzen, also andere als die durch ändern des Prescalers eingestellt werden können (z.B. 2kHz) ist sehr aufwändig und schwierig.
  • Dimmen von RGB-LEDs, bei denen die Farbe weiss blieben soll ist sehr schwierig, weil das menschliche Auge die einzelnen Farben nicht linear wahrnimmt.

Nimm doch mal eine RBG-LED (Vorwiderstände so wählen, dass <40mA fliessen) und probiere diesen Sketch aus:

int ledPinR = 9;    
int ledPinG = 10;
int ledPinB = 11;

void setup() {
}

void loop() {
  for (int i = 0 ; i < 255; i++) {   // Dunkel > Hell
    analogWrite(ledPinR, i);
    analogWrite(ledPinG, i);
    analogWrite(ledPinB, i);
    delay(20);  // ca. 5sek Fade-Dauer
  }

  for (int i = 254 ; i >0; i--) {    // Hell > Dunkel
    analogWrite(ledPinR, i);
    analogWrite(ledPinG, i);
    analogWrite(ledPinB, i);
    delay(20);  // ca. 5sek Fade-Dauer
  }
}

Dann siehst du, was ich meine.
Einfacher wäre vielleicht warmweisse LEDs zu verwenden.

Diese Punkte solltest du vielleicht bedenken, um den Umfang deines Projektes zu kontrollieren.

makertom:
@Doc_Arduino
Ändert die Libary auch die dauer der Funktion "delay" oder "millis" ?

Hallo,

du meinst wegen der erwähnten Helligkeitsanpassung? Das ist keine Lib. Man greift auf vorberechnete PWM Werte zu die in einem Array stehen. Mehr ist das nicht. Allerdings habe ich keine RGB LEDs, nur einfarbige. Du bräuchstest dann mehrere solcher Arrays bzw. ein mehrdimensionales Array.

Und delay()/millis() ändert sich nur wenn man was an Timer0 macht