智能車學習(十一)——陀螺儀學習


一、學習說明

     感覺就是配置I2C通信,然后直接移植51代碼。。。

 

二、代碼分享:

1、頭文件:

#ifndef I2C_GYRO_H_
#define I2C_GYRO_H_



/***********函數聲明***********/

extern  void Gyro_Init(void);
extern  void Read_GY(void);

/*****************************/


/***********全局變量聲明***********/

extern float Gyro_X ;
extern float Gyro_Y ;
extern float Gyro_Z ;

/*********************************/

#endif

 

2、源文件:

#include "include.h"
#include "common.h"
#include "gpio.h"
#include "I2C_GYRO.h"
#include "lptmr.h"


/***********管腳聲明***********/

#define L3G_S_I2C_SDA       (PTE21)//(PTB3)//(PTE0) //(PTE22)//(PTC1)//                     
#define L3G_S_I2C_SCL       (PTE5)//(PTB2)//(PTE1)//(PTE20)//(PTC0)//

/*****************************/


//IO方向設置
#define L3G_I2C_SDA_IN()   DDRE21 = 0//輸入模式
#define L3G_I2C_SDA_OUT()  DDRE21 = 1//輸出模式


//IO操作函數     
#define L3G_I2C_SCL        PTE5_OUT //SCL
#define L3G_I2C_SDA        PTE21_OUT //SDA     
#define L3G_I2C_READ_SDA   PTE21_IN  //輸入SDA 

/***********全局變量聲明***********/
float Gyro_X = 0;
float Gyro_Y = 0;
float Gyro_Z = 0;
/********************************/



//**********L3G4200D內部寄存器地址*********
#define L3G_WHO_AM_I 0x0F
#define L3G_CTRL_REG1 0x20
#define L3G_CTRL_REG2 0x21
#define L3G_CTRL_REG3 0x22
#define L3G_CTRL_REG4 0x23
#define L3G_CTRL_REG5 0x24
#define L3G_REFERENCE 0x25
#define L3G_OUT_TEMP 0x26
#define L3G_STATUS_REG 0x27
#define L3G_OUT_X_L 0x28
#define L3G_OUT_X_H 0x29
#define L3G_OUT_Y_L 0x2A
#define L3G_OUT_Y_H 0x2B
#define L3G_OUT_Z_L 0x2C
#define L3G_OUT_Z_H 0x2D
#define L3G_FIFO_CTRL_REG 0x2E
#define L3G_FIFO_SRC_REG 0x2F
#define L3G_INT1_CFG 0x30
#define L3G_INT1_SRC 0x31
#define L3G_INT1_TSH_XH 0x32
#define L3G_INT1_TSH_XL 0x33
#define L3G_INT1_TSH_YH 0x34
#define L3G_INT1_TSH_YL 0x35
#define L3G_INT1_TSH_ZH 0x36
#define L3G_INT1_TSH_ZL 0x37
#define L3G_INT1_DURATION 0x38
//****************************************
#define    L3G_SlaveAddress   0xD2      //定義器件在IIC總線中的從地址,根據ALT  ADDRESS地址引腳不同修改
#define    L3G_SlaveAddfire   0x69      //定義器件在IIC總線中的從地址,根據ALT  ADDRESS地址引腳不同修改


//============================================================================
//函數名稱:void L3G_I2C_Config(void)
//函數返回:無
//參數說明:無
//功能概要:配置I2C管腳
//============================================================================
void L3G_I2C_Config(void)
{
  //L3G_I2C_SDA_OUT();
  gpio_init(L3G_S_I2C_SDA,GPO,0);
  gpio_init(L3G_S_I2C_SCL,GPO,1);
  
  L3G_I2C_SCL=1;
  L3G_I2C_SDA=1;
}


//============================================================================
//函數名稱:void L3G_I2C_Start(void)
//函數返回:無
//參數說明:無
//功能概要:I2C啟動
//============================================================================
void L3G_I2C_Start(void)
{
  L3G_I2C_SDA_OUT();
  L3G_I2C_SDA=1;
  L3G_I2C_SCL=1;
  lptmr_delay_us(1); 
  L3G_I2C_SDA=0;      
  lptmr_delay_us(1); 
  L3G_I2C_SCL=0;   
}


