Here
is a simple example to interface multiple temperature sensors to AVR (Atmega8)
microcontroller. Atmega8 is a High-performance,
Low-power Atmel®AVR® 8-bit Microcontroller Advanced RISC Architecture with 8KB
ISP flash, 1KB RAM, 512B EEPROM, Two 8-bit Timer/Counters with Separate
Prescaler, one Compare Mode, One 16-bit Timer/Counter with Separate Prescaler,
Compare Mode, and Capture Mode, Real Time Counter with Separate Oscillator, Three
PWM Channels, 6 multiplexed ADC channels with 10-bit resolution. We have used 2
channels to connect 2 LM35 linear temperature sensors to it.
About LM35:
The
LM35 series are precision integrated-circuit temperature sensors, whose output
voltage is linearly proportional to the Celsius (Centigrade) temperature. The
LM35 thus has an advantage over linear temperature sensors calibrated in °Kelvin.
·
Calibrated
directly in ° Celsius (Centigrade)
·
Linear
+ 10.0 mV/°C scale factor
·
0.5°C
accuracy guaranteeable (at +25°C)
·
Rated
for full −55° to +150°C range
·
Suitable
for remote applications
·
Low
cost due to wafer-level trimming
·
Operates
from 4 to 30 volts
·
Less
than 60 μA current drain
·
Low
self-heating, 0.08°C in still air
·
Nonlinearity
only ±1⁄4°C typical
·
Low
impedance output, 0.1 W for 1 mA load
AVR AMTEGA8 ADC Registers:
BIT
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
ADMUX
|
REFS1
|
REFS0
|
ADLAR
|
–
|
MUX3
|
MUX2
|
MUX1
|
MUX0
|
BIT
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
ADCSRA
|
ADEN
|
ADSC
|
ADFR
|
ADIF
|
ADIE
|
ADPS2
|
ADPS1
|
ADPS0
|
Functions used:
ADC_init();
To initialize the ADC with reference voltage, adc clock prescalar, interrupts,,,
ADC_readch(ch_no);
To start conversion in
the specified channel & return the values.
int
ADC_readch(unsigned char chn)
{
ADMUX= (ADMUX & 0xF0) | (chn &
0x0F);
ADC_CLEAR_ADIF(); //Clear ADC Interrupt
Flag
ADC_START_CONV(); //Start ADC Conversion.
while(!(CHECKBIT(ADCSRA,ADIF)));
//wait for
conversion complete
return(ADC_read());//----read values &
return
}
ADC_calcvolt(long int ADCval);
To convert the ADCvalue
into equ. voltage value (float).
updatedisp();
To display the
temperature in LCD in required format.
To get the Celsius value, the ADC_Value is divided by 2 to convert 5mV/'C
to 10mV/'C
Main Program:
Main Program:
unsigned char d1[]="T1= . 'C",d2[]="T2= . 'C";unsigned int t1,t2;
void updatedisp1(){ unsigned int i=t1/2; //convert 5mV/'C to 10mV/'C (directly into Celcius) d1[6]= (i%10) | 0x30; //1s i/=10; d1[5]= (i%10) | 0x30; //10s i/=10; d1[4]= (i%10) | 0x30; //100s d1[8]= (t1%2 ? 5:0) | 0x30;//decimal LCD_putsXY(0,0,d1);}void updatedisp2(){ unsigned int i=t2/2; //convert 5mV/'C to 10mV/'C (directly into Celcius) d2[6]= (i%10) | 0x30; //1s i/=10; d2[5]= (i%10) | 0x30; //10s i/=10; d2[4]= (i%10) | 0x30; //100s d2[8]= (t2%2 ? 5:0) | 0x30;//decimal LCD_putsXY(0,1,d2);}
int main(){
CLEARBIT(DDRC,4)//set as i/p for adc CLEARBIT(DDRC,5) DDRD=0xF8;//enable PD as i/p & en pull ups PORTD=0x07; _delay_ms(10); LCD_init(COFF); _delay_ms(100); LCD_putsXY(0,0,"Welcome"); WaitMs(1000);//wait for some time ADC_init();
LCD_putsXY(0,0,d1); LCD_putsXY(0,1,d2);
while(1) {// t=t2/2;//convert 5mV/'C to 10mV/'C (directly into Celcius) t1=ADC_readch(4); t2=ADC_readch(5); updatedisp1(); updatedisp2(); WaitMs(300); }//end of while return 0;}
OUTPUT Snapshots:
Viewers comments are encouraged.
It helps us to do better.
Thank you.
what if I want the sensor distance of 2-3 meters from avr ?
ReplyDeleteWriting a post is really important for the growth of your websites. Thanks for sharing amazing tips about parking sensors dubai. Following these steps will transform the standard of your post for sure.
ReplyDelete