Помогите пожалуйста! Измерение скорости врашения двигателя avr 8535
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено pv 22 января 2004 г. 09:00

на ось двигателя надет датчик, который выдает импульсы с частотой 600*F, где F - частота вращения двигателя.
эти импульсы я завожу на внешнее прерывание:

#pragma vector=INT0_vect
__interrupt void ext_int0_isr(){
if (status.BEGINIMPULSECOUNTER){
impulsetimer_start=TCNT1;
status.BEGINIMPULSECOUNTER=0;
impulsecounter=0;
}else{
impulsetimer_stop=TCNT1;
impulsecounter+=1;
}
}

TCNT1 бежит от 8Мгц кварца поделенного на 8, т.е. микросекунды считает.

теперь по прерыванию от компаратора (100 раз в секунду) (на него 50 Гц от розетки заведено):

#pragma vector=ANA_COMP_vect
__interrupt void ana_comp_isr(){
GIMSK=0; //turn off ext. interrupts
enginefreq=((unsigned long)(impulsecounter)*16666667)/((unsigned int)(impulsetimer_stop-impulsetimer_start));
status.BEGINIMPULSECOUNTER=1;
GIMSK=0xC0; //turn on ext. interrupts
}

считается частота вращения двигателя.
считается почти правильно. но не совсем.
если ему на внешнее прерывание подать ровно 6000 Гц с генератора (проверил частотомером, генератор стабильно и точно генерит), то avr насчитает частоту в диапазоне от 10 Гц до 10,2 Гц (причем всегда больше 10 Гц)
насколько я понимаю если я считаю частоту 100 раз в секунду, то счетчик времени, который микросекунды считает, должен насчитать примерно 10000, т.е. точность измерения должна быть около 10^(-4), а на самом деле получается гораздо хуже. что я не так делаю?
зы если это сэмултровать в proteus, то становится чуть-чуть получше, но все равно разброс частот такой же примерно.

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru