STM32F103ZE+mpu6050+hmc5883L通过卡尔曼滤波串口输出姿态角

2020-08-06来源: 互联网关键字:STM32F103ZE  mpu6050  hmc5883L  卡尔曼滤波  串口输出  姿态角

单片机源程序如下:

/* main.c file

功能:

1.初始化各个传感器,

2.运行姿态解算和高度测量

3.将解算的姿态和各个传感器的输出上传到 MiniIMU AHRS 测试软件

4.响应 PC发送的命令

------------------------------------

*/


#include "common.h"  //包含所有的驱动 头文件


//上传数据的状态机

#define REIMU  0x01 //上传解算的姿态数据

#define REMOV  0x02        //上传传感器的输出

#define REHMC  0x03        //上传磁力计的标定值


#define Upload_Speed  15   //数据上传速度  单位 Hz

#define upload_time (1000000/Upload_Speed)/2  //计算上传的时间。单位为us


int16_t ax, ay, az;       

int16_t gx, gy, gz;

int16_t hx, hy, hz;

int32_t Temperature = 0, Pressure = 0, Altitude = 0;

uint32_t system_micrsecond;

int16_t hmcvalue[3];

u8 state= REIMU;  //发送特定帧 的状态机

/**************************实现函数********************************************

*函数原型:                int main(void)

*功  能:                主程序

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

int main(void)

{

        int16_t Math_hz=0;

        unsigned char PC_comm; //PC 命令关键字节         

        float ypr[3]; // yaw pitch roll

        /* 配置系统时钟为72M 使用外部8M晶体+PLL*/      

    SystemInit();

        delay_init(72);                //延时初始化

    Initial_LED_GPIO();        //初始化STM32-SDK板子上的LED接口

        Initial_PWMLED();

        Initial_UART1(115200L);

        Initial_UART2(115200L);

        IIC_Init();         //初始化I2C接口

        delay_ms(300);        //等待器件上电

        //UART1_Put_String("Initialize...rn");

        AHRS_init(); //初始化IMU和传感器

        system_micrsecond=micros();


        while(1){        //主循环

               

        //delay_ms(1); //延时,不要算那么快。

        AHRS_getYawPitchRoll(ypr); //姿态更新

        printf("%f %f %frn",ypr[1],ypr[2],ypr[0]);

        Math_hz++; //解算次数 ++

        BMP180_Routing(); //处理BMP018 事务 开启转换和读取结果将在这个子程序中进行


//-------------上位机------------------------------

        //是否到了更新 上位机的时间了?

        if((micros()-system_micrsecond)>upload_time){

        switch(state){

        case REIMU:

        BMP180_getTemperat(&Temperature); //读取最近的温度值

        BMP180_getPress(&Pressure);           //读取最近的气压测量值

        BMP180_getAlt(&Altitude);           //读取相对高度

        //UART1_ReportIMU((int16_t)(ypr[0]*10.0),(int16_t)(ypr[1]*10.0),

        //(int16_t)(ypr[2]*10.0),Altitude/10,Temperature,Pressure/10,Math_hz*16);

        //UART2_ReportIMU((int16_t)(ypr[0]*10.0),(int16_t)(ypr[1]*10.0),

        //(int16_t)(ypr[2]*10.0),Altitude/10,Temperature,Pressure/10,Math_hz*Upload_Speed);

       

        Math_hz=0;

        state = REMOV; //更改状态。

        break;

        case REMOV:

        MPU6050_getlastMotion6(&ax, &ay, &az, &gx, &gy, &gz);

        HMC58X3_getlastValues(&hx,&hy,&hz);

        //UART1_ReportMotion(ax,ay,az,gx,gy,gz,hx,hy,hz);

        //UART2_ReportMotion(ax,ay,az,gx,gy,gz,hx,hy,hz);

        state = REIMU;

        break;

        default:

        state = REIMU;

        break;

        }//switch(state)                          

        system_micrsecond=micros();         //取系统时间 单位 us

        LED_Change();        //LED1改变亮度

        }

//--------------------------------------------------

        //处理PC发送来的命令

        if((PC_comm=UART2_CommandRoute())!=0xff)

        {

        switch(PC_comm){ //检查命令标识

        case Gyro_init:                        MPU6050_InitGyro_Offset(); break; //读取陀螺仪零偏

        case High_init:                        BMP180_ResetAlt(0);         break;                //气压高度 清零

        }

        }// 处理PC 发送的命令


        }//主循环 while(1) 结束


}  //main       


