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

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

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

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

 

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

ترموپیل مادون قرمز ویژه در داخل MLX90614 مقدار انرژی مادون قرمز از مواد اطراف که منتشر می‌شود را حس کرده و یک سیگنال الکتریکی متناسب با آن تولید می کند . این سیگنال الکتریکی تولید شده توسط ترموپیل توسط 17ADC‌بیتی پردازنده نمونه برداری و پردازش شده ، به میکروکنترلر منتقل می‌شود.

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

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

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

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

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

قابلیت‌های سنسور 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

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

 

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

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

 

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

 
خروجی PWM سنسور MLX90614

برنامه نویسی

هدر فایل 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 را مشاهده می کنید:

				
					
#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);        
      }
      
}

				
			

خروجی برنامه

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

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

نوشته های مشابه

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

  1. سعید گفت:

    با سلام و خسته نباشید …
    پیشنهاد میشود پروژه های ارائه شده در سایت به صورت کیت در فروشگاه عرضه گردد

  2. erfan گفت:

    MLX90614.h(36), #included from: HI.c: ‘(‘ expected
    سلام خسته نباشید
    این ارور روتوی خط پایین دریافت میکنم! نمیدونم چرا!
    uint16_t MLX90614_ReadRam(uint8_t RegisterName)

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

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

18 − شش =