راه اندازی سنسور دمای MAX30205 با میکروکنترلر AVR و کدویژن

آموزش قدم به قدم راه اندازی سنسور دمای MAX30205 با میکروکنترلر AVR و کدویژن
نوشته شده توسط

با عرض سلام خدمت همراهان سایت مایکروالکام. در مطالب قبلی نحوه راه اندازی و استفاده از سنسور دما DS18b20 بصورت تکی و چند تایی با میکروکنترلر AVR مورد بررسی قرار گرفت. در این مطلب نحوه راه اندازی سنسور دمای MAX30205 با میکروکنترلر AVR و کامپایلر کدویژن مورد بررسی قرار خواهد گرفت. پس با من تا انتهای مطلب همراه باشید. همچنین میتونید سایر مطالب من رو از این قسمت مطالعه کنید.


معرفی سنسور دما MAX30205 

MAX30205 یک سنسورِ سریع و دقیق، مناسب برای اندازه‌گیری دمای بدن انسان می‌باشد. این سنسور، دمای اندازه‌گیری شده را با استفاده از یک مبدل آنالوگ به دیجیتالِ (ADC) سیگما-دلتا، که تفکیک پذیریِ بسیار بالایی دارد به فرمِ دیجیتال تبدیل می‌کند. همچنین ارتباط با این سنسور، از طریق پروتکل I2C صورت می‌گیرد. MAX30205 سه خطِ انتخابِ آدرس دارد که با ترکیبی از دو خط SDA و SCL  طبق جدول (Table 1) دیتا شیت مجموعا 32 آدرس را شامل می‌شود. ولتاژ کاری سنسور، بین 2.7V تا 3.3V بوده و جریان کل مصرفی آن حدود 600uA است.

به دلیل کوچک، دقیق و سریع بودنِ این سنسور و همچنین استفاده از پروتکل I2C و تعداد کم سیم‌های مورد نیاز جهت برقراری ارتباط با آن، استفاده از MAX30205 برای پروژه‌های مربوط به تجهیزات پزشکی بسیار ایده آل می‌باشد. این قطعه در پکیج TDFN 8-pin موجود بوده و دمای کاریِ آن بین 0 درجه سانتیگراد تا +50 درجه سانتیگراد می‌باشد. در شکل زیر، نحوه سیم بندی این قطعه نمایش داده شده است.

سنسور دما MAX30205 
سنسور دما MAX30205

مزایا و ویژگی‌های سنسور دمای MAX30205

1- دقت و سرعت بالای این سنسور و همچنین ولتاژ کاری پایین آن،  به طراحان این اجازه را می‌دهد تا بتوانند در استفاده از منابع مورد نیاز جهت طراحی مدار خود، صرفه جویی کنند.

0.1°C Accuracy (37°C to 39°C)
16Bit (0.00390625°C) Temperature Resolution
2.7V to 3.3V Supply Voltage Range

2- وجود حالت‌های One-shot و Shutdown که به کاهش مصرف توان کمک می‌کند.

3- جریان کل مصرفی 600uA.

4- داشتن توابع دیجیتالی که امکان  استفاده از این سنسور در هر سامانه‌ای را به راحتی ممکن می‌سازد.


هدف آزمایش

در این مطلب قصد داریم با استفاده از میکروکنترلر AVR و استفاده از کامپایلر CodeVision 3.12، سنسور دمای MAX30205 را بدون استفاده از کتابخانه آماده و صرفا از طریق توابع I2C موجود در خود کامپایلر کدویژن و با مطالعه دیتاشیت این قطعه، راه اندازی و مقادیر دما را بر روی یک LCD کاراکتری 2 در 16 نمایش دهیم.


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


اتصال ماژول به میکروکنترلر

مانند تصویر زیر، پایه های تغذیه ماژول MAX30205 (CJMCU) را متصل کرده و همچنین پایه‌های SDA و SCL آن که مربوط به پروتکل I2C می‌باشد، به پایه‌های I2C میکروی AVR مورد نظر خود که در این جا برای ما ATMEGA32 می‌باشد وصل می‌کنیم. (دقت شود که حداکثر ولتاژ کاری سنسور 3.3 ولت می‌باشد.)

