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

0

هدف از این آموزش راه اندازی واحد I2C با  سنسور پزشکی دما MLX90614 ، به زبان برنامه نویسی C  توسط مجموعه آموزشی AVR WIZZARD میباشد .

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

  1. برد اصلی AVR WIZZARD
  2. LCD2X16
  3. ماژول سنسور پزشکی دما MLX90614

تغذیه 9 ولت

سنسور MLX90614

 در داخل ، MLX90614 دو قسمت وجود دارد: یک سنسور حرارتی مادون قرمز و یک پردازنده پردازش سیگنال.

طبق قانون استفان-بولتزمن ، هر ماده ای که زیر صفر مطلق نباشد (0 درجه سانتیگراد) باشد ، نور را در طیف مادون قرمز (مستقیماً با دما قابل مشاهده نیست) ساطع می کند. ترموپیل مادون قرمز ویژه در داخل MLX90614 مقدار انرژی مادون قرمز از مواد اطراف که منتشر می شود را حس کرده و یک سیگنال الکتریکی متناسب با آن تولید می کند . این سیگنال الکتریکی تولید شده توسط ترموپیل توسط ADC 17 بیتی پردازنده نمونه برداری و پردازش شده ، به

میکروکنترلر منتقل می شود.

بلوک داخلی سنسور MLX90614

پین های خروجی سنسور MLX90614

سنسور MLX90614 در یک پکیج TO-39 با چهار پین قرار دارد: دو پین برای پاور و تغذیه ، و دو پین نیز برای رابط SMBus. “” . شکاف روی بدنه نشان می دهد که کدام پین زمین است.

پین-های-خروجی-سنسور-MLX90614.jpg
پین های خروجی سنسور MLX90614.jpg

قابلیت های  سنسور MLX90614

سنسور  MLX90614 دو نوع دما را اندازه گیری می کند: یک دمای اجسام و دیگر دمای محیط. اندازه گیری  دمای جسم غیر تماسی است ، در حالی که حرارت محیط در سنسور اندازه گیری می شود. حرارت محیط در کالیبراسیون داده ها می تواند مفید باشد .

اندازه گیری دمای جسم می تواند از -70 تا 382.2 درجه سانتیگراد (-94 تا 719.96 درجه فارنهایت) باشد ، در حالی که خواندن دمای محیط از -40 تا 125 درجه سانتی گراد است.هم اندازه گیری دمای محیط و هم  اندازه گیری دمای اجسام دارای وضوح 0.02 درجه سانتی گراد است.

میدان دید سنسور MLX90614

میدان دید دماسنج IR  یک ویژگی مهم از سنسور بوده که آگاهی از آن بسیار مهم است که در واقع رابطه بین فاصله از یک شی و مساحت فضایی که مشاهده می شود ان را تعیین می کند. میدان دید MLX90614 به شکل مخروط است که اگر در منطقه نزدیکی جسم باشد ، میدان دید آن بسیار کم است ، که با دورتر شدن از ان افزایش پیدا می کند.

خروجی سنسور MLX90614

سنسور MLX90614 از دو رابط پشتیبانی می کند – اگرچه برای دسترسی به به یکی از آنها نیاز دارید. رابط SMBus دو سیمه پروتکل اصلی برای برقراری ارتباط با سنسور IR است. هنگامی که رابط SMBus را تنظیم کردید ، می توانید بعداً MLX90614 را تنظیم کنید تا یک سیگنال مدوله شده با عرض پالس متناسب با دما (های) اندازه گیری شده تولید کند PWM .

این سنسور از طریق رابط 2 سیم SMBus پیکربندی شده و خوانده می شود. – بسیار مشابه و تقریباً برابر با I2C  دو سیگنال – SDA و SCL به ترتیب داده ها و سیگنال های کلاک را در اختیار دارند. یک دستگاه اصلی کلاک را کنترل می کند  در حالی که سیگنال داده به صورت دو جهته کنترل می شود.

پروتکل-ارتباطی-I2C-در-سنسور-MLX90614.jpg
پروتکل-ارتباطی-I2C-در-سنسور-MLX90614.jpg

هر MLX90614 دارای یک آدرس I2C پیش فرض 0x5A است ، اما می توان آن آدرس را دوباره نوشت که یکی از مهمترین ویژگی های پشتیبانی شده توسط دستگاه است. با پیکربندی مجدد آدرس یک MLX90614 ، می توانید چندین دستگاه (حداکثر تا 127!) را به همان باس اضافه کنید تا یک طیف دمای بزرگتر دریافت کنید.

 

نکته آخر در مورد رابط SMBus – هر انتقال خواندن یا نوشتن باید با یک بررسی 8 بیتی CRC-8-CCITT با استفاده از چند جمله ای x8 + x2 + x1 + x1 – مفید باشد.

اطلاعات MLX90614 را می توان از طریق رابط PWM نیز بخوانید. در این مورد استفاده فقط یک سیم برای خواندن از سنسور لازم است. برای استفاده از رابط PWM ، باید MLX90614 برای تولید آن از طریق SMBus تنظیم شود.

 

خروجی PWM با استفاده از میکروکنترلر می تواند دشوار باشد ، اما اگر می خواهید از MLX90614 برای کنترل مستقیم یک رله یا سایر دستگاههای خارجی استفاده کنید ، بسیار کارامد است.

