BetaFlight模块设计之九:气压计任务分析
BetaFlight模块设计之九:气压计任务分析
- 气压计任务
- taskUpdateBaro气压计任务函数
- baroUpdate气压计数据更新函数
- 气压计配置
基于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模块设计之九:气压计任务分析相关推荐
- BetaFlight模块设计之八:GPS任务分析
BetaFlight模块设计之八:GPS任务分析 GPS任务 gpsUpdate函数分析 gpsNewData函数分析 gpsNewFrame函数分析 onGpsNewData 函数分析 基于Beta ...
- BetaFlight模块设计之七:LEDSTRIP任务分析
BetaFlight模块设计之七:LEDSTRIP任务分析 1. LEDSTRIP任务 2. ledStripUpdate函数分析 2.1 StatusProfile 2.2 SimpleProfil ...
- BetaFlight模块设计之二十九:滤波模块分析
BetaFlight模块设计之二十九:滤波模块分析 滤波模块 滤波类型 1. slewFilter 2. simpleLowpassFilter 3. laggedMovingAverage 4. p ...
- BetaFlight模块设计之十:磁力计任务分析
BetaFlight模块设计之十:磁力计任务分析 磁力计任务 taskUpdateMag函数分析 compassUpdate函数分析 磁力计配置 基于BetaFlight开源代码框架简介的框架设计,逐 ...
- BetaFlight模块设计之二:SERIAL任务分析
BetaFlight模块设计之二:SERIAL任务分析 SERIAL任务 1.总体情况 2.主要函数分析 2.1 taskHandleSerial任务 2.2 命令行处理函数cliProcess 2. ...
- BetaFlight模块设计之二十六:接收机任务分析
BetaFlight模块设计之二十六:接收机任务分析 接收机任务 配置情况 硬件配置 软件配置 驱动配置 sbus驱动函数分析 sbusDataReceive函数 sbusFrameStatus函数 ...
- BetaFlight模块设计之十二:电传任务分析
BetaFlight模块设计之十二:电传任务分析 电传任务 taskTelemetry任务分析 subTaskTelemetryPollSensors函数分析 telemetryProcess函数分析 ...
- BetaFlight模块设计之十七:pinioBox任务分析
BetaFlight模块设计之十七:pinioBox任务分析 pinioBox任务 业务配置 硬件配置 pinioBoxUpdate任务分析 基于BetaFlight开源代码框架简介的框架设计,逐步分 ...
- BetaFlight模块设计之二十四:transponder任务分析
BetaFlight模块设计之二十四:transponder任务分析 transponder任务 配置情况 硬件配置 驱动配置 业务配置 初始化 MSP协议 三种IR transponder type ...
最新文章
- 中国科学院大学研一课程教材课件共享项目
- Linux Shell中的延时函数
- lzg_ad:使用OPENROWSET函数连接并访问远程数据库数据
- div+css+theme
- 低成本运行 Spark 数据计算
- error gyp ERR! stack Error: Could not find any Visual Studio installation to use
- 正则表达式基础知识,持续更新…
- 淘宝SDK easing属性(旋转木马)
- ftp断点下载工具,推荐6款好用的ftp断点下载工具,怎么使用
- w550 白屏解决办法
- 倪光南:友友云计算中间件体现后发优势
- 如何在视频中添加水印?给视频添加水印方法
- up考研资料更新目录
- java 文件拷贝保留原来的属性_Java常用属性拷贝工具类使用总结
- WIndow10下安装UR机器人接口ur_rtde
- WebView实现改变选中区域颜色以及添加下划线
- kali linux 打不开终端的问题
- python人工智能课程设计_中小学课程设计:以计算思维培养为核心的人工智能课程设计与实践...
- 基于requests和lxml库爬取优信二手车
- 一个屌丝脱屌的经历【转载】
热门文章
- 千里馬高中率免杀网馬賀歲版算法注册机 Code.By.HackWm[D.S.T].
- notes java api_lotus-notes-使用Java API读取Lotus Notes文档
- pdfbox 转图片中文乱码处理
- STM32课程设计--数字时钟+数字电压表+扩展功能--从零开始
- Oracle 专用服务器与共享服务器的区别
- android Studio keytool' 不是内部或外部命令,也不是可运行的程序 或批处理文件
- Virtual Drive Manager V1.3.2(小巧实用的虚拟光驱)绿色版
- Java常用类全面解析(含部分源码)
- 不买NAS搭建私有云盘:虚拟机安装群晖 1-5
- 使用Unity模拟人群疏散的资料整理