В данной статье http://avr-start.ru/?p=3983 описан способ управления симистором с помощью микроконтроллера. В ходе его реализации у меня возник вопрос: предложенная в этой статье схема требует соблюдения правильного подключения нуля и фазы, иначе ничего не будет работать, поскольку фазовый сигнал нужен в качестве обратной связи для отслеживания пересечения нуля. Посоветуйте, как можно модифицировать схему, чтобы она была не зависима от положения фазы и нуля?
И еще попутно один вопрос. Набросал схему в протеусе, написал код, правда немного отличный от предложенного. Предложенный в статье код опирается на аппаратном прерывании, у меня же происходит отслеживание изменения логического состояния на входном пине по таймеру. В остальном фактически то же самое. Т.е. в обработчике прерывания таймера идет проверка смены логического стояния на входном пине ОС. Как только произошла смена лог. состояния, запускается отсчет задержки, который идет до определенного значения (предела задержки). Как только предел задержки достигнут, в текущем цикле на управляющий пин отправляется лог. 1, а следующем лог. 0 (т.е. генерируется управляющий импульс). Таким образом происходит открытие симистора с задержкой после прохождения нуля.
Код: Выделить всё
#define CTRL_SIGN_OFF 0
#define CTRL_SIGN_ON 1
//Отправка управляющего сигнала в PORTC.0
void SetCtrlSignal(unsigned char state)
{
if (state == CTRL_SIGN_ON) PORTC |= 1;
else PORTC &= ~1;
}
//Считывание сигнала обратной связи PINA.7
unsigned char GeFbSignal(void)
{
return (PINA & 0x80);
}
//Функция фазовой регулировки (вызывается в теле обработчика прерывания таймера)
void PhaseRegulation(void)
{
curFbSignal = GetFbSignal(); //получить текущее логическое состояние сигнала обратной связи
if (DelayBeg == TRUE) //Если запущен отсчет задержки
{
if (DalayCntr == DelayLim) //Если достигнут предел отсчета
{
SetCtrlSignal(CTRL_SIGN_OFF); //Прекратить управляющий импульс
DalayBeg = FALSE; //Остановить отсчет задержки
}
else if (dvBoundDalayCntr == DelayLim - 1) //Если достигнут предел отсчета минус 1
{
SetCtrlSignal(CTRL_SIGN_ON); //Запустить управляющий импульс
}
DelayCntr++; //увеличить счетчик задержки
}
else if (oldFbSignal != curFbSignal) //Если произошла смена логического состояния сигнала ОС
{
SetCtrlSignal(CTRL_SIGN_OFF); //Прекратить управляющий сигнал
DelayBeg = TRUE; //Запустить отсчет задержки
DelayCntr = 0; //Обнулить счетчик задержки
}
oldFbSignal = curFbSignal;
}
В протеусе все запускается и как бы работает, но спустя секунд 3-5 вываливается такая ошибка. Подскажите, что ему не хватает?
Добавлено after 26 minutes 35 seconds:
Модифицировал схему вот так, в протеусе работает (так же вылетает ошибка, но осциллограмма правильная), как думаете в реале будет такая схема работать?

