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

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

0

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

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

لوازم مورد نیاز

  1. برد اصلی AVR WIZARD
  2. برد جانبی SENSOR SHIELD
  3. LCD2X16
  4. سنسور MQ9
  5. تغذیه 9 ولت

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

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

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

انواع سنسورهای SMT172

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

سنسور SMT172
سنسور SMT172

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

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

SMT172 محل سنسور
SMT172 محل سنسور

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

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

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

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

(dutycycle=h_time/(h_time+l_time

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

فرمول دما SMT172

[cpp]
/*******************************************************
This program was created by the
CodeWizardAVR V3.12 Advanced
Automatic Program Generator
© Copyright 1998-2014 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 05/05/2019
Author :
Company :
Comments:

Chip type : ATmega16A
Program type : Application
AVR Core Clock frequency: 16.000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*******************************************************/

#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

}
}

}
[/cpp] خروجی برنامه:

راه انداری سنسور SMT172 با AV

Choose your Reaction!
دیدگاه خود را بنویسید

آدرس ایمیل شما منتشر نخواهد شد.

redronic.com