logo
HCS12 с применением языка С - royallib

Генерация импульсной последовательности

Для того, чтобы сформировать последовательность импульсов на одном из выходов МК, следует воспользоваться подсистемой выходного сравнения. В данном примере мы рассмотрим технику использования одного из каналов таймера в режиме выходного сравнения для генерации импульсной последовательности с заданной частотой и коэффициентом заполнения. В примере мы будем использовать следующие биты и регистры управления:

• Бит разрешения работы модуля таймера 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. Назначим в качестве источника тактирования для счетчика временной базы программируемый делитель, на вход которого подается fBUS =8 МГц;

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); /*генерация высокого уровня*/

  half_cycle(low_time); /*генерация низкого уровня*/

 }

}

/*--------------------------------------------------------------------*/

/* Функция timer_init производит инициализацию модуля таймера.        */

/* Канал 2 таймера настраивается на режим выходного сравнения.        */

/* Частота тактирования счетчика временной базы устанавливается 2 МГц.*/

/*--------------------------------------------------------------------*/

void timer_init(void) {

 TMSK1 = 0x00; /*запретить прерывания от каналов таймера*/

 TMSK2 = 0x02; /*назначить коэффициент деления 4*/

 TIOS = 0х04; /*установить канал 2 в режим выходного сравнения*/

 TSCR = 0х80; /*разрешить работу таймера*/

 TCTL2 = 0х10; /*назначить режим формирователя уровня */

               /*"инвертирование"*/

 TFLG1 = 0x04; /*очистить флаг события канала 2*/

 TC2 = TCNT; /*записать в регистр данных канала 2 текущее*/

             /*состояние счетчика временной базы*/

}

/*------------------------------------------------------------------------*/

/* Функция half_cycle генерирует временной интервал заданной длительности */

/* Число тактов для отсчета должно быть определено вне функции            */

/*------------------------------------------------------------------------*/

void half_cycle(unsigned int time) {

 ТС2 += time; /*задать код сравнения в регистр данных канала*/

 while ((TFLG1 & 0x04) == 0) /*ожидать события выходного сравнения*/

 {

  ;

 }

 TFLG1 = 0x04; /*очистить флаг события канала 2*/

}

/*------------------------------------------------------------------------*/

Предложенный к рассмотрению программный фрагмент (timer2.c) отличается своей простотой и легкостью отладки. Это объясняется использованным методом программного опроса триггера события канала. Однако такой способ генерации импульсного сигнала становится непригодным, если по условию задачи управления необходимо формировать сразу несколько импульсных сигналов, и в каждом из них должны быть точно реализованы их временные параметры. Поэтому рассмотрим способ генерации импульсного сигнала с использованием подсистемы выходного сравнения таймера и подсистемы прерывания.