【51单片机快速入门指南】4.4.3:Madgwick AHRS 九轴姿态融合获取四元数、欧拉角

最新更新时间:2022-07-15来源: csdn关键字:51单片机  AHRS  四元数  欧拉角 手机看文章 扫描二维码
随时随地手机看文章


Madgwick_9.h

#ifndef Madgwick_9_H_

#define Madgwick_9_H_


extern float Pitch, Roll, Yaw;

extern float q0, q1, q2, q3;


void MPU6050_Madgwick_Init(float loop_ms);

void MadgwickAHRSupdate_6(float gx, float gy, float gz, float ax, float ay, float az);

void MadgwickAHRSupdate_9(float gx, float gy, float gz, float ax, float ay, float az, float mx, float my, float mz);


#endif


使用方法

先调用MPU6050_Madgwick_Init(dt),参数为一次循环的时间,单位为ms

再使用MadgwickAHRSupdate_9姿态融合函数。


测试

陀螺仪、磁力计的原始数据经校准后输入MadgwickAHRSupdate_9函数


main.c

#include

#include "intrins.h"

#include "stdint.h"

#include "USART.h"

#include "./Software_I2C/Software_I2C.h"

#include "XMC5883L.h"

#include "./MPU6050/MPU6050.h"

#include "./MPU6050/Madgwick_9.h"


void Delay1ms() //@22.1184MHz

{

unsigned char i, j;


_nop_();

_nop_();

i = 22;

j = 128;

do

{

while (--j);

} while (--i);

}


void delay_ms(uint32_t ms)

{

while(ms --)

Delay1ms();

}


#define LED_PORT P0


void main(void)

{

int16_t mag_x, mag_y, mag_z;

int16_t aacx,aacy,aacz; //加速度传感器原始数据

int16_t gyrox,gyroy,gyroz; //陀螺仪原始数据


MPU_Init();

xmc5883lInit();


AUXR &= 0xBF; //定时器时钟12T模式 1T的51使用12T的定时器程序时需要加入这两句

AUXR &= 0xFE; //串口1选择定时器1为波特率发生器

USART_Init(USART_MODE_1, Rx_ENABLE, STC_USART_Priority_Lowest, 22118400, 115200, DOUBLE_BAUD_ENABLE, USART_TIMER_1);


MPU6050_Madgwick_Init(10.48);


while(1)

{

MPU_Get_Accelerometer(&aacx, &aacy, &aacz); //得到加速度传感器数据

MPU_Get_Gyroscope(&gyrox, &gyroy, &gyroz); //得到陀螺仪数据

xmc5883lRead(&mag_x, &mag_y, &mag_z);


MadgwickAHRSupdate_9(gyrox+7, gyroy+23, gyroz-1, aacx, aacy, aacz, 1.108270606866881 * (mag_x + 297.2882033958856), 0.9218994400020794 * (mag_y + 3088.0092054124193), 0.9871899380641738 * (mag_z + 782.925290575134));


printf("%f, ", Pitch);

printf("%f, ", Roll);

printf("%frn", Yaw);

}

}


效果

在这里插入图片描述

[1] [2]
关键字:51单片机  AHRS  四元数  欧拉角 编辑:什么鱼 引用地址:【51单片机快速入门指南】4.4.3:Madgwick AHRS 九轴姿态融合获取四元数、欧拉角

上一篇:【51单片机快速入门指南】4.5:I2C 与 TCA6416实现双向 IO 扩展
下一篇:【51单片机快速入门指南】4.4.2:Mahony AHRS 九轴姿态融合获取四元数、欧拉角

推荐阅读

用AT89C51单片机显示倒计时程序
;可设定时间的倒计时定时器,可选择5/15/20/30/35/45/50分钟倒计时;倒计时时间由四位拨码开关的2/3/4位来控制,;第2位表示5分钟,第3位表示15分钟,第4位表示30分钟,;通过不同的组合可以产生5/15/20/30/35/45/50分钟倒计时;P1.0口的外接的发光二极管为状态LED,定时未开始时LED常亮,定时过程中LED闪烁;K1为开始按钮,K2为停止按钮适用STM8S/STM8L/STM8A N76E003 脱机编程器/烧录器/下载器/SP_00【包邮】m.tb.cn/h.UlXVKiOa_bit equ 20h ;数码管个位数存放内存位置b_bit equ 21h ;数码管十位数存放内存位置temp eq
发表于 2023-01-13
51单片机数码管静态显示和动态显示原理及实验 夜猫子
数码管多位数码管,即是两个或两个以上单个数码管并列集中在一起形成一体的数码管。当多位一体时,它们内部的公共端是独立的,而负责显示什么数字的段线全部是连接在一起的,独立的公共端可以控制多位一体中的哪一位数码管点亮,而连接在一起的段线可以控制这个能点亮数码管亮什么数字,通常我们把公共端叫做“位选线”,连接在一起的段线叫做“段选线”有了这两个线后,通过单片机及外部驱动电路就可以控制任意的数码管显示。一般一位数码管有10个引脚,二位数码管也是10个引脚,四位数码管是12个引脚。为了更方便区分段选和位选,请看下原理图:如图为两个4位一体的数码管,可以看到与8个com相连的是两个数码管的位选,位选与引脚相连,所以位选控制那个灯亮。段选可以看到a
发表于 2023-01-12
<font color='red'>51单片机</font>数码管静态显示和动态显示原理及实验 夜猫子
51单片机独立按键和矩阵按键实现
独立按键实验按键是一种电子开关,使用时轻轻按开关按钮就可使开关接通,当松开手时,开关断开。我们开发板上使用的按键及内部简易图如下图所示管脚与管脚之间(注意是距离)距离长的是导通状态,短的是接通状态。通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,电压信号如下图所示:如图所示,按键闭合式不会立刻稳定的接通,断开时也不会一下子断开,会伴随一些抖动。抖动的时间长短有按键特性决定,一般为5Ms到10ms.按键抖动会引起按键被误读多次。为了确保 CPU 对按键的一次闭合仅作一次处理,必须进行消抖。消抖消抖可分为硬件消抖和软件消抖。为了使电路更加简单,通常采用软件消抖。一般来说一个简单的按键消抖就是先读取按键的状态, 如果得到按键按下
发表于 2023-01-12
51单片机8*8点阵原理及实现
LED点阵(8*8)LED 点阵是由发光二极管排列组成的显示器件,在我们日常生活的电器中随处可见,被广泛应用于汽车报站器,广告屏等。通常应用较多的是 8* 8 点阵,然后使用多个 8 * 8 点阵可组成不同分辨率的 LED点阵显示屏,比如 16* 16 点阵可以使用 4 个 8* 8 点阵构成。因此理解了 8* 8LED点阵的工作原理,其他分辨率的 LED 点阵显示屏都是一样的。这里以 8* 8LED 点阵来做介绍。发光原理8* 8 点阵共由 64 个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一行置 1 电平(行所接的是二极管的阳极,所以为高电平),某一列置 0 电平(列所接的是二极管的阴极极,所以为低
发表于 2023-01-12
51单片机中断基本概念
问题引入在了解基本概念之前,先看三个问题:1.你想使用的中断是哪个?2.你所希望的触发条件是什么?3.你希望在中断之后做什么?可以边看边思考,文章最后给出答案中断概念为什么引入中断?中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的,中断功能的存在,很大程度上提高了单片机处理外部或内部事件的能力。中断系统特点:①分时操作。CPU 可以分时为多个 I/O 设备服务,提高了计算机的利用率;②实时响应。CPU 能够及时处理应用系统的随机事件,系统的实时性大大增强;③可靠性高。CPU 具有处理设备故障及掉电等突发性事件能力,从而使系统可靠性提高中断过程对于单片机来讲,中断是指CPU在处理某一时间A时,发生了另一事件B请求CPU立
发表于 2023-01-12
51单片机外部中断点亮LED
外部中断软件设计原理中断发生的三个条件①中断源有中断请求;②此中断源的中断允许位为 1;③CPU 开中断(即 EA=1)。比如我们配置外部中断 0,对应的配置程序如下:EA=1;//打开总中断开关EX0=1;//开外部中断 0IT0=0/1;//设置外部中断的触发方式(下降沿触发)如果要配置的是外部中断 1,只需将 EX0 改为 EX1,IT0 改为 IT1在编写程序时通常我们会将外部中断的配置放到一个自定义函数内便于管理维护。如下伪代码所示:void Int0Init(){//设置 INT0IT0=1;//边沿触发方式(下降沿)EX0=1;//打开 INT0 的中断允许。EA=1;//打开总中断}/*当触发中断后即会进入中断服务函
发表于 2023-01-12
小广播
设计资源 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2023 EEWORLD.com.cn, Inc. All rights reserved