/* использованием глобальных переменных */
/*-------------------------------------------------------------------*/
void measure_wave(void) {
while((TFLG1 & 0х04) == 0) {
/*ожидать нарастающего фронта*/
;
}
rising_1 = TCNT; /*запомнить код счетчика временной базы*/
/*в переменной rising_1*/
TFLG1 = 0х04; /*сброс триггера события канала 2*/
while((TFLG1 & 0х04) == 0) {
/*ожидать нарастающего фронта*/
;
}
rising_2 = TCNT; /*запомнить код счетчика временной базы*/
/*в переменной rising_2*/
TFLG1 = 0х04; /*сброс триггера события канала 2*/
}
/*------------------------------------------------------------------------*/
/* Функция period_freq вычисляет период и частоту исследуемого импульсного*/
/* сигнала и отображает полученные значения на экране */
/*------------------------------------------------------------------------*/
void period_freq(void) {
unsigned long int new_rising;
unsigned long int new_falling;
float frequency;
float period;
unsigned int int_period;
unsigned int int_freq, freq_tenths;
if(rising_2 < rising_1) /*вычисление периода*/
{
new_rising = rising_2 + 0xFFFF;
period = ((float)new_rising (float)rising_l)*0.0000005;
} else {
period = ((float)rising_2 (float)rising_l)*0.0000005;
}
frequency = 1.0/period; /*вычисление частоты*/
int_freq = (int)(frequency/l000.0);
freq_tenths = (int)((frequency –(float) int_freq*1000)/100.0);
/*вывод результатов*/
printf("Frequency = %d.%d kHz \n\n" int_freq, freq_tenths);
int_period = (int) (1000000*period);
printf("Period = %d s\n\n", int_period);
printf{"Period = %f ms\n\n", (period*1000))};
}
/*------------------------------------------------------------------------*/
Приведенная программа выдаст ошибочный результат для сигналов, период которых превышает период переполнения счетчика внешних событий. В одном из домашних заданий в конце данной главы мы попросим Вас изменить исходный текст программы так, чтобы измерение более «медленных» сигналов также стало возможным. Какие изменения в программу следует внести? Вы должны будете контролировать, сколько раз переполнился счетчик временной базы между двумя соседними событиями в канале входного захвата. Для этого следует организовать программный счетчик, который будет инкрементироваться каждый раз, когда счетчик переполнится. Переполнение счетчика Вы будете фиксировать по установленному флагу TOF. Этот флаг может программно считываться с последующим сбросом, или по флагу могут быть разрешены прерывания. В подпрограмме прерывания будет инкрементироваться программный счетчик. После того, как второй нарастающий фронт зафиксирован, программа должна выполнить вычисления, используя формулу:
Рассматриваемая программа имеет также ограничение по измерению сигналов с достаточно высокой частотой. Как узнать максимальную частоту, которая может быть измерена? Для этого следует вспомнить, что в нашем учебном примере частота внутренней шины МК составляет 8 МГц. Вы должны просмотреть ассемблерный код функции измерения частоты measure_wave и определить, сколько машинных тактов необходимо для распознавания установленного в 1 флага события и считывания кода первого события из регистра данных канала. Именно этот интервал является минимальным периодом сигнала, который может быть измерен.