Страница 1 из 1

Объясните по определению частоты входящих импульсов.

Добавлено: Чт май 19, 2011 02:26:36
zenekk
Собрал устройство, которое при превышении определенной частоты входных импульсов зажигает светодиод.
Входные импульсы - это импульсы тахометра автомобиля. Частота импульсов вдвое больше частоты вращения коленчатого вала двигателя.

Алгоритм работы таков:
На пин контроллера приходят те самые импульсы, контроллер сконфигурирован так что по приходу имульса генерируется прерывание. в главной программе постоянно инкрементируется счетчик (буду называеть его клоками), а в прерывании значение этого счетчика сравнивается с заданным. Т.е. мы смотрим сколько клоков проходит за период входного импульса и сравниваем кол-во клоков с заданным.
на GPIO2 весит кнопка при нажатии которой запоминается сколько клоков прошло за период входного импульса.

вот для большего понимания немного кода:

Код: Выделить всё

unsigned long clk=0;
unsigned long fr=0;

iterrupt pulse(){ // обработчик прерываний
  GIE=0;//запрещаем прерывания
  if(GPIO2==0) //если нажата кнопка запоминания текущей частоты
    fr=clk;
  }
  if(clk<fr){
     GPIO0=1; // зажигаем LED
  }else GPIO0=0; //гасим LED
  clk=0;
  GIE=1; //разрешаем прерывания
}

int main(){
  // ...инициализация и конфигурирование контроллера
  while(1) clk++;
  return 0;
}
При оборотах двигателя 840об\мин=16об\сек=32Гц за каждый период импульса клоков насчитывается 1500.

Контроллер тактируется внутренним генератором 4МГц. Машинный цикл - 4 такта.
Я так понимаю что за одну секунду должно насчитываться 1.000.000 клоков.
Между входными импульсами насчитывается 1500 клоков. Следовательно 1.000.000 \ 1500 => частота импульсов ~666 Гц что соответсвует 333 об\сек = 18000об\мин :blink: :wall:

как так?? как посчитать правильно частоту при такой реализации (на прерывании по переднему фронту импульса)? А то получается что 1500 это не машинные циклы а "попугаи" какието))

С Ув.

Re: Объясните по определению частоты входящих импульсов.

Добавлено: Чт май 19, 2011 08:03:24
Аlex
Конечно попугаи. Даже если бы clk был char, он не инкрементировался бы за 1 МЦ. А он у Вас ещё и long :)
Юзайте таймеры. Они могут "тикать" каждый МЦ.