中级会员
- 积分
- 384
- 威望
- 304
- 贡献
- 68
- 兑换币
- 35
- 注册时间
- 2010-11-24
- 在线时间
- 6 小时
|
我用过非常好用,我用在自平衡车上。- //初始化MPU6050,根据需要请参考pdf进行修改
- u8 Init_MPU6050(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- if(Single_Read(MPU6050_Addr,WHO_AM_I)==0x68)
- {
- Single_Write(MPU6050_Addr,PWR_MGMT_1, 0x00);//电源管理1,解除休眠状态,时钟为内部8MHz
- Single_Write(MPU6050_Addr,SMPLRT_DIV, 0x07);//采样速率125Hz
- Single_Write(MPU6050_Addr,CONFIG,0x06);
- //不使能FSYNC,不使用外同步采样速率;DLPF_CFG[2~0],设置任意轴是否通过DLPF,
- //典型值:0x06(5Hz)低通滤波器带宽5Hz,
- //对加速度和陀螺仪都有效,输出频率为1kHz,决定SMPLRT_DIV的频率基准
- Single_Write(MPU6050_Addr,GYRO_CONFIG, 0x08);//不自测,量程设置500°/s
- /*?GYRO 量程单位系数
- +-250 deg/s 131 LSB/deg/s 初始化hex 0x00
- +-500 deg/s 65.5 LSB/deg/s 0x08
- +-1000 deg/s 32.8 LSB/deg/s 0x10
- +-2000 deg/s 16.4 LSB/deg/s 0x18
- */
- Single_Write(MPU6050_Addr,ACCEL_CONFIG, 0x00);//不自测,量程设置2g
- /* Accle any axe
- +-2 g 16384 LSB/g
- +-4 g 8192 LSB/g
- +-8 g 4096 LSB/g
- +-16 g 2048 LSB/g
- */
-
- return 0;
- }
- return 1;
- }
- //******读取MPU6050数据****************************************
- //**************************************
- //读取mpu6050内部数据,两个字节,合成数据
- //**************************************
- s16 GetData(u8 REG_Address) //返回值为有符号的整形,16位
- {
- s16 H=0,L=0;
- H = Single_Read(MPU6050_Addr,REG_Address); //先读高字节,再读低字节
- L = Single_Read(MPU6050_Addr,REG_Address+1);
- return (H<<8)+L; //合成数据,为有符号整形数
- }
- //-------------加速度部分解算角度------------------
- s32 Read_Acc(void)
- {
- s32 Accel_x; //mpo6050读出的X轴加速度
- s32 Accel_z; //mpu6050读出的z轴加速度
- //-------------加速度部分解算------------------
- /*使用是加速度轴x轴正向朝向小车行径方向,y轴陀螺仪的正向 逆时针方向。
- 加速度计的量程范围见配置 不自测,量程设置4g scal系数为8192
- Accle any axe
- +-2 g 16384 LSB/g
- +-4 g 8192 LSB/g
- +-8 g 4096 LSB/g
- +-16 g 2048 LSB/g
- */
-
- Accel_x = GetData(ACCEL_XOUT_H); //从mpu6050读取X轴加速度
- Accel_z = GetData(ACCEL_ZOUT_H); //从mpu6050读取z轴加速度
-
- if(Accel_x>0)
- {
- Angle_accel = atan2((float)Accel_x,(float)Accel_z)*(180/3.14159265);//反正切计算rad
- /* atan2(y,x)是表示X-Y平面上所对应的(x,y)坐标的角度,
- 它的值域范围是(-Pi,Pi)
- 用数学表示就是:atan2(y,x)=arg(y/x)-Pi
- 当y<0时,其值为负,
- 当y>0时,其值为正. atan2*180/Pi可以计算出角度值 */
-
- }
- else
- {
- Angle_accel = atan2((float)Accel_z,(float)Accel_x)*(180/3.14159265)-90;//反正切计算
- Angle_accel = -Angle_accel;
- }
- //angle_accel物理量单位是角度 deg!
- return Angle_accel;
- }
- //陀螺仪计算Y轴的角速度
- s32 Read_Gry(void)
- {
- s32 read_gyro_y;
- s32 Angle_gyro;
- //-------角速度解算-------------------------
- //角速度量程见配置 本处使用1000 deg/s。scal系数为32.8 LSB
- /*?GYRO 量程单位系数
- +-250 deg/s 131 LSB/deg/s offset 44.38188277*2
- +-500 deg/s 65.5 LSB/deg/s offset 44.38188277
- +-1000 deg/s 32.8 LSB/deg/s ok offset 44.38188277/2
- +-2000 deg/s 16.4 LSB/deg/s offset 44.38188277/4
- */
- read_gyro_y= GetData(GYRO_YOUT_H)+Gyro_y_offset; //静止时角速度Y轴输出
- //Gyro_y_offset计算方法gyro静止时候N多个数据的算术均值
-
- Angle_gyro= -read_gyro_y/65.5; //去除零点偏移,计算角速度值,负号为方向处理
- //Angle_gyro测量值的单位是 deg/s.测量的物理量是角速度。
- return Angle_gyro;
- }
复制代码 |
|