problemas con la modificacion del codigo para IXARC SSI 25 Bits encoder

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

Hola estresado.
Debiste haber puesto un link a tu IXARC SSI 25 Bits encoder que mejore la comprensión de tu problema o crees que todos abrimos el cajón y sacamos uno? jajaja bueno espero no te moleste la broma.

He buscado la hoja de datos porque no entendía que tenia que ver el MAX1486 en la situación pero veo que el encoder entrega los datos de ese modo, usando interfaz RS422.

Estoy analizando tu problema y luego te responderé algo

Hola Surbyte,

Mi nombre es Juanje, y como siempre estresado con esto.... No me molesta en absoluto la broma, es más me relaja que bastante tenso estoy con la manía esta de aprender e innovar que me está costando la úlcera.

A ver este es el básico:

Y este el manual del de 24 bits, que a mi humilde entender es criminal de complicado:

En el segundo encotrarás una explicación muy cañera de todo el funcionamiento basandose en el aTMEGA directamente, se podría adaptar al arduino...

PEro a mi me viene grande (A día de hoy), que me estoy desempolvando los libros de C y demás

Como nota aclaratoria, y temporal, decidí eliminar el envíode datos 422, porque no funcionó e incluso el fabricante tampoco me supo aclarar muy bien si funciona o no ((A mi modesto entender fué un problema de voltaje a más metros de cable (En mi montaje fueros 100 aprox.) se necesitaba mayor voltaje que 5 V, también en el envíod e datos SPI cosa que con el arduino resultaba dificil de cuadrar y lod escarté, me basé en la mayor proximidadd el micro al encoder y reenvio de datos por ethernet, esto me generó otros problem,as que de momento no vienen a cuento (Recuerdas el falloq eu si no tenía conectado el usb no me funcionaba bien? Pues eso)

En fin , que vivan las úlceras de estómago
:slight_smile:

:wink:

Saludos y gracias por tu atención

SOSPECHO EL PROBLEMA VIENE DE LA MANERA DE CONTAR LOS BITS...