همچنین پایه‌های A0 ،A1 و A2 مربوط به آدرس سنسور MAX30205 بوده که در این مدار به GND متصل شده. پایه OS نیز برنامه پذیر بوده و می‌توانید این پایه را طوری برنامه ریزی کنید که بر روی دو دمای مورد نظر شما فعال و غیر فعال شود . این پایه می‌تواند به یک مدار هشدار دهنده یا گرمایشی و یا سرمایشی متصل شده و روی دماهای تعین شده روشن و خاموش شود. در شکل های زیر نمونه هایی از این نوع مدار‌ها آورده شده است.

مدار های راه اندازی ماژول MAX30205
مدار های راه اندازی ماژول MAX30205
اتصالات سنسور MAX30205 به میکروکنترلر
اتصالات سنسور MAX30205 به میکروکنترلر
مشخصات پایه های سنسور MAX30205
مشخصات پایه های سنسور MAX30205

برنامه نویسی در محیط کدویژن

کدویژن را باز کرده و CodeWizard را اجرا کنید. در قسمت Chip Settings میکروی مورد نظر خود را که در این جا برای ما ATMEGA32 است را انتخاب و سپس فرکانس کاری میکرو را تنظیم کنید. در این مطلب ما فرکانس میکرو را بر روی 8 مگاهرتز قرار داده ایم.

تنظیمات انتخاب چیپ و فرکانس میکرو
تنظیمات انتخاب چیپ و فرکانس میکرو

در ادامه، به بخش Alphanumeric LCD رفته و آن را فعال کرده و تنظیمات مربوط به پورت و نحوه اتصال آن به پایه‌های را انجام دهید.

تنظیمات مربوط به کانفیگ LCD
تنظیمات مربوط به کانفیگ LCD

حال در کد ویزارد، بخش Bit-Banged I2C Bus Interface را انتخاب و تنظیمات I2C را مطابق شکل انجام دهید. (بهتر است نرخ ارسال و دریافت دیتا بر روی 100khz قرار داده شده باشد. همچنین می‌توانید پورت و پایه‌های میکرو را جهت اتصال پایه‌های SDA و SCL سنسور به میکرو، تغییر دهید.)

تنظیمات مربوط به بخش I2C
تنظیمات مربوط به بخش I2C

تا این جای کار تنظیمات مربوط به ویزارد تمام شده است. به منوی Program رفته و با انتخاب گزینه Generate, Save and Exit پروژه را تولید و ذخیره کنید.

تولید و ذخیره پروژه در کدویژن
تولید و ذخیره پروژه در کدویژن

شروع برنامه نویسی در محیط کدویژن

قدم اول پیدا کردن آدرس سنسور MAX30205 با استفاده از دیتاشیت آن است. با توجه به جدول ارائه شده در دیتاشیت سنسور (Table 1)، و از آن جایی که ما هر سه پایه آدرس سنسور (A0، A1 و A2) را به زمین متصل کردیم، بنابراین آدرس قطعه برای نوشتن 0x90 خواهد بود که به آن آدرس Write می گوییم. توجه داشته باشید که بیت صفرم Device Address در قطعاتی که با پروتکل I2C به میکرو متصل می‌شوند مشخص کننده نوشتن یا خواندن از دیوایس مورد نظر می‌باشد. اگر این بیت صفر باشد یعنی می‌خواهیم در قطعه اطلاعاتی را بنویسیم و اگر یک باشد یعنی می‌خواهیم از قطعه بخوانیم. بنابراین برای Read کردن از سنسور، آدرس مربوطه 0x91 خواهد بود.

آدرس های سنسور دما MAX30205
آدرس های سنسور دما MAX30205

حال در ابتدای برنامه خود آدرس‌های Read و Write را define می‌کنیم. ADDR آدرس خواندن و ADDW آدرس نوشتن خواهد بود.

#define ADDR        0x91  // Address to Read from MAX30205
#define ADDW       0x90  // Address to Write from MAX30205

 

معرفی آدرس های خواندن و نوشتن
معرفی آدرس های خواندن و نوشتن

اعمال تنظیمات اولیه و Initialize کردن سنسور MAX30205

تنظیمات مربوط به راه اندازی MAX30205
تنظیمات مربوط به راه اندازی MAX30205
جدول مربوط به تنظیمات سنسور دما MAX30205
جدول مربوط به تنظیمات سنسور دما MAX30205

