Autor Tema: Alto consumo corriente en Sleep  (Leído 618 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado tito melli

  • PIC12
  • **
  • Mensajes: 63
Alto consumo corriente en Sleep
« 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:

Código: [Seleccionar]
#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

Desconectado Eduardo2

  • PIC12
  • **
  • Mensajes: 84
Re:Alto consumo corriente en Sleep
« Respuesta #1 en: 13 de Abril de 2018, 17:05:57 »
En principio si, aunque sería mejor ver el circuito.

Desconectado Yoshua

  • PIC16
  • ***
  • Mensajes: 134
Re:Alto consumo corriente en Sleep
« Respuesta #2 en: 13 de Abril de 2018, 18:50:48 »
¿Es el consumo del PIC solamente o hay mas componentes como resistencias de pull-up?

Desconectado tito melli

  • PIC12
  • **
  • Mensajes: 63
Re:Alto consumo corriente en Sleep
« Respuesta #3 en: 14 de Abril de 2018, 12:39:59 »
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
« Última modificación: 15 de Abril de 2018, 06:27:25 por tito melli »

Desconectado tito melli

  • PIC12
  • **
  • Mensajes: 63
Re:Alto consumo corriente en Sleep
« Respuesta #4 en: 19 de Abril de 2018, 12:56:47 »
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

Desconectado Eduardo2

  • PIC12
  • **
  • Mensajes: 84
Re:Alto consumo corriente en Sleep
« Respuesta #5 en: 19 de Abril de 2018, 15:56:18 »
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.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4795
Re:Alto consumo corriente en Sleep
« Respuesta #6 en: 19 de Abril de 2018, 16:49:43 »
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.
« Última modificación: 19 de Abril de 2018, 16:51:44 por Picuino »

Desconectado nico

  • PIC16
  • ***
  • Mensajes: 176
Re:Alto consumo corriente en Sleep
« Respuesta #7 en: 19 de Abril de 2018, 20:05:44 »
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.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4795
Re:Alto consumo corriente en Sleep
« Respuesta #8 en: 20 de Abril de 2018, 03:32:18 »
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.

Desconectado tito melli

  • PIC12
  • **
  • Mensajes: 63
Re:Alto consumo corriente en Sleep
« Respuesta #9 en: 28 de Abril de 2018, 05:44:22 »
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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6849
Re:Alto consumo corriente en Sleep
« Respuesta #10 en: 28 de Abril de 2018, 10:27:18 »
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.

Desconectado Eduardo2

  • PIC12
  • **
  • Mensajes: 84
Re:Alto consumo corriente en Sleep
« Respuesta #11 en: 28 de Abril de 2018, 13:27:52 »
....
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°)
 
Citar
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í?

Citar
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.


Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4795
Re:Alto consumo corriente en Sleep
« Respuesta #12 en: 29 de Abril de 2018, 12:36:43 »
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.

Desconectado Eduardo2

  • PIC12
  • **
  • Mensajes: 84
Re:Alto consumo corriente en Sleep
« Respuesta #13 en: 29 de Abril de 2018, 19:02:07 »
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.  :(

Desconectado tito melli

  • PIC12
  • **
  • Mensajes: 63
Re:Alto consumo corriente en Sleep
« Respuesta #14 en: 30 de Abril de 2018, 02:39:11 »
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