Translate

viernes, 7 de junio de 2013

Proyecto: Medidor de potencia

En este proyecto vamos a construir un medidor de potencia, un dispositivo que monitoriza la potencia (de la que se puede deducir fácilmente el consumo) de un electrodoméstico o cualquier otro aparato conectado a la red.

Para obtener la potencia consumida tendremos que monitorizar (muestrear) la intensidad y el voltaje de la red. Como siempre que manipulemos la red, debemos ser muy cuidadosos con nuestros montajes. Existen varias formas de monitorizar el voltaje e intensidad de la red. En este montaje he escogido la que me ha parecido más segura: un montaje en el que existe un aislamiento galvánico entre la red y las señales que el micro monitoriza.

Una vez que tenemos las medidas de intensidad y voltaje a lo largo de un ciclo de trabajo (20 milisegundos si nuestra red va a 50 Hz) es muy sencillo para el micro estimar valores como la intensidad RMS, potencia RMS y potencia real consumida y volcar los resultados por el puerto serie o (si queremos un sistema más autónomo) presentarlos en un LCD.

Como en proyectos anteriores, se adjunta un programa MATLAB para visualizar los datos capturados (intensidad, potencia instantánea, etc.) a lo largo de un ciclo, permitiéndonos ver gráficamente aspectos como el desfase entre Intensidad y Voltaje, forma de onda de la intensidad, etc.  En el video adjunto se muestran los resultados para el caso de una pequeña batidora, mientras cambiamos su velocidad, ponemos el "turbo", etc:


Código asociado:  power_meter.c  (código PIC)
                         18f4520_g.lkr    (linker script modificado) 
                         power_meter.m (programa MATLAB de interfaz con el PC).  


martes, 4 de junio de 2013

Formateo de números en coma flotante

Como comentamos en la entrada anterior, la función sprintf (y sus variantes) del compilador C18 no tienen soporte para volcar datos de tipo float en coma flotante (modificador %f en ANSI C). La posible razón es que interpretar y volcar números en coma flotante no es trivial, por lo que el código necesario es relativamente grande. La función sprintf ya ocupa bastante código (alrededor de 2K word) y si incluyese soporte para números reales su tamaño posiblemente se doblaría. Al ser una función monolítica, dicho coste adicional lo sufrirían incluso aquellos usuarios que nunca trabajasen con números en coma flotante.


En esta entrada vamos a describir la representación de números en coma flotante dentro del PIC para entender como se guarda la información. A partir de ahí crearemos un par de rutinas que nos permitan volcar este tipo de datos a una cadena.

El objetivo es poder sacar datos por el LCD o puerto serie con los formatos mostrados en la figura adjunta, que corresponden a %e (izquierda) y %f (derecha) del printf definido en ANSI C.



Código asociado a esta entrada: float2ascii.c 

lunes, 3 de junio de 2013

Formateo de datos (para LCD o puerto serie)

En muchos momentos (presentación de resultados, debug) tendremos que visualizar valores de la variables de nuestro programa por el LCD, puerto serie o equivalente. Ello conlleva convertir los datos numéricos en cadenas de texto mostrando sus contenidos, bien sea en formato binario, hexadecimal, decimal, etc.

El compilador C18 (y otros basados en ANSI C) ya cuentan con una forma rápida y versatil de hacer dicha conversión: con las rutinas tipo printf, sprintf o equivalentes.

Estas funciones son muy flexibles y convenientes pero como veremos pueden ser lentas y ocupar bastante espacio. Son ideales por su conveniencia en las primeras fases de un desarrollo. Sin embargo, si la  aplicación se va complicando y nos acercamos a los límites del micro usado podemos encontrarnos con que ocupan demasiada memoria de programa y/o van demasiado lentas.

En esta entrada replicaremos la funcionalidad de sprintf de forma modular. Escribiremos varias rutinas para volcar diferentes datos enteros con varios formatos (binario, hexadecimal, decimal con o sin signo, etc). Estas funciones, al preocuparse de un solo argumento y tipo de formato van a ser mucho más pequeñas y rápidas que sprintf. Además, muchas veces, dentro de una aplicación, solo trabajaremos con un cierto tipo de datos, por lo que este tipo de rutinas pueden ahorrarnos bastante código.

En una entrada posterior trataremos el tema de la presentación de datos tipo float, del que carecemos por defecto en C18.

Código asociado a esta entrada: int2ascii.c