TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: akira_ve en 07 de Agosto de 2010, 14:37:46
-
Hola amigo tenia Mucho tiempo que no entraba en el foro.................vine a compartir una interesante experiencia con ustedes....han querido usar por ejemplo hacer un circuitos con varios comparadores de voltaje con operacionales y resulta uy voluminoso el diseño??
Han intentado programar un PIC para que realize comparaciones de voltaje??.................pues es mi caso hace casi 2 años se me ocurrio algo y tenis que usar 2 LM324 y me parecio engorroso..........y me parecio asombroso conseguir informacion de cualquier tema relacionado con los pic.
No consegui alguien que tocara el tema de como escribir prgramas para realizar comparadores de voltaje con PIC aunque paresca mentira.................me llevo casi los 2 años tener una manera efectiva de hacerlos he llegado a a crear 16 comparadores para crear 8 comparadores tipo verntana con sus respectivas histeresis poco a poco realisate entragas de informacion para como realizar comparadores, con los PIC.
Diran.........vaya este sujeto, es bien lento.....pero tenia que trabajar y otras ocupaciones, ademas tener que solventar problemas con que me toperen el camino, dios vendiga al PICKIT 2 adquieri una version clon hace 8 meses y fue asi que pude acelerar el proceso de investigacion respecto al tema, todavia preparo el material para ustedes........espero les interese el tema.
-
Comensando con el tema expuesto .........les recoendare algo, hagan todas las pruevas y ensayos en una targeta o PCB, no usen protoboard, pues como se trabajaron con un maximo de 5 voltios y la relativa alta impedancia de los ADC, se detecta el ruido presente el las conexiones presentes en el protoboard y el funcionamiento del pic como comparador deja que desear y se hace suceptibles hasta el simple encendido de una luz o licuadora, etc.
Por experiencia propia tengan un PICKIT2 o alguna herramienta que permita decirle como funcionan los programas dentro del PIC.
Usen una fuente de poder de bajo ruido, pueden usar el USB como fuente de poder.
La proximales explicare mas sobre los comparadores..................y la Histeresis..
-
Si se analiza el comparador de voltaje basicamente toma 2 valores y lo compara, por lo tanto se debe utilizar un ADC y una rutina comparadora, en cual puede usar las 2 Condiciones A > B, A = B, A < B y generar una salida apartir de la comparacion del valor obtenido de ADC y un valor previamente cargado en el Comparador, combinando 2 veces esta accion se obtiene un comparador de Ventana.
Para tener valores de voltajes variables para el ADC, uitilizo un potenciometro multi vuelta asi se obtiene un valor bastante fino para probar el programa.
Luego me di cuenta de la inestabilidad que se prensentaba en el proceso de cambio de estado de salida del comparador ( rutina comparadora ), esto sucede cuando el valor de referencia se va haciendo igual o proximoael valor obtenido del ADC.
Me di cuenta que hacia falta una HISTERESIS para hacer que el comparador sea insensible a los ruidos y al efecto de cambio erraticos de la salida poe la proximidad de los valores comparados ( el del ADC y el valor de Referencia ), crees una rutina en la cual la HISTERESIS depende del estado de la salida, luego les mostrare un programa basico para que funcione como comparador basico.
-
Hola Akira, sigo tus avances e instrucciones... :mrgreen:
Saludos!
Norberto
-
Buenas mis panas Creo que todos sabemos como funciona el AO ( Amplificador Operacional ) por eso Obvio pa explicacion de su funcionamiento como comparador, lo que si es importante es tener claro de la Histeresis dentro del comparador pues cuando la tension a comparar se aproxima a valor a comparar, sobre esta puede existir una tension variable muy pequeña, que no es mas que ruido.
Este ruido puede ser generado por el medio ambiente, la alimentacion del circuito, el PCB, etc, y la Histeresis tiene una mision importante que cuando la tension a comparar, pasa de un determinado nivel ( aunque esta tenga algo de ruido ) este proboca un cambio en la salida del operacional............pero como funciona la histeresis???.
Pueden ir en esta direccion y explican con formulas como funciona y calcular esta histeresis
http://www.electronicafacil.net/tutoriales/COMPARADOR-TENSION.php
Pero de una manera simple se las explicare, de una manera simple con esta imagen, que es la empleo en mi programa en asm
(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=31573.0;attach=12806)
-
Si miran el diagrama Cuando el voltaje Ve, se aproxima al valor Va' no sucede nada pero al ser menor a va la Vo o tension de salida del operacion sube, pero e aqui lo interesante cuando sucede este cambio la tension Va´ cambias a Va en donde Va es menor a Va´ pues asi el valor a comparar se hace mayor al de referencia o con quien se quiere comparar.
Esto proboca, que la unica manera de que cambie de estado la salida del comparador es bajando la tension del valor que se compara y cuando esto sucede Va cambiara de nuevo a Va´.
este cambio en la referencia de Va´a Va y viceversa es lo que genera la Histeresis que se ve en la figura y hace inmune al comparador al ruido que se encuentre presente en la Tension que sera comparado con el valor de referencia. con esto tenemos una idea somera de como funcionaria el programa en el PIC. enla proxina les coloco el codigo, las preguntas esta abiertas....
-
Hola akira_ve, tu tema esta muy interesante, pero quería decirte que los PIC traen internamente unos módulos comparadores, la mayoría trae 2 módulos pero algunos traen 3, con estos módulos podrías ahorrarte los IC extra de los que hablas, solamente tienes que programarlo.
A continuación puedes encontrar 2 links en los que se habla de este tema.
http://www.todopic.com.ar/foros/index.php?topic=27711.0 (http://www.todopic.com.ar/foros/index.php?topic=27711.0)
http://www.todopic.com.ar/foros/index.php?topic=27876.0 (http://www.todopic.com.ar/foros/index.php?topic=27876.0)
-
Sabes.......creo que no leiste lo que dije al comienzo.................necesitaba 2 LM324.............es mas, sustitui la eletronica de un protector de volteje de 1500 VA que usaba una eletronica elaborada con un simple 16F876, es bien sabido por todos lo que dices pero...repito......repito..,..necesitaba 2 LM324 osea................8 comparadores amigo y sabes que..........
Sabes lo mas interesante de la experiencia................no necesites resistencias de precision las de 5% funcionan de maravillas......y sabes que es lo mas asombroso de todo.............y no se lo cuentes a nadie.................fue que el ajuste de todos los valores fue por SOFTWARE asi que dime tu que te resulta mas economico.....montar de 2 LM324 con toda la circuiteria y los calculos que acarrea eso, aparte que ajustar o calibrar los 8 comparadores, o vaciar el programa en un 16F876 y con una simple rutina ajustar todos los valores?
Con todo respeto nunca subestimes....cualquier idea...nunca, las ciencias estan plagadas de ideas que en su momento se les considero absurdas.........nunca subestimes cualquier ides por absurda que hay...............hace 2 años algune en la red........logro que un simple 16F84A funcionara con USB, feliocite a la persona por que eso indica...........inventiva.............
Amigo BIGLUIS espero tu inquietud este satisfecha.........
-
:oops: Lo siento, lo que pasó es que no había entendido bien el post, :( es mas aún no entiendo bien que es lo que estas haciendo, me gustaría que subieras algunas imagenes para que agregues más detalles a lo que estas diciendo.
En ningun momento desee ofenderte, más bien lo que deseo es ayudar.
:oops: Como dije antes no entiendo muy bien lo que estas haciendo, pero lo poco que entendí es que estas comparando 8 valores analógicos, y que usando los ADC del PIC no era bueno debido al ruido, si ese es el caso lo que se recomienda es utilizar un filtro digital, cosa que no manejo muy bien pero conozco un poco.
si deseas adjuntar imagenes usa esto
http://www.todopic.com.ar/foros/index.php?topic=8120.0 (http://www.todopic.com.ar/foros/index.php?topic=8120.0)
-
Gracias BIGLUIS.
abajo les muestro el Grafico de Histeresis que use para el operacion
http://img337.imageshack.us/img337/841/ao1008.gif
a continuacion les doy el codigo que el comparador basico que use
; ******************************
list p=16F876A
#include "P16F876A.inc"
errorlevel -302
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _XT_OSC &
_LVP_OFF & _CPD_OFF & _DEBUG_OFF
; ******************************
; Definiciones
; ******************************
#define AMB 0
#define AIB 1
#define BMA 2
#define TR1 3
#define TR2 4
#define TR3 5
; ******************************
; Variables
; ******************************
CBLOCK 0x20
ADC_Sup
ADC_Inf
BComp
Vs_Sup
Vs_Inf
Vi_Sup
Vi_Inf
Sup
Inf
Tmro
ENDC
org 0
goto Inicio
org 5
; ******************************
; Initialisacion
; ******************************
Inicio:
clrf PORTC
clrf PORTB
clrf PORTA
bsf STATUS, RP0
movlw B'01000000'
movwf ADCON0
movlw B'10001110'
movwf ADCON1
movlw B'00000000' ; PORTB D0-D3 S y D4-D7 E
movwf TRISB
MOVLW 0X00 ; PORTC COMO SALIDAS
MOVWF TRISC
MOVLW B'11111111' ; PORTA COMO ENTRADAS
MOVLW TRISA
bcf STATUS, RP0
; *****************************
; CONFIGURACION
; *****************************
movlw 0x02
movwf Vs_Sup
movlw 0xA0
movwf Vs_Inf
movlw 0x00
movwf Vi_Sup
movlw 0xEA
movwf Vi_Inf
; ******************************
; PROG. PRINCIPAL
; ******************************
Ciclo:
call Leer_ADC ; Leer ADC
movf Vs_Sup, W
movwf Sup
movf Vs_Inf, W
movwf Inf
call Ref_HA
call Comp
; El Bcomp esta configurado asi
; 0 Salida del comparador A > B ( AMB )
; 1 Salida del comparador A = B ( AIB )
; 2 Salida del Comparador A < B ( BMA )
; 3 a 7 Bits de uso general ( TR1-TR5 )
movf BComp, W
movwf PORTB
goto Ciclo
; ******************************
; Captura de valores analogicos con el ADC de 10 BIT
; ******************************
Leer_ADC:
movlw B'01000001'
movwf ADCON0
call Temp
bsf ADCON0, GO_DONE
btfsc ADCON0, GO_DONE
goto $-1
movf ADRESH, W
movwf ADC_Sup
bsf STATUS, RP0
movf ADRESL, W
bcf STATUS, RP0
movwf ADC_Inf
bcf ADCON0, 0
return
; ******************************
; Comparador de 16 Bit
; ******************************
Comp:
movf ADC_Sup, W
subwf Sup, W
btfsc STATUS, Z
goto A1_IGU_B1
btfsc STATUS, C ; A1 <> B1
goto A_MEN_B
goto A_MAY_B
A1_IGU_B1:
movf ADC_Inf, W
subwf Inf, W
btfsc STATUS, Z
goto A_IGU_B ; A = B
btfsc STATUS, C ; A2 <> B2
goto A_MEN_B
A_MAY_B:
bsf BComp, AMB
bcf BComp, AIB
bcf BComp, BMA
goto Salir
A_IGU_B:
bcf BComp, AMB
bsf BComp, AIB
bcf BComp, BMA
goto Salir
A_MEN_B:
bcf BComp, AMB
bcf BComp, AIB
bsf BComp, BMA
Salir:
return
; ******************************
; Rut. de valores de Histeresis
; ******************************
Ref_HA:
btfsc BComp, AMB ;
Call Cam_Ref ;
Return
Cam_Ref:
movlw .10
subwf Inf, F
btfss STATUS, C
decf Sup, F
Return
; ******************************
Temp:
movlw .10
movwf Tmro
decfsz Tmro, F
goto $-1
Return
end
Si ven el codigo es bastante simple, el programa lo confeccione de una manera que aplico en todos los programas que he hecho y utilicen comparadores de la manera siguente :
1ero, se lee el valor a comparar con el ADC ( se guardan en las Variables ADC_Sup y ADC_Inf ).
2do, Se carga el valor a comparar y la de referencia ( Que son las Variables ADC_Sup, ADC_Inf Valores del ADC y Sup, Inf que son Valores De Referencia).
3ro, llamada de la rutina de Histeresis, que revisa el estado del BIT de salida de la rutina del Comparador que se almacena en el BYTE BComp, lo que hace la rituna es restar 1o pasos al la referencia, y asi se logra la histeresis
4to, Se llama la rutina de comparacion, esta rutina trabaja con 16 BIT para trabajar con un margen mayor de valores, alli se muestra A > B A = B y B > A `pero con el tiempo solo uso A > B por rasones de comodidad que explicare luego.
5to, el resutado se guarda el BComp pero en este caso se guardan los valores de salida del comparador, pero yo use solo la salida A > B por que la rutina de histeresis hace la resta de 10 solo cuando el BIT de Salida es 1.
Si se usa Solamente A > B la rutina de Hiteresis se usa para mas comparadores asi se ahorra mas codigo..............en la proxima entrega veran como se hacen mas comparadores y un comparador de Ventana con el BYTE BComp, se aceptan sujerencias
-
(http://img337.imageshack.us/img337/841/ao1008.gif) (http://img337.imageshack.us/i/ao1008.gif/)
-
Con el programa anterior, el valor de salida del compador AMB ( A mayor que B ) se hace 1 cuando el valor a comparar se hace mayor a la referencia sin embargo se siguen haciendo comparaciones osea AIB ( A igual que B ) y BMA ( B mayor que A ) pero estsad salidas no estan asociadas a ninguna Histeresis.
Pero como nota Curiosa BMA estaindirectamente relacionada con AMB, pero en mi caso la rutina del comparador de 16 BIT lo modifique para que el comparador de salida de valor 1 cuando A y B sean iguales o B mayor que B y la rutina quedo asi:
Comp:
movf ADC_Sup,W ; Valor ADC Superior
subwf Sup, W ; Valor de Ref. Superior
btfsc STATUS, Z
goto A1_IGU_B1
btfsc STATUS, C ; A1 <> B1
goto A_MEN_B
goto A_MAY_B
A1_IGU_B1:
movf ADC_Inf, W ; Valor ADC Inferior
subwf Inf, W ; Valor de Ref. Inferior
btfsc STATUS, Z
goto A_IGU_B ; A = B
btfsc STATUS, C ; A2 <> B2
goto A_MEN_B
A_MAY_B:
A_IGU_B:
bsf BComp, AMIB
Return
A_MEN_B:
bcf BComp, AMIB
Return
Para hacer que se tenga un comparador de ventana hay que tener 2 valores y comparar con estos valores asi se fija el valor maximo y minimo de la ventana y lo que se hace es lo siguiente:
1ero, usas el ADC y asi obtienes un equivalente digital del valor de voltaje.
2do, usas la rutima de la histeresis que revisa el estado de la salida para aplicar la histeresdis.
3ero, se compara con elvalor alto o bajo y se guarda el valor en un registro.
4to, usas la rutima de la histeresis que revisa el estado de la salida para aplicar la histeresdis.
5to, se compara con elvalor alto o bajo y se guarda el valor en un registro, es cuestion de gusto si comparan el valor alto y luego el bajo o al reves.
6to, luego usar una condicion logica que nos indica cuando el valor medido esta dentro o fuera de la ventana, estos valores son tomado del registro donde se duardaron los valores de salida.
el comparador que uso hace la salida igual a 1 cuando el valor medido es mayor o igual a la referencia por lo tanto, cuando el valor alto de valor 0 y el valor bajo de valor 1.
Se preguntaran por que guardo los valores en un registro?? pues muy simple cada comparacion es independiente uno del otro y como lo uno que cambia es la referencia y el valor de los 2 procesos u se arma una condicion logica que cuando valor alto valga 0 y el valor bajo valga 1 la salida del comparador de ventana dara 1 indicando que el valor medido esta entre los valores de la ventana abajo les muestro un programa para ilustrar lo explicado
List p=16F876A
#include "P16F876A.inc"
errorlevel -302
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _XT_OSC & _LVP_OFF & _CPD_OFF & _DEBUG_OFF
; ***************************************************
; ******* Definiciones
; ***************************************************
#define AMB 7
#define TR6 6
#define TR5 5
#define TR4 4
#define TR3 3
#define TR2 2
#define TR1 1
#define TR0 0
; ***************************************************
; ******* Variables
; ***************************************************
CBLOCK 0x20
ADC_Sup
ADC_Inf
BComp
Vs_Sup
Vs_Inf
Vi_Sup
Vi_Inf
Sup
Inf
Tmro
ENDC
org 0
goto Inicio
org 5
; ***************************************************
; ******* Initialisacion
; ***************************************************
Inicio:
clrf PORTC
clrf PORTB
clrf PORTA
bsf STATUS, RP0
movlw B'01000000'
movwf ADCON0
movlw B'10001110'
movwf ADCON1
movlw B'00000000' ; PORTB D0-D3 S y D4-D7 E
movwf TRISB
MOVLW 0X00 ; PORTC COMO SALIDAS
MOVWF TRISC
MOVLW B'11111111' ; PORTA COMO ENTRADAS
MOVLW TRISA
bcf STATUS, RP0
; ---------------------------------------------------
; CONFIGURACION
; ---------------------------------------------------
movlw 0x01
movwf Vs_Sup
movlw 0xB0
movwf Vs_Inf
movlw 0x01
movwf Vi_Sup
movlw 0xA0
movwf Vi_Inf
clrf BComp
; ---------------------------------------------------
; PROG. PRINCIPAL
; ---------------------------------------------------
Ciclo:
call Leer_ADC ; Leer ADC
movf Vs_Sup, W
movwf Sup
movf Vs_Inf, W
movwf Inf
call Ref_HA
call Comp
btfsc BComp, AMB
bcf BComp, TR0
btfss BComp, AMB
bsf BComp, TR0
movf Vi_Sup, W
movwf Sup
movf Vi_Inf, W
movwf Inf
call Ref_HB
call Comp
btfsc BComp, AMB
bsf BComp, TR1
btfss BComp, AMB
bcf BComp, TR1
btfss BComp, TR0 ; Confirmacion del Estado de Comparador de
btfss BComp, TR1 ; Ventana
goto Cero ; No Cumple Condicion ( Rele de Salida = 0 )
bsf BComp, TR2 ; Si Cumple Condicion ( Rele de Salida = 1 )
goto $+2
Cero:
bcf BComp,TR2
movf BComp, W
movwf PORTB
goto Ciclo
; ***************************************************
; ******* Captura de valores analogicos con el ADC de 10 BIT
; ***************************************************
Leer_ADC:
movlw B'01000001'
movwf ADCON0
call Temp
bsf ADCON0, GO_DONE
btfsc ADCON0, GO_DONE
goto $-1
movf ADRESH, W
movwf ADC_Sup
bsf STATUS, RP0
movf ADRESL, W
bcf STATUS, RP0
movwf ADC_Inf
bcf ADCON0, 0
return
;****************************************
; Comparador de 16 Bit
;****************************************
Comp:
movf ADC_Sup, W
subwf Sup, W
btfsc STATUS, Z
goto A1_IGU_B1
btfsc STATUS, C ; A1 <> B1
goto A_MEN_B
goto A_MAY_B
A1_IGU_B1:
movf ADC_Inf, W
subwf Inf, W
btfsc STATUS, Z
goto A_IGU_B ; A = B
btfsc STATUS, C ; A2 <> B2
goto A_MEN_B
A_MAY_B:
A_IGU_B:
bsf BComp, AMB
Return
A_MEN_B:
bcf BComp, AMB
Return
; -----------------------------------------------------------------
; Rut. de valores de Histeresis
; -----------------------------------------------------------------
Ref_HA:
btfss BComp, TR0 ;
Call Cam_Ref ;
Return
Ref_HB:
btfsc BComp, TR1 ;
Call Cam_Ref ;
Return
Cam_Ref:
movlw .15
subwf Inf, F
btfss STATUS, C
decf Sup, F
Return
; -----------------------------------------------------------------
Temp:
movlw .20
movwf Tmro
decfsz Tmro, F
goto $-1
Return
end
Bueno usenlo y me avisan que tal en la proxima hablare de hacer multiples comparadores.