Вход/Регистрация
Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С
вернуться

Пак Дэниэл Дж.

Шрифт:

/* Канал 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 запоминает два последовательных момента */

/* нарастающего фронта исследуемого сигнала. Значения запоминаются с */

/* использованием глобальных переменных */

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

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. Этот флаг может программно считываться с последующим сбросом, или по флагу могут быть разрешены прерывания. В подпрограмме прерывания будет инкрементироваться программный счетчик. После того, как второй нарастающий фронт зафиксирован, программа должна выполнить вычисления, используя формулу:

  • Читать дальше
  • 1
  • ...
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: