资源简介
通过stm32对mpu6050用互补滤波算法算出角度用串口输出,数据和dmp一样稳定

代码片段和文件信息
#include “imu.h“
#include “mpu6050.h“
#include “math.h“
#define RTA 57.295780 //弧度到角度需要乘的系数(180/3.14)
#define ATR 0.0174533 //角度到弧度需要乘的系数(3.14/180)
#define Gyro_A 0.0610351f //陀螺仪初始化时量程是陀螺仪角速度+-2000度每秒转化成我们所认知的度每秒,所以1 / (65536 / 4000) = 0.06103515625f
#define Gyro_R 0.0010653f //转化成弧度每秒 即上式*ATR
#define Prepare_Period 0.001 //执行Prepare_Data函数的周期 这里设置为1ms
#define Filter_Num 20 //滤波数组长度
/*----浮点型角度和加速度值得定义,用于存放解算后的值----*/
S_float_XYZ Angle_Valu = {000};
S_float_XYZ GYRO_Valu = {000};
S_short_XYZ ACC_Avg; //平均值滤波后的ACC
S_float_XYZ GYRO_I; //陀螺仪积分
S_float_XYZ EXP_Angled; //目标角度
S_float_XYZ DIF_Angle; //目标角度与实际角度的偏差
S_float_XYZ Euler_Angle; //四元数计算出的欧拉角
int16_t ACC_X_Buffer[Filter_Num]ACC_Y_Buffer[Filter_Num]ACC_Z_Buferr[Filter_Num]; //加速度滑动窗口滤波数组
void Prepare_Data(void)
{
static uint8_t filter_cnt = 0;
int32_t temp1 = 0temp2 = 0temp3 = 0;
uint8_t i;
/*-------6050最近一次得到的值-------*/
MPU6050_ReadValu();
/*-------6050最近一次得到的值装进滤波数组-------*/
ACC_X_Buffer[filter_cnt] = ACC_Valu_First.X;
ACC_Y_Buffer[filter_cnt] = ACC_Valu_First.Y;
ACC_Z_Buferr[filter_cnt] = ACC_Valu_First.Z;
/*-------软件一阶惯性滤波-------*/
for(i=0;i {
temp1 += ACC_X_Buffer[i];
temp2 += ACC_Y_Buffer[i];
temp3 += ACC_Z_Buferr[i];
}
ACC_Avg.X = temp1 / Filter_Num;
ACC_Avg.Y = temp2 / Filter_Num;
ACC_Avg.Z = temp3 / Filter_Num;
filter_cnt++;
if(filter_cnt==Filter_Num) filter_cnt=0;
/*------角速度的积分值计算 角速度乘以周期 所得的和 即为 积分--------*/
// GYRO_I.X += GYRO_Valu_First.X*Gyro_A*Prepare_Period;
// GYRO_I.Y += GYRO_Valu_First.Y*Gyro_A*Prepare_Period;
GYRO_I.Z += GYRO_Valu_First.Z*Gyro_A*Prepare_Period;
}
/*------获取姿态-------*/
void Get_Attitude(void)
{
IMUupdate(GYRO_Valu_First.X * Gyro_R
GYRO_Valu_First.Y * Gyro_R
GYRO_Valu_First.Z * Gyro_R
ACC_Avg.XACC_Avg.YACC_Avg.Z
);
}
#define kp 10.0f //比例增益控制加速度计的收敛速度
#define ki 0.008f //积分增益控制陀螺仪偏差的收敛速度
#define halfT 0.001f //周期的一半
float q0 = 1q1 = 0q2 = 0q3 = 0; //四元数元素代表估计取向,四元素初始值
float exInt = 0 eyInt = 0ezInt = 0; //比例积分误差,初始值误差
/*------四元数解析-----*/
/*
* axayaz为在XYZ轴上的加速度
* gxgygz为在XYZ轴上的陀螺仪
*/
void IMUupdate(float gx float gy float gz float ax float ay float az)
{
float norm; //归一化变量
float vxvyvz;
float exeyez;
/*---计算平方项,节省运算时间- 其实鄙人觉得这一步并没有什么卵用,但由于参考别人的四元数算法,鄙人也没怎么搞太懂---*/
float q0q0 = q0 * q0;
float q0q1 = q0 * q1;
float q0q2 = q0 * q2;
float q1q1 = q1 * q1;
float q1q3 = q1 * q3;
float q2q2 = q2 * q2;
float q2q3 = q2 * q3;
float q3q3 = q3 * q3;
if(ax*ay*az == 0)
return;
norm = sqrt((ax * ax) + (ay * ay) + (az *az)); //加速度数据归一化
/*----计算 规范后的加速度-----*/
ax = ax / norm;
ay = ay / norm;
az = az / norm;
/*-----估计重力方向和流量/变迁----*/
vx = 2*(q1q3 - q0q2); ////四元素中xyz的表示
vy = 2*(q0q1 + q2q3);
vz = q0q0 - q1q1 - q2q2 + q3q3 ;
ex = (ay*vz - az*vy) ; //向量外积在相减得到差分就是误差
ey = (az*vx - ax*vz)
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 4419 2016-07-06 09:58 MPU6050 互补滤波算法算出欧拉角\APP\IMU\imu.c
文件 579 2016-07-05 21:01 MPU6050 互补滤波算法算出欧拉角\APP\IMU\imu.h
文件 17273 2010-06-07 10:25 MPU6050 互补滤波算法算出欧拉角\CORE\core_cm3.c
文件 85714 2011-02-09 14:59 MPU6050 互补滤波算法算出欧拉角\CORE\core_cm3.h
文件 15503 2011-03-10 10:52 MPU6050 互补滤波算法算出欧拉角\CORE\startup_stm32f10x_hd.s
文件 1687 2016-07-06 09:26 MPU6050 互补滤波算法算出欧拉角\HARDWARE\IIC\iic.c
文件 855 2016-07-06 09:58 MPU6050 互补滤波算法算出欧拉角\HARDWARE\IIC\iic.h
文件 291 2016-07-05 21:49 MPU6050 互补滤波算法算出欧拉角\HARDWARE\LED\led.c
文件 211 2016-07-05 21:06 MPU6050 互补滤波算法算出欧拉角\HARDWARE\LED\led.h
文件 3635 2019-04-02 15:33 MPU6050 互补滤波算法算出欧拉角\HARDWARE\MPU6050\mpu6050.c
文件 1387 2019-04-02 15:34 MPU6050 互补滤波算法算出欧拉角\HARDWARE\MPU6050\mpu6050.h
文件 1423 2019-04-02 15:33 MPU6050 互补滤波算法算出欧拉角\HARDWARE\TIM3\timet.c
文件 136 2016-07-06 09:58 MPU6050 互补滤波算法算出欧拉角\HARDWARE\TIM3\timet.h
文件 399 2011-04-23 10:24 MPU6050 互补滤波算法算出欧拉角\keilkilll.bat
文件 3942 2019-04-02 11:21 MPU6050 互补滤波算法算出欧拉角\OBJ\core_cm3.crf
文件 104 2019-04-02 11:21 MPU6050 互补滤波算法算出欧拉角\OBJ\core_cm3.d
文件 11328 2019-04-02 11:21 MPU6050 互补滤波算法算出欧拉角\OBJ\core_cm3.o
文件 349839 2019-04-02 11:22 MPU6050 互补滤波算法算出欧拉角\OBJ\delay.crf
文件 1710 2019-04-02 11:22 MPU6050 互补滤波算法算出欧拉角\OBJ\delay.d
文件 384412 2019-04-02 11:22 MPU6050 互补滤波算法算出欧拉角\OBJ\delay.o
文件 401976 2019-04-02 15:33 MPU6050 互补滤波算法算出欧拉角\OBJ\DEMO.axf
文件 2147 2019-04-02 15:33 MPU6050 互补滤波算法算出欧拉角\OBJ\DEMO.build_log.htm
文件 65563 2019-04-02 15:33 MPU6050 互补滤波算法算出欧拉角\OBJ\DEMO.hex
文件 117687 2019-04-02 15:33 MPU6050 互补滤波算法算出欧拉角\OBJ\DEMO.htm
文件 1182 2019-04-02 15:33 MPU6050 互补滤波算法算出欧拉角\OBJ\DEMO.lnp
文件 3657 2016-07-06 09:58 MPU6050 互补滤波算法算出欧拉角\OBJ\DEMO.tra
文件 74461 2019-04-02 15:33 MPU6050 互补滤波算法算出欧拉角\OBJ\DEMO_DEMO.dep
文件 19 2016-07-06 09:49 MPU6050 互补滤波算法算出欧拉角\OBJ\ExtDll.iex
文件 352010 2019-04-02 11:22 MPU6050 互补滤波算法算出欧拉角\OBJ\iic.crf
文件 1601 2019-04-02 11:22 MPU6050 互补滤波算法算出欧拉角\OBJ\iic.d
............此处省略206个文件信息
相关资源
- STM32F103RC+ADC+DMA多通道采样LCD显示
- I2C读写AT24C02 基于STM32F103 cube116540
- 基于stm32f103ve的程序——跑马灯实验
- 基于STM32RCT6的步进电机驱动程序
- stm32f407上的两个can发送和接收例程
- STM32 led 时钟
- STM32 2.4G通信例程
- 直流无刷电机方波驱动 stm32 例程代码
- STM32中文资料
- STM32蓝牙和串口程序
- STM32f103超声波模块例程
- stm32f103c8t6 4 oled.rar
- mpu6050+hmc5883L.rar
- stm32f030 IAP Demo(原创)
- STM32基于rt_thread操作系统的SDHC卡文件
- NRF24L01实现51与STM32双向通讯
- STM32F103 串口程序(完整版)
- stm32 ds18b20 温度传感器 测试通过
- stm32官方例程
- STM32F103定时器中断程序
- [免费]基于stm32f103ze 的OLED驱动代码
- STM32F103RBT6驱动UC1698控制芯片的160160黑
- STM32F103 DS18B20 V3.5.0固件库驱动程序工
- STM32定时器使用入门。看了这个程序会
- SIM908 SDIO FSMC STM32 FIFO
- STM32F103 CC2500完整驱动(模拟SPI)
- AD7606采集程序
- stm32 用SPI 方式读写 SDHC
- stm32通过DMA方式采集ADC数据
- 意法半导体STM全系列微控制器STM32ST
评论
共有 条评论