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

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

ITG3200 project with avr wizzard

فهرست مطالب

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

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

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

مقدمه

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

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

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

 

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

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

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

 

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

				
			

نتیجه

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

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

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

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

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

چهارده + یک =