با توجه به (Table 2)، ابتدا باید بر اساس فریمِ دیتای مربوط به اعمال تنظیمات، دیوایس را به حالت Config برده و مقدار مناسب را در رجیستر پیکر بندی قطعه قرار دهیم. برای این منظور باید در آدرس 0x01 که Configuration می‌باشد، مقدار مناسب ، که در جدول 0x00 می‌باشد را قرار دهیم. یک تابع در برنامه به نام MAX30205_begin ایجاد کرده و موارد گفته شده را مطابق با فریمِ موجود در دیتاشیت، پیاده می‌کنیم.

void MAX30205_begin(void)
{
  i2c_start(); 
  i2c_write(ADDW);
  i2c_write(0x01); 
  i2c_write(0x00);
  i2c_stop();
  delay_ms(50); 
}

 

معرفی تابع MAX30205_begin
معرفی تابع MAX30205_begin

نوشتن تابع برای خواندن دما از سنسور MAX30205

تنظیمات مربوط به راه اندازی MAX30205
تنظیمات مربوط به راه اندازی MAX30205

حال می‌خواهیم تابعی جهت خواندن دما از سنسور ایجاد کنیم. با توجه به دیتاشیت و مشاهده فریم مربوط به دریافت دما که در تصویر بالا نیز آورده شده است، مراحل به شرح زیر می‌باشد. شایان ذکر است این تابع دارای خروجی از نوع float بوده تا بتواند مقادیر اعشاری دما را نیز برگرداند.

  1. Start کردن I2C.
  2. نوشتن آدرس Write
  3. نوشتن آدرس Temperature Mode که 0x00 می‌باشد.
  4. Stop کردن I2C.
  5. Start مجدد I2C.
  6. نوشتن آدرس خواندن دیتا.
  7. خواندن بخش Most Significant byte دیتا که مربوط به قسمت صحیح دما می‌باشد با acknowledge یک.
  8. خواندن بخش Least Significant byte دیتا که مربوط به قسمت اعشار دما می‌باشد با acknowledge یک.
  9. Stop کردن I2C.
float MAX30205_getTemperature(void)
{
 unsigned char readRaw[2] = {0};
 int raw;         
 float temperature;
 readRaw[0]=readRaw[1]=23;
 i2c_start(); 
 i2c_write(ADDW);
 delay_ms(5);
 i2c_write(0x00);
 i2c_stop();
 i2c_start();
 i2c_write(ADDR);
 readRaw[0]=i2c_read(1);
 readRaw[1]=i2c_read(1);  
 i2c_stop();             
 raw = (readRaw[0] << 8) | readRaw[1];  
 temperature = raw  * 0.00390625;        
 return temperature; 
}

 

تابع مربوط به خواندن دما از سنسور MAX30205
تابع مربوط به خواندن دما از سنسور MAX30205

تشریح تابع نوشته شده برای خواندن دما

در خط اول یک آرایه با دو خانه به نام readRaw برای خواندن دیتای خام از نوع unsigned char تعریف شده است تا بخش های صحیح و اعشاری دما در این آرایه قرار گیرند. در خط دوم متغیر raw از نوع int تعریف شده است که بعد از کنار هم قرار دادن هر دو دیتای خوانده شده در آرایه readRaw، مقدار دیتای خام در آن ذخیره می‌گردد. دیتای مربوط به بخش صحیح ابتدا 8 بار به سمت چپ شیف داده شده و با دیتای مربوط به بخش اعشار OR منطقی می‌شود و در متغیر raw دخیره می‌گردد.

در نهایت متغیر raw را برای بدست آمدن مقدار صحیح دما در عدد 0.00390625 ضرب کرده و در متغیر temperature که از نوع float تعریف شده است قرار می‌دهیم. با توجه به این که می‌خواهیم از توابع sprintf برای چاپ مقادیر float بر روی lcd استفاده کنیم لازم است که از منوی Project و سپس باز کردن بخش Configuration در کدویژن و رفتن به سربرگ C Compiler گزینه sprintf features را بر روی float, width, precision قرار دهیم.

تنظیمات مربوط به تابع sprintf برای نمایش مقادیر float
تنظیمات مربوط به تابع sprintf برای نمایش مقادیر float

اضافه کردن کتابخانه‌ها و متغیر‌های لازم جهت خواندن دما

در ابتدای برنامه کتابخانه‌های  delay و stdio و همچنین متغیر‌های temp و s را به برنامه اضافه می‌کنیم. از متغیر s برای تبدیل مقادیر float به کاراکتر جهت چاپ بر روی LCD استفاده خواهد شد.

