پروژه های AVR, پروژه‌ها

پروژه راه اندازی سنسور دما SMT172 با استفاده از مجموعه آموزشی AVR WIZARD توسط برد پلاریس به زبان C

راه-انداری-سنسور-SMT172-با-AVR

فهرست مطالب

هدف از این آموزش فراگیری نحوه خواندن مقدار PWM به ورودی میکروکنترلر به زبان  C  توسط مجموعه آموزشی AVR WIZARD می‌باشد. ( شما می توانید سنسور های مشابه دیجیتال با خروجی PWM را به این روش راه اندازی نمایید )

قطعات مورد نیاز

سنسور دیجیتال دما SMT172

سنسور SMT172 یک سنسور کم مصرف و با دقت بالا است که سهولت استفاده را در طیف وسیعی از دما ایجاد می کند. با استفاده از پیشرفت های اخیر در فن آوری سنجش دما ، SMT172 برای دستیابی به یک عدم دقت مطلق کمتر از 0.1 C درجه سانتیگراد در دامنه 20- درجه تا 60 درجه سانتی گراد از برخی از تکنیک های طراحی پیچیده IC و همچنین روش های کالیبراسیون با دقت بالا استفاده کرده است.

SMT172 با ولتاژ از 2.7 ولت به 5.5 ولت کار می کند و جریان فعال ان 60μA می باشد . SMT172 دارای تبدیل سریع با سرعت بیش از 4000 خروجی در ثانیه ( در دمای اتاق ) بوده و کم نویز بودن آن، این سنسور را به حسگر حرارت بسیار کارآمد در جهان تبدیل کرده است .این سنسورها در پکیج‌های متعددی طراحی شده‌اند: TO18 ، TO92 ، TO220 ، SOIC-8L ، SOT223 ، HEC .

شکل 1. سنسور SMT172

سنسور SMT172 دارای دقت کلی 0.1 درجه سانتیگراد در دامنه 20- تا 60+ درجه سانتیگراد و دقت 0.4 درجه سانتی گراد از 45- تا 130+ درجه سانتیگراد می باشد. این ویژگی باعث می شود که از این سنسور در صنایع مختلف اعم از پزشکی گرفته تا غیره استفاده کنند.

نحوه اتصال سنسور MQ به برد SENSOR SHIELD مجموعه آموزشی AVR WIZARD

در برد شیلد سنسور موسوم به SENSOR SHIELD سنسور SMT172 بر روی برد موجود بوده و کاربر می تواند به راحتی شروع به کدنویسی کند.

شکل 2. محل سنسور SMT172 روی برد Sensor Shield

نحوه برنامه نویسی و خواندن مقادیر سنسور MQ

مزیت این سنسور نسبت به سنسورهای آنالوگ دما نظیر LM35 این است که خروجی سنسور  SMT172 دیجیتال و به صورت مدولاسیون عرض پالس (PWM) است و نیازی به مبدل آنالوگ به دیجیتال ندارد و همچنین خروجی CMOS آن باعث شده تا بتوان سنسور را با کابلی به طول ۲۰ متر به میکرو وصل کرد.
خروجی این سنسور از نوع پالس است و توسط اندازه گیری نسبت ۱ بودن پالس به عرض کل پالس می توان دما را به دست آورد (اندازه گیری عرض پالس توسط تایمرها انجام می شود).

نحوه اندازه گیری دیوتی سایکل یا D.C در میکروکنترلر:

برای اندازه گیری پایه خروجی سنسور دما را به پایه وقفه خارجی میکروکنترلر وصل می کنیم و در لبه بالا رونده تایمر را روشن در لبه پایین رونده مقدار تایمر را خوانده و به عنوان زمان یا نیم سیکل مثبت  ثبت می کنیم و بعد تایمر را دوباره در همین لبه ( پایین رونده ) روشن و تا لبه بالا رونده زمان را اندازه گیری می کنیم که این  نیم سیکل منفی در برنامه نویسی می شود:

 

(dutycycle=h_time/(h_time+l_time

سپس با استفاده از فرمول زیر ( موجود در دیتاشیت ) دما را بدست می آوریم:

				
					
#include <mega16a.h>
#include <delay.h>
// Alphanumeric LCD functions
#include <alcd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// Declare your global variables here
char apply_rising=1;
unsigned long int t0_ovf=0;
unsigned long int high_time=0;
unsigned long int low_time=0;
unsigned char temp[30];
// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
// Place your code here
TCCR0=0;
if(apply_rising==1)
{
low_time=t0_ovf*256+TCNT0;
// INT1 Mode: Falling Edge
MCUCR=(1<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
apply_rising=0;
}
else
{
high_time=t0_ovf*256+TCNT0;
// INT1 Mode: Rising Edge
MCUCR=(1<<ISC11) | (1<<ISC10) | (0<<ISC01) | (0<<ISC00);
apply_rising=1;
}
TCNT0=0x00;
t0_ovf=0;
TCCR0=(0<<WGM00) | (0<<COM01) | (0<<COM00) | (0<<WGM01) | (0<<CS02) | (1<<CS01) | (1<<CS00);
}
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Place your code here
t0_ovf++;
}
void main(void)
{
float temprature,dutycycle;
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);
// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
// Port C initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRC=(0<<DDC7) | (0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTC=(0<<PORTC7) | (0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);
// Port D initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);
// External Interrupt(s) initialization
// INT0: Off
// INT1: On
// INT1 Mode: Rising Edge
// INT2: Off
GICR|=(1<<INT1) | (0<<INT0) | (0<<INT2);
MCUCR=(1<<ISC11) | (1<<ISC10) | (0<<ISC01) | (0<<ISC00);
MCUCSR=(0<<ISC2);
GIFR=(1<<INTF1) | (0<<INTF0) | (0<<INTF2);
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 250.000 kHz
// Mode: Normal top=0xFF
// OC0 output: Disconnected
// Timer Period: 1.024 ms
TCCR0=(0<<WGM00) | (0<<COM01) | (0<<COM00) | (0<<WGM01) | (0<<CS02) | (1<<CS01) | (1<<CS00);
TCNT0=0x00;
OCR0=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (0<<TOIE0);
// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTB Bit 0
// RD - PORTB Bit 1
// EN - PORTB Bit 2
// D4 - PORTA Bit 4
// D5 - PORTA Bit 5
// D6 - PORTA Bit 6
// D7 - PORTA Bit 7
// Characters/line: 16
lcd_init(16);
// Global enable interrupts
#asm("sei")
lcd_clear();
lcd_putsf(" HI Welcom");
delay_ms(2000);
while (1)
{
lcd_clear();
lcd_putsf("www.redronic.com");
#asm("cli");
dutycycle=(float)high_time/(float)(high_time+low_time); //calculate D.C
#asm("sei");
temprature=dutycycle*212.77-68.085;
ftoa(temprature,0,temp);
lcd_gotoxy( 0 ,1);
lcd_putsf("SMT172:");
lcd_gotoxy(9 ,1);
lcd_puts(temp);
lcd_gotoxy(12,1);
lcd_putsf("C");
delay_ms(5000);
//lcd_clear();
// Place your code here
}
}
}

				
			

خروجی برنامه

نظرتان را درباره این مقاله بگویید 1 نظر

پروژه راه اندازی سنسور دما SMT172 با استفاده از مجموعه آموزشی AVR WIZARD توسط برد پلاریس به زبان C

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *