Программный ШИМ. Сначала плавно увеличивается от 0% до 100%. Достигнув максимального значения начинает плавно уменьшаться от 100% до 0%. Затем все повторяется снова. Жалкое подобие аппаратного Fast PWM. Настоятельно рекомендуется компилировать при нулевой степени оптимизации.
/*******************************************
Program : pwm
Compiler : AVR GCC
Chip type : ATmega8
System Clock : 1 MHz
*******************************************/
#include <avr/io.h>
int main(void)
{
unsigned char i = 0;
unsigned char j = 0;
unsigned char flag = 0;
unsigned char pwm = 0;
DDRD = 0b00000001; // PD0 out
PORTD = 0b00000000; // PD0 "0"
for(;;)
{
PORTD |= 0b00000001; // PD0 "1"
i = 0;
while( i != 255 )
{
if ( i == pwm )
{
PORTD &= 0b11111110; // PD0 "0"
}
i += 1;
// --- begin delay ---
j = 0;
while( j != 20 )
{
j += 1;
}
// --- end delay ---
}
if ( flag == 0 ) pwm += 5;
if ( flag == 1 ) pwm -= 5;
if ( pwm == 255 ) flag = 1;
if ( pwm == 0 ) flag = 0;
}
return 0;
}
(Добавление)
Реальное устройство имеет ограничения на частоту ШИМ. Это необходимо учитывать. Иначе устройство сломается. |