Как правильно управляь диммером на болших расстояниях?
- Войдите на сайт для отправки комментариев
Всем добрый день!
Дорогие ардуинщики помогите мне с одной задачей.
Я управляю диодной лентой 220 вольт, через выпрямитель.
При помощи модуля AC light dimmer module
При прямом подключении ленты к диммеру или через кабель 20 метров, все работает хорошо, но при увеличении кабеля например до 50-70 метров, лента всегда светится и не манят свою яркость. Когда же я подключаю лампу накаливания то все работает хорошо даже на 100 метрах.
Я использую данный код:
#include <TimerOne.h> // Avaiable from http://www.arduino.cc/playground/Code/Timer1 volatile int i=0; // Variable to use as a counter volatile as it is in an interrupt volatile boolean zero_cross=0; // Boolean to store a "switch" to tell us if we have crossed zero int AC_pin = 3; // Output to Opto Triac int dim = 0; // Dimming level (0-128) 0 = on, 128 = 0ff int inc=1; // counting up or down, 1=up, -1=down int freqStep = 75; // This is the delay-per-brightness step in microseconds. // For 60 Hz it should be 65 // It is calculated based on the frequency of your voltage supply (50Hz or 60Hz) // and the number of brightness steps you want. // // Realize that there are 2 zerocrossing per cycle. This means // zero crossing happens at 120Hz for a 60Hz supply or 100Hz for a 50Hz supply. // To calculate freqStep divide the length of one full half-wave of the power // cycle (in microseconds) by the number of brightness steps. // // (120 Hz=8333uS) / 128 brightness steps = 65 uS / brightness step // (100Hz=10000uS) / 128 steps = 75uS/step void setup() { // Begin setup pinMode(AC_pin, OUTPUT); // Set the Triac pin as output attachInterrupt(0, zero_cross_detect, RISING); // Attach an Interupt to Pin 2 (interupt 0) for Zero Cross Detection Timer1.initialize(freqStep); // Initialize TimerOne library for the freq we need Timer1.attachInterrupt(dim_check, freqStep); // Use the TimerOne Library to attach an interrupt // to the function we use to check to see if it is // the right time to fire the triac. This function // will now run every freqStep in microseconds. } void zero_cross_detect() { zero_cross = true; // set the boolean to true to tell our dimming function that a zero cross has occured i=0; digitalWrite(AC_pin, LOW); // turn off TRIAC (and AC) } // Turn on the TRIAC at the appropriate time void dim_check() { if(zero_cross == true) { if(i>=dim) { digitalWrite(AC_pin, HIGH); // turn on light i=0; // reset time step counter zero_cross = false; //reset zero cross detection } else { i++; // increment time step counter } } } void loop() { dim+=inc; if((dim>=128) || (dim<=0)) inc*=-1; delay(18); }
На одном из форумов мне сказали что при подключении лампы накаливания все работает хорошо так как у нее есть инерционность. Я заметил в этом логику, но при этом когда я использую другой код, который не учитывает проход через ноль и не отслеживает его, а просто изменяет PWM выход от 20 до 80% все работает плавно, даже на 100 метрах как с лампой так и с лентой. Я думаю что все дело в выпрямителе он же преобразовывает ток в пульсирующий.
//Libraries #include <RBDdimmer.h>//https://github.com/RobotDynOfficial/RBDDimmer //Parameters const int zeroCrossPin = 2; const int acdPin = 3; int MIN_POWER = 0; int MAX_POWER = 80; int POWER_STEP = 2; //Variables int power = 0; //Objects dimmerLamp acd(acdPin); void setup(){ //Init Serial USB Serial.begin(9600); Serial.println(F("Initialize System")); acd.begin(NORMAL_MODE, ON); } void loop(){ testDimmer(); } void testDimmer(){/* function testDimmer */ ////Sweep light power to test dimmer for(power=MIN_POWER;power<=MAX_POWER;power+=POWER_STEP){ acd.setPower(power); // setPower(0-100%); Serial.print("lampValue -> "); Serial.print(acd.getPower()); Serial.println("%"); delay(100); } for(power=MAX_POWER;power>=MIN_POWER;power-=POWER_STEP){ acd.setPower(power); // setPower(0-100%); Serial.print("lampValue -> "); Serial.print(acd.getPower()); Serial.println("%"); delay(100); } }
Есть минус у этого кода, при пиковых значениях идет скачек в яркости.
вопрос-то в чем?
вопрос-то в чем?
Как сделать плавное включение диодной ленты, через кабель в 50 метров при помощи данного модуля
Использовать RS485 тогда и на километре без проблем будет управлять.
Как вариант использовать провод для сварочных аппаратов :-)
Использовать RS485 тогда и на километре без проблем будет управлять.
Вы сейчас говорите про управление модулем на расстояние киллометр, но у меня модуль рядом с контроллером, а вот лента далеко от модуля диммера.
Как вариант использовать провод для сварочных аппаратов :-)
Чем они лучше?
Потери на большой длине меньше !
Так вы будете управлять по RS485 самим контроллером, а он будет управлять лентой.
Вообще-то управлять LED через AC диммер это извращение. По хорошему надо ставить MOSFET после "выпрямителя" и управлять им обычным ШИМом, а сигнал подавать через опторазвязку. На 50 метров, возможно, и мощности выходных каскадов АВР-а хватит, но я бы поставил буффер на транзисторе или чего нибудь в этом роде.