用于EagleEye3.0 规则集漏报和误报测试的示例项目,项目收集于github和gitee
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

229 lines
5.3 KiB

3 months ago
#include "mpu6050.h"
#include "sys.h"
#include "delay.h"
//#include "usart.h"
//<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>MPU6050
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:0,<EFBFBD>ɹ<EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u8 MPU_Init(void)
{
u8 res;
MPU_IIC_Init();//<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>IIC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80); //<EFBFBD><EFBFBD>λMPU6050
delay_ms(100);
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>MPU6050
MPU_Set_Gyro_Fsr(3); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD>2000dps
MPU_Set_Accel_Fsr(0); //<EFBFBD><EFBFBD><EFBFBD>ٶȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD>2g
MPU_Set_Rate(50); //<EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>50Hz
MPU_Write_Byte(MPU_INT_EN_REG,0X00); //<EFBFBD>ر<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
MPU_Write_Byte(MPU_USER_CTRL_REG,0X00); //I2C<EFBFBD><EFBFBD>ģʽ<EFBFBD>ر<EFBFBD>
MPU_Write_Byte(MPU_FIFO_EN_REG,0X00); //<EFBFBD>ر<EFBFBD>FIFO
MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80); //INT<EFBFBD><EFBFBD><EFBFBD>ŵ͵<EFBFBD>ƽ<EFBFBD><EFBFBD>Ч
res=MPU_Read_Byte(MPU_DEVICE_ID_REG);
if(res==MPU_ADDR)//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID<EFBFBD><EFBFBD>ȷ
{
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>CLKSEL,PLL X<EFBFBD><EFBFBD>Ϊ<EFBFBD>ο<EFBFBD>
MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00); //<EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƕ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MPU_Set_Rate(50); //<EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ50Hz
}else return 1;
return 0;
}
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>MPU6050<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̷<EFBFBD>Χ
//fsr:0,<EFBFBD><EFBFBD>250dps;1,<EFBFBD><EFBFBD>500dps;2,<EFBFBD><EFBFBD>1000dps;3,<EFBFBD><EFBFBD>2000dps
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:0,<EFBFBD><EFBFBD><EFBFBD>óɹ<EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>
u8 MPU_Set_Gyro_Fsr(u8 fsr)
{
return MPU_Write_Byte(MPU_GYRO_CFG_REG,fsr<<3);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̷<EFBFBD>Χ
}
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>MPU6050<EFBFBD><EFBFBD><EFBFBD>ٶȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̷<EFBFBD>Χ
//fsr:0,<EFBFBD><EFBFBD>2g;1,<EFBFBD><EFBFBD>4g;2,<EFBFBD><EFBFBD>8g;3,<EFBFBD><EFBFBD>16g
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:0,<EFBFBD><EFBFBD><EFBFBD>óɹ<EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>
u8 MPU_Set_Accel_Fsr(u8 fsr)
{
return MPU_Write_Byte(MPU_ACCEL_CFG_REG,fsr<<3);//<EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><EFBFBD>ٶȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̷<EFBFBD>Χ
}
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>MPU6050<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ͨ<EFBFBD>˲<EFBFBD><EFBFBD><EFBFBD>
//lpf:<EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ͨ<EFBFBD>˲<EFBFBD>Ƶ<EFBFBD><EFBFBD>(Hz)
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:0,<EFBFBD><EFBFBD><EFBFBD>óɹ<EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>
u8 MPU_Set_LPF(u16 lpf)
{
u8 data=0;
if(lpf>=188)data=1;
else if(lpf>=98)data=2;
else if(lpf>=42)data=3;
else if(lpf>=20)data=4;
else if(lpf>=10)data=5;
else data=6;
return MPU_Write_Byte(MPU_CFG_REG,data);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ͨ<EFBFBD>˲<EFBFBD><EFBFBD><EFBFBD>
}
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>MPU6050<EFBFBD>IJ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD>ٶ<EFBFBD>Fs=1KHz)
//rate:4~1000(Hz)
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:0,<EFBFBD><EFBFBD><EFBFBD>óɹ<EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>
u8 MPU_Set_Rate(u16 rate)
{
u8 data;
if(rate>1000)rate=1000;
if(rate<4)rate=4;
data=1000/rate-1;
data=MPU_Write_Byte(MPU_SAMPLE_RATE_REG,data); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ͨ<EFBFBD>˲<EFBFBD><EFBFBD><EFBFBD>
return MPU_Set_LPF(rate/2); //<EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>LPFΪ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>һ<EFBFBD><EFBFBD>
}
//<EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD>ֵ
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:<EFBFBD><EFBFBD>ֵ(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>100<EFBFBD><EFBFBD>)
short MPU_Get_Temperature(void)
{
u8 buf[2];
short raw;
float temp;
MPU_Read_Len(MPU_ADDR,MPU_TEMP_OUTH_REG,2,buf);
raw=((u16)buf[0]<<8)|buf[1];
temp=36.53+((double)raw)/340;
return temp*100;;
}
//<EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ(ԭʼֵ)
//gx,gy,gz:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>x,y,z<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:0,<EFBFBD>ɹ<EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u8 MPU_Get_Gyroscope(short *gx,short *gy,short *gz)
{
u8 buf[6],res;
res=MPU_Read_Len(MPU_ADDR,MPU_GYRO_XOUTH_REG,6,buf);
if(res==0)
{
*gx=((u16)buf[0]<<8)|buf[1];
*gy=((u16)buf[2]<<8)|buf[3];
*gz=((u16)buf[4]<<8)|buf[5];
}
return res;;
}
//<EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD>ֵ(ԭʼֵ)
//gx,gy,gz:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>x,y,z<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:0,<EFBFBD>ɹ<EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u8 MPU_Get_Accelerometer(short *ax,short *ay,short *az)
{
u8 buf[6],res;
res=MPU_Read_Len(MPU_ADDR,MPU_ACCEL_XOUTH_REG,6,buf);
if(res==0)
{
*ax=((u16)buf[0]<<8)|buf[1];
*ay=((u16)buf[2]<<8)|buf[3];
*az=((u16)buf[4]<<8)|buf[5];
}
return res;;
}
//IIC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>д
//addr:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
//reg:<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
//len:д<EFBFBD><EFBFBD><EFBFBD>
//buf:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:0,<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u8 MPU_Write_Len(u8 addr,u8 reg,u8 len,u8 *buf)
{
u8 i;
MPU_IIC_Start();
MPU_IIC_Send_Byte((addr<<1)|0);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(MPU_IIC_Wait_Ack()) //<EFBFBD>ȴ<EFBFBD>Ӧ<EFBFBD><EFBFBD>
{
MPU_IIC_Stop();
return 1;
}
MPU_IIC_Send_Byte(reg); //д<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
MPU_IIC_Wait_Ack(); //<EFBFBD>ȴ<EFBFBD>Ӧ<EFBFBD><EFBFBD>
for(i=0;i<len;i++)
{
MPU_IIC_Send_Byte(buf[i]); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(MPU_IIC_Wait_Ack()) //<EFBFBD>ȴ<EFBFBD>ACK
{
MPU_IIC_Stop();
return 1;
}
}
MPU_IIC_Stop();
return 0;
}
//IIC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//addr:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
//reg:Ҫ<EFBFBD><EFBFBD>ȡ<EFBFBD>ļĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
//len:Ҫ<EFBFBD><EFBFBD>ȡ<EFBFBD>ij<EFBFBD><EFBFBD><EFBFBD>
//buf:<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ洢<EFBFBD><EFBFBD>
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:0,<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u8 MPU_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf)
{
MPU_IIC_Start();
MPU_IIC_Send_Byte((addr<<1)|0);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(MPU_IIC_Wait_Ack()) //<EFBFBD>ȴ<EFBFBD>Ӧ<EFBFBD><EFBFBD>
{
MPU_IIC_Stop();
return 1;
}
MPU_IIC_Send_Byte(reg); //д<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
MPU_IIC_Wait_Ack(); //<EFBFBD>ȴ<EFBFBD>Ӧ<EFBFBD><EFBFBD>
MPU_IIC_Start();
MPU_IIC_Send_Byte((addr<<1)|1);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ+<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MPU_IIC_Wait_Ack(); //<EFBFBD>ȴ<EFBFBD>Ӧ<EFBFBD><EFBFBD>
while(len)
{
if(len==1)*buf=MPU_IIC_Read_Byte(0);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD>nACK
else *buf=MPU_IIC_Read_Byte(1); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ACK
len--;
buf++;
}
MPU_IIC_Stop(); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ֹͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return 0;
}
//IICдһ<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
//reg:<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
//data:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:0,<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u8 MPU_Write_Byte(u8 reg,u8 data)
{
MPU_IIC_Start();
MPU_IIC_Send_Byte((MPU_ADDR<<1)|0);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(MPU_IIC_Wait_Ack()) //<EFBFBD>ȴ<EFBFBD>Ӧ<EFBFBD><EFBFBD>
{
MPU_IIC_Stop();
return 1;
}
MPU_IIC_Send_Byte(reg); //д<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
MPU_IIC_Wait_Ack(); //<EFBFBD>ȴ<EFBFBD>Ӧ<EFBFBD><EFBFBD>
MPU_IIC_Send_Byte(data);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(MPU_IIC_Wait_Ack()) //<EFBFBD>ȴ<EFBFBD>ACK
{
MPU_IIC_Stop();
return 1;
}
MPU_IIC_Stop();
return 0;
}
//IIC<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
//reg:<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u8 MPU_Read_Byte(u8 reg)
{
u8 res;
MPU_IIC_Start();
MPU_IIC_Send_Byte((MPU_ADDR<<1)|0);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MPU_IIC_Wait_Ack(); //<EFBFBD>ȴ<EFBFBD>Ӧ<EFBFBD><EFBFBD>
MPU_IIC_Send_Byte(reg); //д<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
MPU_IIC_Wait_Ack(); //<EFBFBD>ȴ<EFBFBD>Ӧ<EFBFBD><EFBFBD>
MPU_IIC_Start();
MPU_IIC_Send_Byte((MPU_ADDR<<1)|1);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ+<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MPU_IIC_Wait_Ack(); //<EFBFBD>ȴ<EFBFBD>Ӧ<EFBFBD><EFBFBD>
res=MPU_IIC_Read_Byte(0);//<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD>nACK
MPU_IIC_Stop(); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ֹͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return res;
}