//============================================================================
//函數名稱:void L3G_I2C_Stop(void)
//函數返回:無
//參數說明:無
//功能概要:I2C停止
//============================================================================
void L3G_I2C_Stop(void)
{
  L3G_I2C_SDA_OUT();
  L3G_I2C_SDA=0;
  L3G_I2C_SCL=1;
  lptmr_delay_us(1);                        
  L3G_I2C_SDA=1;
  lptmr_delay_us(1);                                           
  L3G_I2C_SCL=0;
}


//============================================================================
//函數名稱:void L3G_I2C_Mack(void)
//函數返回:無
//參數說明:無
//功能概要:
//============================================================================
void L3G_I2C_Mack(void)
{ 
  L3G_I2C_SDA_OUT();
  L3G_I2C_SDA=0;
  L3G_I2C_SCL=1;
  lptmr_delay_us(1); 
  L3G_I2C_SCL=0;
  L3G_I2C_SDA=1;
}



//============================================================================
//函數名稱:void L3G_I2C_Mnack(void)
//函數返回:無
//參數說明:無
//功能概要:讀取完的完成停頓信號
//============================================================================
void L3G_I2C_Mnack(void)
{
  L3G_I2C_SDA_OUT();
  L3G_I2C_SDA=1;    
  lptmr_delay_us(1); 
  L3G_I2C_SCL=1;
  lptmr_delay_us(1); 
  L3G_I2C_SCL=0;
  lptmr_delay_us(1);  
  //L3G_I2C_SDA=0;
}


//============================================================================
//函數名稱:uint8_t L3G_I2C_Cack(void)
//函數返回:無
//參數說明:無
//功能概要:發送間隔函數
//============================================================================
uint8_t L3G_I2C_Cack(void)
{  
  L3G_I2C_SDA_IN();
  L3G_I2C_SCL=0;
  lptmr_delay_us(1); 
  L3G_I2C_SCL=1;
  lptmr_delay_us(1); 
  if(L3G_I2C_READ_SDA)
  {
    //L3G_I2C_Stop();
    //return 0xff;
  }
  L3G_I2C_SCL=0;              
  L3G_I2C_SDA_OUT();  
  return 0;  
}


//============================================================================
//函數名稱:void L3G_I2C_WriteByte(unsigned char data)
//函數返回:無
//參數說明:無
//功能概要:I2C發送一個字節的數據
//============================================================================
void L3G_I2C_WriteByte(unsigned char data)
{
  unsigned char i=8;
  L3G_I2C_SDA_OUT();
  while(i--)
  {
    lptmr_delay_us(1); 
    if(data & 0x80)  
      L3G_I2C_SDA=1;
    else
      L3G_I2C_SDA=0;
    lptmr_delay_us(1); 
    L3G_I2C_SCL=1; 
    lptmr_delay_us(1); 
    L3G_I2C_SCL=0;         
    data<<=1;            
  }
}


//============================================================================
//函數名稱:uint8_t L3G_I2C_ReadByte(void)
//函數返回:無
//參數說明:無
//功能概要:I2C接收一個字節的數據
//============================================================================
uint8_t L3G_I2C_ReadByte(void)
{
  unsigned char i;
  unsigned char data=0;
  char temp;                
  L3G_I2C_SDA_IN();                      
  for(i=0;i<8;i++)            
  {  
    data<<=1;
    lptmr_delay_us(1); 
    L3G_I2C_SCL=1; 
    temp=L3G_I2C_READ_SDA;
    if(temp)
      data++;
    lptmr_delay_us(1);   
    L3G_I2C_SCL=0;            
  }
  return data;
}


//============================================================================
//函數名稱:uint8_t L3G_I2C_WR_REG(uint8_t dev_addr, uint8_t reg_addr, uint8_t writeData)
//函數返回:無
//參數說明:無
//功能概要:I2C向一個地址寫一個數據
//============================================================================
uint8_t L3G_I2C_WR_REG(uint8_t dev_addr, uint8_t reg_addr, uint8_t writeData)
{
  L3G_I2C_Start();
  L3G_I2C_WriteByte(dev_addr);
  L3G_I2C_Cack();
  L3G_I2C_WriteByte(reg_addr);
  L3G_I2C_Cack();
  L3G_I2C_WriteByte(writeData);
  L3G_I2C_Cack();
  L3G_I2C_Stop();
  
  return 0;
}


