Sunday, June 7, 2020

Temperature reading from LM35 with ADC module of ATMega32

In this ADC module, we have an easy example of interfacing with device ADC. LM35 is analog temperature sensor capable of measuring the temperature between -55 to 150 degree Celsius. It outputs an analog voltage value that is 10 mV per degree Celsius proportionally. For more information please see this post.

Reading an analog temperature data with ADC module of ATMega32
A sample picture and pin diagram of LM35

In this example the system could only read the positive temperature value. Because I have some difficulty of working with negative voltage reading at this time.

Reading an analog temperature data with ADC module of ATMega32
LM35 connects to ADC0. There is no negative temperature reading here.

Source code:

#include <avr/io.h>
#define  F_CPU 4000000UL
#include <util/delay.h>
int main(void)
{ float voltage;
 float temperature;
 int _temperature;
 char ssd[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,
 0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
 //PortC as output
 DDRC=0xFF;
 //PortD as output
 DDRD=0xFF;
 //PA0 or ADC0 as an analog input
 DDRA=0;
 //Turn on the ADC module
 ADCSRA|=(1<<ADEN);
 while (1)
 {
  //Start the conversion
  ADCSRA|=(1<<ADSC);
  //Wait for the completion
  while((ADCSRA&(1<<ADSC))==1);
  /*Convert ADC to voltage*/
  voltage=(ADCL+(ADCH<<8))*5.0/1024;
  /*Convert to temperature*/
  temperature=voltage*100;
  /*make dot point*/
  temperature*=10;
  _temperature=(int)temperature;
  /*Displaying the Data*/
  PORTD=0x00;
  PORTC=ssd[_temperature/1000];
  if(_temperature>=1000) PORTD=0x01;
  _delay_ms(10);
  PORTD=0x00;
  PORTC=ssd[(_temperature%1000)/100];
  PORTD=0x02;
  _delay_ms(10);
  PORTD=0x00;
  PORTC=ssd[(_temperature%100)/10]|0x80;
  PORTD=0x04;
  _delay_ms(10);
  PORTD=0x00;
  PORTC=ssd[_temperature%10];
  PORTD=0x08;
  _delay_ms(10);
   }
}

Back to main tutorial page ATMega32 tutorials in C with Atmel Studio 7.

Reading an analog temperature data from LM35 with ADC module of ATMega32



Click here to download its source file.


No comments:

Post a Comment

Search This Blog

Labels

25AA010A (1) 8051 (7) 93AA46B (1) ADC (30) Analog Comparator (1) Arduino (15) ARM (6) AT89C52 (7) ATMega32 (56) AVR (57) CCS PICC (28) DAC (1) DHT11 (2) Display (105) Distance Sensor (3) DS18B20 (3) dsPIC (2) dsPIC30F1010 (2) EEPROM (5) Environment Sensor (4) esp8266 (1) I2C (29) Input/Output (67) Interrupt (19) Keil (5) Keypad (10) LCD (47) Master/Slave (1) MAX7221 (1) MCP23017 (5) MCP23S17 (4) Meter (3) MikroC (2) Motor (15) MPLABX (71) Nokia 5110 LCD (3) OLED (2) One-Wire (6) Oscillator (8) PCB (6) PCD8544 (3) PCF8574 (5) PIC (107) PIC12F (2) PIC16F628A (2) PIC16F630 (1) PIC16F716 (3) PIC16F818 (10) PIC16F818/819 (2) PIC16F84A (15) PIC16F876A (1) PIC16F877A (9) PIC16F88 (1) PIC16F887 (60) PIC18 (19) PIC18F1220 (4) PIC18F2550 (3) PIC18F4550 (12) PWM (11) RTC (8) Sensor (10) SH1106 (1) Shift Register (11) Shift Registers (3) SPI (24) STM32 (6) STM32 Blue Pill (6) STM32CubeIDE (6) STM32F103C8T6 (6) SysTick (3) temperature sensor (11) Thermometer (21) Timer/Counter (31) TM1637 (2) UART (7) Ultrasonic (4) Voltmeter (7) WDT (1) XC16 (2) XC8 (94)