• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Мерцание лампы от AC Light Dimmer Module

petran67

New member
Шим тут вреден.
На один переход через ноль, один импульс открывания.
Причём импульс должен коротким, иначе если податите длинный импульс не задолго до перехода через ноль (малая мощность), симистор откроется два раза.
Открылся, напряжение упало до нуля - закрылся, и открылся снова, когда напряжение выросло.
А в этом уже есть что-то! Осталось найти такой скетч )) Я в написании скетчей не фонтан. Буду пробовать и этот вариант.
Спасибо. Думаю в этом может быть проблема.
 

petran67

New member
Может драйвер светодиодной лампы мешает :)
Нет, драйвер тут не причем. Пробовал полностью исключить светодиодную нагрузку и подключал ЛН. Результат тот-же, только мелкие мерцания не так заметны из-за понятного специфического свойства работы ЛН.
 

nikolz

Well-known member
Нет, драйвер тут не причем. Пробовал полностью исключить светодиодную нагрузку и подключал ЛН. Результат тот-же, только мелкие мерцания не так заметны из-за понятного специфического свойства работы ЛН.
синхронизируйте осциллограф от P2 и покажите P1.
 

CodeNameHawk

Moderator
Команда форума
А в этом уже есть что-то! Осталось найти такой скетч )) Я в написании скетчей не фонтан. Буду пробовать и этот вариант.
Шутить вы умеете, а поискать ? Вы что думаете до вас никто не собирал?
https://arduino.ua/prod3117-odnokanalnii-dimmer-220v-dlya-arduino-ot-robotdyn
https://github.com/RobotDynOfficial/RBDDimmer

https://www.google.com/search?sxsrf...AEAoAEGqgEHZ3dzLXdpeg&gs_ivs=1&sclient=psy-ab
 

petran67

New member
Потрясли первая и третья ссылка! ))))))
А вы думаете что до этого я не допер до таких поисков? Ну да... ))
Вот со второй ссылкой надо будет покопаться во всем мусоре и найти что-то полезное.
 

nikolz

Well-known member
Вот - первый сигнал это в точке Р1 а второй (прямоугольный) - это Р2.
я просил не сигналы отдельно показать, а один относительно другого.
Чтобы можно было увидеть задержку и если есть пропадания то сбой синхронизации.
 

petran67

New member
я просил не сигналы отдельно показать, а один относительно другого.
Чтобы можно было увидеть задержку и если есть пропадания то сбой синхронизации.
Извините, у меня двухканального осциллографа нет, не могу одновременно подключить оба пина для сравнения. Одно могу сказать - сигнал перехода нуля стоит стабильно как вкопанный и ШИМ сигнал так же (частота не скачет).
 

petran67

New member
Ну да готовая библиотека просто мусор.
Для кого-то она готовая а для кого-то (например как я, простого электрика) она далеко ни о чем не говорит. Я пытаюсь разобраться в том что я не большой мастер а вы мне бросаете "формулы высшей математики и утверждаете что это как два пальца об асфальт". Для вас это просто а для меня это еще сложная математика.
Все же, спасибо за подсказку! Уважаю уделение внимания.
 

nikolz

Well-known member
Извините, у меня двухканального осциллографа нет, не могу одновременно подключить оба пина для сравнения. Одно могу сказать - сигнал перехода нуля стоит стабильно как вкопанный и ШИМ сигнал так же (частота не скачет).
У вас стоит сигнал как вкопанный потому что вы от него же и синхронизируетесь.
можно на компе через звуковую карту Там хотя бы два канала есть
либо возьмите логический анализатор на 8 каналов. он копейки стоит на али.
--------------
Ну да ладно. Дайте ссылку на программу, которую грузите.
 

petran67

