Translate

miércoles, 20 de febrero de 2013

Proyecto: Levitador magnético

En este proyecto escribiremos un programa para el PIC que mantenga un imán suspendido en el aire. El PIC controlará la bobina de un electroimán a través de un L293D. Bajo este electroimán colocaremos un imán. En ausencia de corriente el imán siente dos fuerzas: la gravedad hacia abajo y la atracción magnética con el núcleo (un tornillo) del electroimán. 

Existe un punto donde ambas fuerzas están equilibradas. Desgraciadamente dicho punto es inestable. Si el imán se aparta un poco de la bobina la atracción magnética disminuye y el peso gana la partida: el imán cae. Si el imán se acercara un poco a la bobina, la atracción imán-tornillo es cada vez más fuerte, por lo que terminará pegándose arriba.  La idea es colocar un sensor de flujo magnético justo debajo de la bobina. Usando este sensor el PIC puede detectar la posición del imán y actuar en consecuencia: si el imán empieza a caerse, hacemos pasar la corriente por el electroimán de forma que atraiga un poco al imán y éste se recupere. Si se acerca, activamos la bobina en sentido contrario para rechazar el imán y volverlo a llevar a la posición ideal de equilibrio.

Podéis encontrar en internet bastantes variantes de este esquema, aunque la mayoría de ellas no usan un microcontrolador sino un integrado (MIC502) originalmente diseñado para modificar la velocidad de un ventilador (mediante PWM) en función de la temperatura de un sensor. La ventaja de un enfoque con un microcontrolador es que tenemos muchas más posibilidades de control (podríamos p.e. hacer oscilar a voluntad el imán). En este proyecto nos limitaremos a construir el programa básico. 

El objetivo del proyecto es lograr algo parecido a lo mostrado en este corto video:



Al igual que en las entradas correspondientes a control de motores acompañamos el código del PIC con un código MATLAB para visualizar los resultados y jugar con los parámetros de control. 

Código asociado:  maglev_4520.c  (código PIC)
                         maglev.m (programa MATLAB de interfaz con el PC).  
Fichero hex:        maglev_4520.hex 

viernes, 1 de febrero de 2013

Controlador PID para posición de un motor DC

En el tema anterior construimos una gráficas mostrando la relación entre el input (% PWM) aplicado y el resultado (velocidad) obtenido por el motor. Podríamos usar esa información para controlar nuestro motor. Si queremos que gire con una cierta velocidad, podríamos ver que entrada (PWM) precisamos y aplicarla. Sin embargo ya comentamos que dicha relación cambia por numerosos factores, por lo que nunca estaríamos seguros de alcanzar la velocidad deseada.

Técnicamente esta situación se conoce como un control de bucle abierto, al no tener un feedback que nos informe de lo que realmente está haciendo el motor. De hecho disponemos de dicho feedback (la info de los encoders en cuadratura) pero hasta ahora no la estamos usando.

En esta entrada vamos a "cerrar" el bucle, usando el feedback de que disponemos para controlar la posición de un  motor. La entrada suministrada por el usuario no será un PWM (de efectos inciertos) sino un objetivo en términos de la velocidad o posición deseada del motor. El sistema, en función del feedback recibido, variará adecuadamente su variable de control (en este caso el ciclo ON del PWM) para conseguir el objetivo dado. Usaremos un sencillo controlador PID para la implementación.

Al igual que en el tema anterior, acompañaremos al código en C del microcontrolador con un programa en MATLAB para poder mostrar de forma gráfica los movimientos del motor.



Archivos de código asociado a esta entrada: 
          PID_pos.c  monitor_PID.m (MATLAB)


Manejo de motores DC usando PWM

En este tema usaremos nuestros conocimientos del PWM del PIC para guiar un motor de corriente continua (DC). En esta primera entrada simplemente aplicaremos un PWM con un duty variable al motor y observaremos su respuesta (velocidad) usando los codificadores en cuadratura explicados en la entrada anterior.

Obviamente el PIC no puede proporcionar la intensidad necesaria para mover un motor, por lo que necesitaremos algún tipo de driver o interfaz. Para poder manejarlo en las dos direcciones usaremos un driver configurado como un puente en H (H-bridge). Describiremos el popular integrado (aunque no especialmente eficaz) L293D. Otras alternativas basadas en MOSFETs son más eficientes, pero el concepto y la forma de controlar el MOTOR serán comunes.

Ficheros de código asociados a esta entrada:  quad_pwm.c , auto_pwm.c , auto_pwm.m

Codificadores en cuadratura


Tras un largo paréntesis impuesto por el trabajo, retomo el blog. En las siguientes entradas vamos a aplicar la salida PWM del micro a un motor DC con capacidad para manejarlo en ambas direcciones.  Nuestro objetivo final será escribir un código de control para hacer que el motor alcance una posición dada y se detenga o se mueva con velocidad constante.  Para ello necesitaremos algún tipo de información sobre la posición del motor y su velocidad. La forma más común de obtener dicha información es a través de codificadores en cuadratura. 

En esta entrada describiremos su concepto y los diferentes modos en los que podemos monitorizarlos (1X, 2X, 4X).


Archivos de código asociado a esta entrada:   quad1.c

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

miércoles, 27 de junio de 2012

Aplicación: Audio con PWM

Una aplicación inmediata (y más interesante que los LED de colores del programa anterior) de la modulación PWM es intentar reproducir un archivo de audio digital tipo WAV usando el módulo PWM del PIC como un DAC (Digital-Analog Converter) incorporado.

Obviamente el principal problema es dónde guarda el PIC el audio a reproducir.  En la memoria de un PIC pueden caber unos 1000/2000 bytes, lo que a un ritmo de típico de 8 o 10 KHz solo da para una fracción de segundo. Lo que vamos a hacer en esta aplicación es recibir los datos a través del puerto serie. Si ajustamos la velocidad del puerto serie a 115200, teniendo en cuenta que para cada byte necesitamos mandar 10 bits (datos + start + stop) esto se traduce a un ritmo de unos 11500 bytes/segundo, muy cercano a 11025 que es una típica frecuencia de muestreo de archivos de audio. Según lleguen los datos por el puerto serie los usaremos para modificar el ciclo de trabajo del módulo PWM que previamente habremos configurado.

A la izquierda tenemos una foto con el hardware usado. A la derecha, un video donde pueden oírse el resultado,  junto con una captura de la señal PWM en el osciloscopio:

                         

Código asociado a esta entrada:  PWM_audio_serial.c
Proyecto C18 completo:  proyecto.rar