TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: elecpic en 30 de Octubre de 2014, 16:52:46
-
hola que tal, quisiera saber como desplegar en dos bcd 7 seg la temperatura en grados celcius (de un lm35), que me arroja el ADRESH. Estoy trabajando con un pic 18f4550 y tengo como Vref 1.5v para usar la resolucion completa del adc.
MOVLW 00H
MOVWF TRISB
MOVLW 01H
MOVWF TRISA
MOVLW 04H
MOVWF ADCON0
MOVLW 3BH
MOVWF ADCON1
MOVLW 19H
MOVWF ADCON2
BSF ADCON0,0
ADC
BSF ADCON0,1
COMIENZO
BTFSC ADCON0,1
GOTO COMIENZO
MOVFF ADRESH,PORTB
GOTO ADC
este es mi programa y aqui solo mando al puerto b para observar la teperatura en binario
-
No me gusta nada este tema xD seguro que algun dia lo toque pero ya ni recuerdo
El LM35 varia 10mV/ºC, para 25ºC tenes 250mV
Tu ADC con una Vref de 1.5V tenes que para 10 bits. los pasos mas pequeños estan dados en 1.5 / 1024 = 1.465mV
Pero como solo tomas los primeros 8 bits de los 10, tendrias una resolucion de 5.8mV, es lo minimo que podrias diferenciar ( 0.58ºC/bit )
Para tus 250mV/25ºC leerias en el ADC = 170 ( AAh - 00 1010 1010 ) pero estar recortando tus 2 ultimos bits asi que quedaria 2Ah a mostrar.
Esta es la parte mas dificil por el resultado da con coma, si fuera una Vref de 4.096V seria feliz, hay que representar ese valor A8h en un numero legible. ( Pienso lo facil que seria hacerlo en C xD )
Lo que se me ocurre es lo siguiente:
Comenzar de 0 y sumar 58 por cada bit de resultado del ADC, luego restar de a 100 para obtener la cantidad de grados y podes mostrarlos (A ese resultado pasarlo a BCD mientras se va sumando o hacerlo luego con el resultado general), esto teniendo en cuenta que el error es acumulativo, ya que no es exacto 0.58ºC sino que es 0.5859375ºC/bit
Si mostraras solo los grados y no sus decimales, a partir de 168 - A8h ( que te de el resultado el ADC) deberias sumar 1ºC , 336 deberias sumar 2ºC , 505 sumar 3ºC , y continuamos sumando de lo que obtenes en el primer paso.
La otra es hacer lo mismo PERO tomando como comienzo los 25ºC o donde tu sensor va a estar casi siempre.
Para tener menos error cerca de esa temperatura.
Lo ideal seria usar coma flotante (?), o una referencia de tension que sea multiplo de 2, Asi es mas facil de representar. y disminuye el error. Otra no se me ocurre. Sino que alguno explique como, la verdad que ya ni recuerdo.
*******EDIT:
Mirando por inet vi este ejemplo, aunque hace multiplicaciones de 16bits.
http://www.avr-asm-tutorial.net/avr_en/calc/FP_CONV10_EN.html
Lo que hace basicamente para no trabajar con numeros con coma, es multiplicarlo por un valor grande... yo hice 1.5/ 1024, pero si lo multiplico por 65536 (2^16) podria hacer primero la multiplicacion y luego dividirlo:
mi caso: 1.5 / 1024
Ese caso : ((1.5 * 65536) / 1024 ) * Valor ADC / 65536, entonces no trabajas con comas xD y el error se reduce. Esto te da el valor en voltios e.e me olvide decirlo xD