Ir ao conteúdo

Posts recomendados

Postado

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 :D

  • 4 anos depois...
Postado

Olá amigo, já faz muito tempo, mas vamos lá, bem, logo no começo do código, se estabelece uma interrupção externa na borda de descida. E se você prestar atenção na onda gerada pelos dois sinais do encoder, logo depois de uma mudança de estado lógico de um sinal, por exemplo, A indo pra LOW,  se B estiver também em LOW nesse instante, quer dizer que o encoder está girando pra um sentido, mas se estiver em HIGH quer dizer que esta girando no outro. O mesmo vale pra uma subida, e para o sinal B. Aplicando isso pra esse código, temos que ele só vai fazer o teste quando ou houver uma interrupção,  porque o teste if está dentro da função que é chamada pela interrupção,  e está é causada pela borda de descida, logo o teste será feito logo após a borda de descida ocorrer, então se os estados lógico estiverem iguais: um sentido de rotação. Se diferentes: sentido oposto.Entendeu? valeu. Abraços.

 

  • 2 meses depois...
Postado

Boa tarde, pessoal!

Estou precisando ligar um sensor ótico simples(sg213) no meu arduino para controlar o fim de curso do meu step motor. Estou apanhando. solicito uma ajuda para programar o arduino para o motor reconhecer o sensor. Penso em colocar na verdade dois um pra trilha inicio e o outro para o fim.Peço ajuda dos colegas.

Citação

 

 

Visitante
Este tópico está impedido de receber novas respostas.

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!