ADC y manipulación de bits

ADC y manipulación de bits

de Julian Oreggioni -
Número de respuestas: 0

Hola,

Hay varios grupos que están usando ADCs y pensando cómo aprovechar los 6 bits que el ADC deja libres en cada conversión (porque el ADC del micro que usamos es de 10 bits).

No es un invento nuestro, claramente, pero les comparto una idea que puede serles útil, que usa uniones, que nos ha resultado muy práctica, y que elaboramos con Leonardo Steinfeld  y Alfredo Solari hace ya algún tiempo.

@Leo, por favor revisá y complementá.

En este ejemplo de más abajo la primera parte de la union va ser para separar entre la muestra (los primeros 10 bits) y un contador de muestras de 6 bits (por ejemplo para analizar en destino si se perdieron muestras). Estos 6 bits podrían redefinirse para implementar un empaquetado de datos o para mandar parámetros u otros datosLa segunda parte de la union separa en bytes para implementar la comunicación con destino, por ejemplo mediante la UART.

________________________________________________________________

typedef union {

  struct {

    unsigned int adc:  10;

    unsigned int count:  6;

  } sample;

  struct {

    unsigned int low: 8;

    unsigned int high: 8;

  } byte;

} data_t;

________________________________________________________________

Ejemplo de uso:

data_t variable1;

// Uso cuando tratan la info como "datos de entrada"

variable1.sample.adc = ADC10MEM;

variable1.sample.count = sample_count+1; // ojo que si llega a 2^6 hay que volver a cero, ¿cómo habría que resolverlo?

// Uso cuando tratan la info como datos para transmitir

uart_buffer_tx[0] = variable1.byte.high;

uart_buffer_tx[1] = variable1.byte.low;

________________________________________________________________

A tener en cuenta con tipos de datos (cosas que comentamos en teórico):

  • Sepan que los : para indicar la cantidad de bits en una variable (dentro de struct o union) lo pueden googlear buscando "bit fields"
  • Comentario de estilo: es usual utilizar el _t al final del nombre de un tipo de dato cuando es definido por el usuario.
  • Para saber que tamaño ocupa un tipo de dato, pueden utilizar el operador: sizeof (recuerden que un mismo tipo de dato puede tener un tamaño distinto cuando es utilizado en diferentes arquitecturas de hw)
  • Para evitarse problemas usen uint8_t, int8_t, etc de la biblioteca stdint.h

________________________________________________________________



Saludos,

Julián