Temperature controlled fan using PIC 16F877A

Temperature-controlled-fan-pic-16f877a-microcontroller-dc-motor
Temperature Controlled DC motor

You might have come across several applications where we need to control a specific device based on analog parameter. This Embedded system works in a similar concept where we are about to control the speed of a DC motor using based on the external temperature. The rise in temperature will result in increase in speed of the motor and vice versa. These type of Temperature controlled fan systems can generally be used to maintain temperature of a room or object automatically.

 DESIGN OF TEMPERATURE CONTROLLED FAN SYSTEM:

  • The temperature is measured by means of a temperature sensor LM35.
  • The output voltage of the sensor is fed to the A/D channel of the Microcontroller.
  • Based on the sensed temperature the speed of the motor is controlled using PWM .
  • Several temperature ranges was set in the code to vary the motor speed based on the level of temperature sensed.
  • The speed of the motor is controlled by using PWM.
  • The motor is driven using a driver IC l293D, See a brief explanation on its working and wiring here.

LM35:

LM35-pin-diagram-temperature-sensor
LM35 Pin Diagram

Lm 35 is used to sense the external temperature which is capable of sensing temperature ranges from -55 to 150 C. The output voltage is proportional to the temperature hence there is no need of trimmers to calibrate the reading. The output voltage of this sensor varies by 10mv per degree change in temperature.

CALIBRATION:

We are using a 10 bit ADC and Vcc as Vref to the ADC module of the Controller. So in order to determine the step size we have to divide the Vref by our resolution that is 2^10 ( 1024 ).

Step Size = 5 / 1024 = 4.83mV

We obtain a change of 10mV with each rise or fall in temperature from the sensor. And value in the ADC register will alter by two steps with each degree change in the sensor since two increments of step size i.e 4.833mV * 2 = 9.96mV which is approximately equal to 10mV. So in order to obtain the original value we have to divide the contents in the ADC register by 2

Real value = ADC value / 2

CODE:

This code was built using CCS compiler for PIC Microcontrollers.

#include <16F877A.h>
#device ADC=10                              //Setting ADC bits
#FUSES NOWDT               
#FUSES NOBROWNOUT          
#FUSES NOLVP                
#use delay(crystal=20000000)
#byte lcd=0x08
#byte TRIS_lcd=0x88
#bit rs=0x06.2
#bit en=0x06.3
#bit TRIS_rs=0x86.2
#bit TRIS_en=0x86.3
long int adc_value,real_value;        
int i;
char value[4];
unsigned char text[]="Temperature:";
void display(unsigned char a, int b);
void motor();
void main()
{
  TRIS_lcd=TRIS_rs=TRIS_en=0;
  display(0x38,0);
  display(0x01,0);
  display(0x0c,0);
    for(i=0;i<=12;i++)
    {
     display(text[i],1); 
    }
  setup_timer_2(T2_DIV_BY_16,255,1);    //Setting timers for PWM      
  SETUP_ADC_PORTS(AN0);                   //Setting ADC PORTS
  SET_ADC_CHANNEL(0);                       //Selecting Channel
  SETUP_ADC(ADC_CLOCK_INTERNAL);
     while(TRUE)
      {
        delay_us(20);
        adc_value=READ_ADC();            //Reading ADC value
        delay_us(10);
        real_value=adc_value/2;           //Obtaining real value
        motor();
        sprintf(value,"%lu",real_value);  //Changing int to char
        display(0x8c,0);
          for(i=0;i<=3;i++)
           {
             display(value[i],1);
           }   
      }
 }
void display(unsigned char a,int b)         //LCD sub routine
  {
    lcd=a;
    rs=b;
    en=1;
    delay_ms(10);
    en=0;
    delay_ms(10);
  }
 
void motor()
{
  if(real_value<10)
   {
   setup_ccp1(CCP_OFF);             
   }
  if(real_value>10)
   {
     setup_ccp1(CCP_PWM);
      if(real_value>=10&&real_value<=29)
      {
        set_pwm1_duty((int16)204);         //20% duty cycle PWM
      }
      else if(real_value>=30&&real_value<=69)
     {
       set_pwm1_duty((int16)510);         //50% duty cycle PWM 
      }
      else if(real_value>=70&&real_value<=99)
      {
         set_pwm1_duty((int16)715);      //70% duty cycle PWM
       }
      else if(real_value>=100&&real_value<=150)
       {
         set_pwm1_duty((int16)919);     //90% duty cycle PWM
       }
    }
 }

The above code uses built in functions in the CCS compiler to use the A/D and PWM feature in the Microcontroller. The received analog value is calibrated to display the temperature in the LCD. The “real_value” int value is converted to character using “sprintf” in order to display the temperature values.

The temperature ranges and duty cycle of the PWM is given using the subroutine “.motor”. So the microcontroller runs a check on the temperature every time and alters the speed of the motor based on it.


99 Comments

  1. Pingback: Temperature controlled fan using PIC 16F877A • Tech Projects

  2. HAKIM

    HELLO SIR,, CAN I NOT USE THE IC AND JUST CONNECT THE MOTOR DIRECTLY TO PWM?

    Reply
    1. Frank DonaldFrank Donald (Post author)

      Hakim,
      The output current from MCU is not sufficient to drive a motor so we need a driver chip’s help.

      Reply
  3. Karthik

    How to cantrol speed in l293d
    You are cannected enable pin to +5 volt

    Reply
    1. Frank DonaldFrank Donald (Post author)

      Karthik,
      Enable pin is to activate the motor driver in IC chip. For controlling speed you have to feed PWM pulse to IN pins of the driver IC.

      Reply
      1. adel

        salut, jai pas comris cest quoi le fichier h

        Reply
  4. Arturo

    I get a compile error that says “A #device required before this line” do you have any idea of what should I do to solve it?
    Thanks a bunch

    Reply
    1. Frank DonaldFrank Donald (Post author)

      Which line the error is in ? what IDE you are using ?

      Reply
  5. yared

    during simulation on proteus it’s saying no power supply specified for 12v and 5v

    Reply
    1. Frank DonaldFrank Donald (Post author)

      Yared,
      It’s been long time since I worked on Proteus but I guess you need to use power terminal in MCU Vcc pin and specify the input voltage.

      Reply
  6. NIKITA

    Sir, Can I get this project source code idea in MPLAB IDE software.

    Reply
  7. megat

    can the coding work on mplab software??

    Reply
  8. reshmi

    set_pwm1_duty((int16)204) // 20% duty cycle
    sir, please explain the format above (CCS compiler program for PIC )- what does the term int16 and 204 denotes

    Reply
  9. geneshgenesh96

    sir, im using hitech compiler with mplab, can get the source code for this project using ldr replacing the teperature sensor.I need to include 2 ldrs, leds and a motor using pic16f877a. u can contact me through geneshgenesh96@gmail.com. tq in advance and hope to hear from u soon

    Reply
  10. Firdaus

    Hello sir, i have one question for u. can i replace sensor lm35 with another sensor witch like PIR sensor.
    Sorry for my bad english

    Reply
    1. Frank DonaldFrank Donald (Post author)

      Firdaus,
      Of course you can but you need to do a different calibration. Check your PIR sensor documentation to do this.

      Reply

Leave a Comment

Your email address will not be published. Required fields are marked *