domingo, mayo 17, 2009

Universal Battery Charger

Mi proyecto de este mes es un cargador de baterías universal, es decir, carga todo tipo de baterías (NiCd, NiMh, LiPo (o LiPoly), SLA, litio, etc), todo controlado en forma inteligente por el PIC 16F877A para garantizar el cuidado de la vida útil de las baterías y obtener su máxima eficiencia.

Estoy haciendo código fuente, por ahora, les muestro una foto de preview:












Análisis de carga/descarga de baterías NiCd y NiMh

La carga es el proceso de restaurar la capacidad original a una batería descargada. Con el fin de lograr una mayor vida útil, se debe cargar con el método apropiado.

Se usan varios métodos para cargar celdas recargables:

1. Carga de corriente rápida: 1CmA (temperatura de carga rápida: 0 C a 40 C). Para lograr controlar y detener la carga rápida, se recomienda cargar a más de 0.5CmA pero menos de 1CmA. La carga de baterías a más de 1CmA puede causar que se active la ventilación de seguridad por el aumento de la presión interna de las baterías, causando fuga de electrolítos. Cuando la temperatura de las baterías se detecta por un termistor u otro tipo de sensor, y su temperatura está bajo 0 C o sobre los 40 C al comienzo de la carga, se debe realizar una carga flotante, en lugar de una carga rápida. Una carga rápida se debe detener cuando cualquiera de los valores descriptos más abajo alcanza el nivel señalado:

  • Control del límite voltaje superior: Aprox. 1.8V/celda. Este método de carga se cambia a flotante si el voltaje de la batería alcanza aproximadamente 1.8V/celda debido a problemas o funcionamiento incorrecto de alguna naturaleza.
  • Valor de dV/dt (o corte por delta pico): 5 a 10mV/celda. Cuando el voltaje de la batería cae de su pico un 5 a 10mV/celda durante la carga rápida, está se debe detener, y el método de carga se debe cambiar a flotante.
  • Valor de dT/dt (o corte por temperatura): 1 a 2 C/min. Cuando un aumento en la temperatura de batería por unidad de tiempo se detecta en el termistor u otro tipo de sensor de temperatura durante la carga rápida, y el aumento de temperatura es detectado por el sensor, la carga rápida debe detenerse y el método de carga cambiarse a flotante.
  • Tiempo límite: 90 minutos.


2. Para cargar baterías excesivamente descargadas, primero aplicar carga flotante para que la corriente fluya, y luego proceder con la carga rápida una vez que el voltaje de la batería se elevó.
Voltaje inicial para carga rápida: Aprox. 0.8V/celda con una corriente de 0.2 ~ 0.3 CmA.

Requisitos:

  • Espera inicial: 10 minutos. Esto previene que los circuitos de detección de dV/dt se active por el tiempo especificado al comienzo de la carga rápida. Sin embargo, la detección dT/dt puede estar activa en este periodo. Esto es necesario para baterías que fueron dejadas sin carga durante mucho tiempo o fueron excesivamente descargadas, etc. La espera inicial es necesaria para prevenir que la carga se detenga (para prevenir malos funcionamientos) debido a pseudos -dV/dt.
  • Corriente flotante o de mantenimiento: 0.033 a 0.05 CmA. Cuando el flujo de corriente es alto, la temperatura de las baterías aumenta, causando que las características de la batería se deterioren.
  • Tiempo de carga rápida: 60 minutos.
  • Tiempo total: 10 a 20 horas. Sobrecargar una batería NiXX, aun en carga flotante o de mantenimiento, causa el deterioro en las características de las baterías. Para prevenir la sobrecarga por carga flotante o cualquier otro método, se debe proveer de un temporizador para regular el tiempo total de carga.


Análisis de carga/descarga de baterías SLA (Sealed Lead-Acid) Plomo-Ácido

A diferencia de las baterías NiXX, este tipo de baterías se cargan a voltajes fijos en lugar de corrientes fijas.

Método de carga:
1. Verificar si la batería.
2. Si está bien, iniciar la carga a corriente constante a capacidad/10.
3. Cuando el voltaje alcance 2.55V/celda cambiar a carga por voltaje constante a 2.45V/celda.
4. Si la corriente cae por debajo de capacidad/20 entonces cambiar a carga flotante.
5. Cargar en forma flotante a 2.25V/celda por tiempo indefinido (máximo recomendable 20 horas).

Requisitos:

Una batería SLA no debería descargarse a menos de 1.5V/celda.
Voltaje máximo para baterías SLA es de 3V/celda.

