Алгоритм не верен. Симистор можно только включить (достаточно подать управляющий сигнал на время 5-30 мкс), выключится он сам перед очередным переходом через 0. С момента пересечения 0 таймер должен отсчитывать время, в течение которого симистор включать не надо (если это время будет равно 0, питание микроконтроллера будет периодически пропадать, впрочем, это зависит от схемы). Надо добиваться того, чтобы определять за один период оба пересечения нуля, или определять одно пересечение (например, прерыванием по срезу) и вычислять второе программно, иначе весь второй полупериод симистор будет выключен (если он управляется короткими импульсами). Я в своем диммере, реализованном на ATtiny12 (см. этот же форум, тема «Сенсорный регулятор освещенности на микроконтроллере»), сделал 100 шагов регулировки, т.е. таймер использует интервал 100 мкс (TCCR0=1). Хотя в микроконтроллере всего один таймер и на обработку его прерывания уходит много процессорного времени, реализовано немало функций, использующих различные интервалы времени (например, таймер с программируемым временем переключения лампы до 10 суток). Учтите: используется внутренний тактовый генератор, поэтому в программе необходимо использовать калибровочное значение генератора, определяемое программатором. Советую внимательно почитать теорию про каждую функциональную часть схемы, а также пользоваться осциллографом при анализе работы своей схемы.
|