Конечно крайне мало данных чтобы что-то посоветовать.
Пол периода это 10 мс или 180 градусов. Допустим будем регулироваться с дискретностью 100мкс или 1,8 градуса. Т.е. поделим полупериод на 100 частей.
При тактовой частоте 16 МГц за 100мкс МК выполнит 1600 однотактовых команд. Это приличное число, т.е. между этими точками МК может заняться спокойненько другим вещами. Эти точки дисретизации условно нумеруем от 0 до 100.
Запускаете таймер в режиме СТС и настраиваете прерывание так, чтобы оно вызывалось каждые 100мкс.
Так же настраиваете внешнее прерывание от детектора фазы.
Для каждого канала задается точка включения (фаза включения симистора), например по UART или как то еще. Ну видимо 6 переменных для 6 каналов.
В прерывании от детектора: сброс таймера и обнуление счетчика текущей дискретной точки (текущей фазы) на полуволне.
В прерывании от таймера:
инкремент счетчика дискретных точек;
если счетчик совпадает с заданием, то соответствующий порт включается иначе выключается.
Не знаю насколько понятно написал и надо будет конечно учесть кой-какие нюансы. Например, не увеличивать счетчик больше какого-то числа, можно останавливать таймер при фазе больше 160 градусов и запускать снова по детектору, учесть что детектор может быть чуть раньше или позже фактичего перехода через ноль и т.д.
Последний раз редактировалось
Z_h_e Ср авг 16, 2017 20:31:53, всего редактировалось 1 раз.