Análisis de carga/descarga de baterías LiPO (litio polímero) y LiIon(ion de litio)

Método de carga:
1. Corriente constante hasta 1C hasta que el voltaje alcance los 4.2V/celda.
2. Voltaje constante a 4.2V/celda hasta que la corriente caiga a la capacidad / 15.
3. Carga flotante a capacidad / 30 por 30 minutos.

Requisitos:
Una batería LiPO no debería descargarse a menos de 2.5V/celda.
Voltaje máximo para baterías LiPO (litio polímero) es de 4.5V/celda.

En base a estas recomendaciones, diseñé el cargador con las siguientes características:

Descripción Valor por defecto

Corriente máxima de carga: 0 a 5A
Corriente máxima de descarga: 440mA ( I = V/R -> I = 12/27 -> I=0.444mA)
Modos: 0:NiMh, 1:SLA, 2:NiCd, 3:LiPo, 4: LiIon
Capacidad de celdas: 3000mAh
Número de celdas: (1 a 19) 6

Carga: (0.1 a 25.5) (10) -> 3000*1.0=3A
Descarga: (0.1 a 25.5) (40) -> 3000*4.0=12A

Espera delta pico: 10 minutos

Corte por bajo voltaje (por celda):
NiCd (0 a 2550) 800mV
NiMh (0 a 2550) 1000mV
LiPo (2500 a 3500) 3000mV
SLA (1500 a 2500) 2000mV

Delta pico (0 a 255):
NiCd 10mV
NiMh 5mV

Voltaje máximo por celda:
NiCd 1680mV
NiMh 1680mV
LiPo (3500 a 4500) 4200mV
SLA (2000 a 3000) 2500mV (2.5V x 6 celdas = 15V - voltaje máximo para SLA de 12V)

Corriente final (% de la corriente de carga inicial, 0 a 255):
LiPo (5%) -> 3000*5/100=150mA
SLA (5%) -> 3000*5/100=150mA

Timeout
NiCd y NiMh 65 min a 1C, 130 min para 0.5C, etc

Tiempo total: 20 h

Universal Battery Charger 0.01



Universal Battery Charger 0.98

La funcionalidad está al 80%

Refactoring...










Software de PC

Carga de batería SLA de 1200mAh de 6 celdas a 0.1C


Carga de batería LiIon (de celular) de 920mAh de 1 celda a 0.3C


Descarga de batería LiIon


Carga de batería NiMH de 2500mAh 2 celdas a 0.5C


29-10-2009 Disponibilidad de PCBs
Están disponibles en la sección de descargas los PCBs del cargador gracias al amigo Emiliano del foro de uControl:








Licencia
Los archivos e imagenes de este sitio se encuentran disponible bajo la licencia Creative Commons (Attribution-Share Alike 3.0 Unported)

Video del cargador funcionando:



* Videos.


Aviso de seguridad
La sobrecarga de baterías Li-Ion y Li-Poli puede llegar a ser explosiva:


Si van a hacer pruebas, por favor, haganlo con baterías NiCd o en su defecto NiMH, y luego pasen a las SLA, al último, con las basadas en Iones de litio

Documentación completa del proyecto

Este es el diseño del PCB del amigo Emiliano del foro uControl (www.ucontrol.com.ar).

Luego de pedirle permiso para su publicación aquí están las fotos de su excelente trabajo:











En el caso del LCD vamos a dar dos versiones, así se adapta a 16x1 o 14x1, en su caso tenía uno de 7x2



Descargas en la sección correspondiente del blog.

domingo, abril 19, 2009

Fuente de alimentación digital

Fuente de alimentación digital






Descripción
Este proyecto se basa en las modificaciones de Osvaldo Valdorre (ver hilo del foro TodoPic) a la fuente de alimentación publicada por la revista elektor número 260.

La fuente tiene las siguientes características

• Tensión de entrada: 220VAC
• Tensión de salida: 0 a 25VDC con una corriente de 0 a 2.5A.
• Precisión de la regulación
• Gruesa: 1V / 100mA
• Fina: 100mv / 3mA
• Uso del microcontrolador PIC 16F877A de Microchip dejando disponibles para el uso 10 puertos.
• Ajuste por medio de pulsadores y encoder mecánico u óptico.
• Ventilación controlada de acuerdo al consumo de corriente.
• Lectura del consumo de corriente, con indicación de sobre corriente visual y auditiva.
• Memorias preseleccionadas (2.5, 3, 3.3, 5, 9 y 12 voltios a 0.5A, 1A y 2.5A).
• Control de ventilación por lectura de temperatura.
• Líneas de alimentación de circuito de control separado de la parte de potencia.
• Información de todos los valores por medio de LCD 16x2 con control de contraste y backlight.
• Control y comunicación por RS232 con PC u otra placa de control.
• Código escrito en C del compilador SDCC.

