راه اندازی LM35

هدف پروژه: آشنایی با وقفه و راه اندازی سنسور  lm35. شما در مقالات قبلی با راه اندازی واحد adc آشنا شدید. از آن جایی که  سنسور دمای مورد بحث در این مقاله خروجی آنالوگ دارد، مقدار آن را باید از طریق واحد adc خواند. شرح کلی کار از این قرار است که دما را خوانده و در یک ال سی دی کاراکتری نمایش می دهیم.

سخت افزار مورد استفاده: در این مثال از برد آموزشی avr شرکت نامینیک مبتنی بر پردازنده ATMEGA32 استفاده شده است. در این برد، سنسور lm35 به پایه 6 پورت a یعنی کانال 6 واحد adc متصل است. ال سی دی هم روی هدر شماره p14 نصب می شود. که مراحل راه اندازی آن در مقاله های قبلی برسی شده است.

کتابخانه های استفاده شده: 5 کتابخانه در این پروژه استفاده شده است. در خط 9 تا 13 به ترتیب کتابخانه ها تعریف میکرو، تاخیر، ال سی دی، توابع ورودی/خروج و توابع کاراکتری فراخوانی شده است. در مورد این 5 کتابخانه قبلا به اجمال صحبت شده است. (پروژه های قبلی سایت را ببینید).

تشریح کد: پردازنده یا cpu برای ارتباط با واحد های جانبی خود میکرو و یا وسایل خارج از میکرو دو راه کلی دارد. یکی اینکه هر از چند گاهی به آن وسیله یا واحد جانبی سرکشی کند. مسلما این کار پردازنده را درگیر می کند. روش دیگر این است که وسیله خارجی یا واحد جانبی وقایع مهم اتفاق افتاده در کارش را خودش به اطلاع پردازنده برساند و پرازنده فقط همان موقع که واحدی، اطلاع از تمام شدن کارش یا واقعه مهمی داد متوجه واحد جانبی شده و موضوع را برسی کند و باقی اوقات پردازنده می تواند به کارهای دیگری برسد. این اطلاع واحد جانبی باعث متوقف شدن روند فعلی برنامه شده (برای همین دلیل به آن وقفه می گویند) و برنامه به زیربرنامه واحدی که وقفه را ارسال کرده پرش می کند. بعد از انجام کار وقفه، اجرای کد از همان خط قبلی که برنامه از آن پرش کرده بود، ادامه می یابد. جزییات کار را پردازنده و واحد مدیریت وقفه میکرو انجام می دهند. در مورد جزییات وقفه و اصلا جزییات هر چیزی که سازنده آن مونتاژ کار نیست، به داکیومنت های خود سازنده مراجعه شود. در تراشه ATMEGA32 تقریبا اکثر واحد های جانبی داخل میکرو یک یا چند وقفه دارند و میکرو برای دستگاه های خارج از تراشه 3 پایه وقفه خارجی دارد که با به کار بردن مدارهایی در خارج، بیشتر از 3 وسیله می توانند به میکرو وقفه دهند. معمولا استفاده از وقفه به جای سرکشی مداوم مزیت های بیشتری دارد ولی یک برتری همه جانبه نیست و ممکن است در موارد اندکی الگوریتم سرکشی مداوم جایگزین بهتری باشد.

اما سنسور lm35، این سنسور در حالتی که در برد نصب شده می تواند دمای 2 تا 150 درجه سانتی گراد را خطی تشخیص دهد. و مقدار ولتاژ خروجی آن به ترتیب از صفر تا 1480 میلی ولت تغییر می کند. ما این ولتاژ را با کانال 6 واحد adc اندازه گرفته و در نمایشگر نشان می دهیم. به دلیل اینکه ولتاژ مرجع واحد adc در برد یعنی همان vref، 3.3 ولت است و تبدیل 8 بیتی انجام می شود، حداکثر مقدار خوانده شده از سنسور در بایت بزرگتر خروجی واحد adc مقدار 114 (در دمای 150 درجه) و حداقل آن صفر است (در 2 درجه سانتی گراد) که در متغییر adc_data ذخیره می شود. این متغییر در خط 15 برنامه تعریف شده است.

اگر مقدار این متغییر را در 114/148 ضرب کنیم مقدار دمای خوانده شده به دست می آید.

در تابع main، برنامه بعد از مقداردهی اولیه واحد adc در خطوط 43 و 44، در نهایت وقفه سراسری را در خط 48 فعال می کند. حال در خط 52 استارت تبدیل زده شده و وقفه اتمام تبدیل فعال می شود. واحد adc شروع به کار می کند و مستقل از پردازنده عملیات تبدیل را انجام می دهد. شما می توانید به جای خط 53 که یک انتظار 1 ثانیه ای است، برنامه خود را جایگزین کنید. برنامه در حلقه while ادامه می یابد تا اینکه عملیات تبدیل تمام شود و واحد adc یک وقفه تولید می کند. برنامه هر کجا که بود متوقف شده و روتین adc_isr که در خطوط 21 الی 37 قرار دارد، فراخوانی می شود. توضیحات در خود برنامه هست. این روتین از نوع interrupt است و مقدار تبدیل شده را در متغییر adc_data ریخته و بعد از تبدیل به عدد دما آن را در ال سی دی نمایش می دهد. بعد از تمام شدن روتین adc_isr برنامه به همان جایی که از آن پرش کرده بود بر می گردد. احتمالا برنامه جایی درون تابع تاخیر بوده که وقفه رخ داده است و برنامه از همان جا ادامه می یافته و تا اجرای تابع تاخیر پایان نیابد، نمونه دیگری گرفته نمی شود. دقت کنید که شروع نمونه گیری از دما فقط در خط 52 کلید می خورد.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/*****************************************************
Chip type               : ATmega32
AVR Core Clock frequency: 8.000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 512
*****************************************************/
#include <mega32.h>
#include <delay.h>
#include <alcd.h>
#include <stdio.h>
#include <stdlib.h>
float adc_data;
#define ADC_VREF_TYPE 0x20
const float ct=148/114;
// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
  unsigned char init_temp[5],lcd_temp[5];
  
  adc_data=ADCH;        //read result of adc conversation.
  ADCSRA |=0x10;        //clear interrupt flag by write 1 to it(bit 4).
  
  adc_data=adc_data*ct;   //these 3 line prepares adc_data to display in lcd.
  ftoa(adc_data,2,init_temp);          
  sprintf(lcd_temp,"%d",init_temp);    
  
  lcd_clear();
  lcd_gotoxy(0,0);
  lcd_putsf("the temp is:");
  lcd_gotoxy(1,0);
  lcd_puts(lcd_temp);
}
void main(void)
{
// ADC initialization
ADMUX=0x06 | (ADC_VREF_TYPE & 0xff);     //select channel 6 (pin 6 of port A).
ADCSRA=0x8E;           //8 bit mode, 125kHz clock and AREF pin as a voltage reference.
lcd_init(8); //initiate lcd.
#asm("sei")   //enable Global interrupts
while (1)
      {
         ADCSRA |=0x48;     //start the adc conversation and enable interrupt.
         delay_ms(1000);   
      }
}

دانلود سورس کد

در  اینجا شما میتوانید سورس برنامه را دریافت ،کامپایل و پروگرم نمایید و شاهد عملکرد برنامه باشید.

Tags: , , ,