//------------------End of File----------------------------


关键字:STM32F103ZE  mpu6050  hmc5883L  卡尔曼滤波  串口输出  姿态角 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic505499.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:MAX30102空气质量监测模块STM32源程序与资料
下一篇:STM32 BH1750光线感应源程序

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

基于stm32f103ze+mpu9250通过官方DMP库串口输出角度
结构体        USART_InitTypeDef  USART_InitStructure;          //串口结构体定义        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1|RCC_APB2Periph_AFIO,ENABLE);        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE
发表于 2020-07-23
使用STM32CubeMX,生成STM32F103ZE SPI3 HAL 工程
1,选择芯片型号为STM32F103ZET6,开始工程,引脚配置如下:主要是RCC,SPI3,和SYS三个模块2,时钟配置,可按下图进行:3,SPI3配置,如下图,配完这一步其它可以不管,直接生成工程。4,生成工程,打开工程手动输入红框中内容。运行:成功输出波形。
发表于 2019-10-18
使用<font color='red'>STM32</font>CubeMX,生成<font color='red'>STM32F103ZE</font> SPI3 HAL 工程
STM32F103ZE FreeRTOS移植、测试
一、前期准备 单片机:STM32F103ZET6 开发环境:MDK5.14 库函数:标准库V3.5 FreeRTOS:V9.0.0(网上下载,官网上目前是V10.0.1)二、实验效果 总共6个任务,串口1、串口2、4个RGB小灯以不同频率闪烁。5050 RGB LED驱动请参考RGB驱动,串口1、2同时打印测试信息。 三、移植准备 下载好的FreeRTOS源码中,只需要把Source文件夹加入工程。 1.FreeRTOS内核文件,如下图所示,里面所有C文件加入到工程里面   2.将portable中无关文件夹删除掉,只留下
发表于 2019-05-08
<font color='red'>STM32F103ZE</font> FreeRTOS移植、测试
STM32F103ZE FreeRTOS任务创建与删除
_t xTaskToDelete //任务句柄 );四、测试代码 完整工程请加QQ:1002521871,验证:呵呵 。只附上与FreeRTOS相关的代码,其余串口,LED初始化请参考STM32F103ZE FreeRTOS移植、测试 rtos_app.h#ifndef __RTOS_APP_H__#define __RTOS_APP_H__#include "conf.h"#include "FreeRTOS.h"#include "task.h"#define     START_TASK_PRIO 
发表于 2019-05-08
<font color='red'>STM32F103ZE</font> FreeRTOS任务创建与删除
STM32F103ZEGPIO口的配置以流水灯为例
设置步骤:1.使能外设时钟如PA,PB,PE.2.设置成所需状态。这里是推挽输出 50Khz速率3.设置输出状态,是高电平还是低电平。可用ODR,BSRR,BSR均可设置。代码如下:#include “stm32f10x.h”extern void Stm32_Clock_Init(u8 PLL);void delay(u32 t)//简单延时函数,减计数 {     for(;t>0;t--); }void XYDRCC_DeInit(void) //复位时钟函数,一般可省略不写 {     RCC->APB1RSTR
发表于 2018-10-08
mpu6050 DMP库的移植
官方的运动库,必须通过这个才能启用MPU6050的DMP引擎(数据手册里完全不提这个东西,必须在官网注册登录后才有·····)里面的代码是基于msp430的,不过很容易就能移植到stm32上面唯一需要的就是得提供i2c读写接口,然后在#define i2c_write(a, b, c, d)   !I2C_BufferWrite(d, c, b, a)这里替换剩下的就是照着范例文件依次调用函数主要是这几个mpu_init();mpu_set_sensors(INV_XYZ_GYRO | INV_XYZ_ACCEL);mpu_configure_fifo(INV_XYZ_GYRO | INV_XYZ_ACCEL
发表于 2020-09-16
<font color='red'>mpu6050</font> DMP库的移植
小广播
何立民专栏 单片机及嵌入式宝典

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

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