Ir ao conteúdo

jhonathaneletric

Membro Júnior
  • Posts

    11
  • Cadastrado em

  • Última visita

Reputação

0
  1. Pessoal, Quero usar este programa para ler um encoder mecanico de 24 pulsos por revolução.Porém eu testei e nao funcionou direito pois cada pulso que eu dava girando o encoder incrementava de 1 a 3 vezes o contador.Qual é o problema? O programa foi retirado do site da arduino. /* read a rotary encoder with interrupts Encoder hooked up with common to GROUND, encoder0PinA to pin 2, encoder0PinB to pin 4 (or pin 3 see below) it doesn't matter which encoder pin you use for A or B uses Arduino pullups on A & B channel outputs turning on the pullups saves having to hook up resistors to the A & B channel outputs */ #define encoder0PinA 2 #define encoder0PinB 4 volatile unsigned int encoder0Pos = 0; void setup() { pinMode(encoder0PinA, INPUT); digitalWrite(encoder0PinA, HIGH); // turn on pullup resistor pinMode(encoder0PinB, INPUT); digitalWrite(encoder0PinB, HIGH); // turn on pullup resistor attachInterrupt(0, doEncoder, CHANGE); // encoder pin on interrupt 0 - pin 2 Serial.begin (9600); Serial.println("start"); // a personal quirk } void loop(){ // do some stuff here - the joy of interrupts is that they take care of themselves } void doEncoder() { /* If pinA and pinB are both high or both low, it is spinning * forward. If they're different, it's going backward. * * For more information on speeding up this process, see * [Reference/PortManipulation], specifically the PIND register. */ if (digitalRead(encoder0PinA) == digitalRead(encoder0PinB)) { encoder0Pos++; } else { encoder0Pos--; } Serial.println (encoder0Pos, DEC); } /* See this expanded function to get a better understanding of the * meanings of the four possible (pinA, pinB) value pairs: */ void doEncoder_Expanded(){ if (digitalRead(encoder0PinA) == HIGH) { // found a low-to-high on channel A if (digitalRead(encoder0PinB) == LOW) { // check channel B to see which way // encoder is turning encoder0Pos = encoder0Pos - 1; // CCW } else { encoder0Pos = encoder0Pos + 1; // CW } } else // found a high-to-low on channel A { if (digitalRead(encoder0PinB) == LOW) { // check channel B to see which way // encoder is turning encoder0Pos = encoder0Pos + 1; // CW } else { encoder0Pos = encoder0Pos - 1; // CCW } } Serial.println (encoder0Pos, DEC); // debug - remember to comment out // before final program run // you don't want serial slowing down your program if not needed } /* to read the other two transitions - just use another attachInterrupt() in the setup and duplicate the doEncoder function into say, doEncoderA and doEncoderB. You also need to move the other encoder wire over to pin 3 (interrupt 1). */ Tenho algumas duvidas: No sentido horário a sequencia dos canais A e B é: 00, 10, 11, 01 Então nao faz sentido dizer que quando "CanalA = CanalB incrementa-se e caso contrario decrementa-se" pois isto sempre vai acontecer em qualquer sentido de rotaçao em um ciclo completo. Me expliquem por favor? Isto acontece nessa etapa : void doEncoder() { /* If pinA and pinB are both high or both low, it is spinning * forward. If they're different, it's going backward. * * For more information on speeding up this process, see * [Reference/PortManipulation], specifically the PIND register. */ if (digitalRead(encoder0PinA) == digitalRead(encoder0PinB)) { encoder0Pos++; } else { encoder0Pos--; } Desculpem minha 'noobeza' e minha ignorância mas sou iniciante Obrigado

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...