Вы вошли на сайт, как Гость
Регистрация

Контроль предельной скорости

Программные примеры для микроконтроллеров 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
}

Файлы проекта можно скачать здесь: