Lord Integer
26.02.2020, 16:07
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.
//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
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.
//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