Hallo,
ich möchte mit einem "Arduino Nano" über einen "PWM Pin" mit einem "Constant Current Buck LED Driver " eine LED dimmen.
Jedoch benötigt der "Buck LED Driver" ein bestimmtes PWM-Signal, dass ich nur mit Veränderungen im Arduino- Code erzeugen kann.
siehe Datenblatt Buck LED: https://www.mouser.de/datasheet/2/468/RCD-48-958257.pdf
/************************************************** ************************************************** ******************/
Laut Datenblatt:
PWM DIMMING CONTROL & REMOTE ON/OFF CONTROL
Input Voltage Range: 5V typ. / 10V max.
Threshold Voltage: Device ON 0.5V max.
Device OFF 2.0V min.
PWM Frequency: For Linear Operation 200Hz max.
Frequency Limit 1000Hz max.
/************************************************** ************************************************** ******************/
Weil ich eine lineare Dimmung erreichen möchte, habe ich mir gedacht,dass ich den "Arduino Nano" PIN 3 verwende,
da dieser 450Hz hat und ich dort dann das PWM Signal auf 150Hz setze(200 Hz max. lineare PWm Operation ).
Ebenfalls habe ich in meinen Sketch versucht das PWM- Signal zu invertieren, da ja Device On = 0,5V max. und Device OFF = 2,0V min. sind.
Jedoch bekomme ich nicht das gewünschte Ergebnis. Die LED wird zwar gedimmt, wenn ich mit den Duty Cycle rumspiele , aber die LED geht bei 0 DC nicht aus. Hmmm
/************************************************** ************************************************** ******************/
Hier mein Sketch:
Code:
//Uno, Nano, Mini 3, 5, 6, 9, 10, 11 490 Hz (Pins 5 und 6: 980 Hz)
/********************************************************************/
int ledPin3 = 3;
/********************************************************************/
void setup()
{
Serial.begin(9600);
Serial.println("********************************* PWM Test *********************************");
changePWmFrequenncy(ledPin3);
}
void loop()
{
if (Serial.available() > 0)
{
char ch = Serial.read();
int pwmPercent = ch - '0';
writePwmInverted(ledPin3,pwmPercent);
}
}
void changePWmFrequenncy(int _ledPin)
{
pinMode(_ledPin, OUTPUT); // Set digital pin to an output
TCCR1A = _BV(COM1A1) | _BV(COM1A0) | _BV(WGM11); // Enable the PWM output OC1A on digital pins and invert output
TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS12); // Set fast PWM and prescaler of 256 on timer 1
ICR1 = 415.667; // Set the PWM frequency to 150Hz: 16MHz/(256 * 150Hz) - 1 => (16000000/38400)-1 => 416,667 -1 => 415,667
}
void writePwmInverted(int _ledPin,float _percent)
{
analogWrite(_ledPin, (255 / 100) * _percent);
TCCR1A = TCCR1A & ~B00110000; //switch off output B
TCCR1A |= B00110000; //switch on the B output with inverted output
}
Wie kann ich mein Ziel erreichen und was ist falsch in meinem Code?
Beste Grüße
Lesezeichen