فهرست مطالب
قطعات مورد نیاز
- برد AVR Wizard
- ماژول MAG3110
- پروگرامر MKII
- منبع تغذیه 6-12 ولت
مقدمه
سنسور MAG3110 یک مگنتومتر سه محوره دیجیتال است. این سنسور از یک ADC 16 بیتی برخوردار است که به صورت مولتیپلکسری دیتای هر محور را تبدیل میکند و از طریق درگاه I2C منتقل میکند. همچنین این سنسور داری یک سنسور دمای داخلی 8 بیتی میباشد.
ماژول MAG3110 را میتوان در کاربردهای جهتیابی استفاده کرد. کار با آن آسان بوده و کاربر میتواند تنظیمات دلخواه خود را بر آن اعمال کند.
توضیحات برنامه
ابتدا در CodeVision یک پروژه جدید ایجاد کنید.
سپس ورودی و خروجیها، LCD و Chip مربوطه را تعیین کنید.
پس از ذخیره و تولید فایلها، وارد محیط برنامه نویسی میشویم.
در ابتدا متغیرها و توابع مورد نیاز را تعریف میکنیم:
#include
#include
#include
#include
#define mag_address 0x0E
#define CTRL_REG1 0x10
uint8_t mag_data[6],buffer[2],mode[1]={0x01};
uint8_t who_am=0x07,user;
int8_t temperature[1];
char lcd_data[15];
float mag_x,mag_y,mag_z;
سپس ارتباط درگاه I2C برد AVR Wizard با ماژول MAG3110 بررسی میکنیم و در صورت تایید شدن ماژول، پیغام آن بر روی LCD به نمایش در میآید:
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts(" Hi! Welcome ");
lcd_gotoxy(0,1);
lcd_puts("www.redronic.com");
delay_ms(2000);
lcd_clear();
buffer[1]=i2c_readReg(mag_address<<1,who_am, (uint8_t*)buffer, 1);
if(buffer[1]!=0 )
{
lcd_gotoxy(0,0);
lcd_puts(" I2C Error!");
while(1);
}
else if(buffer[0]!=196)
{
lcd_gotoxy(0,0);
lcd_puts(" It isn't ");
lcd_gotoxy(0,1);
lcd_puts(" MAG3110");
while(1);
}
else
{
lcd_gotoxy(0,0);
lcd_puts(" MAG3110 ");
lcd_gotoxy(0,1);
lcd_puts(" Detected!");
}
سپس ماژول را در حالت فعال قرار میدهیم:
i2c_writeReg(mag_address<<1, CTRL_REG1, (uint8_t*) mode, 1);
حال وارد حلقه اصلی برنامه میشویم. بخاطر جا نشدن تمامی اطلاعات در LCD، دو صفحه برای نمایش تعریف میکنیم و برای جابجا شدن بین صفحات از دکمه SW1 استفاده میکنیم:
if(PINC.4==0)
{
user++;
delay_ms(300);
if(user==2)
user=0;
}
حال نوبت خواندن اطلاعات از ماژول است. رجیستر سنسور دمای داخلی سنسور MAG3110، دادهی مربوط به دما را به صورت یک داده هشت بیتی علامت دار نگه میدارد و هر بیت نشانگر “1” درجه سانتیگراد است:
i2c_readReg(mag_address<<1,0x0F, (uint8_t*)temperature,1);
دادههای مربوط به هر محور مگنتومتر در دو رجیستر 8 بیتی ذخیره میشود؛ به عبارت دیگر، دادهی هر محور یک دادهی 16 بیتی است.
برای خواندن این رجیسترها، کافیاست آدرس اولین رجیستر را در تابع وارد کنیم، تابع به اندازه طولی که برای آن مشخص میکنیم، رجیسترها را خوانده و ذخیره خواهد کرد. همچنین هر بیت، نشاندهنده “0.1” میکروتسلا است:
mag_x=(float)((int16_t)(mag_data[0]<<8 | mag_data[1]))*.1;
mag_y=(float)((int16_t)(mag_data[2]<<8 | mag_data[3]))*.1;
mag_z=(float)((int16_t)(mag_data[4]<<8 | mag_data[5]))*.1;
حال با توجه به SW1 دیتای مربوط به آن حالت را بر روی LCD نشان میدهیم:
switch (user)
{
case 0 :
lcd_gotoxy(0,0); //line 0, char 0
lcd_puts("Temperature('C): ");
lcd_gotoxy(6,1); //line 1, char 6
itoa(temperature[0],lcd_data); // Convert integer to string
lcd_puts(lcd_data);
break;
case 1 :
lcd_gotoxy(0,0); //line 1, char 0
lcd_puts("MAG(uT):");
lcd_puts("X=");
ftoa(mag_x,1,lcd_data); // Convert integer to string
lcd_puts(lcd_data);
lcd_gotoxy(0,1); //line 2, char 0
lcd_puts("Y=");
ftoa(mag_y,1,lcd_data); // Convert integer to string
lcd_puts(lcd_data);
lcd_puts(" Z=");
ftoa(mag_z,1,lcd_data); // Convert integer to string
lcd_puts(lcd_data);
break;
}
delay_ms(100);