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.