Translate

martes, 17 de julio de 2012

ADC con interrupciones


En la entrada dedicada al conversor AD vimos como optimizar el código ejemplo del compilador de C18. Aprovechando las características especificas de cada controlador, usando macros en vez de llamadas a funciones, etc. conseguimos que el tiempo necesario para una conversión bajase desde unos 50 usec a 25 usec. Eso equivalía a duplicar el posible ritmo de muestreo de 20000 a 40000 muestras por segundo.

En esta entrada vamos a explorar el uso de interrupciones junto con el conversor AD.

En primer lugar veremos como usar la interrupción de un timer para asegurar un ritmo de muestreo exacto. Posteriormente veremos como usar la interrupción asociada al ADC para no tener que esperar mientras el conversor realiza su tarea. Esto nos permitirá liberar gran parte de los recursos del micro, lo que será especialmente útil si estamos cerca del ritmo de muestreo máximo.

Codigo asociado a esta entrada:  adc0_timer.c, adc1_timer.c

viernes, 13 de julio de 2012

Proyecto: brújula electrónica

En este proyecto vamos a ver una simple aplicación del uso del conversor AD del  PIC. Se trata de escribir el código base de una brújula electrónica. La idea es disponer de dos sensores magnéticos alineados en dos ejes (A y B) perpendiculares en el plano horizontal, cada uno de ellos midiendo la correspondiente componente del campo magnético terrestre.


Con el conversor AD tomaremos dos medidas (ma y mb) "simultáneas" (separadas por unos pocos usec) de ambos sensores. A partir de ellas hallaremos el ángulo relativo (theta) entre la orientación del eje A de nuestra brújula y el norte magnético.  Además de usar el conversor AD, el proyecto nos servirá para introducir el tema de optimización de rutinas matemáticas cuando estamos usando microcontroladores. En particular en este proyecto tenemos que usar la función arco tangente para obtener el ángulo a partir de las medidas ma y mb. Veremos una implementación aproximada de dicha función, adecuada para la precisión requerida en este proyecto y con bastante menos carga (tanto de código como computacional) que la rutina matemática (atan2) suministrada con el compilador.

El siguiente cutrevideo trata de dar una idea del resultado final.  


Código asociado a esta entrada:  brujula1.c, brujula2.c

Conversor ADC


En otro tutorial vimos como el módulo PWM funcionaba como una especie de conversor digital -> analógico (DAC). El conversor analógico-digital (ADC) que equipa a muchos microcontroladores hace justo lo contrario, convirtiendo un voltaje analógico externo en un número, con el que podremos operar.

Como siempre empezaremos con una introducción sobre los fundamentos de un conversor AD y los registros usados para su manejo en los PIC. Tras entender el proceso, presentaremos las rutinas de C18 para el manejo del ADC y escribiremos nuestras propias funciones, que nos permitirán optimizar el rendimiento del ADC y no depender de un compilador en particular.

En la siguiente entrada veremos como al igual que pasaba con el puerto serie, usando interrupciones podemos optimizar el rendimiento del PIC mientras estamos usando el conversor AD.

Codigo asociado a esta entrada:  adc1.c