Agradecimientos
Totalmente agradecido con Osvaldo Valdorre por crear esta fuente y compartirla con la comunidad.

Un especial agradecimiento a los integrantes del Foro uControl - El mejor foro de internet para los amantes de electrónica, por sus ayudas en mi carrera por armar esta fuente en muy poco tiempo.


Licencia

Esta documentación se encuentra disponible bajo la licencia Creative Commons (Attribution-Share Alike 3.0 Unported)


Objetivo
Una fuente de alimentación es una de las herramientas más usadas en un laboratorio electrónico, existen en el mercado de varios tipos, con voltaje fijo, regulables en forma analógica, fuentes conmutadas (como las de PC) que proveen tensiones variadas (12v, -12v, 5V, -5V) con altos amperajes.
La idea de esta fuente de alimentación es que sea una fuente analógica controlada/regulada por el microcontrolador de fácil armado, barata y con múltiples prestaciones con posibilidades de expansión.


Restricciones de diseño
Dado que la disipación en calor para 25V a 3 o 4A puede comprometer algunos componentes se debe contar con ventilación forzada controlada por temperatura y consumo.

Las líneas de alimentación externas deben estar separadas de la parte de control, esto reduce posibles caídas de tensión por el uso de la ventilación, la luz trasera del LCD u otros dispositivos.

Para facilitar la construcción los PCBs se diseñarán a una cara sin puentes sin impedir el uso de métodos de menor costo como la transferencia de toner por calor.

El peso de dos transformadores más la electrónica en general puede llevar a que la fuente tenga un peso importante (3kg en mi caso), es por ello que se utilizará un gabinete de aluminio de 3mm.

El lenguaje de programación debe ser C dado que es fácil de entender para una amplia mayoría de personas, pero con rutinas en assembler cuando se requiera eficiencia de ejecución.

El compilador debería ser gratuito y sin límite en la generación del archivo HEX para el PIC.

El código debe estar muy comentado en cada una de sus fases para facilitar al que desee adaptar el trabajo a sus necesidades.

Hardware
El circuito está formado por dos partes, una analógica con transistores de paso, operacional LM324N, transformadores, regulador 7805, entradas y salidas de control.
La parte de control está formada por el microcontrolador, el LCD, el buzzer, conector ICSP, y conectores a pulsadores de entrada y encoder si se elige usar.
Parte analógica
El circuito regulador está dominado por el componente LM324N, un operacional cuadrúple que nos da la posibilidad de una tensión máxima de 32V y con el uso de resistencias de baja tolerancia (en mi caso utilizo de 5%, pero se recomienda del 1%).

El circuito lo dividí en secciones para su mejor entendimiento y análisis

Etapa de alimentación



En esta fuente la etapa de control (parte digital) es la más elaborada, y la parte analógica es la clásica con el agregado de control contra cortocircuitos provistos por T1,T2,T3 (BC547) y las resistencias de 0.51ohm que aterrizan la base de los transistores de potencia Q1..3.

Regulación de tensión
El funcionamiento sería así, la fuente de corriente constante formada por D4, D5, R5, Q4 y R1 provee de 2mA a la base de los darlington. La referencia de dichos transistores está controlada por los operacionales de la parte de control.


Se realiza con el divisor de tensión formado por R13, R14 y R17, pero como la lectura se ve afectada por la corriente suministrada y que cae en resistencia Rs (resistencia shunt, las 10 resistencias de 1ohm en paralelo) cuando a la salida tendría que haber 25v, se tendrá 25.25v, es por ello que se usa el IC1D que es un amplificador inversor, si hay un consumo de 2.5A por ejemplo, aparece una caida de 0.25V en los extremos de la Rs.

Como dije, IC1D entonces se lo usa para realizar dicha corrección, entonces veremos que este tiene esta fórmula:

Vo = -(R18/(R19+R20)) * Vin
entonces si Vin como dijimos es 0.25V
Vo = -(10k/40k)*0.25
Vo = -0.0625V (recuerden este numerillo)

Ok, el potencial entre los 25.25v y la referencia -0.0625v nos da 25.3125v, luego a la salida del divisor resistivo formado por R13, R14 y R17 habría:

