资源简介

STM32F1单片机+四元数欧拉角姿态解算+MPU6050+HMC5883L+MS5611+曲线打印完整工程代码. 燕骏编程规范: https://download.csdn.net/download/zzw5945/10397028 燕骏串口打印曲线上位机: https://download.csdn.net/download/zzw5945/10397194

资源截图

代码片段和文件信息

/*
***********************************************************************
*                YanJunFly V1.0 - Copyright (c) 2017
* All rights reserved.More information please browse www.yanjuntech.cn
*                  燕骏智控——以极客技术推进工程教育
*             手把手教你,如何从头开始做一个电子设计类项目。
* 我们将以 四轴飞行器 为项目载体,带领大家进行项目式学习做出属于自己的四旋翼。

* 其他声明:
* 对代码中产生的bug,本人不承担任何直接或间接的损害赔偿
* 若使用本代码即视为默认本条款。若发现bug,请将详细信息
* 发送下面链接至评论区,谢谢!
* http://www.yanjuntech.cn/forum.php?gid=87
*
* 文件名称:control.ccontrol.h
* 文件摘要:无
*
* 注意事项:
* 1、有的32型号没有 定时器5678 如STM32F103RBT6 使用stm32cube查看
* 2、外设时钟初始化的时候,鼠标右键 进底层看看时钟函书 上面的注释,有没有对应好
* 如 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 ENABLE);
* 3、各种中断 如果不知道,是哪个中断名字,可以复制一下,ctrl + f,然后使用find in files
* 在文件中查找,能分方便的查出来,如已知:TIM3_IRQHandler,想查定时器1的中断服务函数
* ctrl+f快捷键,弹出查找 find in files ,然后点击查找结果 即可找到 TIM1_UP_IRQHandler
*
* 当前版本:v1.0
* 当前作者:YJ_朱子文
* 完成日期:2017-3-16 17:45:05
* 改动说明:创建文件
*
* 取代版本:无
* 原 作 者:YJ_朱子文
* 完成日期:2017-3-16 17:45:05
***********************************************************************
*/

#include “./Control/control.h“

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

/* 声明实时姿态数据 */
CONTROL_AttitudeDataTypedef x_AttitudeNow = 
{
{0.0f0.0f0.0f}
{0.0f0.0f0.0f}
{0.0f0.0f0.0f}
{0.0f0.0f0.0f}
};

/*
***********************************************************************
*函数名称:void TIM3_IRQHandler(void)  
*函数功能:定时器3中断服务函数
*
*使用说明:硬件自动调用
*入口参数:无
*返 回 值:无
*
*函数作者:YJ_朱子文
*创建日期:2017-3-17 09:58:14
***********************************************************************
*/

extern float f_AccInertiaAfterFilter;

void TIM3_IRQHandler(void)   
{
/* SENSOR_SensorTypedef该数据类型在sensor.h文件中 */
static SENSOR_SensorTypedef x_SensorData ={0};
/* 大地坐标系(惯性坐标系)下的加速度值 这个驱动工程中没有使用到
 实际上在IMU.C姿态解算 四元数转欧拉角算法中 计算的数据。
 在这里定义了这个结构体变量,是因为总工程中的sensor中用到了
*/
static CONTROL_3FloatDataTypedef x_AccInertia = {0.0f};
/* 用于分频的系数 */
static uint32_t ui_Timer30Ms = 0;
static uint32_t ui_Timer2Ms = 0;

/* 判断是否更新中断 UIF 位是否置位 */
if (TIM3->SR & (uint32_t)(1)) 
{
/* 每1ms调用一次数据读取函数 */
vSensorDataRead(&x_SensorData(SENSOR_3FloatDataTypedef *)&x_AccInertia);

if(++ui_Timer2Ms > 2)
{
ui_Timer2Ms = 0;
/* 调用姿态解算函数 */
vImuUpdate((IMU_AttitudeTypedef *)&x_AttitudeNow
 (IMU_SensorTypedef *)&x_SensorData
 (IMU_3FloatTypedef *)&x_AccInertia);

/* 由于这里IMU是反着放的 放在了飞机背面 所以要经过计算处理才能得到真正的角度数据 */

x_AttitudeNow.x_OriginalAngle.f_X = x_AttitudeNow.x_OriginalAngle.f_X;
if(x_AttitudeNow.x_OriginalAngle.f_Y > 0.0f)
{
x_AttitudeNow.x_OriginalAngle.f_Y = (x_AttitudeNow.x_OriginalAngle.f_Y - 180.0f);
}else 
{
x_AttitudeNow.x_OriginalAngle.f_Y = (x_AttitudeNow.x_OriginalAngle.f_Y + 180.0f);
}

/* 减去地面起飞偏置的角度值 得到现在正确角度 */
x_AttitudeNow.x_AngleNow.f_X = x_AttitudeNow.x_OriginalAngle.f_X - x_SensorCaliInitData.x_AngleInitData.f_X;
x

评论

共有 条评论