TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: janmego en 17 de Noviembre de 2007, 17:06:58
-
bueno la verdad es que tengo que hacer un proyecto que es un contador de energía electrica con el pic 16f877a pero apenas estoy entendiendo esto de pic y de assembler, y entonces encontré este foro y pues bueno aquí coloco una petición para los que saben y ya están avanzados en el tema me puedan ayudar.
Pido disculpas a los moderadores si este tema no va acá, acabo de entrar y lei las normas y dice que debo postear en el lugar mas adecuado y creo que es este.
Gracias
-
¿Que es exactamente lo que necesitas?
Un saludo
-
Bueno pues esto es un circuito AC simple, y de la fuente se debe medir el voltaje y de la inductancia la corriente (esto lo había pensado hacer con ADC) y tocaria medir el angulo de desfase entre el voltaje y la corriente y que el valor necesitado seria V*I*cos(angulo)
(http://www.freehostimages.com/view_comp/09a71355/circuito.JPG)
Gracias por tu interés de ayudarme
Suerte
-
Hola janmego,
1) Primero vas a necesitar 2 buenos detectores de cruce por cero (uno para la tensión y otro para la intensidad), con esto ya puedes medir el desfase entre ambas señales
2) Luego necesitaras dos rectificadores de señal con OA para poder introducir a los A/D una tensión de continua RMS proporcional a las señales de intensidad y tensión de la carga
3) También necesitaras encontrar algun conversor A/D externo (los del PIC son de muy baja resolución) tanto para medir la intensidad como la tensión que posee la carga
Ya con las señales que te proveen los circuitos anteriores y por medio del PIC, puedes calcular el consumo instantaneo del circuito, y por sumatoria de los mismos el consumo a largo plazo.
Espero te sea de ayuda.
Un saludo.
Atte. CARLOS.
-
Gracias por la respuesta, pero aun tengo dudas sobre los detectores de cruce por cero, ¿como serian?¿se haria con el pic o con un circuito extra? la verdad no entiendo bien esa parte, y seria posible que me ayudaras con el código en assembler.
Gracias
-
¿como serian?¿se haria con el pic o con un circuito extra? la verdad no entiendo bien esa parte, y seria posible que me ayudaras con el código en assembler.
Busca en el foro o por la web y de seguro encontrarás varios circuito detectores de cruce por cero, si bien la medición de los tiempos la realiza el PIC, necesitarás también de un circuito para adaptar las señales de tal forma que el PIC las reconozca.
Yo personalmente no puedo garantizarte que te ayudaré con el código (falta de tiempo), pero de seguro si tu empiesas a hacerlo y posteas las dudas que se te presenten, alguién te dará una mano.
Un saludo.
Atte. CARLOS.
-
Gracias por la respuesta Carlos. Bien pues he comenzado a buscar, y lo del detector de cruce por cero pues hay varias opciones he encontrado como 2 circuitos para hacer eso y ademas encontré información que con solo una resistencia grande (5M) conectada al pic se puede hacer. Pero lo que no he podido saber como se hace es el circuito para el valor rms de la señal, si alguien me pudiera ayudar con eso porfavor.
Despues, cuando lo vaya haciendo y si tengo mas dudas las haré e iré posteando los avances por si a alguien le sirven.
Suerte
-
Bueno pues he estado trabajando en esto un poco y hasta ahora:
El valor rms lo puedo hacer con un divisor de tensión (para voltaje) pero para la corriente no se aun como adecuar esta señal.
Suponiendo que ya tenia las dos señales adecuadas para introducirlas en el pic, me puse a trabajar en el codigo, lo que llevo hasta ahora es el ADC y la multiplicacion de los dos datos:
INCLUDE <P16F877.INC>
CONTA EQU 20
DATO1 EQU 21
DATO2 EQU 22
productol EQU 23 ; el resultado va en dos registros de 8bit
productoh EQU 24
ORG 00
CALL configuracion
CALL principal
configuracion
bcf STATUS,RP0
bcf STATUS,RP1
bsf ADCON0,ADCS0
bsf ADCON0,ADON
bsf STATUS,RP0 ;BANCO 01
clrf TRISB
clrf TRISC
clrf ADCON1
bcf STATUS,RP0 ;BANCO 00
return
principal
call time_adq ;ESPERA tiempo de adquisicion
bsf ADCON0,GO ;INICIA CONVERSION
aca
btfsc ADCON0,GO ;esperamos final de conversion
goto aca
BTFSC ADCON0,CHS0 ;
GOTO CANAL01
movf ADRESH,0 ;MUEVO RESULTADO DE CONVERSION AL REG W
MOVWF DATO1
BSF ADCON0,CHS0
GOTO principal
CANAL01
movf ADRESH,00 ;MUEVO RESULTADO DE CONVERSION AL REG W
MOVWF DATO2
BCF ADCON0,CHS0
call multiplicacion
CALL VISUALIZACION
goto principal
multiplicacion
clrf productol
clrf productoh
movf DATO2,f ;Si es cero...
btfsc STATUS,Z
return ;volver con resultado= 0
movf DATO1,w ;cargamos el operando 1
mult
addwf productol
btfsc STATUS,C ;hay llevada?
incf productoh,f
decfsz DATO2,f ;no y termino?
goto mult ;no
movf productol,00 ; esta visualizacion es solo para poder
movwf PORTB ; ver facilmente que la multiplicacion estaba funcionando
movf productoh,00
movwf PORTC
RETURN
VISUALIZACION ; me falta esto
RETURN
time_adq
movlw 20
movwf CONTA
aqui
decfsz CONTA
goto aqui
return
END
Asi como esta el codigo convierte las entradas de RA0 y RA1 y luego las multiplica, el problema es que ahora debo volver a la escala inicial para poder visualizar el valor correcto, para ello debo dividir por 108 (o multiplicar por 0,009259) y luego visualizar este dato y no se como hacerlo si alguien me pudiera ayudar se lo agradecería.
Suerte
-
Bueno, pues he avanzado un poco mas, ya tengo los dos ADC, la multiplicación de los datos y la división del resultado para poder mostrarlo en displays, y aquí les dejo el código para el que le interese, se que se puede mejorar pero bueno hasta ahora estoy aprendiendo
INCLUDE <P16F877.INC>
CONTA EQU 20
DATO1 EQU 21
DATO2 EQU 22
productol EQU 23
productoh EQU 24
DIVIDENDOH EQU 25
DIVIDENDOL EQU 26
DIVISORH EQU 27
DIVISORL EQU 28
RESULTADOH EQU 29
RESULTADOL EQU 2A
ORG 00
CALL configuracion
CALL principal
configuracion
bcf STATUS,RP0
bcf STATUS,RP1
bsf ADCON0,ADCS0
bsf ADCON0,ADON
bsf STATUS,RP0 ;BANCO 01
clrf TRISB
clrf TRISC
clrf TRISD
clrf ADCON1
bcf STATUS,RP0 ;BANCO 00
return
principal
call time_adq ;ESPERA tiempo de adquisicion
bsf ADCON0,GO ;INICIA CONVERSION
aca
btfsc ADCON0,GO ;esperamos final de conversion
goto aca
BTFSC ADCON0,CHS0 ;
GOTO CANAL01
movf ADRESH,0 ;MUEVO RESULTADO DE CONVERSION AL REG W
MOVWF DATO1
BSF ADCON0,CHS0
GOTO principal
CANAL01
movf ADRESH,00 ;MUEVO RESULTADO DE CONVERSION AL REG W
MOVWF DATO2
BCF ADCON0,CHS0
call multiplicacion
movf productol,0
movwf DIVIDENDOL
movf productoh,0
movwf DIVIDENDOH
CLRF DIVISORH
MOVLW 6C
MOVWF DIVISORL
CALL DIVISION
CALL VISUALIZACION
goto principal
multiplicacion
clrf productol
clrf productoh
movf DATO2,f
btfsc STATUS,Z
return
movf DATO1,w
mult
addwf productol
btfsc STATUS,C
incf productoh,f
decfsz DATO2,f
goto mult
RETURN
VISUALIZACION
MOVF RESULTADOH,0
MOVWF DIVIDENDOH
MOVF RESULTADOL,0
MOVWF DIVIDENDOL
CLRF DIVISORH
MOVLW 64
MOVWF DIVISORL
CALL DIVISION ;divide por 100 para saber las centanas del numero a mostrar
MOVF RESULTADOL,0
MOVWF PORTB
CLRF DIVISORH
MOVLW 0A
MOVWF DIVISORL
CALL DIVISION ;divide por 10 para saber las decenas del numero a mostrar
MOVF RESULTADOL,0
MOVWF PORTC
MOVF DIVIDENDOL,0
MOVWF PORTD ;lo que sobra son las unidades
RETURN
time_adq
movlw 20
movwf CONTA
aqui
decfsz CONTA
goto aqui
return
DIVISION
CLRF RESULTADOH
CLRF RESULTADOL
COMF DIVISORL,1 ;COMPLEMENTO A 2 DE DIVISOR
COMF DIVISORH,1
MOVLW 01
ADDWF DIVISORL,1
BTFSC STATUS,C
ADDWF DIVISORH,1
DIVISION1
MOVF DIVISORL,0
ADDWF DIVIDENDOL,1
BTFSC STATUS,C
INCF DIVIDENDOH,1
MOVF DIVISORH,0
ADDWF DIVIDENDOH,1
BTFSC STATUS,C
GOTO MAYORCERO
GOTO MENORCERO
MAYORCERO
MOVLW 01
ADDWF RESULTADOL,1
BTFSC STATUS,C
INCF RESULTADOH,1
GOTO DIVISION1
MENORCERO
COMF DIVISORL,1 ;COMPLEMENTO A 2 DE DIVISOR
COMF DIVISORH,1
MOVLW 01
ADDWF DIVISORL,1
BTFSC STATUS,C
ADDWF DIVISORH,1
MOVF DIVISORL,0
ADDWF DIVIDENDOL,1
BTFSC STATUS,C
INCF DIVIDENDOH,1
MOVF DIVISORH,0
ADDWF DIVIDENDOH,1
RETURN
END
Bueno y si no seria mucha molestia pedirle a alguien que me de una idea de como adecuar la señal de corriente para introducirla al pic, y si pudieran colaborar con el medidor de fase, se que tengo que hacer un detector de cruce por cero de cada señal y despues meter eso por CCP para asi medir el tiempo y por consiguiente el angulo, pero de eso ni idea.
Espero que el código le sirva a alguien y acepto sugerencias sobre como reducirlo porque hay algunas rutinas que se repiten pero a duras penas hice esto.
Suerte
-
Bueno y si no seria mucha molestia pedirle a alguien que me de una idea de como adecuar la señal de corriente para introducirla al pic, y si pudieran colaborar con el medidor de fase, se que tengo que hacer un detector de cruce por cero de cada señal y despues meter eso por CCP para asi medir el tiempo y por consiguiente el angulo, pero de eso ni idea.
¿Si montas un convertido I-V con una AO no te será más facil de detectar?