TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: tito melli en 13 de Abril de 2018, 16:24:46
-
Hola!
Tengo mi proyecto practicamente desarrollado al 100%, pero al validarlo y comprobar el consumo en sleep, estoy viendo que es de 1.55 mA.
He chequeado registro por registro y he desactivado previamente o justo antes del sleep todo lo posible, y no sé ya qué puede ser.
El micro controlador es el 12F1840. Os dejo un resumen de las declaraciones:
#device PIC12F1840 // Definición PIC
#include <12F1840.h> // Incluir especificaciones PIC
#device ADC = 10 // Analog output data with 10bits length
// CONFIG1
#fuses INTRC_IO // Internal Oscillator
#fuses NOWDT // Watch Dog Timer Disabled
#fuses NOPUT // Power-Up Timer Disabled
#fuses NOMCLR // Master Clear Reset pin disabled
#fuses NOPROTECT // Code not protected
#fuses NOCPD // Data Code not protected
#fuses BROWNOUT_NOSL // BrownOut reset enabled and disabled during sleep
#fuses NOCLKOUT // Clock Out is disabled. Enable to tune OSC frequency.
#fuses NOIESO // Internal/external switchover disabled
#fuses FCMEN // Fail safe clock monitor enabled
// CONFIG2
#fuses NOLVP // Low Voltage Programming disabled
//#fuses NODEBUG // Debug disabled
#fuses BORV19 // BrownOut reset 2.4V
#fuses NOSTVREN // Stack Overflow/Underflow Reset disabled
#FUSES PLL_SW //4X HW PLL disabled
#fuses NOWRT // Write protection disabled
#use delay(clock = 4MHZ) // Velocidad reloj PIC
void main (void) {
VREGPM = 1; // Enable Low-Power Sleep Mode
WPUA = 0; // Deactivate Weak pull-up resistor on every pin to avoid current consumption
T1GSEL = 1; // Select RA3 as Timer 1 Gate pin
TXCKSEL= 0; // Deactivated - Select RA4 as Tx pin for Rs232
// TIMER1 CONFIGURATION
// 00 = Timer1 clock source (Fosc/4)
// 11 = 1:8 Prescaler value
// 0 = Dedicated Timer1 oscillator circuit disabled (LP osc)
// 1 = Do not synchronize asynchronous clock input to Fosc
// 0 - Unimplemented
// 1 = Enable Timer1
T1CON = 0b00110101; // TIMER1 CONFIGURATION
// TIMER2 CONFIGURATION
// 0 - Unimplemented
// 1111 = 1:16 Postscaler
// 1 = Timer is ON
// 11 = Prescaler is 1:64
T2CON = 0b01111111; // TIMER2 CONFIGURATION
// INTERRUPT CONFIGURATION
GIE = 1; // Enable General interrupts
PEIE = 1; // Enable Peripheral Interrupts (TIMER1 uses it)
IOCAN3 = 1; // Enable IOC falling edge on pin RA3
TMR1GIE = 0; // Disable TMR1 Gate Acquisition interrupt. Code doesn't flow properly (too many interrupts)
TMR1IE = 1; // Enable TMR1 Overflow interrupt
TMR2IE = 1; // Enable TMR2 PR2 match flag
// Set inputs and outputs
// Inputs: RA3 RA4
// Outputs: RA0 RA1 RA2 RA5
TRISA = 0b00011000;
// Set analog or digital I/O
// Analog: RA4
// Digital I/O: RA0 RA1 RA2 RA3 RA5
ANSELA = 0b00010000;
// Configure Fixed Voltage Reference module
// FVR 1.024V and FVR ADC enabled, Temperature indicator disabled, and Comparator and DAC FVR disabled
FVRCON = 0b11000001;
// Set inputs and outputs
// Inputs: RA3 RA4
// Outputs: RA0 RA1 RA2 RA5
TRISA = 0b00011000;
// Set analog or digital I/O
// Analog: RA4
// Digital I/O: RA0 RA1 RA2 RA3 RA5
ANSELA = 0b00010000;
// Configure Fixed Voltage Reference module
// FVR 1.024V and FVR ADC enabled, Temperature indicator disabled, and Comparator and DAC FVR disabled
FVRCON = 0b11000001; // Set inputs and outputs
while (1) {
// ---------------------------------------------------
// ----- En este espacio van las condiciones para entrar en el sleep. No las pongo para resumir. ----------------------
// ---------------------------------------------------
GIE = OFF; // Global interrupt should be disabled before SLEEP to avoid entering in ISR
IOCAF3 = 0; // Clear flag
IOCIE = ON; // Activate IOC and deactivate timers
TMR1ON = OFF;
TMR2ON = OFF;
ANSELA = 0x00; // Disable Anagolic module on every pin to avoid current consumption during sleep
TRISA = 0b00001000; // Put pins to Output to minimize current consumption. RA3 can only be input
sleep(); // Go to sleep mode. Use capacitor to avoid bounce and undesired weak-up
IOCIE = OFF; // Go back to normal functioning and activate the timers
IOCAF3 = 0; // Clear flag
TMR1ON = ON;
TMR2ON = ON;
TRISA = 0b00011000; // Restore pin configuration after weak-up
ANSELA = 0b00010000; // Enable again Anagolic module on pin RA4
GIE = ON;
// ---------------------------------------------------
// ----- Continúa la ejecución del programa ----------------------
// ---------------------------------------------------
}
}
Alguien tiene alguna idea de qué puede ser?
He medido los voltajes de los pines con el polímetro y todos están a 0, excepto 2, que están a 0.5V (uno es el del botón y el otro es de un sensor resistivo).
¿Es posible que el consumo no me lo esté produciendo el PIC sino el sensor resistivo?
Gracias de antemano!
Saludos
-
En principio si, aunque sería mejor ver el circuito.
-
¿Es el consumo del PIC solamente o hay mas componentes como resistencias de pull-up?
-
Consumiendo corriente está el PIC, el circuito pull-up del botón, y el sensor resistivo + resistencia de linealización.
En un rato intento subir el esquema.
*Editado: Aquí os lo subo.
Gracias!!
Saludos
-
Hola,
Este fin de semana probé desconectando el sensor y efectivamente el consumo se reduce drásticamente.
Voy a darle la corriente a través de uno de los pines del PIC para poder controlar el consumo, pues no excede los 20mA.
Por otro lado, hice los cálculos y el exceso de consumo medido coincide a la perfección con el teórico.
Gracias por vuestras respuestas!
Saludos
-
Consumiendo corriente está el PIC, el circuito pull-up del botón, y el sensor resistivo + resistencia de linealización.
En un rato intento subir el esquema.
*Editado: Aquí os lo subo.
Gracias!!
Saludos
¿Pero cual es la resistencia del sensor? ¿O era una adivinanza?
Basta que sea de 3K para que drene los 5/(3000+220) = 1.55mA en sleep.
-
Voy a darle la corriente a través de uno de los pines del PIC para poder controlar el consumo, pues no excede los 20mA.
Eso va a añadir mucho error. Mejor utiliza un mosfet N con baja tensión de base para conectar a tierra al divisor de tensión.
También puedes conectar a tierra mediante un pin del PIC y medir la tensión del pin para corregir su error.
Saludos.
-
Me sumo a lo que dice Eduardo, cual es la resitencia del sensor?, sino la conoces, es tan simple como retirar el pic y medir el consumo sin el micro, seguramente es lo que se "va" por el sensor.
Salutes.
-
Parece que la resistencia del sensor es de 3000 ohmios.
En ese caso la resistencia que le acompaña es demasiado baja. Debería ser también de 3k.
Un saludo.
-
Hola,
El valor de la resistencia aparece en la imagen. En efecto es de 220 ohms. Perdonad si no estaba claro.
Con respecto a subir el valor de esta resistencia, he buscado una solución, pero subir su valor me añade un error enorme a baja temperatura al pasar de V a °C. El valor está ajustado para dar buena precisión de 50 a 120°C, donde la curva S es una recta.
Gracias por las respuestas!!
Saludos
-
Lo que no esta claro tito melli, es cual es el valor del SENSOR, la resistencia de 220ohms la vemos, pero el valor resistivo del SENSOR es lo que faltaba para poder calcular la corriente unica del sensor.
-
....
El valor de la resistencia aparece en la imagen. En efecto es de 220 ohms. Perdonad si no estaba claro.
El valor que no estaba claro es el sensor de temperatura, aparentemente usás un NTC ¿de cuanto? (el valor nominal es la resistencia que tiene a 25°)
Con respecto a subir el valor de esta resistencia, he buscado una solución, pero subir su valor me añade un error enorme a baja temperatura al pasar de V a °C.
Esa resistencia debe ser igual a la resistencia del termistor en la mitad del intervalo de interés.
En tu caso, de 50° a 120° debería ser a 85° ¿Es así?
El valor está ajustado para dar buena precisión de 50 a 120°C, donde la curva S es una recta.
Con un NTC se acerca a una recta dentro de un intervalo +/-10° , entre 50° y 120° (+/-35°) es una S pura y dura.
Con microcontroladores no representa mayor problema porque la curva se corrige, solamente que la rutina de calibración necesita de mas puntos (4 o 5 por lo menos). Olvidate de calibrarlo midiendo dos puntos.
-
Cambia de sensor y asunto arreglado.
También puedes cambiar la referencia del ADC a bajas tensiones para que sea más preciso.
Por ultimo, puedes hacer un oscilador RC con la ntc y medir su resistencia de forma indirecta a partir de la frecuencia. Esto es muy preciso en un rango muy amplio de valores y consume muy poca corriente.
Saludos.
-
Otro truco para minimizar el consumo, no solo en sleep, es dar masa a la R220ohm vía una salida.
De esa forma, antes del sleep pones esa salida en 1 o la reprogramas como entrada y el consumo será 0. También lo podes hacer si el intervalo entre lecturas es largo.
Aunque siendo un micro de 8 pines dudo que esté sobrando uno. :(
-
Hola,
Os subo la tabla de valores del sensor.
Me estáis aportando ideas muy interesantes.
Con microcontroladores no representa mayor problema porque la curva se corrige, solamente que la rutina de calibración necesita de mas puntos (4 o 5 por lo menos). Olvidate de calibrarlo midiendo dos puntos.
Con respecto a lo de 5 puntos, te refieres a la fórmula de conversión voltaje a degC? Es cierto que actualmente uso una recta, pero tampoco necesito una precisión excesivamente alta fuera de ese rango de temperaturas.
Por ultimo, puedes hacer un oscilador RC con la ntc y medir su resistencia de forma indirecta a partir de la frecuencia. Esto es muy preciso en un rango muy amplio de valores y consume muy poca corriente.
Leeré un poco sobre esto. No lo había visto nunca, y parece realmente interesante.
Otro truco para minimizar el consumo, no solo en sleep, es dar masa a la R220ohm vía una salida.
De esa forma, antes del sleep pones esa salida en 1 o la reprogramas como entrada y el consumo será 0. También lo podes hacer si el intervalo entre lecturas es largo.
Aunque siendo un micro de 8 pines dudo que esté sobrando uno. :(
Curiosamente me sobra 1 pin. Había optado por dar voltaje a este circuito con él, pero es cierto que no tendré puramente Vdd. Lo intentaré hacer así :)
Gracias por las respuestas!!
Saludos
-
Hola,
Os subo la tabla de valores del sensor.
Bien elegido, pensé que era de los comunes cuya resistencia baja casi a la mitad cada 10°C y en ese rango la lectura sería muy poco lineal.
Con microcontroladores no representa mayor problema porque la curva se corrige, solamente que la rutina de calibración necesita de mas puntos (4 o 5 por lo menos). Olvidate de calibrarlo midiendo dos puntos.
Con respecto a lo de 5 puntos, te refieres a la fórmula de conversión voltaje a degC? Es cierto que actualmente uso una recta, pero tampoco necesito una precisión excesivamente alta fuera de ese rango de temperaturas.
Lo de mas puntos era para calibrar cuando no se tiene la tabla de respuesta y son menos lineales que el que usás.
En tu caso, aproximando una recta en el rango 50..120° el error puede ser de 1 o 2°.
No sé si vas a seguir indicando la temperatura cuando el termistor esté a temperatura ambiente , como en esa zona el error va a ser grande cada curioso que pase va a decir "Eh! eso marca para la m..."
Inútil explicar , es preferible que fuera de rango se lea LOW TEMP antes que un número :)
-
Si quieres bajo consumo, deberías escoger un termistor con mayor resistencia.