6. Взять разность полученных кодов, которая будет равна периоду исследуемого сигнала. Воспользовавшись операцией деления, вычислить частоту исследуемого сигнала. На рис. 4.43 приведена блок схема рассмотренного алгоритма. Ниже приведен программный фрагмент (timer1.c), который реализует этот алгоритм. В программе применен метод программного опроса триггера события входного захвата C2F. Когда программа «обнаруживает» установленный в 1 триггер события первый раз, она копирует регистр данных канала в переменную rising_1, сбрасывает триггер и ожидает следующей установки триггера события. Когда триггер события установится второй раз, программа копирует регистр данных канала в переменную rising_2. Разность двух зафиксированных в регистре данных канала входного захвата значений позволит вычислить период, а затем и частоту исследуемого импульсного сигнала.
Рис. 4.43. Блок схема алгоритма измерения периода и частоты исследуемого сигнала
Отметим три момента в стиле написания исходного текста представленного программного фрагмента для измерения периода и частоты импульсного сигнала:
• Основная программа «main» содержит вызовы трех функций, каждая из которых выполняет отдельную смысловую задачу;
• Имена функций и переменных выбраны в соответствии с их смысловым назначением;
• Представленный исходный текст программы достаточно полно документирован посредством комментариев перед записью каждой функции.
/*-------------------------------------------------------------------*/
/* filename: timer1.c */
/* МAIN PROGRAМ: Эта программа измеряет период и частоту импульсного */
/* сигнала. Сигнал подключается на вход 2 подсистемы таймера (IC2). */
/*-------------------------------------------------------------------*/
/*подключаемые файлы*/
#include <912b32.h>
#include
#include
/*используемые функции*/
void timer_init(void);
void measure_wave(void);
void period_freq(void);
/*глобальные переменные*/
unsigned long int rising_1;
unsigned long int rising_2;
void main(void) {
timer_init; /*инициализация таймера*/
measure_wave; /*определение времени двух фронтов сигнала*/
period_freq; /*вычисление периода и частоты*/
}
/*----------------------------------------------------------------------*/
/* Функция timer_init производит инициализацию модуля таймера */
/* Канал 2 таймера настраивается на режим входного захвата по переднему */
/* фронту сигнала */
/* Частота тактирования счетчика временной базы устанавливается 2 МГц. */
/*----------------------------------------------------------------------*/
void timer_init(void) {
TMSK1 = 0x00; /*запретить прерывания от каналов таймера*/
TMSK2 = 0x02; /*назначить коэффициент деления 4*/
TIOS = 0х00; /*установить канал 2 в режим входного захвата*/
TSCR = 0х80; /*разрешить работу таймера*/
TCTL4 = 0х10; /*назначить режим детектора событий по*/
/*положительному фронту*/
TFLG1 = 0xFF; /*очистить флаги событий*/
}
/*-------------------------------------------------------------------*/
/* Функция measure_wave запоминает два последовательных момента */
/* нарастающего фронта исследуемого сигнала. Значения запоминаются с */