New member
Ну да ладно. Дайте ссылку на программу, которую грузите.
#include "CyberLib.h" //Библиотека от Cyber-Place.ru
volatile uint8_t tic, Dimmer1, Dimmer2;
uint8_t data;
int pwm;
void setup()
{
D5_Out; D6_Out; //Настраиваем порты на выход
D5_Low; D6_Low; //установить на выходах низкий уровень сигнала
D2_In; //настраиваем порт на вход для отслеживания прохождения сигнала через ноль
pinMode(A0, INPUT);
pinMode(A1, INPUT);
//CHANGE – прерывание вызывается при любом изменении значения на входе;
//RISING – вызов прерывания при изменении уровня напряжения с низкого (Low) на высокий(HIGH)
//FALLING – вызов прерывания при изменении уровня напряжения с высокого (HIGH) на низкий (Low)
attachInterrupt(0, detect_up, LOW); // настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень
StartTimer1(halfcycle, 40); //время для одного разряда ШИМ
StopTimer1(); //остановить таймер
UART_Init(115200); //инициализация порта
}
void loop()
{
Dimmer1 = map(analogRead(0), 0, 1023, 255, 0); // Эти входы для потенциометров добавил сам
Dimmer2 = map(analogRead(1), 0, 1023, 255, 0);
}
//********************обработчики прерываний*******************************
void halfcycle() //прерывания таймера
{
tic++; //счетчик
if(Dimmer1 < tic ) D5_High; //управляем выходом
if(Dimmer2 < tic ) D6_High; //управляем выходом
}
void detect_up() // обработка внешнего прерывания. Сработает по переднему фронту
{
tic=0; //обнулить счетчик
ResumeTimer1(); //запустить таймер
attachInterrupt(0, detect_down, HIGH); //перепрограммировать прерывание на другой обработчик
}
void detect_down() // обработка внешнего прерывания. Сработает по заднему фронту
{
StopTimer1(); //остановить таймер
D5_Low; D6_Low; //логический ноль на выходы
tic=0; //обнулить счетчик
attachInterrupt(0, detect_up, LOW); //перепрограммировать прерывание на другой обработчик
}
 

nikolz

Well-known member
попробуйте так (скрипт не тестировал):
Код:
#include "CyberLib.h" //Библиотека от Cyber-Place.ru
volatile uint32_t   Dimmer1, Dimmer2,T,T1,D1,D2;
#define DT 10 //длительность импульса
#define Tdet 10000     //длительность импульса 100 Гц
#define Tdet2 Tdet/2    // половина длительность  100 Гц

void setup()
{
     D5_Out; D6_Out; //Настраиваем порты на выход
    D5_Low; D6_Low; //установить на выходах низкий уровень сигнала
    D2_In; //настраиваем порт на вход для отслеживания прохождения сигнала через ноль
    pinMode(A0, INPUT);
    pinMode(A1, INPUT);
    T=micros();
    attachInterrupt(0,detect,RISING); // настроить срабатывание прерывания interrupt0 на pin 2  по положительному фронту
    UART_Init(115200); //инициализация порта
}
void loop()
{
    Dimmer1 = map(analogRead(0), 0, 1023, 255, 0); // Эти входы для потенциометров добавил сам
    Dimmer2 = map(analogRead(1), 0, 1023, 255, 0);
       T1=micros()-T;
    if (T1>0 && T1<Tdet)   //контроль длительности импульса детектора
     {
        if (D1>0 && (D1-T1)>=0) {  D5_High; delayMicroseconds(DT); D1=0;  D5_Low;}
        if (D2>0 && (D2-T1)>=0) {  D6_High;  delayMicroseconds(DT); D2=0; D6_Low; }
    }
}
void detect() // обработка внешнего прерывания.
{
       if (T1>Tdet2)  //фильтр дребезга перехода
     {  D1=Dimmer1; D2=Dimmer2; T=micros();  D6_Low;  D5_Low;    }
}
 

nikolz

Well-known member
формирование импульсов можно упростить:
if (D1-T1)>0) { D5_High; delayMicroseconds(DT);D1=0;D5_Low;}
if (D2-T1)>0) { D6_High; delayMicroseconds(DT);D2=0;D6_Low;}
--------------
в детекторе лучше переставить так:
{ T=micros(); D1=Dimmer1; D2=Dimmer2; D6_Low; D5_Low; }
 

nikolz

Well-known member
немного упростил:
Код:
#include "CyberLib.h" //Библиотека от Cyber-Place.ru
volatile uint32_t  T,T1,D1,D2;
#define DT 10 //длительность импульса
#define Tdet 10000     //длительность импульса 100 Гц
#define Tdet2 Tdet/2    // половина длительность  100 Гц

