Симистор диммера переменного тока Krida с 4 каналами не инициализируется с Arduino

Ни один из моих каналов не инициализируется. Я подозреваю, что проблема с драйвером, но я пробовал две разные библиотеки.

У меня есть это устройство:

4-канальный Krida

подключено точно так:

GND - > GND
VCC -> 5V
SYNC -> DIGITAL.3
CH1 -> DIGITAL.7

Попытка библиотек:

https://code.google.com/archive/p/arduino-timerone/downloads

и стандартный Arduino <TimerOne.h> из менеджера библиотек

Я перепробовал все разные примеры кода, но вот самый последний. Пример кода:

#include <TimerOne.h>

unsigned char channel_1 = 7;    // Выход на контакт оптосимистора, канал 1
unsigned char channel_2 = 6;    // Выход на контакт оптосимистора, канал 2
unsigned char channel_3 = 5;    // Выход на контакт оптосимистора, канал 3
unsigned char channel_4 = 4;    // Выход на контакт оптосимистора, канал 4
unsigned char CH1, CH2, CH3, CH4;
unsigned char i=0;
unsigned char delay_time=25;     // задержка мс или мигание SPEED
unsigned char clock_tick;        // переменная для Таймера1
unsigned char CHANNEL_SELECT;    // переменная для выбора канала

unsigned char CH[]={CH1,CH2,CH3,CH4};

unsigned char dim_level[]={5,8,10,12,15,18,20,25,30,35,45,50,55,60,65,70,75,80,82,85,88,92,95};   // не используйте этот массив для 60 Гц
                                                                                                  // создаём новый массив для 60Гц
void setup() {

  pinMode(channel_1, OUTPUT);//Устанавливаем вывод нагрузки переменного тока в качестве выхода
  pinMode(channel_2, OUTPUT);//Устанавливаем вывод нагрузки переменного тока в качестве выхода
  pinMode(channel_3, OUTPUT);//Устанавливаем вывод нагрузки переменного тока как выход
  pinMode(channel_4, OUTPUT);// Устанавливаем вывод нагрузки переменного тока в качестве выхода
  attachInterrupt(1, zero_crosss_int, RISING);
  Timer1.initialize(100); // устанавливаем таймер длиной 100 микросекунд для 50 Гц или 83 микросекунды для 60 Гц;
  Timer1.attachInterrupt( timerIsr ); // прикрепляем сюда служебную процедуру

}

void timerIsr()
{    
    clock_tick++;

      if (CH[0]==clock_tick)
    {
      digitalWrite(channel_1, HIGH);   // срабатывание симистора
      delayMicroseconds(10);           // Задержка распространения симистора (для 60 Гц используйте 8.33)
      digitalWrite(channel_1, LOW);    // симистор выключен
    }  

      if (CH[1]==clock_tick)
    {
      digitalWrite(channel_2, HIGH);   // срабатывание симистора
      delayMicroseconds(10);           // Задержка распространения симистора (для 60 Гц используйте 8.33)
      digitalWrite(channel_2, LOW);    // симистор выключен
    }  

      if (CH[2]==clock_tick)
    {
      digitalWrite(channel_3, HIGH);   // срабатывание симистора
      delayMicroseconds(10);           // Задержка распространения симистора (для 60 Гц используйте 8.33)
      digitalWrite(channel_3, LOW);    // симистор выключен
    }  

      if (CH[3]==clock_tick)
    {
      digitalWrite(channel_4, HIGH);   // срабатывание симистора
      delayMicroseconds(10);           // Задержка распространения симистора (для 60 Гц используйте 8.33)
      digitalWrite(channel_4, LOW);    // симистор выключен
    }   
}



void zero_crosss_int()  // функция, которая будет запущена при пересечении нуля, чтобы затемнить свет
{
  // Каждое прерывание по пересечению нуля: для 50 Гц (1/2 цикла) => 10 мс; Для 60 Гц (1/2 цикла) => 8,33 мс
  // 10 мс=10000 мкс, 8,33 мс=8330 мкс

    clock_tick=0;        
}