خروجی-PWM-سنسور-MLX90614.jpg
خروجی-PWM-سنسور-MLX90614.jpg

برنامه نویسی

 هدر فایل MLX90614

#ifndef MLX90614_h
#define MLX90614_h
#include "Twi.h"
//#define MLX90614_I2CADDR 0x5A
#define MLX90614_ADDRESS     0x5A
#define MLX90614_ADDRESS_WRITE    0|(MLX90614_ADDRESS<< 1)
#define MLX90614_ADDRESS_READ     1|(MLX90614_ADDRESS<< 1)  
// RAM
#define MLX90614_RAWIR1 0x04
#define MLX90614_RAWIR2 0x05
#define MLX90614_TA 0x06
#define MLX90614_TOBJ1 0x07
#define MLX90614_TOBJ2 0x08
// EEPROM
#define MLX90614_TOMAX 0x20
#define MLX90614_TOMIN 0x21
#define MLX90614_PWMCTRL 0x22
#define MLX90614_TARANGE 0x23
#define MLX90614_EMISS 0x24
#define MLX90614_CONFIG 0x25
#define MLX90614_ADDR 0x0E
#define MLX90614_ID1 0x3C
#define MLX90614_ID2 0x3D
#define MLX90614_ID3 0x3E
#define MLX90614_ID4 0x3F


long int readObjectTempC(void);
//long int readAmbientTempC(void);
double readObjectTempF(void);
double readAmbientTempF(void);
float readTemp(uint8_t reg);
//uint16_t read16(uint8_t addr);


uint16_t MLX90614_ReadRam(uint8_t RegisterName)
{   
  uint16_t data; 
  char pec;
  Twi_Start();   
  Twi_Send(MLX90614_ADDRESS_WRITE);   
//  Twi_Send(RegisterName|TCS34725_COMMAND_BIT);    
  Twi_Send(RegisterName);    
  Twi_Start();
  Twi_Send(MLX90614_ADDRESS_READ);  
  data=Twi_Read(ACK);     
  data |= Twi_Read(ACK) << 8; 
  pec = Twi_Read(NACK); 
  return data; 
}

long int readObjectTempC(void)
{
  long int temp;
  temp = MLX90614_ReadRam(MLX90614_TA);
  temp *= .02;
  temp  -= 273.15;
  return temp;
}



#endif

هدر فایل TWI

#ifndef TwoWire_h
#define TwoWire_h
#include <mega16a.h>
#define uint8_t     unsigned char
#define ACK     0
#define NACK     1
void Twi_Start(void);
void Twi_Send(uint8_t data)  ;
uint8_t Twi_ReadStatus(void)   ;
void Twi_Stop()  ;
void Twi_Init(void)  ;
uint8_t Twi_Read(uint8_t ack_n)  ;
void Twi_AsSlave(uint8_t slave_a)    ;
void Twi_listen(void)  ;

 void Twi_Start(void)
{
    TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
    while ((TWCR & (1<<TWINT))==0);    
    
}

void Twi_Send(uint8_t data)
{
    TWDR=data;
    TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA);
    while ((TWCR & (1<<TWINT))==0); 
}

uint8_t Twi_ReadStatus(void)
{
    uint8_t i=0;
    i=TWSR & 0XF8;
    return i;
}

void Twi_Stop()
{
    TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
}

void Twi_Init(void)
{
    TWSR=0;
    TWBR=0x48;
    TWCR=0x44;
}
uint8_t Twi_Read(uint8_t ack_n)
{
    if(ack_n==0)
    TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA);
    else
    TWCR=(1<<TWINT)|(1<<TWEN);
    while ((TWCR & (1<<TWINT))==0);
    return TWDR;
}

void Twi_AsSlave(uint8_t slave_a)
{
    TWAR=slave_a;
    TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA);
}

void Twi_listen(void)
{
  while ((TWCR & (1<<TWINT))==0);
}  

#endif

در ادامه برنامه به زبان C در تابع MAIN را مشاهده می کنید:

/*******************************************************
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    : 02/10/2020
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 <alcd.h>
#include <delay.h>
#include <stdlib.h>
#include "MLX90614.h"
#include "Twi.h"

void main(void)
{
 char databuffer[10];  
 //double data;
long int data;
//double data  = 0.0;
//char str[20];
// 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);

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM);
UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
UCSRC=(1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL);
UBRRH=0x00;
UBRRL=0x67;

lcd_init(16);
lcd_putsf( "   HI Wellcom   " ) ;
lcd_gotoxy( 0 , 1 );
lcd_putsf( "TO REDRONIC.COM" ) ;
delay_ms(2000);
lcd_clear();
Twi_Init() ;
// Global enable interrupts
#asm("sei")

while (1)
      {                                  
        lcd_clear();
        data = readObjectTempC();           
        itoa (data,databuffer);  
        lcd_gotoxy(0,0);
        lcd_putsf("Temp:");
        lcd_gotoxy(7,0); 
        lcd_puts(databuffer); 
        delay_ms(2000);        
      }
      
}

خروجی برنامه

پروژه-راه-اندازی-سنسور-MLX90614-با-AVR-1.jpg
پروژه-راه-اندازی-سنسور-MLX90614-با-AVR-1.jpg
Choose your Reaction!
دیدگاه خود را بنویسید

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

رفتن به نوار ابزار