Electrónica de control
Aunque el sistema no requiere de ningún tipo de manipulación, se ha incorporado un interruptor en el habitáculo para poder activarlo o desconectarlo a voluntad. Dicho interruptor actúa sobre un relé que incorpora el circuito de control. Por ello la línea de control puede ser un cable de sección reducida. Es complicado encontrar una comunicación del vano del motor al habitáculo para pasar el cable, todo está completamente sellado y de difícil acceso. Pude encontrar un resquicio detrás del guardabarros en la rueda delantera izquierda, junto al pilar que sujeta la puerta del mismo lado y perforando unos tapones de plástico que comunicaban con el interior.
Quitando el guardabarros de la rueda delantera izquierda y a través del pilar que sujeta la puerta podemos comunicar el alojamiento del motor con el habitáculo.
Es necesario quitar elementos del tapizado y el tirador de la apertura del capó para hacerse hueco hasta localizar unos tapones de plástico que se pueden ver en el interior de la aleta.
Como guía he utilizado un pequeño retal de cable que nos permitirá encaminar la manguera definitiva. Hay que tener cuidado a la hora de perforar el tapón exterior para evitar hacer el agujero demasiado grande (peligro de filtraciones), solo lo necesario para pasar la manguera. En el caso del tapón interior, cuanto más grande hagáis el agujero menos trabajo costará pasar el cable. No está de más sellar con masilla el paso de cable en el tapón exterior de la aleta. El recorrido final se realiza por la parte trasera del faro pegado al guardabarros y se puede guiar fácilmente hasta la caja de control localizada junto al depósito de electrolito. En el lado del habitáculo canalizo el cable junto al resto de mangueras y sitúo el interruptor detrás del cenicero.
Terminada esta primera línea de control, es necesario canalizar la alimentación de potencia desde la batería hasta nuestra electrónica. En este caso es necesario ser generosos con la sección del cable ya que estamos manejando corrientes por encima de los 10A. Con 4mm de sección tendremos garantizada la seguridad de la instalación. La toma de alimentación la cogeremos de uno de los fusibles que está sin uso (el perteneciente a la caja manual comandada) del grupo situado en la parte superior de la batería. El negativo lo tomo directamente del chasis, en uno de los tornillos de la viga que sujeta nuestro depósito.
La toma de alimentación en este punto es limpia y de fácil acceso. El amperaje del fusible original está sobredimensionado por lo que hay que tener presente el sustituirlo por uno lo más aproximado a 15A. La interconexión con la electrónica la realizaremos con grupos de conectores faston.
Un último cable es necesario para controlar la producción de HHO. Cuando el inyector no está metiendo combustible a la cámara de combustión no es necesario producir hidrógeno ya que este no se aprovecha (no se quema), esto sucede cuando deceleramos o tenemos el motor parado. Como medida de seguridad extra viene perfecto para evitar que se esté produciendo hidrógeno y se acumule cuando tenemos el contacto puesto con el motor parado. Para conocer si se está inyectando combustible tomaremos la actividad de uno de los inyectores a través de la inducción producida en el cable que lo alimenta. Con un pequeño número de espiras junto al cable del inyector podremos tomar la señal que lo controla y evitaremos manipular líneas activas. Esta señal la llevaremos a la electrónica de control con un cable apantallado de sección reducida. Dada la proximidad de elementos del motor con temperatura elevada evitaremos que el cable esté próximo a estas zonas.
Con solamente uno de los hilos que alimenta el inyector podremos tomar una muestra de señal que nos servirá para comprobar la actividad del motor.
Una pequeña clema de electricista nos servirá para unir el cable esmaltado con la línea coaxial.
La inteligencia del sistema recae en la electrónica de control que se encarga de las siguientes funciones: Activación del sistema en remoto. El interruptor utilizado para activar el sistema puede ser de reducidas dimensiones y/o baja potencia y alojarse discretamente en cualquier lugar del habitáculo. La entrega de potencia la realizan el relé de la electrónica. Regulación de corriente de la célula mediante PWM. El consumo de corriente por la célula varía dependiendo de la densidad del electrolito y su temperatura. Por esto es importante tener continuamente supervisada la corriente que circula y regular mediante PWM. Cuando se llena por primera vez el depósito con agua se introduce poco a poco las pastillas de potasa hasta que alcanzas un consumo de 8A a temperatura ambiente. Es necesario respetar un tiempo de reposo e ir añadiendo día a día la cantidad necesaria de potasa hasta alcanzar la corriente mencionada. Aunque por programación se ha optado por un consumo de 10A, estos se alcanzan fácilmente cuando se calienta el electrolito después de permanecer un tiempo funcionando. A partir de ese momento el sistema PWM nos regulará la corriente y evitará que el consumo se incremente excesivamente. Supervisión de la inyección de combustible. Mantendremos el sistema produciendo hidrógeno solamente cuando el motor este inyectando combustible. El hidrógeno es peligroso y conseguiremos cortar la producción en los momentos que no son necesarios. Monitorización de corriente y tensión. Continuamente se supervisa la corriente consumida por la célula y la tensión. Estos datos son enviados a un smartphone junto con la información de la actividad de la célula (si se ha cortado la producción de HHO) y el porcentaje de regulación PWM. El circuito de control está montado sobre una placa estándar de prototipos. Hay que respetar unas secciones mínimas entre las conexiones de entrada de alimentación y la salida hacia la célula. Para el resto del conexionado se ha utilizado cable de puentes. Lo primero que nos encontramos es el conjunto de relés en cascada que activan el sistema. El RL1 es importante que soporte 20A. La entrada RA0 del PIC16F886 nos medirá la corriente consumida por la célula y en patilla RA1 se toma una muestra de la tensión de alimentación. El diodo BY251 junto con el filtro formado por L1 y C9 y C10 nos evitan tener fuertes sobrecorrientes y picos de tensión que generan gran cantidad de ruido eléctrico y pueden llegar a ser dañinas para el resto de los sistemas. La salida de potencia está formada por los MOS IRFZ44N que es necesario protegerlos con un radiador para mejorar la disipación de potencia. También al regulador de tensión 7805 es necesario añadirle un pequeño disipador. Como enlace bluetooth se ha utilizado el módulo hibrido HC-06 que nos servirá de medio para el envío de información vía radio. La captación de la señal del inyector es tomada a través de la pequeña bobina L2 que tras amplificarla y filtrarla por U5 y U6 se la entregamos al PIC en la entrada RB0.
FU 15A D1 BY251 D2 1N4004 R1 620 R2 150 RA0/AN0/ULPWU/C12IN0- 2 RA1/AN1/C12IN1- 3 RA2/AN2/VREF-/CVREF/C2IN+ 4 RA4/T0CKI/C1OUT 6 RA5/AN4/SS/C2OUT 7 RB0/AN12/INT 21 RB1/AN10/P1C/C12IN3- 22 RB2/AN8/P1B 23 RA7/OSC1/CLKIN 9 RA6/OSC2/CLKOUT 10 RC0/T1OSO/T1CKI 11 RC1/T1OSI/CCP2 12 RB7/ICSPDAT 28 RB6/ICSPCLK 27 RB5/AN13/T1G 26 RB4/AN11/P1D 25 RC7/RX/DT 18 RC6/TX/CK 17 RC5/SDO 16 RC4/SDI/SDA 15 RC3/SCK/SCL 14 RC2/CCP1/P1A 13 RA3/AN3/VREF+/C1IN+ 5 RB3/AN9/PGM/C12IN2- 24 RE3/MCLR/VPP 1 U1 PIC16F886 RL1 Relé potencia 20A C1 100nF C2 1nF C3 4700uF  25V 1uF 10k VI 1 VO 3 GND 2 U2 7805 C5 1uF C6 1uF VI 1 VO 3 GND 2 U3 7809 C7 1uF C8 1uF R4 330 R5 330 Q1 BC548 Q2 BC548 R6 3k3 R7 1k R8 22 R9 100k Q3 IRFZ44N Q4 IRFZ44N R10 22 R11 100k C9 4700uF  25V C10 4700uF  25V L1 10uH + Celula HHO - Celula HHO RL2 Relé 5V D4 1N4004 D5 1N4004 C11 10uF +5V D6 LED R12 10k SW Int. seguridad habitáculo +12V +12V Bateria IP+ 1/2 IP- 3/4 VIOUT 7 VCC 8 GND 5 FILTER 6 U4 ACS712ELCTR-20A-T C12 1uF +5V R14 10k C13 4nF Rx Tx GND Vcc HC-06 C14 1uF +5V 3 2 1 8 4 U5:A TL072 5 6 7 8 4 U5:B TL072 L2 Det. Inyector +9V C15 10nF R13 100k R15 100k R16 1k R17 100k C16 100nF C17 100nF R18 47k R19 1k R 4 DC 7 Q 3 GND 1 VCC 8 TR 2 TH 6 CV 5 U6 555 C19 10nF C20 4,7uF R20 100k +5V +5V D3 LED R21 330 D7 1N4004 R22 10k R23 100k C21 4,7uF +9V C18 1uF
Esquema eléctrico encargado de controlar la producción de HHO.
Las reducidas dimensiones del circuito hace posible alojar el conjunto fácilmente.
Firmware microcontrolador ;------------------------------------------------------------------ ; ;	Control PWM y supervisor de corriente en sistema  ;		HHO para Peugeot 308. ; ;------------------------------------------------------------------  	LIST P=16F886 	INCLUDE  <P16F886.INC> 	processor PIC16F886  ;--< config settings >--------------------------------------------- __CONFIG  _CONFIG1, _INTOSCIO & _BOR_OFF & _IESO_OFF & _CPD_OFF & _CP_OFF  & _MCLRE_OFF & _LVP_OFF & _FCMEN_OFF & _PWRTE_ON & _WDT_OFF & _DEBUG_OFF __CONFIG  _CONFIG2, _WRT_OFF & _BOR40V  ;--< constants >--------------------------------------------------- ;Imax	equ	D'110'	; 11,0 Amp ;Imin	equ	D'100'	; 10,0 Amp  Imax	equ	D'110' Imin	equ	D'100'   ;--< variables >--------------------------------------------------- 	CBLOCK 0x70 		Delay_1		;temporizador 1. 		Delay_2		;temporizador 2. 		Delay_3		;temporizador 3. 		Valor_I		;Valor intensidad (A/D conv). 		Valor_V		;Valor voltaje Bateria (A/D conv). 		Valor_PWM	;Valor porcentage modulador PWM. 		DecBCD_0	;Digito 0 conv. Bin-BCD. 		DecBCD_1	;Digito 1 conv. Bin-BCD. 		DecBCD_2	;Digito 2 conv. Bin-BCD. 	ENDC  	ORG	00h         	;startup = 0000H (Reset Vector). 	goto	Inicio 	  ;--< Main Program >------------------------------------------------  	ORG	05h		;startup = 0005H (Main Program). Inicio 	BANKSEL	OSCCON 	movlw	B'01110000'	;Inic clock 8Mhz INTRC 	movwf	OSCCON^80H Stable 	btfss	OSCCON^80H,HTS	;INTOSC frequency stable? 	goto	Stable  	clrf	Valor_I		;Inic variable. 	clrf	Valor_V		;Inic variable. 	clrf	Valor_PWM	;Inic variable.  	call	IniINT		;Config. interrupciones. 	call	IniPORT		;Config. puertos. 	call	IniPWM		;Config. PWM.  ;--< Bucle principal >--------------------------------------------- MainLoop 	call	wait1s  	call	AD_ConversionV	;Tomar lectura Voltaje. 	call	AD_ConversionI	;Tomar lectura Intensidad. 	 	btfss	PORTB,RB0	;¿Se esta inyectando combustible? 	goto	SinInyeccion	;No se esta inyectando. 	 	call	RegIntensidad	;Regulacion PWM.  	movf	Valor_PWM,W	;Establecer ajuste PWM. 	movwf	CCPR1L  	call	Tx_Trama	;Enviar datos Bluetooth.  	goto	MainLoop  SinInyeccion 	call	AnularHHO	;Reducir hasta anular HHo  	movf	Valor_PWM,W	;Establecer ajuste PWM. 	movwf	CCPR1L  	call	Tx_Trama	;Enviar datos Bluetooth.  	goto	MainLoop  ;------------------------------------------------------------------   ;------------------------------------------------------------------ ;	Anular la produccion de HHO. ;	En caso de detectar que no se inyecta combustible, ;	la produccion de HHO se reduce hasta 0. ;------------------------------------------------------------------ AnularHHO 	movf	Valor_PWM,F	;¿Es 0 el valor de PWM? 	btfsc	STATUS,Z	 	return			;Ya no hay produccion de HHO.  	decf	Valor_PWM,F	;Seguir reduc.la produccion hasta 0. 	return  ;------------------------------------------------------------------   ;------------------------------------------------------------------ ;	Regulacion intensidad consumida por la celula HHO. ;------------------------------------------------------------------ RegIntensidad 	movf	Valor_I,W	;Comprobar valor max. intensidad.  	sublw	Imax 	btfsc	STATUS,C 	goto	CompImin	 	decf	Valor_PWM,F	;I>Imax => reducir PWM. 	decf	Valor_PWM,F 	return  CompImin 	movf	Valor_I,W	;Comprobar valor min. intensidad. 	sublw	Imin 	btfss	STATUS,C 	return 	incf	Valor_PWM,W	;I<Imin => aumentar PWM. 	sublw	D'51' 	btfss	STATUS,Z 	goto	IncPWM 	movlw	D'50'		;No sobrepasar el valor maximo de  	movwf	Valor_PWM	;de control PWM (D'50' = 100%) 	return  IncPWM 	incf	Valor_PWM,F  	return  ;------------------------------------------------------------------   ;------------------------------------------------------------------ ;	Retardo (no hay prisa en hacer un anueva lectura). ;------------------------------------------------------------------ wait1s 	clrf	Delay_3 	clrf	Delay_2  	movlw	0x01 	movwf	Delay_1  wait1s_loop 	decfsz	Delay_3,F 	goto	wait1s_loop  	decfsz	Delay_2,F 	goto	wait1s_loop  	decfsz	Delay_1,F 	goto	wait1s_loop  	return  ;------------------------------------------------------------------   ;------------------------------------------------------------------ ;	Lectura intensidad consumida por el generador HHO (AN0). ;------------------------------------------------------------------ AD_ConversionI 	BANKSEL ADCON0 	movlw	B'01000001'	;Fosc/8 - Canal AN0 - A/D enab. 	movwf	ADCON0  	nop 	bsf	ADCON0,GO	;Inicio nueva conversion. 	btfsc	ADCON0,GO	;¿Termino la conversion? 	goto	$-1		; 	 	movlw	D'128'		;restar 127 a la medida. 	subwf	ADRESH,F 	btfss	STATUS,C	;corrige inestabilidad sensor Hall. 	clrf	ADRESH	;si la corriente es negativa se deja a 0.	 	 	rlf	ADRESH,W	;multiplicar por 2.  	movwf	Valor_I		;guardar valor en variable.  	return  ;------------------------------------------------------------------   ;------------------------------------------------------------------ ;	Lectura voltaje de la bateria (AN1). ;------------------------------------------------------------------ AD_ConversionV 	BANKSEL ADCON0 	movlw	B'01000101'	;Fosc/8 - Canal AN1 - A/D enab. 	movwf	ADCON0  	nop 	bsf	ADCON0,GO	;Inicio nueva conversion. 	btfsc	ADCON0,GO	;¿Termino la conversion? 	goto	$-1		;  	movf	ADRESH,W	;Lectura parte alta conver.  	movwf	Valor_V		;guardar valor en variable.  	return  ;------------------------------------------------------------------   ;------------------------------------------------------------------ ;	Transmisión trama de informacion. ;------------------------------------------------------------------ Tx_Trama	  ;--< Intensidad >----------------------------------------------- 	movf	Valor_I,W 	call	bin2decBCD	;Convertir dato a BCD.  	movf	DecBCD_2,W 	call	Tx_USART 	movf	DecBCD_1,W 	call	Tx_USART 	movf	DecBCD_0,W 	call	Tx_USART                  ;--< Voltaje >-------------------------------------------------- 	movf	Valor_V,W 	call	bin2decBCD	;Convertir dato a BCD.  	movf	DecBCD_2,W 	call	Tx_USART 	movf	DecBCD_1,W 	call	Tx_USART 	movf	DecBCD_0,W 	call	Tx_USART  ;--< PWM >-------------------------------------------------- 	bcf	STATUS,C 	rlf	Valor_PWM,W	;multiplicar por 2. 	call	bin2decBCD	;Convertir dato a BCD.  	movf	DecBCD_2,W 	call	Tx_USART 	movf	DecBCD_1,W 	call	Tx_USART 	movf	DecBCD_0,W 	call	Tx_USART  ;--< Inyeccion >-------------------------------------------------- 	btfss	PORTB,RB0	;¿Se esta inyectando combustible? 	goto	NoInyeccion	;No se esta inyectando.  SiInyeccion 	movlw	A'S'		; 	call	Tx_USART 	goto	SaltarNoInyeccion  NoInyeccion 	movlw	A'N'		; 	call	Tx_USART SaltarNoInyeccion  ;--< TX Sincronismo >---------------------------------------------- 	movlw	D'13'		;Sincronismo trama. 	call	Tx_USART	;	" 	movlw	D'10'		;	" 	call	Tx_USART	;	"  	return  ;------------------------------------------------------------------   ;------------------------------------------------------------------ ;	Transmisión USART. ;------------------------------------------------------------------ Tx_USART 	BANKSEL	TXSTA 	btfss	TXSTA^80H,TRMT  ;¿Se puede transmitir? 	goto	$-1  	BANKSEL	TXREG 	movwf	TXREG		;Se transmite W.  	return  ;------------------------------------------------------------------   ;------------------------------------------------------------------ ;	Covertidor binario a decima BCD. (from Daniel Serpell) ;------------------------------------------------------------------ bin2decBCD 	clrf	DecBCD_2 	clrf	DecBCD_1  	addlw	.56		;w > 199? (200 a 255) 	btfss	STATUS,C 	goto	digit100 	bsf	DecBCD_2,1  	addlw	.176		;rango de 200 a 255. 	goto	digit40  digit100 	addlw	.100		;comprobar de 100 a 199. 	btfss	STATUS,C 	goto	$+3 	bsf	DecBCD_2,0 	addlw	.156  	addlw	.20		;comprobar de 0 a 99. 	btfss	STATUS,C 	goto	digit40 	bsf	DecBCD_1,3  	addlw	.236 	goto	digit10  digit40 	addlw	.40		;comprobar de 40 a 79. 	btfss	STATUS,C 	goto	$+3 	bsf	DecBCD_1,2 	addlw	.216  	addlw	.20		;comprobar de 20 a 39. 	btfss	STATUS,C 	goto	$+3 	bsf	DecBCD_1,1 	addlw	.236  digit10 	addlw	.10		;comprobar de 10 a 19. 	btfss	STATUS,C 	goto	$+3 	bsf	DecBCD_1,0 	addlw	.246  	addlw	.58		;comprobar de 0 a 9. 	movwf	DecBCD_0  	movlw	0x30 	xorwf	DecBCD_1,f 	xorwf	DecBCD_2,f      return ;------------------------------------------------------------------   ;------------------------------------------------------------------ ;	Inicialización Interrupciones. Se anulan todas las interrup. ;------------------------------------------------------------------ IniINT		 	BANKSEL  INTCON 	CLRF	INTCON 	;Disable interrupts and clear T0IF  	CLRF	PIE1^80H	;Disable peripheral interrupts  	BANKSEL  PIR1 	CLRF	PIR1		;Clear peripheral interrupts Flags  	return ;------------------------------------------------------------------   ;------------------------------------------------------------------ ;	PORTA:  AN0	in	Medida Intensidad. ;		AN1	in	Medida Voltage. ;	PORTB:  RB0	in	Lectura estado inyeccion. ;	PORTC:  P1A	out	Salida control PWM. ;		TX	out	Enviar trama bluetooth (USART). ;------------------------------------------------------------------ IniPORT 	BANKSEL TRISA 	movlw	b'11111111' 	movwf	TRISA^80H	;RA0... RA7=in.  	BANKSEL ANSELH 	movlw	b'00000000'	;RB0... RB7 Digital I/O. 	movwf	ANSELH^180H 	BANKSEL TRISB 	movlw	b'00000001'	;RB0=in; RB1... RB7=out. 	movwf	TRISB^80H	  	movlw	b'00001110'	;Configurar convertidor A/D. 	movwf	ADCON1^80H	;Justif. izq. 				;ADRES a la izq. 				;Ref. VREF+=VDD y VREF-= VSS.  	bcf	TRISC^80H,RC6	;RC6/TX salida USART.  	movlw	d'51' 	movwf	SPBRG^80H	;Vel. TX = 9600bps @8Mhz.  	movlw	b'00100100' 	movwf	TXSTA^80H	;8 bits, TX-ON, SYNC=0, BRGH=1  	BANKSEL BAUDCTL 	bcf	BAUDCTL^180H,BRG16	;BRGH16=0  	BANKSEL ADCON0 	movlw	b'10000001'	;Fosc/32 - Canal 0 - A/D on. 	movwf	ADCON0  	bsf	RCSTA,SPEN	;Serial port Enable.  	return ;------------------------------------------------------------------   ;------------------------------------------------------------------ ;	Control PWM.  Fosc=8MHz -> 10KHz,TimerPr=4,PR2=49,res.8bits ;------------------------------------------------------------------ IniPWM 	;PWM Period=[(PR2)+ 1]•4•1/FOSC•(TMR2 Prescale Value) 	;Pulse Width=(CCPRxL:CCPxCON<5:4>)•TOSC•(TMR2 Prescale Value  	BANKSEL TRISC 	bcf	TRISC^80H,RC2	;Pin RC2/CCP1 como salida  	BANKSEL PORTC 	bcf	PORTC,RC2	;Salida baja.  	BANKSEL CCP1CON 	clrf	CCP1CON	;PWM mode.  	BANKSEL PR2 	movlw	.49		;Frecuencia 10KHz 	movwf	PR2^80H  	BANKSEL CCPR1L 	movlw	.0		;.50 max.  .0 min. 	movwf	CCPR1L  	BANKSEL	T2CON 	movlw	B'00000101'	;Config. prescaler=1 Timer2=ON 	movwf	T2CON		;00=1, 01=4, 1x=16  	BANKSEL	CCP1CON		 	movlw	B'00001100'	;Single output (salida PWM por RC2) 	movwf	CCP1CON	;PWM mode.  	movlw	.0		;D'0'min... D'50'max. 	movwf	CCPR1L		;0%... 100% PWM.  	return ;------------------------------------------------------------------      END
El firmware del PIC se encarga de cuantificar los niveles de tensión y corriente, controlar el módulo PWM acorde al límite que hemos establecido de corriente “Imax”, “Imin” y transmitir en texto plano los datos que tiene que mostrar en el smartphone.  

Sistema HHO

Bricos Peugeot 308