Для программной реализации ШИМ необходимо перепрограммировать таймер на интервал 1 мc. Тогда постоянный период ШИМ 20 мс будет сформирован с помощью дополнительной переменной PWM_count– счетчика периода ШИМ, которая будет инкрементироваться в обработчике прерываний от 0 до 19. Текущее значение переменной должно проверяться и если оно меньше заданного порога (уровня яркости), то светодиод должен быть включен, а если больше, то выключен. В данном примере 4 младших светодиода включаются только при значении переменной меньше 5 (уровень яркости 5/20), а старшие 4 светодиода горят постоянно для визуального сравнения:
char T0_event; //Глобальная переменная - флаг события прерывания от таймера
charPWM_count;//Глобальная переменная - счетчик периода ШИМ
int main (void)
{
. . .//Инициализация
while (1)//Loop forever
{
if( T0_event ) //Если прерывание случилось
{
T0_event = 0; //Сброс флага до следующего прерывания
if( PWM_count> 5 ) //Если текущее значение интервала больше порога
FIO2SET = 0xF0;//То выключаем светодиоды (0-3)
else
FIO2SET = 0xFF;//Включаем светодиоды (0-3), если еще не дошли до порога
}
}
return 0;
}
__irq __nested __armvoid TimerHandler0() //Прерывание каждую миллисекунду
{
T0IR = 0x01;
VICADDRESS = 0; //Сброс прерывания
T0_event = 1; //Устанавливаем флаг события прерывания от таймера
PWM_count++;//Увеличиваем счетчик периода ШИМ
if( PWM_count> 19 )
PWM_count = 0;//Сбрасываем счетчик периода ШИМ при достижении максимума
}
После проверки работоспособности примера необходимо модифицировать программу следующим образом:
Далее необходимо модифицировать программу используя индивидуальное задание в соответствии с номером бригады:
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.