|
Контроль предельной скорости
Программные примеры для микроконтроллеров PIC - MPLab IDE
(Контроль предельной скорости вращения двигателя)
Таймер TMR1 работает в режиме захвата на входе. На вход ССР1 (например,
вывод 2 порта С) подается сигнал от тахометра, измеряющего скорость вращения
двигателя. Если период следования импульсов становится меньше 1 мс, то это говорит о слишком высокой скорости вращения двигателя, а включается светодиод,
подключенный к выводу 0 порта D.
При измерении периода следования импульсов от тахометра следует учитывать
возможность возникновения переполнения счетчика, поэтому в программе
реализуем подсчет переполнений.
При рабочей частоте микроконтроллера 10 МГц и коэффициенте деления 1 за
одну секунду счетчик подсчитывает 10000 импульсов, поэтому будем сопоставлять
полученную величину периода именно с этим значением.
Примечание: при компиляции проекта требуется добавить в проект следующие библиотеки: "16F877.h", "stdio.h".
PSP_1.c
#use delay(clock=10000000)
#fuses HS, NOWDT
int N_overflows;
unsigned long int N_start, N_end;
long int N;
#int_timer1 //Обработка прерывания при переполнении TMR1
timer1_isr()
{
++N_overflows; //Увеличиваем счетчик переполнений
}
#int_CCP1 //Обработка прерывания при захвате на входе
CCP1_isr()
{
N_end = CCP_1; //Количество тактовых импульсов, подсчитанных
//с момента поступления предыдущего импульса на входе CCP1
//Вычисляем период между двумя последовательными импульсами CCP1
N = (N_overflows * 0x10000) - N_start + N_end;
if (N < 10000) //Если период меньше 10000 импульсов, то...
output_low(PIN_D0); //загорается сигнальная лампочка
else
output_high(PIN_D0); //Иначе лампочка гаснет
N_start = N_end; //Запоминаем позицию текущего замера
N_overflows = 0; //Сбрасываем счетчик переполнений
}
void main()
{
setup_ccp1(CCP_CAPTURE_RE); //Захват по нарастающему фронту
//Инициализируем TMR1: тактируется от внутреннего осциллятора,
//без предварительного деления частоты
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
//Разрешаем прерывание при переполнении TMR1
enable_interrupts(INT_TIMER1);
//Разрешаем прерывание при захвате на входе
enable_interrupts(INT_CCP1);
enable_interrupts(global); //Общее разрешение прерываний
while(1); //Бесконечный цикл в ожидании сигнала на входе CCP1
}
|
Файлы проекта можно скачать здесь:
|
|
|