Для того, чтобы сформировать последовательность импульсов на одном из выходов МК, следует воспользоваться подсистемой выходного сравнения. В данном примере мы рассмотрим технику использования одного из каналов таймера в режиме выходного сравнения для генерации импульсной последовательности с заданной частотой и коэффициентом заполнения. В примере мы будем использовать следующие биты и регистры управления:
• Бит разрешения работы модуля таймера TEN (регистр управления модулем таймера TSCR);
• Бит разрешения прерывания по переполнению счетчика временной базы TOI и биты выбора коэффициента деления программируемого делителя частоты на входе счетчика временной базы PR2:PR1:PR0 (регистр масок таймера TMSK2);
• Бит выбора режима работы канала IOSn (регистр режимов каналов захвата/сравнения TIOS). Если бит IOSn установлен в 1, то канал работает в режиме выходного сравнения. Если бит IOSn равен 0, то канал настроен на режим входного захвата;
• Биты выбора режима работы формирователя уровня канала выходного сравнения OMn:OLn (регистры управления таймером TCTL1 и TCTL2);
• Бит события в канала CnF (регистр флагов таймера TFLG1);
• Бит разрешения прерывания по событию в канале выходного сравнения CnI (регистр масок таймера TMSK1);
• Регистр данных канала TCn, код которого автоматически сравнивается с кодом счетчика временной базы. Момент равенства кодов и является событием выходного сравнения.
В нашем примере мы будем формировать импульсную последовательность, параметры которой определяются числом и годом рождения разработчика. Допустим, Вы родились 19 мая 1977 года. Тогда частота генерируемого сигнала будет равна 519 Гц, коэффициент заполнения будет равен 77%. Для задания численных констант, определяющих частоту и коэффициент заполнения генерируемого импульсного сигнала, проведем следующие несложные расчеты:
1. Назначим в качестве источника тактирования для счетчика временной базы программируемый делитель, на вход которого подается
2. Установим коэффициент деления программируемого делителя частоты на входе счетчика временной базы, равный 4. Тогда частота тактирования счетчика будет равна 2 МГц, что соответствует разрешающей способности счетчика 0,5 мкс. Выбранная таким образом разрешающая способность должна быть достаточна для формирования периода следования и длительности импульса;
3. По условию задачи частота формируемого сигнала составляет 519 Гц, что соответствует периоду следования Т = 1/519 = 0.0019268 с;
4. Вычислим длительность высокого и низкого уровня сигнала на интервале периода. По условию задачи коэффициент заполнения равен 77%. Длительность искомых временных интервалов составляет:
Длительность_1 = 0.77*(0.0019268) = 0.001484 с
Длительность_0 = 0.23*(0.0019268) = 0.0004432 с
5. Преобразуем полученные временные интервалы в целое число периодов частоты тактирования счетчика временной базы:
Код_1 = 0.001484 с/0.5 мкс = 2968 тактов
Код_0 = 0.0004432 с /0.5 мкс = 886 тактов
На рис. 4.44 приведена упрощенная блок схема алгоритма генерации импульсной последовательности. Ниже представлен исходный текст программы на Си (timer2.c), в котором используется метод программного опроса триггера события в канале выходного сравнения.
Рис. 4.44. Блок схема алгоритма генерации импульсной последовательности с заданными временными параметрами
/*------------------------------------------------------------------------*/
/* filename: timer2.c */
/* МAIN PROGRAМ: Эта программа генерирует импульсную последовательность */
/* с частотой 519 Гц и коэффициентом заполнения 77%. Сигнал формируется на*/
/* выходе 2 подсистемы таймера (IC2) */
/*------------------------------------------------------------------------*/
/*подключаемые файлы*/
#include <912b32.h>
/*используемые функции*/
void timer_init(void);
void half_cycle(unsigned int time);
void main(void) {
unsigned int high_time = 2968; /*число тактов высокого уровня*/
unsigned int low_time = 886; /*число тактов низкого уровня*/
timer_init;
half_cycle(low_time); /*генерация низкого уровня*/
while(1) {
half_cycle(high_time); /*генерация высокого уровня*/