Vo = Vi * (R17 / (R17 + R13 + R14) = 5.0625v

y como el amplificador LM324 tiene una referencia de masa de -0.0625 gracias al diodo D9.
El voltaje queda en 5V listos para entrar en el comparador IC1A

IC1A recibe la salida del divisor de tensión y la compara con la tensión seleccionada ya que

Vo = Vs+ siempre que V1 > V2
Vo = Vs- siempre que V1 < V2 De esa forma regula el voltaje de salida (o corta si el voltaje supera el valor deseado). Regulación de corriente



Lo mismo es con la corriente, siguiendo el ejemplo propuesto, si hay un consumo de 2.5A, tendríamos a la entrada del operacional no inversor 0.25v y ya que

Vo = (1+ 19k/1k) * 0.25 = 5V

Y la salida va a parar a la entrada inversora del IC1C y sucede lo mismo que en IC1A, es decir se regula la referencia de los transistores o se corta si se supera el máximo preseleccionado.

------------------------

Análisis del encoder

Encoder para rotación continua con tres pines de salida.
Dos canales de salida de código grey (http://es.wikipedia.org/wiki/Código_Gray).
Genera tres secuencias binarias 11,10, 00, 01 por cada giro.
Código Gray de dos bits
00
01
11
10

El encoder posee tres terminales, uno es el común, y los otros son las salidas digitales generadas por los contactos internos del dispositivo.

Genera la siguiente secuencia
Canal A B
Estado1 0 0
Estado2 0 1
Estado3 1 1
Estado4 1 0

Rotación en sentido horario ->
00 01 11 10 00
<- antihorario="" en="" n="" rotaci="" sentido="" span="" style="font-weight: bold;">Conección al PIC
El terminal del medio va a masa y los otros dos se conectan cada uno a una resistencia de pullup de al menos 1k a VCC.



Chuck McManis y su publicación "Quadratrack: Using Mechanical Rotary Encoders" es el autor original de la lectura del encoder en el código ASM de Valdorre.

URL: http://www.mcmanis.com/chuck/robotics/projects/lab-x3/quadratrak.html

Citando al autor:
Para una interrupción de 1khz desde el TMR0 en un sistema a 4MHZ se debe hacer este código (en ASM):

; * * * * * *
; * BANK 1 Operations
; * * * * * *
BSF STATUS,RP0 ; Set Bank 1
MOVLW B'0000010' ; Set TMR0 prescaler to 8
MOVWF OPTION_REG ; Store it in the OPTION register
CLRF TRISB ; B all outputs
BSF TRISB,QUAD_A ; Except for Quadrature inputs
BSF TRISB,QUAD_B
; * * * * * * * * * * *
; * BANK 0 Operations *
; * * * * * * * * * * *
CLRF STATUS ; Back to BANK 0
BSF INTCON, T0IE ; Enable Timer 0 to interrupt
BCF INTCON, T0IF ; Reset interrupt flag
BSF INTCON, GIE ; Enable interrupts


Luego el servicio de interrupción debería ser:


; Interrupt Service Routine Pre-amble, save state,
; reset status to BANK 0
INTR_PRE:
MOVWF TMP_W ; Copy W to temp register
SWAPF STATUS,W ; Swap Status and move to W
MOVWF TMP_STATUS ; Copy STATUS to a temp
CLRF STATUS ; Force Bank 0
;
; State is saved, and we've expended 3 Tcy plus the
; 3 Tcy (4 worst case) of interrupt latency for a total
; of 6(7) Tcy.
;
; Now loop through until we've satisfied all the
;pending interrupts.
;
ISR_0:
; ... test bit to see if it is set
BTFSS INTCON,T0IF ; Timeer0 Overflow?
GOTO ISR_1 ; No, check next thing.
;
; Else process Timer 0 Overflow Interrupt
;
BCF INTCON, T0IF ; Clear interrupt
MOVLW D'133' ; Reset 1khz counter
MOVWF TMR0 ; Store it.
CALL QUAD_STATE ; Check Quadrature Encoders.
GOTO ISR_1 ; Nope, keep counting
ISR_1:
;
; Exit the interrupt service routine.
; This involves recovering W and STATUS and then
; returning. Note that putting STATUS back
; automatically pops the bank back as well.
; This takes 6 Tcy for a total overhead of 12 Tcy for sync
; interrupts and 13 Tcy for async interrupts.
;
INTR_POST:
SWAPF TMP_STATUS,W ; Pull Status back into W
MOVWF STATUS ; Store it in status
SWAPF TMP_W,F ; Prepare W to be restored
SWAPF TMP_W,W ; Restore it
RETFIE


Como se puede ver, primero se recarga la interrupción TMR0 para asegurar un ratio de ticks (y además esta es la primer interrupción verificada!)
Luego se verifica el estado del encoder en la llamada a QUAD_STATE:



;
; QUAD State
;
; A quadrature encoder traverse a couple of states
; when it is rotating these are:
; 00 | Counter
; 10 | Clockwise
; 11 | ^
; 01 V |
; 00 Clockwise |
;
;
QUAD_STATE:
BCF STATUS,C ; Force Carry to be zero
MOVF PORTB,W ; Read the encoder
ANDLW H'6' ; And it with 0110
MOVWF Q_1 ; Store it
RRF Q_1,F ; And rotate it right.

RLF Q_NOW,F ; Rotate Q_NOW Left
RLF Q_NOW,W ; by two
IORWF Q_1,W ; Or in the current value
MOVWF QUAD_ACT ; Store at as next action
MOVF Q_1,W ; Get last time
MOVWF Q_NOW ; And store it.
;
; Computed jump based on Quadrature pin state.
;
MOVLW high QUAD_STATE
MOVWF PCLATH
MOVF QUAD_ACT,W ; Get button state
ADDWF PCL,F ; Indirect jump
RETURN ; 00 -> 00
GOTO DEC_COUNT ; 00 -> 01 -1
GOTO INC_COUNT ; 00 -> 10 +1
RETURN ; 00 -> 11
GOTO INC_COUNT ; 01 -> 00 +1
RETURN ; 01 -> 01
RETURN ; 01 -> 10
GOTO DEC_COUNT ; 01 -> 11 -1
GOTO DEC_COUNT ; 10 -> 00 -1
RETURN ; 10 -> 01
RETURN ; 10 -> 10
GOTO INC_COUNT ; 10 -> 11 +1
RETURN ; 11 -> 00
GOTO INC_COUNT ; 11 -> 01 +1
GOTO DEC_COUNT ; 11 -> 10 -1
RETURN ; 11 -> 11
INC_COUNT:
INCF COUNT,F
MOVLW D'201'
SUBWF COUNT,W
BTFSS STATUS,Z
RETURN
DECF COUNT,F
RETURN
DEC_COUNT
DECF COUNT,F
MOVLW H'FF'
SUBWF COUNT,W
BTFSS STATUS,Z
RETURN
INCF COUNT,F
RETURN












Soñando un poco...


El diseño del gabinete para fuente lo estoy realizando con el software gratuito de google llamado SketchUp.

Vista del frente


Vista posterior


Luego de teclear bastante, tengo programada y funcionando 100% la parte de control de la fuente de alimentación digital.

Leyendo mediciones.
Por un lado tenemos al voltímetro abajo, el lcd arriba, y a la derecha un programa de comunicación serial donde puedo comunicarme con la fuente.


Trabajando sobre el prototipo de la placa de control.
Aquí pueden ver al multiboard funcionando junto a sus amigos módulos, pickit 2 clone reloaded,FT232 para conversión RS232 a USB para control desde la PC, LCD de la fuente, placa de potencia, etc.


El software está programado en C, totalmente explicado con comentarios y es posible reemplazar el uso del encoder óptico por dos pulsadores o un encoder mecánico con una simple línea de código:

#define USAR_PULSADORES


El compilador usado es el SDCC, un compilador gratuito, que uso desde un editor de texto llamado ConTEXT.

Bueno, esta es la placa de control, va atornillada en el frente.


Es importante ver que del modelo con plano de masa le agrego igualmente más area marcada para ayudar al ataque ácido.


Luego de 4 horas de laburo tenemos la placa de control funcionando, un agregado más a la fuente de valdorre es que dispone de conección ICSP para no tener que sacar el micro, que tiene la extraña costumbre de no hacer caso a entrar o salir de los zócalos de 40 pines.


El LCD de 16x2 va soldado con pines a la parte posterior del pcb. No soldar hasta saber que todo funciona ok, o de lo contrario te va a costar bastante la "desoldadita".


Software de control arrancando


1,2,3 probando, todo ok!


Control ventilación por temperatura

Utilizo un NTC de 10k

El esquema es el siguiente:
entrada analogica RA2---------o------------NTC-------O 5V
                                          |
                                          Resistencia de
                                          470 OHM
                                          |
                                          GND

Este componente no está en la placa de control, ya que lo armé de esta manera:











Le faltaría el panel frontal en blanco con letras negras y de la parte trasera todavía me falta el conector RS232.






Videos de la fuente funcionando:








Descargas en la sección correspondiente del blog.