Код: Выделить всё
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
TCNT1H=0x00;
TCNT1L=0x00;
if(count>=PWM_digit)
count=0;
count++;
if(value<count)
{
PWM_out=0;
}
else
{
PWM_out=1;
}
}Мой вариант программного ШИМа, где скважность импульсов задает value, 0<=value<=PWM_digit.Можно легко через CASE добавить нужное количество ножек с независимой регулировкой ШИМ,например вот так
Код: Выделить всё
for(i=0;i<=Chanel_Count;i++)
{
if(count<Chanel_Lev[i])
{
switch(i)
{
case 0 : PORTD.0=1;break;
case 1 : PORTD.1=1;break;
case 2 : PORTD.2=1;break;
case 3 : PORTD.3=1;break;
case 4 : PORTD.4=1;break;
case 5 : PORTD.5=1;break;
case 6 : PORTD.6=1;break;
case 7 : PORTD.7=1;break;
}
}
else
{
switch(i)
{
case 0 : PORTD.0=0;break;
case 1 : PORTD.1=0;break;
case 2 : PORTD.2=0;break;
case 3 : PORTD.3=0;break;
case 4 : PORTD.4=0;break;
case 5 : PORTD.5=0;break;
case 6 : PORTD.6=0;break;
case 7 : PORTD.7=0;break;
}
}
} Но в этом алгоритме есть минус в том что частота ШИМа равна (Частота прерываний таймера)/(количество ступенек регулирования(PWM_digit)), тоисть чем больше ступенек тем меньше частота. Может есть какой нибуть другой алгоритм или все же невозможно без потерь частоты ШИМ сделать ?
Вот уж действительно БУМ рулит. более 200 шим по трем проводам.
- для фиксированного или ступенчато изменяемого уровня вполне пригодно, но для плавных переливов "не очень". 