Lectura analógica

Algunos modelos de PICs (y Arduinos) cuentan con unas entradas llamadas analógicas. ¿Qué es una entrada analógica?

Hasta ahora hemos estado trabajando con entradas y salidas digitales, es decir, que pueden estar en estado alto o bajo, 5 voltios o 0 voltios. Sin embargo, el mundo real no está conformado de señales digitales ni mucho menos evoluciona como tal. Lo que nos permite un puerto analógico es leer y transformar un valor de tensión entre 0 y 5 voltios (en el modo más basico) en un valor numérico.

Dicho valor numérico viene determinado por el PIC y la programación, los hay que usan 8 bits.

Con 8 bits tenemos un recorrido de 2^8 = 256, si tenemos en cuenta que cuando lea 5 voltios tendremos un valor de 256, ésto nos da una resolución (paso) de 0.0195 voltios por cada 1 que se sume al valor.

También tenemos la posibilidad de usar 10 bits: 1024, lo cual nos da una resolución de 0.00488V por valor.

Para un sistema analógico bien acondicionado, es una precisión excelente ¿no creéis?

¿Cómo usamos dicho puerto analógico en la programación?

En primer lugar, se debe indicar al compilador que vamos a usar el “device ADC” y con qué resolución lo queremos (en bits), justo después de añadir la librería del PIC.

#Include <PICQUEVASAUSAR.h>
#Device ADC= Resolución //8 o 10 según os convenga
#Fuses
#Byte
Etc...

Y se debe poner justo ahí porque si no, ya he comprobado que no funciona. Así pues, necesitaremos una variable para almacenar el valor que nuestro ADC lea. Para intentar ahorrar espacio, si usas 8 bits te conviene un int, y si usas 10 bits mejor usar un int16. Como deduciréis, el primero ocupa 8 bits y el segundo 16.

También necesitaréis un float para almacenar el valor convertido a tensión (en caso de necesitarlo).

int16 lectura;
float valor;

El siguiente paso es configurar el puerto. En primer lugar, el pin del puerto que se vaya a usar para la lectura se debe declarar como entrada obligatoriamente, mientras el resto se usará como entradas o salidas digitales normalmente. Recordad que ésto se hace con el registro TRIS.

Para configurar el ADC podéis hacerlo accediendo directamente al registro ADCON0 y ADCON1 y según indique la datasheet los programáis al gusto, o bien podéis tomar el atajo y usar las funciones de CCS.

En primer lugar, decimos qué entradas queremos que sean analógicas:

setup_adc_ports(---);
// Donde he puesto --- hay una lista enorme de posibilidades, las más usadas serían:
// ALL_ANALOG -> Todas las patas del puerto analógico funcionan como tal
// NO_ANALOG -> Ninguna analógica, ésto viene por defecto
// AN0 -> Sólo la pata AN0 es usada como entrada analógica, la más usada.
// AN0_AN1_AN3 -> Ésas 3 serían analógicas
// Y más combinaciones que podéis ver en la librería .h de vuestro PIC
// También es posible seleccionarlos uno a uno escribiendo por ejemplo
// setup_adc_ports(sAN0 | sAN2 | sAN6);

Como ya he indicado, lo más normal es usar sólo una entrada analógica y el resto digitales, se pone AN0 o sAN0 según el PIC (ensayo y error).

El próximo paso es indicarle al ADC con qué velocidad de reloj va a funcionar:

setup_adc(---);
//ADC_CLOCK_DIV_2
//ADC_CLOCK_DIV_8
//ADC_CLOCK_INTERNAL
//Etc
//Lo más indicado es visitar la librería del pic para ver
//de qué dispone

Por último, hay que decir al pic, de entre todas las entradas analógicas que hemos configurado, cuál queremos que lea.

set_adc_channel(Canal);
//El canal vendría siendo 0 para AN0, 3 para AN3, ...

Cuando todo esté listo, podemos empezar a leer el ADC con la/s siguiente/s función/es:

Posibilidad 1:
lectura = Read_adc(); //que es lo mismo que usar
lectura = Read_adc(ADC_START_AND_READ);
delay_us(20); //Le damos un poco de tiempo

Posibilidad 2:
Read_adc(ADC_START_ONLY); //Inicia el ADC pero no lo lee
//Aquí haríamos lo que quisiéramos entre medias, más funciones
lectura = Read_adc(ADC_READ_ONLY); //Y cuando se lo pedimos lo lee
delay_us(20);

Lo más rápido y sencillo es usar la “posibilidad 1” con lect = read_adc() y punto.

Una vez hecho ésto habremos adquirido en la variable lect un valor correspondiente a la tensión que se encontrase en la pata analógica en ése momento. Si lo que queremos es saber el valor de la tensión que se ha leído, tenemos que hacer una regla de tres:

Si 1024 son 5 voltios ¿Cuántos voltios es lo que he leído?

1024 —- 5
lect —- valor

valor = lect*1024/5;

Y así se obtiene ya un valor decimal de dicha tensión.

Espero que os sea de utilidad.