подсчет оборотов инкрементного энкодера

Я делаю проект, который требует от меня использования энкодера faulhaber, и у меня есть 2-канальный 16 строк на оборот. Я раньше не работал с энкодерами и, основываясь на том, что я обнаружил, строки на оборот означают, сколько импульсов я получаю за каждый оборот, поэтому в своем коде я использовал прерывание и подсчитывал, сколько раз мой канал A менялся, пока он не достиг 32 счетов. один раз для каждого максимума к минимуму и один раз для каждого минимума к максимуму для моих 16 импульсов, что, по моему мнению, означает, что у меня был один оборот, но когда я тестирую код примерно после 1/6 вращения, мой счетчик достигает 32 и Буду признателен, если кто-нибудь подскажет, в чем я ошибаюсь .

Это техническое описание кодировщика, который я использую IE2_16. р>

вот код:

volatile long int ticks = 0 ;
unsigned long int rev = 0 ;
const int channelA = 2 ;
void setup(){
   Serial.begin(9600);
   pinMode(6,OUTPUT);
   pinMode(7,OUTPUT);
   pinMode(8,OUTPUT);
   pinMode(channelA,INPUT);
   attachInterrupt(digitalPinToInterrupt(channelA), numCunts,  CHANGE);
   digitalWrite(7,LOW);
   digitalWrite(8,HIGH);
   analogWrite(6,15);
}
void loop(){
       Serial.println(rev);

    if(ticks>=32){
       ticks = 0;
       rev++;

      }
}

void numCunts(){
  ticks+=1 ;
  }

, 👍-1


1 ответ


0

Нет, есть несколько проблем с декодированием. Во-первых, вы обнаруживаете каждое изменение. Вы хотите обнаруживать только изменения нарастающего или спадающего фронта.

Во-вторых, изменения, скорее всего, зашумлены, поэтому вам нужно написать свой декодер, чтобы "устранить дребезг" показаний. С 2-канальным энкодером, который вы используете, обычный способ сделать это состоит в том, чтобы реагировать на изменения переднего фронта на канале A только после того, как вы увидели изменение переднего фронта на канале B, и наоборот.

См. эту ссылку для описания того, как они работают: http://www.creative-robotics.com/quadrature- введение

Я пытался написать свой собственный декодер, но это сложнее, чем вы думаете, сделать это правильно. Я бы посоветовал использовать чью-нибудь библиотеку поворотных энкодеров.

И быстрый поиск в Google выявил эту библиотеку на github: https://github.com/PaulStoffregen/Encoder

(Я не знаю, хорошо это или нет. Это первое, что я нашел.)

,