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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值