Измерение температуры при помощи датчика Lm35 и ATmega 16

Всем привет! Хочу поделится одной простой схемкой для измерения температуры на микроконтроллере ATmega 16 и датчика температуры  Lm35.  Перед сборкой самого проекта я использовал Proteus для того что все хорошенько протестировать. Вместо ATmega 16 Можно взять любой другой, Atmega8 или 32. Для отображения температуры использовал 2 семисегментных индикатора. Температура выводится 2 цифрами, единица измерения градусы Цельсия.

Схема устройства

Схема измерения температуры при помощи датчика Lm35 и ATmega 16

Как работает схема

Датчик температуры LM35 подключается к выводу 5 вольт и земпле а средний вывод к выводу ADC0 порта A микроконтроллера. На эту ножку мы подаем аналоговое значение сигнала. Который далее при помощи АЦП преобразутся в цифровой.

Как происходит измерение, к примеру мы измеряем температуру 25 град. Мы берем это значение и делим на 10 и округляем на до целого значения. Полученную 2-й ку мы выводим на первый индикатор.

Для получения второй цифры мы используем операцию 25%10 таким образом получаем значение 5, которое выводим на второй индикатор. Остальные элементы схемы также необходимы, про них не нужно забывать.

Устройство в сборе

Измерение температуры датчиком Atmega16

Печатная плата устройства

Далее необходимо изготовить печатку. Для разводки платы использовалась программа Eagle. Тут можно сделать разводку и по другому, у меня получилось как на рисунке выше.

Печатная плата

Программа измерения температуры

Вот и сама программа, ее также можно скачать архивом внизу статьи. После компиляции программы заливаем полученный файл в сам микроконтроллер.  О там как прошить микроконтроллер говорилось ранее.


/*
 * Tempsensor.c
 *
 * Created: 2016-10-22 5:04:26 PM
 * Author : alaa nasef _ bio medical
 */ 
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

//global var
int tempC;
int first,last;

int readADC(char channel)
{
	ADMUX = (3 << REFS0)|(1<<ADLAR)|(channel << MUX0);    // VREF=2.56V, 8-bit, channel #0 is on PA0
	_delay_us(10);              // allow multiplexer to settle
	ADCSRA |= (1<<ADSC);        // Start Conversion
	while (ADCSRA & (1<<ADSC)); // wait for completion
	return ADCH;                // 8-bit result because we use ADLAR
}

void led_display(int x)
{
   switch (x)
   {
   case 0: PORTD=0XC0;break;
   case 1: PORTD=0XF9;break;
   case 2: PORTD=0XA4;break;
   case 3: PORTD=0XB0;break;
   case 4: PORTD=0X99;break;
   case 5: PORTD=0X92;break;
   case 6: PORTD=0X82;break;
   case 7: PORTD=0XF8;break;
   case 8: PORTD=0X80;break;
   case 9: PORTD=0X90;break;
   default: break;
   }
   
  
   	
}

int main(void)
{
	DDRC =0b11111111;
	DDRD =0b11111111;
	
	ADCSRA = (1<<ADEN)|(1<< ADPS1)|(1<<ADPS2);        // Enable ADC , div64
	
	TIMSK=(1<<TOIE0) ;  // enable timer overflow interrupt for Timer0
	TCNT0=0x00;    // set timer0 counter initial value to 0
	TCCR0 = (1<<CS01) ;   // start timer0 with /8 prescaler
	sei();    // enable interrupts
	
	while (1) {
		tempC = readADC(0);       // 10mV per C.  full-scale is 2.56V i.e. 256C
	}
	return 0;	
}
 ISR(TIMER0_OVF_vect) {
	 // display temp
	 first=tempC/10;
	 last=tempC%10;
	 //PORTC&=~(1<<PC0);
	 //PORTC&=~(1<<PC1);
	 led_display(first);
	 PORTC|=(1<<PC0);
	 PORTC&=~(1<<PC1);
	 _delay_us(1000);
	 PORTC&=~(1<<PC0);
	 PORTC&=~(1<<PC1);
	 led_display(last);
	 PORTC&=~(1<<PC0);
	 PORTC|=(1<<PC1);
	 _delay_us(1000);
 }
Список радиодеталей
Обозначание Наименование Номинал Количество
1 U1 Микроконтроллер Atmega 16 1
2 Семисегментные индикаторы 2
3 LM35 Датичк температуры 1
4 Резистор 10 кОм 1
5 R2-R9 Резистор 300 Ом 8
6 С1,С2 Конденсатор 100 нФ 2
7 Индуктивность 100 uH
Скачать исходники
Полезные ссылки по проекту
Автор
Staticvoid

Администратор сайта http://www.radiodetector.ru

Понравилась статья? Вы можете поделиться ей с друзьями:
Поделиться
Класснуть
Линкануть
Запинить

Добавить комментарий