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 |
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.
Hello guys..
I should convert this code to hexfile.Anyone have this one ?
My email aytugdemiregen@gmail.com
SIR..PLS HELP..I NEED THE HEXFILE..I HAVING PROBLEM WITH THE CODE..PLS SEND TO MY EMAIL..mohdfirdaus007.mf@gmail.com
pls I need the hexfile. am having problems compiling the code. my email is toscliff_2011@yahoo.com
whre can i get the ccs compiler.. can u give me a link..coz i cant find the same type as your
how to config two value for voltage 5, 12 that used in L293D……thanks
what is the 10K symbol that connect to VDD in LCD and how to get it from proteus
Dear Khalid did you. Get your answer.
please send me compressed file of that project
need to add lighting controll to code any help
need to add lightinf controll to the project so it can control the ln the room
Pat,
Use an LDR sensor and connect it to an ADC pin measure its voltage and write your control condition loops based on those values.
thanks a lot the simulation is working fine. pls i would like to change the referrence temperature from 10 to 30 degrees(whence it would increase initially by 30%) and also want the speed of the fan to increase by 10% per degree after 40 degrees. i know this edition should be made on the program but i dont know where. also pls if its not too much trouble can you help me with a step by step explanation of each line of the code starting from the header files.