Autor Tema: PWM en PIC12F683 + LM35  (Leído 2741 veces)

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

Desconectado Mr.pelax

  • PIC10
  • *
  • Mensajes: 19
PWM en PIC12F683 + LM35
« en: 20 de Julio de 2017, 21:57:44 »
Hola buenas noches estoy realizando el siguiente circuito para controlar la velocidad de un cooler controlado por temperatura con el sensor
LM35, en la simulacion me funciona perfecto ahora lo estoy por armar en fisico . adjunto el codigo para que me digan si esta correcto.

Código: [Seleccionar]
#include <12F683.h>
#device adc=10

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOCPD                    //No EE protection
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES PUT                      //Power Up Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOIESO                   //Internal External Switch Over mode disabled
#FUSES NOFCMEN                  //Fail-safe clock monitor disabled

#use delay(clock=8000000)

#define  set_temp_max 50.0     // temperatura efriamiento.
#define  set_temp_min 30  //

int16 d;
int16 digital_reading;  // ADC resolution is 10Bit, an 8Bit integer is not enough to hold the reading
float temp;

void main()
{
   /* ADC Initialization */
   setup_oscillator(OSC_8MHZ); // reloj interno micro
   setup_adc(ADC_CLOCK_INTERNAL); //
   setup_adc_ports(sAN3);   // Establecer PIN_A3 como canal de entrada analógica
   set_adc_channel(3);            // canal 3 para la lectura del ADC
   setup_ccp1(CCP_PWM);                                // Configure CCP1 as a PWM
   setup_timer_2(T2_DIV_BY_1, 79, 1);     // frecuenca 25Khz cooler
   delay_ms(1);                   // ADC module is slow, needs some time to adjust.
   
   
  while(true) // infinite loop
   {
      digital_reading = read_adc();    // capture current temperature reading
      delay_us(100);                   // 0.1ms delay for ADC stabilization
      temp = digital_reading * 0.4883; // convert reading to Celsius
      //lcd_gotoxy(1,2);                 // point LCD cursor to col1 row2
      //printf(lcd_putc,"%2.1f C",temp); // print value on LCD
     
      //---- Arranca el cooler al 50% de su velocidad --\\
     
      if(temp <= set_temp_min)   // si temp es - que set_temp_min (29°)
      {//output_high(LOAD);   // Control Load
      //else  output_low(LOAD);
      d=160; //al 50%
      set_pwm1_duty(d);
      delay_ms(1000);   // 1 second delay between readings
      }
     
     
      else if(temp>=set_temp_max)   // si temp es + que set_temp (50°) cooler al 100%
      {//output_high(LOAD);   // Control Load
      //else  output_low(LOAD);
      d=320; //al 100%
      set_pwm1_duty(d);
      delay_ms(1000);   // 1 second delay between readings
      }
   }
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:PWM en PIC12F683 + LM35
« Respuesta #1 en: 21 de Julio de 2017, 12:07:11 »
No veo nada incorrecto, podrias llegar a sacar esos comentarios y jutar el if con el elseif asi se entiende un poco mas.

Aca estamos hablando de un control ON/OFF, pero tranquilamente podrias crear una funcion que te devuelva un valor de PWM segun la temperatura. Ejemplo...

Si tenes 160 a 30ºC y 320 a 50ºC

Con una formula asi:

Código: [Seleccionar]
PWM = 8*Temp - 80;
Cuando tenes 30 en Temp te queda 160.
Luego si vas a tener que limitarlo, ya que si observas, cuando tengas 10ºC vas a tener 0 PWM, asi que por ejemplo digamos que mas abajo de 15ºC no funcione directamente. Y si supera los 50 que siga fijo.

Es decir teniendo los siguientes valores:

Código: [Seleccionar]
set_temp_min = 15
set_temp_max = 50

Usar este codigo:
Código: C
  1. while(true) // infinite loop
  2.    {
  3.       digital_reading = read_adc();    // capture current temperature reading
  4.       Temp = digital_reading * 0.4883; // convert reading to Celsius
  5.      
  6.       if(temp <= set_temp_min )   // si temp es menor a 15º
  7.       {
  8.             //Parar todo o pensar que esta roto el LM35.
  9.             d=0; //al 0%
  10.       }
  11.       else if(temp >= set_temp_max)   // si temp es + que set_temp (50°) cooler al 100%
  12.       {
  13.         d=320;  // al 100%
  14.       }
  15.       else
  16.       {
  17.         d = 8*Temp - 80;        
  18.       }
  19.  
  20.       set_pwm1_duty(d);
  21.       delay_ms(1000);   // 1 second delay between readings
  22.      
  23.    }

Quite todos los comentarios, quite el delay despues de la lectura, ya que ahora SI o SI hay un delay de 1 segundo en el camino.

Desconectado Mr.pelax

  • PIC10
  • *
  • Mensajes: 19
Re:PWM en PIC12F683 + LM35
« Respuesta #2 en: 23 de Julio de 2017, 20:43:28 »
Perfecto realize los cambios que me comentastes y quedo mucho mejor, ahora estoy probando la salida PWM para activar un cooler de PC, con un transistor 2n3904 funciona, cuando esta al 50% el voltaje que le llega al cooler es 6.34v y cuando esta al 100% le llegan 7.93v un poco bajo me parece, no se si es el transistor que no le da la potencia..Ahora cuando le conecto un cooler mas potente que el que necesito usar ni arranca le  llegan 2.98v..

Saludos :shock:

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:PWM en PIC12F683 + LM35
« Respuesta #3 en: 23 de Julio de 2017, 22:06:55 »
Medi la corriente que requiere el cooler, y fijate que resistencia de base estas usando.

Otra cosa, con que mediste esos 6.34V y 7.93V ?
Si lo hiciste con el multimetro, este espera que la tension sea continua, pero en cambio vos tenes una señal cuadrada Y vas a tener un error midiendolo con el multimetro.
Si tenes la oportunidad de verlo con el osciloscopio mejor, y si podes proveer un esquematico de como es que es el circuito que tenes seria lo ideal ( hablo unicamente de la salida, lo el LM no importa ).