//============================================================================
//函數名稱:uint8_t L3G_I2C_RD_REG(uint8_t dev_addr, uint8_t reg_addr)
//函數返回:無
//參數說明:無
//功能概要:I2C從一個地址讀一個數據
//============================================================================
uint8_t L3G_I2C_RD_REG(uint8_t dev_addr, uint8_t reg_addr)
{
  uint8_t read_reg = 0;
  L3G_I2C_Start();
  L3G_I2C_WriteByte(dev_addr);
  L3G_I2C_Cack();
  L3G_I2C_WriteByte(reg_addr);
  L3G_I2C_Cack();
  L3G_I2C_Start();
  L3G_I2C_WriteByte(dev_addr + 1);
  L3G_I2C_Cack();
  read_reg = L3G_I2C_ReadByte();
  L3G_I2C_Mnack();
  L3G_I2C_Stop();
  
  return read_reg;
}


//============================================================================
//函數名稱:uint8_t L3G_I2C_RD_Buffer(uint8_t dev_addr, uint8_t reg_addr, uint8_t data_num, uint8_t *readBuffer)
//函數返回:無
//參數說明:無
//功能概要:I2C向一個地址寫一連串數據
//============================================================================
uint8_t L3G_I2C_RD_Buffer(uint8_t dev_addr, uint8_t reg_addr, uint8_t data_num, uint8_t *readBuffer)
{
  uint8_t i = 0;
  L3G_I2C_Start();
  L3G_I2C_WriteByte(dev_addr);
  L3G_I2C_Cack();
  L3G_I2C_WriteByte(reg_addr);
  L3G_I2C_Cack();
  L3G_I2C_Start();
  L3G_I2C_WriteByte(dev_addr + 1);
  L3G_I2C_Cack();
  
  for(i = 0; i < data_num; i++){
    *(readBuffer+i) = L3G_I2C_ReadByte();
    if(i == data_num - 1)
      L3G_I2C_Mnack();
    else
      L3G_I2C_Mack();
  }
  L3G_I2C_Stop();
  
  return 0;
}



//============================================================================
//函數名稱:void Gyro_Init( __RAMFUNC  void)
//函數返回:無
//參數說明:無
//功能概要://初始化為指定模式 
//============================================================================
void Gyro_Init(void)
{    
  L3G_I2C_Config();
  L3G_I2C_WR_REG(L3G_SlaveAddress,L3G_CTRL_REG1,0xcf);    //數據手冊30  0xbf 400hz 20~110截止頻率
  L3G_I2C_WR_REG(L3G_SlaveAddress,L3G_CTRL_REG2,0x20);//前兩位00,后兩位高通濾波器模式選擇,后四位截止頻率  0x29
  L3G_I2C_WR_REG(L3G_SlaveAddress,L3G_CTRL_REG3,0x00);     
  L3G_I2C_WR_REG(L3G_SlaveAddress,L3G_CTRL_REG4,0x30); 
  L3G_I2C_WR_REG(L3G_SlaveAddress,L3G_CTRL_REG5,0x00); 
}


//============================================================================
//函數名稱:void Read_GY(void)
//函數返回:無
//參數說明:無
//功能概要:陀螺儀傳感器測量值讀取接口
//============================================================================

uint8_t tmpBuffer[6] = {0};

void Read_GY(void)
{
  //int16_t x_h = 0,x_l = 0,y_l = 0,y_h = 0,z_h = 0,z_l = 0;//Gyro_X = 0,Gyro_Y = 0,Gyro_Z = 0;
  //Gyro_Init();
  L3G_I2C_RD_Buffer(L3G_SlaveAddress,0xA8,6,tmpBuffer);
 
  /*
  Gyro_X = ((short)((tmpBuffer[1]<<8)|tmpBuffer[0]))>>2;// 14位精度
  
  Gyro_Y = ((short)((tmpBuffer[3]<<8)|tmpBuffer[2]))>>2;// 14位精度
  
  Gyro_Z = ((short)((tmpBuffer[5]<<8)|tmpBuffer[4]))>>2;// 14位精度
  */
  
  int temp;
  
  temp = ((short)((tmpBuffer[1]<<8)|tmpBuffer[0]))>>4;//2;// 14位精度  1g數值為1024(原本為4096,但是右移了(無效位2位)(有效位14位)兩位)
  Gyro_X = (double)Gyro_X*0.5+(double)temp*0.5;
  
  temp = ((short)((tmpBuffer[3]<<8)|tmpBuffer[2]))>>4;//2;// 14位精度
  Gyro_Y = (double)Gyro_Y*0.5+(double)temp*0.5;
  
  temp = ((short)((tmpBuffer[5]<<8)|tmpBuffer[4]))>>4;//2;// 14位精度   
  Gyro_Z = (double)Gyro_Z*0.5+(double)temp*0.5;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM