BetaFlight模块设计之九:气压计任务分析
Posted lida2003
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BetaFlight模块设计之九:气压计任务分析相关的知识,希望对你有一定的参考价值。
BetaFlight模块设计之九:气压计任务分析
基于BetaFlight开源代码框架简介的框架设计,逐步分析内部模块功能设计。
气压计任务
描述:气压计主要测量温度和气压实时参数,并根据公式计算距离水平面的垂直高度。
注:这里要区分距离水平面的垂直高度和距离地面的垂直高度是不一样的。
├──> 初始化
│ ├──> [v]硬件初始化baroPreInit/baroDetect/bmp280Detect/bmp280BusInit/pgResetFn_barometerConfig
│ └──> [x]业务初始化
├──> 任务
│ ├──> [x]实时任务
│ ├──> [x]事件任务
│ └──> [v]时间任务[TASK_BARO] = DEFINE_TASK("BARO", NULL, NULL, taskUpdateBaro, TASK_PERIOD_HZ(20), TASK_PRIORITY_LOW),
├──> 驱动
│ ├──> [v]查询bmp280StartUP/bmp280ReadUP/bmp280GetUP
│ └──> [x]中断
└──> 接口
└──> void baroSetGroundLevel(void)
taskUpdateBaro气压计任务函数
配置SENSOR_BARO就执行更新函数baroUpdate,遇到异常重新规划下次任务执行时间rescheduleTask。
taskUpdateBaro
└──> <sensors(SENSOR_BARO)>
├──> const uint32_t newDeadline = baroUpdate(currentTimeUs);
└──> <newDeadline != 0>
└──> rescheduleTask(TASK_SELF, newDeadline);
baroUpdate气压计数据更新函数
这个模块框架看,数据获取分为两段:【BARO_STATE_TEMPERATURE】【BARO_STATE_PRESSURE】
由于Kakute F7 AIO采用的是BMP280气压计,温度和气压数值可以一次性读取,所以统一在【BARO_STATE_PRESSURE】处理,相信能看到这里的都是比较熟悉代码的了。驱动代码详见:bmp280StartUP/bmp280ReadUP/bmp280GetUP。
baroUpdate
├──> <busBusy(&baro.dev.dev, NULL)>
│ ├──> schedulerIgnoreTaskStateTime();
│ └──> return sleepTime;
├──> <BARO_STATE_TEMPERATURE_START>
│ ├──> baro.dev.start_ut(&baro.dev);
│ ├──> state = BARO_STATE_TEMPERATURE_READ;
│ └──> sleepTime = baro.dev.ut_delay;
├──> <BARO_STATE_TEMPERATURE_READ>
│ ├──> [baro.dev.read_ut(&baro.dev)]
│ ├──> <读取温度命令成功>
│ │ └──> state = BARO_STATE_TEMPERATURE_SAMPLE;
│ └──> <读取温度命令失败>
│ └──> schedulerIgnoreTaskExecTime
├──> <BARO_STATE_TEMPERATURE_SAMPLE>
│ ├──> [baro.dev.get_ut(&baro.dev)]
│ ├──> [<获取温度值成功>
│ │ └──> state = BARO_STATE_PRESSURE_START;
│ └──> [<获取温度值失败>
│ └──> schedulerIgnoreTaskExecTime
├──> <BARO_STATE_PRESSURE_START>
│ ├──> baro.dev.start_up(&baro.dev);
│ ├──> state = BARO_STATE_PRESSURE_READ;
│ └──> sleepTime = baro.dev.up_delay;
├──> <BARO_STATE_PRESSURE_READ>
│ ├──> [baro.dev.read_up(&baro.dev)]
│ ├──> <读取压力命令成功>
│ │ └──> state = BARO_STATE_PRESSURE_SAMPLE;
│ └──> <读取压力命令失败>
│ └──> schedulerIgnoreTaskExecTime
├──> <BARO_STATE_PRESSURE_SAMPLE>
│ ├──> [baro.dev.get_up(&baro.dev)]
│ ├──> <获取压力值失败>
│ │ ├──> schedulerIgnoreTaskExecTime
│ │ └──> break
│ └──> <获取压力值成功>
│ ├──> baro.dev.calculate(&baroPressure, &baroTemperature);
│ ├──> baroPressureSum = recalculateBarometerTotal(baroPressureSum, baroPressure);
│ ├──> <baro.dev.combined_read>[state = BARO_STATE_PRESSURE_START;]
│ ├──> <!baro.dev.combined_read>[state = BARO_STATE_TEMPERATURE_START;
│ └──> sleepTime = baro.dev.ut_delay;]
├──> <sleepTime != baro.dev.ut_delay>
│ └──> schedulerIgnoreTaskExecRate
├──> 记录barometerState下执行最大所需时间
├──> schedulerSetNextStateTime(baroStateDurationUs[state]);
└──> return sleepTime;
气压计配置
注:\\src\\main\\target\\KAKUTEF7\\target.h
#define USE_BARO
#define USE_BARO_BMP280
#define BARO_I2C_INSTANCE I2C_DEVICE
以上是关于BetaFlight模块设计之九:气压计任务分析的主要内容,如果未能解决你的问题,请参考以下文章