void loop() {


for (CHANNEL_SELECT=0;CHANNEL_SELECT<4;CHANNEL_SELECT++)  // постепенное увеличение
 {
  for (i=22;i>1;i--)
  {
    CH[CHANNEL_SELECT]=dim_level[i];
    delay(delay_time);
  } 
 }

delay(2000);

for (CHANNEL_SELECT=0;CHANNEL_SELECT<4;CHANNEL_SELECT++)  // постепенное уменьшение
 {
  for (i=0;i<22;i++)
  {
    CH[CHANNEL_SELECT]=dim_level[i];
    delay(delay_time);
  } 
 }
delay(1000);

}

Код без ошибок загружается на один из многих имеющихся у меня Arduino Nano (я пробовал новое оборудование).

Я не могу установить непрерывность моего канала ввода нагрузки ни с одним из каналов вывода нагрузки. Однако D7 никогда не выполняет свою работу и не открывает канал. Я также не могу добиться непрерывности ни на одном из других каналов.

Предполагается, что код циклически проходит через все из них, но ток никогда не достигает «нагрузки» ни на одном из моих каналов (каналы 1–4).

Более глубокий осмотр Arduino с помощью измерителя напряжения показывает, что на моем выводе d7 наблюдается переполюсовка. на самом деле все d7 – d4 имеют неправильные циклы (обратную полярность). Это все контакты, которые должны включать каналы. Мне это кажется совсем неправильным.

Я подозреваю, что это драйвер, но не могу найти других библиотек, которые могли бы выглядеть нормально.

Как правильно инициализировать вывод d7 Arduino, чтобы активировать канал загрузки моего 4-канального триака Krida?

или я пропустил что-то исключительно невежественное? У меня нет опыта работы с этим конкретным модулем.

фотографии:

image 1

image 2

image 3

То же, что и изображение 2, но с подключенным каналом 1 к d7

, 👍1


1 ответ


Лучший ответ:

1

Прежде всего вам следует проверить, работает ли прерывание SYNC, например, включить один светодиод или что-то, что вы можете отладить. Вы включаете сеть переменного тока, а затем должны обнаружить это прерывание перехода через ноль. Если нет, возможно, вы настроили событие прерывания на неправильном выводе.

Кроме того, создание циклов do- while в программе обработки прерываний недопустимо. Ваш timeISR включает один симистор, затем циклически работает 10 мкс и выключает симистор. Ну не очень хорошая реализация. Вы можете пропустить задержку и отключить ISR через другое время, установив вместо этого ISR на уровне 10 мкс.

void timerIsr()  //10us
{    
    clock_tick++;
    digitalWrite(channel_1, LOW);    // симистор выключен
    digitalWrite(channel_2, LOW);    // симистор выключен
    .....
    if (CH[0]==clock_tick)
      {
        digitalWrite(channel_1, HIGH);   // срабатывание симистора
      }
,

Я внес изменения в код https://bpaste.net/show/428d553e9881, и светодиод перестал мигать на устройстве, но все остальное поведение осталось прежним., @boobie

Но я больше не меняю полярность на своем Arduino., @boobie

Обратная полярность почему-то невозможна, потому что вы снабжаете цепь своими Vcc и GND. Устройство подключило оптотриак к выходам Arduino. Возможно, вы поменяли наконечники вольтметра?, @Marko Buršič

Я могу переключать эту обратную полярность взад и вперед, меняя код взад и вперед, как переключатель. Я использую Greenlee DM-45. Он старый, но довольно надежный. Я буквально могу смотреть этот флип вживую., @boobie

@boobie, проблема решена? (вы отметили ответ принятым), @Juraj

@Юрай, да, грубая ошибка n00b. Я протестировал работу переменного тока со сторонним вентилятором и не получил ответа. Но загорелась традиционная люминесцентная лампа со светодиодной лампочкой. Не знаю почему, но этого достаточно для этого билета., @boobie