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模块设计之十七:pinioBox任务分析