#include <delay.h>
#include <stdio.h>
float temp;
char s[20];

 

معرفی کتابخانه و متغییر های مورد نیاز
معرفی کتابخانه و متغییر های مورد نیاز

تکمیل حلقه While و نحوه استفاده از توابع نوشته شده

قبل از حلقه while تابع MAX30205_begin را فراخوانی کرده و مانند تصویر زیر کد‌های مربوطه جهت خواندن دما و چاپ مقادیر بر روی LCD را نوشته و تکمیل می‌کنیم.

MAX30205_begin();
while (1)
      {
      // Place your code here  
      temp = MAX30205_getTemperature();
      sprintf(s,"Temp:%4.2f",temp);
      lcd_gotoxy(0,0);
      lcd_puts(s);
      delay_ms(1000);

      }
}

 

تکمیل حلقه while
تکمیل حلقه while

پروگرام کردن برنامه بر روی میکرو

برنامه را Build کرده و از بخش Chip Programmer در کدویژن، میکرو را پروگرام کنید. دقت شود که فیوزبیت‌های میکرو، متناسب با Clock ای که در برنامه تعیین شده است تنظیم گردد که در این جا ما برنامه را بر روی فرکانس 8Mhz تنظیم کرده بودیم بنابراین فیوزبیت‌های میکرو را بر روی 8 مگاهرتز داخلی قرار داده‌ایم.

تنظیمات مربوط به پروگرام کردن برنامه روی میکروکنترلر
تنظیمات مربوط به پروگرام کردن برنامه روی میکروکنترلر

در تصویر زیر، برنامه بر روی میکرو پروگرام و اجرا شده است:

مدار کامل و مشاهده عملی نتایج
مدار کامل و مشاهده عملی نتایج

برای دریافت سورس کد مربوطه و پروگرام کردن میکروکنترلر از این لینک اقدام کنید.


مشاهده نتیجه


نتیجه گیری

در این مطلب مشخصات و راه اندازی سنسور دمای MAX30205 با میکروکنترلر توضیح داده شد. MAX30205 یک سنسور سریع و دقیق، مناسب برای اندازه‌گیری دمای بدن انسان، به همراه خروجیِ OS و با قابلیت برنامه ریزی می‌باشد. این سنسور، دمای اندازه‌گیری شده را با استفاده از یک مبدل آنالوگ به دیجیتال (ADC) سیگما-دلتا که تفکیک پذیری بسیار بالایی دارد به فرم دیجیتال تبدیل می‌کند. ارتباط با این سنسور، از طریق پروتکل I2C و با دو سیم صورت می‌گیرد. 

امیدوارم از این آموزش کمال بهره را برده باشید. در صورتی که هرگونه نظر یا سوال داشتید درباره این آموزش لطفا اون رو در انتهای همین صفحه در قسمت دیدگاه ها قرار بدید. در کوتاه ترین زمان ممکن به اون ها پاسخ خواهم داد. اگر این مطلب براتون مفید بود، اون رو حتما به اشتراک بگذارید. همینطور میتونید این آموزش را پس از اجرای عملی توی اینستاگرام با هشتگ microelecom# به اشتراک بگذارید و پیج مایکروالکام (microelecom@) رو هم منشن کنید.

۶ دیدگاه برای “راه اندازی سنسور دمای MAX30205 با میکروکنترلر AVR و کدویژن

  1. سلام
    مرسی از سایت خوبتون
    من انگشتم روی سنسور که میزارم دمای بدن حدود ۳۳و۳۲ نشون میده مشکل از کجاس؟

  2. سلام
    با تشکر از ارایه مطلب بصورت شیوا و روان سوالی داشتم.

    float MAX30205_getTemperature(void)
    {
    unsigned char readRaw[2] = {0};
    int raw;
    float temperature;
    readRaw[0]=readRaw[1]=23; <<—
    i2c_start();
    i2c_write(ADDW);
    در خط چهارم چرا readRaw[0]=readRaw[1]=23; برابر ۲۳ قرار داده شده؟

    1. ممنون از حسن نظر شما. صرفا با یک مقدار دلخواه متغیر را مقدار دهی کردیم که مقدار قبلی دما در هنگام خواندن مجدد تابع از بین برود. شما می توانید این خط را حذف کنید و یا ۲۳ را با صفر جایگزین کنید

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

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