![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Генерация импульсной последовательности
Для того, чтобы сформировать последовательность импульсов на одном из выходов МК, следует воспользоваться подсистемой выходного сравнения. В данном примере мы рассмотрим технику использования одного из каналов таймера в режиме выходного сравнения для генерации импульсной последовательности с заданной частотой и коэффициентом заполнения. В примере мы будем использовать следующие биты и регистры управления: • Бит разрешения работы модуля таймера 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) отличается своей простотой и легкостью отладки. Это объясняется использованным методом программного опроса триггера события канала. Однако такой способ генерации импульсного сигнала становится непригодным, если по условию задачи управления необходимо формировать сразу несколько импульсных сигналов, и в каждом из них должны быть точно реализованы их временные параметры. Поэтому рассмотрим способ генерации импульсного сигнала с использованием подсистемы выходного сравнения таймера и подсистемы прерывания.
|