Hola a todos de nuevo,
Soy el torpe novato , a ver me han enviado otro encoder óptico de mayor precisión. 13 y 12 valores de mono vuelta y multivuelta. He indagado de nuevo por Google y he descubierto que en realidad en lo que he gastado para empezar mi código utilizado hasta ahora de 24 bits. Parte para este modelo de encoder.
El problema es que no consigo que funcione en fino, los valore saltan al extraer los datos de la cadena SSI, lo que equivale a que estoy haciendo algo mal, salvo probleas de transceptor MAX1486 EUB.
Bueno por si alguien puede o quiere colaborar en disipar mis dudas (Yo creo que me viene todo por las posiciones de memoria al leer los datos...
/* Prueba realizadas con el IXARC 25bits
* este codigo está preparado para leer 13 y 12 respectivamente de mono y multi vuelta
* 12 bits == 4096 posiciones por vuelta
* 13 bits == 8192 posiciones por vuelta
* Bits totales 25
*/
const int CLOCK_PIN = 6; //4 max1486eub
const int DATA_PIN = 7; //1 max1486eub
const int BIT_COUNT = 26;
// cBuffer[32];
unsigned long NumVueltas;
float vueltasDec;
float Angulo;
unsigned long pulsos;
float reading;
void setup() {
//configuración de pines
pinMode(DATA_PIN, INPUT);
pinMode(CLOCK_PIN, OUTPUT);
//asigna los valores por defecto
digitalWrite(CLOCK_PIN, HIGH);
digitalWrite(13, LOW);
Serial.begin(19200);
}
void loop() {
float reading = readPosition();
if (reading >= -0.5)
delay(300);
}
//lee la posición angular actual de la monovuelta
float readPosition() {
// repite la lectura de posición para verificar si hay errores
unsigned long sample1 = shiftIn(DATA_PIN, CLOCK_PIN, BIT_COUNT);
unsigned long sample2 = shiftIn(DATA_PIN, CLOCK_PIN, BIT_COUNT);
delayMicroseconds(20); // El reloj se debe quedar en Alto (5V)durante 20 microsegundos antes de poder coger otra lectura
if (sample1 != sample2)
return -1.0;
//pulsos = sample1;
unsigned long pulsos1 = (sample1 & 0x1FFF );
unsigned long pulsos2 = ((sample1 >> 13) & 0x0FFF);
Angulo = ((sample1 & 0x1FFF) * 360UL) / 8192.0;
NumVueltas = ((sample1 >> 13) & 0x0FFF);
vueltasDec = (float)(sample1 / 4096.0);
Serial.print( pulsos1);
Serial.print( " " );
Serial.print( pulsos2);
Serial.print( " " );
Serial.print( Angulo,2);
Serial.print( " " );
Serial.println( vueltasDec,5);
return Angulo;
}
//lee en un byte de datos de la entrada digital de la placa.
unsigned long shiftIn(const int data_pin, const int clock_pin, const int bit_count) {
unsigned long data = 0;
for (int i = 0; i < bit_count; i++) {
data <<= 1;
digitalWrite(clock_pin, LOW);
delayMicroseconds(1);
digitalWrite(clock_pin, HIGH);
delayMicroseconds(1);
data |= digitalRead(data_pin);
}
return data;
}
Si alguien puede ver en donde me está fallando el código, por favor se agradecerá eternamente
Saludos