Здравствуйте, форумчане!
Прошу у вас помощи разобраться в проблеме с диммером лампы накаливания на основе фазового управления.
Прикрепил схему, которую я спаял для тестов с ардуиной. Также прикрепил показания осциллографа, снятые с контактов нагрузки через делитель напряжения (с лампой в цепи и без лампы в цепи).
При подключении лампы, напряжение на нагрузке = 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}