Главная » Статьи » Микроконтроллеры » Firmware |
Всё намного проще чем может показаться на первый взгляд. Во-первых надо завести себе прерывание по таймеру с довольно большой частотой, я взял 8-ми битный счётчик на полной частоте процессора и прерывание по переполнению т.о. прерывание будет происходить через каждые 256 тактов при частоте кварца 16МГц это 62500 раз в секунду. Во-вторых надо объявить переменную "ШИМ счётчик" которая будет считать время внутри одного периода ШИМ и увеличивать её на единицу по каждому прерыванию счётчика. В-третьих для каждой ноги МК на которой нужен ШИМ объявить переменную которая будет определять ширину импульса. Удобно использовать массив из 8-ми значений сразу для целого порта. На каждом прерывании сравнив значение "ШИМ счётчика" со значением ширины импульса т.е. если значение счётчика меньше значения ширины мы выставляем на ноге "1", если значение счётчика больше значения ширины мы выставляем на ноге "0". Пример кода: char b_values[8];//Широты импульсов char pmw_counter = 0;//Шим счётчик char GeneratePortValue(char pmw_values[8],char pmw_counter) //Функция вычисляющая значение порта { char result = 0; char mask = 1; int i; for(i=0;i<8;i++) { if(pmw_values[i]>pmw_counter) { result |=mask; } mask=mask<<1; } return result; } interrupt [TIM0_OVF] void timer0_ovf_isr(void) //Прерывание по таймеру { PORTB = GeneratePortValue(b_values,pmw_counter); pmw_counter++; } Меняя занчения b_values можно менять яркость светодиодов подключенных к порту B. Конечно можно подключать и не только светодиоды, но и двигатели, электромагниты и т.п., но для них уже нужны RC фильтры для сглаживания сигнала и транзисторы для увеличения мощности. | |
Просмотров: 1006 | Рейтинг: 0.0/0 |
Всего комментариев: 0 | |
Меню сайта |
Форма входа |
Категории раздела | |||
|
Поиск |
Наш опрос |
Друзья сайта |
|
Статистика |
Онлайн всего: 1 Гостей: 1 Пользователей: 0 |