Nick Iskrov

Members
  • Публикации

    1
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

О Nick Iskrov

  • Звание
    Новенький
  1. Здравствуйте, форумчане! Прошу у вас помощи разобраться в проблеме с диммером лампы накаливания на основе фазового управления. Прикрепил схему, которую я спаял для тестов с ардуиной. Также прикрепил показания осциллографа, снятые с контактов нагрузки через делитель напряжения (с лампой в цепи и без лампы в цепи). При подключении лампы, напряжение на нагрузке = 0. Во всем диапазоне. Лампа загорается на 100% только когда фаза = 0. При всех остальных значениях фазы, напряжение на нагрузке = 0. При выключении лампы из цепи нагрузки, фазовое управление работает как надо (судя по осциллографу). Включаю лампу в цепь - диммер перестает работать, лампа загорается только в момент, когда симистор пропускает полное напряжение... Код ардуинки: #include <CyberLib.h> //Библиотека от Cyber-Place.ru volatile uint8_t tic, Dimmer1; uint8_t data; int i; void setup() { D4_Out; //Настраиваем порты на выход D4_Low; //установить на выходах низкий уровень сигнала D2_In; //настраиваем порт на вход для отслеживания прохождения сигнала через ноль attachInterrupt(0, detect_up, LOW); // настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень StartTimer1(halfcycle, 40); //время для одного разряда ШИМ StopTimer1(); //остановить таймер UART_Init(115200); //инициализация порта } //********************обработчики прерываний******************************* void halfcycle() //прерывания таймера { tic++; //счетчик if(Dimmer1 < tic ) D4_High; //управляем выходом } void detect_up() // обработка внешнего прерывания. Сработает по переднему фронту { tic=0; //обнулить счетчик ResumeTimer1(); //запустить таймер attachInterrupt(0, detect_down, HIGH); //перепрограммировать прерывание на другой обработчик } void detect_down() // обработка внешнего прерывания. Сработает по заднему фронту { StopTimer1(); //остановить таймер D4_Low; //логический ноль на выходы tic=0; //обнулить счетчик attachInterrupt(0, detect_up, LOW); //перепрограммировать прерывание на другой обработчик } //************************************************************************* void loop() {Start if (i >= 0 && i <= 200) {delay(50); Dimmer1 = i; i = i+1;} else {i = 0;} //Dimmer1=100; End}