Собрал устройство, которое при превышении определенной частоты входных импульсов зажигает светодиод.
Входные импульсы - это импульсы тахометра автомобиля. Частота импульсов вдвое больше частоты вращения коленчатого вала двигателя.
Алгоритм работы таков:
На пин контроллера приходят те самые импульсы, контроллер сконфигурирован так что по приходу имульса генерируется прерывание. в главной программе постоянно инкрементируется счетчик (буду называеть его клоками), а в прерывании значение этого счетчика сравнивается с заданным. Т.е. мы смотрим сколько клоков проходит за период входного импульса и сравниваем кол-во клоков с заданным.
на 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 это не машинные циклы а "попугаи" какието))
С Ув.