void setup()
{
    D5_Out; D6_Out; //Настраиваем порты на выход
    D2_In; //настраиваем порт на вход для отслеживания прохождения сигнала через ноль
    pinMode(A0, INPUT);
    pinMode(A1, INPUT);
    T=micros();
    attachInterrupt(0,detect,RISING); // настроить срабатывание прерывания interrupt0 на pin 2  по положительному фронту
    UART_Init(115200); //инициализация порта
}
void loop()
{
    D5_Low; D6_Low;
    T1=micros()-T;
    if (T1>0 && T1<Tdet)   //контроль длительности импульса детектора
     {
       if (D1-T1)>0) { D5_High; delayMicroseconds(DT);D1=0;}
       if (D2-T1)>0) { D6_High; delayMicroseconds(DT);D2=0;}
       }
}
void detect() // обработка внешнего прерывания
{
   if (T1>Tdet2)  //фильтр дребезга перехода
     { T=micros();
D1=map(analogRead(0), 0, 1023, 255, 0); // Эти входы для потенциометров
D2= map(analogRead(1), 0, 1023, 255, 0); }
}
 

petran67

New member
немного упростил:
Этот код вообще не компилируется, выдает какие-то ошибки:

error: expected primary-expression before '>' token
if (D1-T1)>0) { D5_High; delayMicroseconds(DT);D1=0;}
^
error: expected primary-expression before '>' token
if (D2-T1)>0) { D6_High; delayMicroseconds(DT);D2=0;}

А код выше компилируется но не генерируются импульсы запуска
 

nikolz

Well-known member
Этот код вообще не компилируется, выдает какие-то ошибки:

error: expected primary-expression before '>' token
if (D1-T1)>0) { D5_High; delayMicroseconds(DT);D1=0;}
^
error: expected primary-expression before '>' token
if (D2-T1)>0) { D6_High; delayMicroseconds(DT);D2=0;}

А код выше компилируется но не генерируются импульсы запуска
ошибка синтаксиса скобки не хватает:
if((D1-T1)>0) { D5_High; delayMicroseconds(DT);D1=0;}
if((D2-T1)>0) { D6_High; delayMicroseconds(DT);D2=0;}
 

petran67

New member
ошибка синтаксиса скобки не хватает:
if((D1-T1)>0) { D5_High; delayMicroseconds(DT);D1=0;}
if((D2-T1)>0) { D6_High; delayMicroseconds(DT);D2=0;}
Добавил скобки, скомпилировался код. Теперь генерирует на выходе НЕ регулируемые импульсы с частотой 35,6 кГц. Лампочка соответственно, горит постоянно. ((
 

nikolz

Well-known member
попробуйте распечатать переменные T,T1,D1,D2:

Код:
#include "CyberLib.h" //Библиотека от Cyber-Place.ru
volatile uint32_t  T,T1,D1,D2;
#define DT 10 //длительность импульса
#define Tdet 10000     //длительность импульса 100 Гц
#define Tdet2 Tdet/2    // половина длительность  100 Гц

void setup()
{
    D5_Out; D6_Out; //Настраиваем порты на выход
    D2_In; //настраиваем порт на вход для отслеживания прохождения сигнала через ноль
    pinMode(A0, INPUT);
    pinMode(A1, INPUT);
    T=micros();
    attachInterrupt(0,detect,RISING); // настроить срабатывание прерывания interrupt0 на pin 2  по положительному фронту
    UART_Init(115200); //инициализация порта
}
void loop()
{
    D5_Low; D6_Low;
    T1=micros()-T;
             ardprintf(" %d %d %d %d ", T,T1,D1,D2);

     if (T1>0 && T1<Tdet)   //контроль длительности импульса детектора
     {
       if (D1-T1)>0) { D5_High; delayMicroseconds(DT);D1=0;}
       if (D2-T1)>0) { D6_High; delayMicroseconds(DT);D2=0;}
       }
}
void detect() // обработка внешнего прерывания
{
   if (T1>Tdet2)  //фильтр дребезга перехода
 { T=micros();
D1=map(analogRead(0), 0, 1023, 255, 0); // Эти входы для потенциометров
D2= map(analogRead(1), 0, 1023, 255, 0); 
}
}
 
Сверху Снизу