فهرست مطالب
قطعات مورد نیاز
- برد AVR Wizard
- ماژول ITG3200
- پروگرامر MKII
- منبع تغذیه 6-12 ولت
مقدمه
سنسور ITG-3200 یک ژیروسکوپ سه محوره تکچیپ است. این سنسور دارای 3 16ADC بیتی است که دیتای هر محور را به صورت دیجیتال تبدیل کرده و از طریق درگاه I2C انتقال میدهد. کاربر میتواند با تنظیم رجیسترهای این سنسور، فیلتر و Data rate های مختلف را بر آن اعمال کند.
توضیحات برنامه
ابتدا در CodeVision یک پروژه جدید ایجاد کنید:
سپس درگاه I2C، LCD و Sw1 را فعال میکنیم.
پس از ذخیره و تولید فایلها، وارد محیط برنامهنویسی میشویم.
ابتدا توابع و متغیرهای مورد نیاز را تعریف میکنیم:
#include
#include
#include
#include
#define itg_address 0x68
#define DLPF_FS 0x16 //This register configures several parameters related to the sensor acquisition
#define INT_CFG 0x17// Interrupt Configuration Address
#define INT_STATUS 0x1A //Interrupt Status address
uint8_t gyro_data[6],temperature[2],who[2],fs_config[1]={0x1A},int_config[1]={0x01};
uint8_t who_am=0x00,user;
float temperature_c;
char lcd_data[15];
float gyro_x,gyro_y,gyro_z;
سپس ارتباط با ماژول را بررسی کرده و از صحت آن مطمئن میشویم:
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts(" Hi! Welcome ");
lcd_gotoxy(0,1);
lcd_puts("www.redronic.com");
delay_ms(2000);
lcd_clear();
who[1]=i2c_readReg(itg_address<<1,who_am, (uint8_t*)who, 1);
if(who[1]!=0 )
{
lcd_gotoxy(0,0);
lcd_puts(" I2C Error!");
while(1);
}
else if(who[0]!=104&& who[0]!=105)
{
lcd_gotoxy(0,0);
lcd_puts(" It isn't ");
lcd_gotoxy(0,1);
lcd_puts(" ITG3200");
while(1);
}
else
{
lcd_gotoxy(0,0);
lcd_puts(" ITG3200 ");
lcd_gotoxy(0,1);
lcd_puts(" Detected!");
}
who[1]=i2c_writeReg(itg_address<<1,DLPF_FS,(uint8_t*)fs_config, 1);
who[1]=i2c_writeReg(itg_address<<1,INT_CFG,(uint8_t*)int_config, 1);
if(who[1])
{
while(1);
}
delay_ms(2000);
برای خواندن درست دادهها، از رجیستر status، وضعیت را چک میکنیم و در صورت آماده بودن دیتا، شروع به خواندن آن میکنیم:
who[1]=i2c_readReg(itg_address<<1,INT_STATUS, (uint8_t*)who, 1);
if(who[0])
{
به خاطر زیاد بودن تعداد دادههایی که باید بر روی LCD نمایش داده شوند، دادهها در چند صفحه نمایش میدهیم و برای تغییر صفحات، از دکمه SW1 استفاده میکنیم:
if(PINC.4==0)
{
user++;
delay_ms(300);
if(user==2)
user=0;
}
با توجه به دیتاشیت ماژول، ضرایب و مقادیر اولیه را در فرمولها قرار داده و دادهی خام را به دادهی قابل درک تبدیل میکنیم:
lcd_clear();
i2c_readReg(itg_address<<1,0x1B, (uint8_t*)temperature,2);
i2c_readReg(itg_address<<1,0x1D, (uint8_t*)gyro_data,6);
temperature_c = (((float) (temperature[0]<<8 | temperature[1]))+13200) / 280 + 35.0; // Gyro chip temperature in degrees Centigrade
gyro_x=(float)((int16_t)(gyro_data[0]<<8 | gyro_data[1]))/14.375; // converting to (º/s) (from datasheet)
gyro_y=(float)((int16_t)(gyro_data[2]<<8 | gyro_data[3]))/14.375; // converting to (º/s)
gyro_z=(float)((int16_t)(gyro_data[4]<<8 | gyro_data[5]))/14.375; // converting to (º/s)
switch (user)
{
case 0 :
lcd_gotoxy(0,0); //line 0, char 0
lcd_puts(" Temperature: ");
lcd_gotoxy(6,1); //line 1, char 6
ftoa(temperature_c,2,lcd_data); // Convert integer to string
lcd_puts(lcd_data);
break;
case 1 :
lcd_gotoxy(0,0); //line 1, char 0
lcd_puts("Gyro: ");
lcd_puts(" Gx=");
ftoa(gyro_x,1,lcd_data); // Convert integer to string
lcd_puts(lcd_data);
lcd_gotoxy(0,1); //line 2, char 0
lcd_puts("Gy=");
ftoa(gyro_y,1,lcd_data); // Convert integer to string
lcd_puts(lcd_data);
lcd_puts(" Gz=");
ftoa(gyro_z,1,lcd_data); // Convert integer to string
lcd_puts(lcd_data);
break;
}
}
delay_ms(100);