Есть оптический энкодер от bourns серии EN http://www.bourns.ru/components_encoders.php
128 импульсов на оборот
для считывания и передачи на ПК использую контроллер ATinny 2313 (кварц 7,37 мгц) опрашивается в бесконечном цикле ноги энкодера и соответсвенно обсчитывается
позицию вала считает точно - проверял никуда не уплывает.
а вот скорость неточно - постоянно скачет от 1 до 3 - 4% ! Скорость вращения вала 10 - 40 об мин
Причем измерять скорость пытался двумя способами
1 сначала по разнице в позиции вала за 0.5 секунды например второй вариант считал количество тиков таймера между тиками энкодера.
но в обоих случаях значения скачут.
Код
первый вариант измеряю разность положения вала за определенный период врмени
таймер T0
частота 7199 гц Сompare A = FF // Timer 0 output compare A interrupt service routine interrupt [TIM0_COMPA] void timer0_compa_isr(void) { // Place your code here timercounter++; if (timercounter >15-0 ) { Speed1.result=abs(Encoder1.result-PredEcn1); Speed2.result=abs(Encoder2.result-PredEcn2); PredEcn1 = Encoder1.result; PredEcn2 = Encoder2.result; timercounter =0; }; }
второй вариант (измеряю число тиков таймера между тиками энкодера)
таймер T0
частота 921500 гц Сompare A = FF
interrupt [TIM0_COMPA] void timer0_compa_isr(void) { // Place your code here
timercounter1++; timercounter2++;
if (abs(PredEcn1-Encoder1.result) >= CounterDeep) { if (timercounter1 < 5000000){Speed1.result = (timercounter1);} else {Speed1.result = 51000;};
PredEcn1=Encoder1.result; timercounter1=0; };
if (abs(PredEcn2-Encoder2.result) >= CounterDeep) { if (timercounter2 < 500000){Speed2.result =(timercounter2);} else {Speed2.result = 51000;};