BetaFlight模块设计之十:磁力计任务分析

Posted lida2003

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BetaFlight模块设计之十:磁力计任务分析相关的知识,希望对你有一定的参考价值。

BetaFlight模块设计之十:磁力计任务分析

基于BetaFlight开源代码框架简介的框架设计,逐步分析内部模块功能设计。

磁力计任务

描述:磁力计主要根据地球磁场感知方向,这里主要用于获取磁力计传感器数据,并通知相关任务或模块。

 ├──> 初始化
 │   ├──> [v]硬件初始化compassDetect(qmc5883lDetect/qmc5883lInit)/pgResetFn_compassConfig/compassPreInit
 │   └──> [v]业务初始化compassInit
 ├──> 任务
 │   ├──> [x]实时任务
 │   ├──> [x]事件任务
 │   └──> [v]时间任务[TASK_COMPASS] = DEFINE_TASK("COMPASS", NULL, NULL, taskUpdateMag, TASK_PERIOD_HZ(10), TASK_PRIORITY_LOW),
 ├──> 驱动
 │   ├──> [v]查询qmc5883lRead
 │   └──> [x]中断
 └──> 接口
     ├──> bool compassIsHealthy(void)
     └──> bool compassIsCalibrationComplete(void)

taskUpdateMag函数分析

配置SENSOR_MAG就执行更新函数compassUpdate,遇到异常重新规划下次任务执行时间rescheduleTask。

taskUpdateMag
 └──> sensors(SENSOR_MAG)
     ├──> const uint32_t newDeadline = compassUpdate(currentTimeUs);
     └──> <newDeadline != 0>
         └──> rescheduleTask(TASK_SELF, newDeadline);

compassUpdate函数分析

这里有个一30秒以上的FlashWrite操作,理论上来说EEFlash的寿命这种强度下,这种飞控场景失败概率不高可忽略。为什么要做这个保存?

注:这里我们Kakute F7 AIO是具备BlackBox的SD卡硬件功能的。

compassUpdate
 ├──> <busBusy(&magDev.dev, NULL) || !magDev.read(&magDev, magADCRaw)> //总线忙或者读取ADC数据失败
 │   ├──> schedulerIgnoreTaskExecRate
 │   └──> return 1000 // 1ms
 ├──> [更新三轴ADC数据]
 ├──> <ALIGN_CUSTOM>[alignSensorViaMatrix(mag.magADC, &magDev.rotationMatrix);]
 ├──> <magDev.magAlignment, internal>[alignSensorViaRotation(mag.magADC, magDev.magAlignment);]
 ├──> <第一次loop>[赋值初始化,使用compassConfigMutable()->magZero]
 ├──> <已校准>
 │   ├──> <30s以内>
 │   │   ├──> LED0_TOGGLE
 │   │   └──> 最大值最小值更新
 │   └──> <超出30s>
 │       ├──> magZero->raw取最大最小平均值
 │       └──> saveConfigAndNotify
 └──> return TASK_PERIOD_HZ(10);

磁力计配置

注:硬件配置\\src\\main\\target\\KAKUTEF7\\target.h

#define USE_MAG
#define USE_MAG_HMC5883
#define USE_MAG_QMC5883
#define USE_MAG_LIS3MDL
#define MAG_I2C_INSTANCE      I2C_DEVICE

以上是关于BetaFlight模块设计之十:磁力计任务分析的主要内容,如果未能解决你的问题,请参考以下文章

BetaFlight模块设计之十三:Gyro过滤任务分析

BetaFlight模块设计之十四:高度计算任务分析

BetaFlight模块设计之十七:pinioBox任务分析

BetaFlight模块设计之十五:RunCam设备任务分析

BetaFlight模块设计之十六:OSD更新任务分析

BetaFlight模块设计之十八:图传模块同步任务分析