Hola amigos del foro!!
En esta ocasión vengo a preguntarles sobre como puedo acondicionar la señal de un encoder rotativo de 1000 P/R.
Fotos del Datasheet

Mi duda es la siguiente, como bien explique mas arriba, el encoder por cada vuela envía 1000 pulsos a cada una de sus salidas (A y B). El problema es que
con apenas moverlo, la cuenta se dispara es demasiado sensible. Lo que busco es acondicionar los pulsos, para que por cada vuelta me cuente 360 pulsos un Arduino y lo muestre en un display. Un conocido me comento, que tenia que hacer un prescaler, pero la verdad que no entiendo bien como haría esto en un Arduino.
Por lo que yo entiendo, cuanto mayor es la cantidad de pulsos que me de el encoder, mayor resolucion tengo. Por lo tanto si yo quiero que por vuelta el Arduino me
muestre en pantalla 360 pulsos, menor sera el error del conteo por vuelta. ¿Es así esto?
Este es el programa que yo estoy usando, pero lo que yo necesito, es modificarlo para que el Arduino me cuente 360 P/R.
En esta ocasión vengo a preguntarles sobre como puedo acondicionar la señal de un encoder rotativo de 1000 P/R.
Fotos del Datasheet


Mi duda es la siguiente, como bien explique mas arriba, el encoder por cada vuela envía 1000 pulsos a cada una de sus salidas (A y B). El problema es que
con apenas moverlo, la cuenta se dispara es demasiado sensible. Lo que busco es acondicionar los pulsos, para que por cada vuelta me cuente 360 pulsos un Arduino y lo muestre en un display. Un conocido me comento, que tenia que hacer un prescaler, pero la verdad que no entiendo bien como haría esto en un Arduino.
Por lo que yo entiendo, cuanto mayor es la cantidad de pulsos que me de el encoder, mayor resolucion tengo. Por lo tanto si yo quiero que por vuelta el Arduino me
muestre en pantalla 360 pulsos, menor sera el error del conteo por vuelta. ¿Es así esto?
Este es el programa que yo estoy usando, pero lo que yo necesito, es modificarlo para que el Arduino me cuente 360 P/R.
C++:
volatile unsigned int temp, counter = 0; //This variable will increase or decrease depending on the rotation of encoder
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd (0x27, 2, 1, 0, 4, 5, 6, 7);
void setup() {
lcd.setBacklightPin(3,POSITIVE); // puerto P3 de PCF8574 como positivo
lcd.setBacklight(HIGH);// habilita iluminacion posterior de LCD
lcd.begin(16, 2); // 16 columnas por 2 lineas para LCD 1602A
lcd.setCursor(0, 0);
lcd.clear();
pinMode(2, INPUT_PULLUP); // internal pullup input pin 2
pinMode(3, INPUT_PULLUP); // internalเป็น pullup input pin 3
//Setting up interrupt
//A rising pulse from encodenren activated ai0(). AttachInterrupt 0 is DigitalPin nr 2 on moust Arduino.
attachInterrupt(0, ai0, RISING);
//B rising pulse from encodenren activated ai1(). AttachInterrupt 1 is DigitalPin nr 3 on moust Arduino.
attachInterrupt(1, ai1, RISING);
}
void loop() {
// Send the value of counter
if( counter != temp ){
temp = counter;
delay(200);
lcd.clear();
}
lcd.setCursor(0,0);
lcd.print(counter);
}
void ai0() {
// ai0 is activated if DigitalPin nr 2 is going from LOW to HIGH
// Check pin 3 to determine the direction
if(digitalRead(3)==LOW) {
counter++;
}else{
counter--;
}
}
void ai1() {
// ai0 is activated if DigitalPin nr 3 is going from LOW to HIGH
// Check with pin 2 to determine the direction
if(digitalRead(2)==LOW) {
counter--;
}else{
counter++;
}
}
Última edición: