¿Cómo controlar o evitar altas temperaturas en un microcontrolador?

#1
Saludos a todos,

tengo una pregunta, quizá alguien ya la haya tenido pero a mi no me cale la peceta....

como harían uds para evitar que el microcontrolador no caliente mas de 85 grados Celsius. Sin utilizar ventilador?
este microcontrolador estaría en una caja cerrada en una zona donde el sol da perpendicularmente al procesador.

saludos
 
#2
Si se calienta por el sol entonces pinta la caja para reflejar lo más posible.

Recomendaría que buscaras de rango industrial (100C) o extendido (150C) si planeas tener tu circuito en esos ambientes, el de consumidor (85C) no está pensado para trabajar de esa forma.
 

Daniel Lopes

Miembro Geconocido
#4
Hola a todos , hay PCs (conputador personal) mas elaborados (y tanbien dispendiosos $$) que enpleyan un sistema de refrigeración en los uProcesadores basados en una tuberia de cubre rellenos de gás Freon que "roba" lo calientamento generado por lo uP y despues es dicipado en un radiador de calor armado en un sitio cercano tal cual en una Heladera convencional que hay en nuestras casas .
Att,
Daniel Lopes.
 
Última edición:
#6
Lo primero pintar la caja de blanco y ponerle algo de sombra si se puede.
Recuerdo cuando empezaron a caer equipos como mosca... habían pintado las cajas de negro mate.
 
#7
si no quieres que se caliente el microcontrolador no le pongas cargas a las salidas usa transistores lo normal sin carga los microcontroladores practicamente no se calientan a no ser que este tomando temperatura de otros componentes cercandos como el regulador de voltaje o que estes exigiendo las salidas podrias separar en el PBC los componentes que generan calor del micro con algo aislante
 
#8
hola a todos,

espero que no dejaran de seguir este problema... segui dandole mente a este asunto y sigo sin poder encontrar una solucion viable... he diseñado un taximetro de bajo costo pero no he logrado solucionar mi problema, el micro que uso es el 4550 a 85 grados...
alguien sabe si poniendole un WDT podre evitar ese problema?.... el aparato se queda congelado o funciona mal cuando queda encerrado en un vehiculo bajo el sol de medio dia o en playas....
alguna idea?
gracias
 
#9
Usar el Watch-Dog Timer te resolverá los problemas de cuelgue por retardos o bugs.
Pero nunca un problema por calentamiento.
El calentamiento de un microcontrolador se debe a que ya estás superando sus parámetros máximos.
En ese caso debes de preocuparte más que nada por ver qué se va a controlar para optar por el sistema de potencia.
Un PIC por ejemplo, puede controlar cargas de 20 mA @ 5V. por pin, si excedes ese límite lo sobrecargas.
 
#10
Hola, otra sugerencia

Existen disipadores para CI's DIP, algo difíciles de conseguir

Poner el diagrama también dará un panorama sobre algún otro motivo que este provocando la falla, incluso una foto de la placa.

Saludos
 
#12
Hola, si el microcontrolador se calienta por temperatura externa, la solución es aislarlo térmicamente. Por ejemplo utiliza una pequeña caja de poliestireno expandido(telgopor), ahí aloja el circuito impreso, y procura sellar muy bien.
Un disipador no va a funcionar, ya que en lugar de disipar, recogerá calor externo y lo llevara al micro, hasta que la temperatura se vuelva homogénea.
Un ventilador sólo moverá aire caliente de un lado a otro.
 
Última edición:

Dr. Zoidberg

Well-known-Papá Pitufo
#13
El problema que tenes se debe a que estas usando componentes con especificaciones de nivel "comercial" en lugar de usar componentes para nivel industrial (o militar jaja).
Para autos se emplean componentes que permiten operacion en rangos de temperatura extendidos (hasta 125°C). Si le compras los PIC a la casa de electronica de Don Jose, tene la certeza que no te van a vender los componentes que necesitas.
 
#14
gracias a todos sus respuestas son muy buenas.

y si el calor es externo no interno del micro. voy a ver si logro conseguir micros de nivel industrial gracias.
 
#15
Y si el calor es externo, no interno del micro. Voy a ver si logro conseguir micros de nivel industrial. Gracias.
En ese caso, es mejor que consigas todos los componentes para uso en temperaturas elevadas.
Algo así cómo una fuente de poder para TV, que aunque no sea de uso industrial, calienta, y necesita que sus componentes soporten temperaturas elevadas.
Aquí los consigo bajo la norma: NOM-001-SCFI-1993
Para otros países, esa norma puede cambiar.

También hago pruebas de calentamiento con un termómetro infrarrojo, para ver qué componente se calienta más.
 
#16
Si es para usar en un auto debe estar certificado con AEC-Q100, esta norma está indicada para soportar el estrés al que se someten los circuitos en el interior del auto, Microchip tiene algunas soluciones pero el chip que estas usando definitivamente no es apto para eso.
 
#17
hola a todos,

despues de mucho estar probando y probando.... no es la temperatura parece que es un problema del programa... estoy pensado en usar el WDT que no lo use antes, pero he leido resetea el PIC (nunca he usado el WDT) como se puede hacer para que no pierda la info que esta usando?.

alguna idea o recomendacion?

gracias.
 
#18
hola a todos,

despues de mucho estar probando y probando.... no es la temperatura parece que es un problema del programa... estoy pensado en usar el WDT que no lo use antes, pero he leido resetea el PIC (nunca he usado el WDT) como se puede hacer para que no pierda la info que esta usando?.

alguna idea o recomendacion?

gracias.
Bueno, creo que es prioritario descifrar porqué se corrompe el programa, vamos, atacar el problema de raíz no solo "parcharlo".

Da más detalles, si puedes colgar el código acá también.

Saludos
 
#19
hola con esto bastara?

es el programa central

Código:
//----------------------------------------------------// 
//-------------------programa central----------------//
int16 precio_banderazo;
float kilometro_extra;
void  operacion(int16 *pago, float *distancia){
   int1 tiempo_cortesia, kilometro_cortesia;   
   int16 pulsos_mts, general;
   int32 x, x2, x3, contador_pulsos, control_tiempo, calculo_tiempo;
   float metros_float, pulsos_float, pulsos_auto, tiempo_mem;
   tiempo_cortesia = 0;
   contador_pulsos = 0;
   kilometro_cortesia = 0;   
   pulsos_auto = make16(read_eeprom(6), read_eeprom(5));  
   *distancia = 0; 
   x = 0;
   x2 = 0;                         
   x3 = 0;
   precio_banderazo = make16(read_eeprom(2), read_eeprom(1));
   *pago = precio_banderazo; //-------                       
   kilometro_extra = make16(read_eeprom(4), read_eeprom(3));
   //calculo de tres             
   pulsos_float = pulsos_auto;                        
   pulsos_mts =   ceil((pulsos_auto*10)/kilometro_extra);
   metros_float = (pulsos_mts*1000)/pulsos_float; 
   tiempo_mem = (make16(read_eeprom(13), read_eeprom(12)));
   control_tiempo = ceil(((10*3600)/tiempo_mem)*1000);
   general = pulsos_auto; //<-- convertimos float a int16 para compara pulsos 
   //---------------//     
   borrar;
   pantalla_precio(precio_banderazo);                                             
   calculo_tiempo = 345000;      
   do{
     delay_ms(1);
     if(sensor_odometro == 0){ 
          do{ 
               off(led_status); 
               delay_ms(1);                  
               if(x++ >= 500){ //medio segundo para saber que estamos detenidos 
                    //control de tiempo nuevo si el kilometro no a sido pasado
                    if((tiempo_cortesia == 0)){
                         calculo_tiempo = 345000 - ((contador_pulsos*345000)/pulsos_auto); 
                         x2 = 0;
                         do{
                              delay_ms(1);             
                              if(x2++ >= calculo_tiempo){
                                 *distancia = (contador_pulsos*1000)/pulsos_auto;
                                 tiempo_cortesia = 1;
                                 kilometro_cortesia = 1;
                                 break;
                              }
                         }while((sensor_odometro == 0)&&(boton_dos == 1));
                         general = pulsos_auto-ceil((x2 * pulsos_auto)/345000);
                         if(general == 0){                         
                              general = pulsos_auto;
                         }
                    } 
                    while((sensor_odometro == 0)&&(boton_dos == 1)){ 
                         delay_ms(1);
                         if((x2++ >= control_tiempo)&&(tiempo_cortesia == 1)){
                              x2 = 0;
                              *pago = *pago + 10;
                              borrar;
                              pantalla_precio(*pago); 
                         }
                    }
               }
          }while((sensor_odometro == 0)&&(boton_dos == 1));
          x = 0;
          contador_pulsos++;
          if((contador_pulsos >= general)||(kilometro_cortesia == 1)){
               kilometro_cortesia = 1;
               tiempo_cortesia = 1;
               if(contador_pulsos >= pulsos_mts){
                    contador_pulsos = 0;
                    *distancia = *distancia + metros_float;
                    *pago = *pago + 10; 
                    borrar;
                    pantalla_precio(*pago);
               }                                          
          }
     }
     if(sensor_odometro == 1){
          do{
               on(led_status); 
               delay_ms(1);                  
               if(x++ >= 500){ //medio segundo para saber que estamos detenidos 
                    //control de tiempo nuevo si el kilometro no a sido pasado
                    if((tiempo_cortesia == 0)){
                         calculo_tiempo = 345000 - ((contador_pulsos*345000)/pulsos_auto); 
                         x2 = 0;
                         do{
                              delay_ms(1);             
                              if(x2++ >= calculo_tiempo){ 
                                 tiempo_cortesia = 1;
                                 kilometro_cortesia = 1; 
                                 *distancia = (contador_pulsos*1000)/pulsos_auto;
                                 break;
                              }
                         }while((sensor_odometro == 1)&&(boton_dos == 1));
                         general = pulsos_auto-ceil((x2 * pulsos_auto)/345000);
                         if(general == 0){                         
                              general = pulsos_auto;
                         }       
                    }
                    x2 = 0;
                    while((sensor_odometro == 1)&&(boton_dos == 1)){ 
                         delay_ms(1);
                         if((x2++ >= control_tiempo)&&(tiempo_cortesia == 1)){
                              x2 = 0;
                              *pago = *pago + 10;
                              borrar;
                              pantalla_precio(*pago);
                         }
                    }
               }
          }while((sensor_odometro == 1)&&(boton_dos == 1));
          x = 0;
     }
   }while(boton_dos == 1);
   for(int z = 0; z <= 4; z++){
      borrar;
      delay_ms(500);
      pantalla_precio(*pago);
      delay_ms(1500);
   }
}
//--------------------------------------------------//
//----------------programa main---------------------//
void main() {
   char voice_status;
   int8  memoria_hora_inicial, memoria_minutos_inicial, memoria_hora_final, memoria_minutos_final;
   int16 pago;
   int32 apagado_pantalla, control_monetario;
   float distancia;
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);      //1,4 s overflow
   enable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);
   set_rtcc(18661);
   segundos = 0;
   fprintf(voice, "\n");
   on(led_status);
   while(true){
      voice_status = fgetc(voice);
      if(voice_status == '1'){
         off(led_status);
         break;
      }
   }
   if(read_eeprom(9) == 255){
     write_eeprom(9, 0x00); 
   }    
   if(read_eeprom(10) == 255){
     write_eeprom(10, 0x00);
   }   
   if(read_eeprom(11) == 255){
     write_eeprom(11, 0x00);
   }                 
   lcd_init();
   on(backlight);
   borrar;
   lcd_putc("Distribuido por\nCasadelasmarias");
   delay_ms(3000);
   borrar;
   configuracion();
   configurar_lcd();
   borrar;                                                
   pantalla_libre();
   while(TRUE){
     delay_ms(1);
     if(apagado_pantalla++ >= 30000){
         off(backlight);
         apagado_pantalla = 0;
     }                                  
     if(boton_uno == 0){
         on(backlight);
         delay_ms(100);
         memoria_hora_inicial = hora;
         memoria_minutos_inicial = minutos;
         while(boton_uno == 1){}
         pago = 0;
         distancia = 0;
         operacion(&pago, &distancia); 
         control_monetario = make32(read_eeprom(11),read_eeprom(10),read_eeprom(9)); 
         control_monetario = control_monetario + pago;
         write_eeprom(9, make8(control_monetario, 0));
         write_eeprom(10, make8(control_monetario, 1));   
         write_eeprom(11, make8(control_monetario, 2)); 
         memoria_hora_final = hora;       
         memoria_minutos_final = minutos;
         off(led_status);
         borrar;
         pantalla_libre();
     }
     if(boton_dos == 0){
         int16 x = 0;
         on(backlight);
         while(boton_dos == 0){
            delay_ms(1);
            if(x++ >= 5000){
               programacion();
               borrar;
               pantalla_libre();
            }
         }
     }
   } 
}
 

Arriba