Вот пример на Си:
u8 Power; //требуемое значение мощности
u8 Phase;
s8 Delta;
Phase = MAXPOW; //инициализация, делать 1 раз
Power = MyPower; //задаем требуемое значение мощности
//делать по вылавливанию перехода через 0:
Delta = Power + Delta;
if (Delta < 0)
{
TriacOff();
}
else
{
TriacOn();
Delta = Delta - MAXPOW;
}
Phase = Phase - 1;
if (Phase == 0)
{
Phase = MAXPOW;
Delta = - (Phase / 2);
}