پروژه راه اندازی ماژول ITG3200 توسط برد AVR Wizard

 پروژه راه اندازی ماژول ITG3200 توسط برد AVR Wizard

راهنما راه اندازی ماژول ITG-3200 توسط برد AVR Wizard

هدف از این آموزش چگونگی برقراری ارتباط با یک سنسور دیجیتال و راه اندازی یک LCD می باشد

در نهایت شما قادر خواهید بود ماژول ITG-3200 را، راه اندازی کرده و خروجی سنسور را بر روی LCD نمایش دهید.

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

  1. برد AVR Wizard
  2. ماژول ITG3200
  3. پروگرامر MKII
  4. منبع تغذیه 6-12 ولت

مقدمه

سنسور ITG-3200 یک ژایروسکوپ سه محوره تک چیپ است. این سنسور دارای 3 ADC 16 بیتی است که دیتای هر محور را به صورت دیجیتال تبدیل کرده و از طریق درگاه I2C انتقال می‌دهد. کاربر می‌تواند با تنظیم رجیسترهای این سنسور، فیلتر و Data rate های مختلف را بر آن اعمال کند.

توضیحات برنامه:

ابتدا در CodeVision یک پروژه جدید ایجاد کنید:

ITG-3200 در CODE VISION

سپس درگاه I2C، LCD و Sw1 را فعال می‌کنیم.

ITG-3200 در CODE VIsion .

ITG-3200 در CODE VIsion ..

پس از ذخیره و تولید فایل‌ها، وارد محیط برنامه نویسی می‌شویم.

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

 

#include <iic.h>
#include <stdint.h>
#include <stdlib.h>
#include <delay.h>
#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);

نتیجه:
نمایش itg-3200 بر روی lcd

zahra_ahmadi

پاسخ دهید

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

19 + هجده =