PX4模块设计之四十四: bmp280模块

2023-05-16

int bmp280_main(int argc, char *argv[]);

PX4模块设计之四十四: bmp280模块

  • 1. bmp280模块简介
  • 2. 模块入口函数
    • 2.1 主入口bmp280_main
    • 2.2 自定义子命令custom_command
    • 2.3 模块状态print_status【重载】
  • 3. bmp280模块重要函数
    • 3.1 模块启动ThisDriver::module_start
    • 3.2 模块停止ThisDriver::module_stop
    • 3.3 模块状态ThisDriver::module_status
    • 3.4 设备实例对象初始化BMP280::instantiate
    • 3.5 BMP280设备实例对象初始化BMP280::init
    • 3.6 设备实例对象任务I2CSPIDriver::Run()
    • 3.7 BMP280设备实例对象任务BMP280::RunImpl
  • 4. 总结
  • 5. 参考资料

1. bmp280模块简介

bmp280 <command> [arguments...]
 Commands:
   start
     [-I]        Internal I2C bus(es)
     [-X]        External I2C bus(es)
     [-s]        Internal SPI bus(es)
     [-S]        External SPI bus(es)
     [-b <val>]  board-specific bus (default=all) (external SPI: n-th bus
                 (default=1))
     [-c <val>]  chip-select pin (for internal SPI) or index (for external SPI)
     [-m <val>]  SPI mode
     [-f <val>]  bus frequency in kHz
     [-q]        quiet startup (no message if no device found)
     [-a <val>]  I2C address
                 default: 118
     [-s]        Internal SPI bus(es)
     [-S]        External SPI bus(es)
     [-b <val>]  board-specific bus (default=all) (external SPI: n-th bus
                 (default=1))
     [-c <val>]  chip-select pin (for internal SPI) or index (for external SPI)
     [-m <val>]  SPI mode
     [-f <val>]  bus frequency in kHz
     [-q]        quiet startup (no message if no device found)

   stop

   status        print status info

注1:print_usage函数是具体对应实现。

class BMP280 : public I2CSPIDriver<BMP280>
class I2CSPIDriver : public I2CSPIDriverBase
class I2CSPIDriverBase : public px4::ScheduledWorkItem, public I2CSPIInstance
class ScheduledWorkItem : public WorkItem
class WorkItem : public IntrusiveSortedListNode<WorkItem *>, public IntrusiveQueueNode<WorkItem *>
class I2CSPIInstance : public ListNode<I2CSPIInstance *>


BMP280  //类继承关系
 └──> I2CSPIDriver
     └──> I2CSPIDriverBase
         ├──> px4::ScheduledWorkItem
         │   └──> WorkItem
         │       ├──> IntrusiveSortedListNode
         │       └──> IntrusiveQueueNode
         └──> I2CSPIInstance
             └──> ListNode

注2:BMP280模块就是针对BMP280硬件芯片进行管理和数据采集的模块。

2. 模块入口函数

2.1 主入口bmp280_main

模块支持start/stop/status命令,除此以外支持BusCLIArguments的I2C/SPI默认参数选项"RXIa:Ssc: m:kb:f:q"。

bmp280_main
 ├──> using ThisDriver = BMP280;
 ├──> BusCLIArguments cli{true, true};
 ├──> <CONFIG_I2C>
 │   ├──> cli.i2c_address = 0x76;
 │   └──> cli.default_i2c_frequency = 100 * 1000;
 ├──> <CONFIG_SPI>
 │   └──> cli.default_spi_frequency = 10 * 1000 * 1000;
 ├──> const char *verb = cli.parseDefaultArguments(argc, argv)
 ├──> <!verb>
 │   ├──> ThisDriver::print_usage()
 │   └──> return -1
 ├──> BusInstanceIterator iterator(MODULE_NAME, cli, DRV_BARO_DEVTYPE_BMP280)
 ├──> <!strcmp(verb, "start")>
 │   └──> return ThisDriver::module_start(cli, iterator)   //模块启动
 ├──> <(!strcmp(verb, "stop")>
 │   └──> return ThisDriver::module_stop(iterator)  //模块停止
 ├──> <!strcmp(verb, "status")>
 │   └──> return ThisDriver::module_status(iterator)  //模块状态
 ├──> ThisDriver::print_usage()
 └──> return -1

2.2 自定义子命令custom_command

注:该模块采用了纯C语言代码实现,在main函数中直接执行命令,无需ModuleBase的custom_command重载实现。

2.3 模块状态print_status【重载】

该模块采用了纯C语言代码实现,在main函数中直接执行ThisDriver::print_usage()函数,无需ModuleBase的模块状态print_status重载实现。

BMP280::print_usage

void
BMP280::print_usage()
{
	PRINT_MODULE_USAGE_NAME("bmp280", "driver");
	PRINT_MODULE_USAGE_SUBCATEGORY("baro");
	PRINT_MODULE_USAGE_COMMAND("start");
#if defined(CONFIG_I2C)
	PRINT_MODULE_USAGE_PARAMS_I2C_SPI_DRIVER(true, true);
	PRINT_MODULE_USAGE_PARAMS_I2C_ADDRESS(0x76);
#else
	PRINT_MODULE_USAGE_PARAMS_I2C_SPI_DRIVER(false, true);
#endif
	PRINT_MODULE_USAGE_DEFAULT_COMMANDS();
}

3. bmp280模块重要函数

3.1 模块启动ThisDriver::module_start

启动过程会将以下驱动信息关联到设备实例上:

  1. static I2CSPIDriverBase *BMP280::instantiate(const I2CSPIDriverConfig &config, int runtime_instance)
  2. int BMP280::init()
  3. void BMP280::RunImpl()
  4. void I2CSPIDriver::Run() final
ThisDriver::module_start(BMP280::module_start)
 └──> I2CSPIDriver::module_start
     └──> I2CSPIDriverBase::module_start

注:I2CSPIDriverBase::module_start会进行第一次的Run激活(px4::WorkItemSingleShot)。

3.2 模块停止ThisDriver::module_stop

ThisDriver::module_stop(BMP280::module_stop)
 └──> I2CSPIDriverBase::module_stop

注:I2CSPIDriverBase类的通用方法,不在这里展开。

3.3 模块状态ThisDriver::module_status

ThisDriver::module_status(BMP280::module_status)
 └──> I2CSPIDriverBase::module_status

注:I2CSPIDriverBase类的通用方法,不在这里展开。

3.4 设备实例对象初始化BMP280::instantiate

该方法在I2CSPIDriverBase::module_start函数里面调用,其目的是新建一个设备对象实例,并进行初始化。

BMP280::instantiate
 ├──> bmp280::IBMP280 *interface = nullptr;
 ├──> <CONFIG_I2C><config.bus_type == BOARD_I2C_BUS>
 │   └──> interface = bmp280_i2c_interface(config.bus, config.i2c_address, config.bus_frequency);
 ├──> <CONFIG_SPI><config.bus_type == BOARD_SPI_BUS>
 │   └──> interface = bmp280_spi_interface(config.bus, config.spi_devid, config.bus_frequency, config.spi_mode);
 ├──> <interface == nullptr>
 │   ├──> PX4_ERR("failed creating interface for bus %i", config.bus);
 │   └──> return nullptr;
 ├──> <interface->init() != OK>  // I2C/SPI总线初始化
 │   ├──> delete interface;
 │   ├──> PX4_DEBUG("no device on bus %i", config.bus);
 │   └──> return nullptr;
 ├──> BMP280 *dev = new BMP280(config, interface);   // 新建一个BMP280设备对象实例
 ├──> <dev == nullptr>
 │   ├──> delete interface;
 │   └──> return nullptr;
 ├──> <OK != dev->init()>   // BMP280设备对象实例初始化
 │   ├──> delete dev;
 │   └──> return nullptr;
 └──> return dev;

3.5 BMP280设备实例对象初始化BMP280::init

BMP280设备实例对象初始化

BMP280::init
 ├──> [reset sensor]
 ├──> [check id]
 ├──> [set config, recommended settings]
 ├──> [get calibration and pre process them]
 ├──> Start()   // 重置模块状态机,然后触发ScheduleNow
 └──> return OK

3.6 设备实例对象任务I2CSPIDriver::Run()

BMP280设备初始化时以及设置定时时间,定时轮询Run过程,并调用业务实现方法RunImpl。

I2CSPIDriver::Run
 ├──> static_cast<T *>(this)->RunImpl()
 └──> <should_exit()>
     └──> exit_and_cleanup()  //优雅退出处理

3.7 BMP280设备实例对象任务BMP280::RunImpl

根据BMP280模块业务状态机变化,进行业务操作,发布sensor_baro消息。

BMP280::RunImpl
 ├──> <_collect_phase>
 │   └──> collect();  // 获取测试数据,并发布sensor_baro消息
 ├──> <else>
 │   └──> measure();  // 触发一次测试
 └──> ScheduleDelayed(_measure_interval);

4. 总结

具体逻辑业务后续再做深入,从模块代码角度:

  • 输入: 芯片(硬件:bmp280)

  • 输出: sensor_baro消息

uORB::PublicationMulti<sensor_baro_s> _sensor_baro_pub{ORB_ID(sensor_baro)};

5. 参考资料

【1】PX4开源软件框架简明简介
【2】PX4模块设计之十一:Built-In框架
【3】PX4模块设计之十二:High Resolution Timer设计
【4】PX4模块设计之十三:WorkQueue设计
【5】PX4模块设计之十七:ModuleBase模块
【6】PX4模块设计之三十:Hysteresis类
【7】PX4 modules_main
【8】PX4模块设计之四十一:I2C/SPI Bus Instance基础知识

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PX4模块设计之四十四: bmp280模块 的相关文章

  • PX4与TX2通信

    PX4与TX2通信以及相关数据的获取 目录 1 PX4硬件接口 2 TELEM1 2接口线序 3 PX4与TX2通信 PX4 IO口定义 xff1a PX4硬件 xff1a 4 通信测试 5 RTPS 43 ROS Jetson TX2终端
  • PX4通过I2C方式添加自定义传感器(3)

    添加自定义传感器并实现数据的发送和订阅 1 前期准备 1 1 建立文件夹和相关文件配置 我是在src drivers distance sensor文件夹下操作的 xff0c 当然其他文件夹下都类似 首先建立了两个文件夹angle sour
  • 【8-12】树莓派部署t265+px4飞控实现无人机视觉定位

    在之前的文章中 xff0c 我们已经成功在树莓派 xff08 ubuntu mate 18 04 xff09 上部署了T265的追踪摄像头 本文将利用MAVROS协议 xff0c 将T265测量的位姿信息发送给px4固件 xff0c 实现室
  • px4: v2的主板刷写v2的固件

    v2的主板刷写v2的固件 fengxuewei 64 fengxuewei Legion Y7000 2019 PG0 src Firmware changwei rc span class token function make span
  • 基于F4/F7/H7飞控硬件和px4飞控固件的廉价自主无人机系统(1)-飞控

    前言 穿越机F4 F7 H7飞控是一系列采用stm32系列F4xx和F7xx处理器的飞控的统称 xff0c 是目前穿越机爱好者非常喜欢使用的飞控硬件 xff0c 其价格也非常便宜180 xff5e 410 而px4则是一款常见的开源飞控固件
  • PX4 Bootloader下载及编译过程中的问题解决

    买来的雷迅的板子都是Bootloader已经烧进去了 xff0c Fireware也已经刷进去了 如果是自制的板子 xff0c 上位机根本没法识别板子 xff0c 必须先烧写下载Bootloader后编译好的bin文件 这篇记一下自己下载及
  • px4源码编译指南

    px4源码编译指南 强烈推荐大家去看官网的英文文档 xff0c 国内的博客杂七杂八 xff0c 官网的中文也很久没有更新 xff0c 这几天自己踩了很多坑 xff0c 写个教程希望能帮助到大家 xff08 本文选用平台是pixhawk1 1
  • PX4模块设计之六:PX4-Fast RTPS(DDS)简介

    64 TOC PX4模块设计之六 xff1a PX4 Fast RTPS DDS 简介 基于PX4开源软件框架简明简介的框架设计 xff0c 逐步分析内部模块功能设计 PX4 Fast RTPS DDS 具有实时发布 订阅uORB消息接口
  • PX4模块设计之十三:WorkQueue设计

    PX4模块设计之十三 xff1a WorkQueue设计 1 WorkQueue启动2 WorkQueue接口2 1 基本接口2 2 辅助接口2 3 WorkQueue任务函数2 3 1 Flat Build2 3 2 Protected
  • PX4模块设计之十八:Logger模块

    PX4模块设计之十八 xff1a Logger模块 1 Logger模块简介2 模块入口函数2 1 主入口logger main2 2 自定义子命令Logger custom command2 3 日志主题uORB注册 3 重要实现函数3
  • PX4模块设计之二十三:自定义FlightTask

    PX4模块设计之二十三 xff1a 自定义FlightTask Step1 创建飞行模式文件夹Step2 创建飞行模式源代码和CMakeLists txt文件Step3 更新CMakeLists txt文件Step4 更新FlightTas
  • PX4模块设计之四十五:param模块

    PX4模块设计之四十五 xff1a param模块 1 param模块简介2 模块入口函数param main3 重要函数列表4 总结5 参考资料 1 param模块简介 Description Command to access and
  • 玩转X-CTR100 l STM32F4 l BMP280气压计传感器

    我造轮子 xff0c 你造车 xff0c 创客一起造起来 xff01 塔克创新资讯 塔克社区 www xtark cn 塔克博客 www cnblogs com xtark 本文介绍X CTR100控制器 扩展BMP280气压计传感器 xf
  • px4_simple_example和uorb机制

    px4 simple app PX4 Autopilot src exampes px4 simple app xff0c 这个程序是用c语言调用orb API和poll机制订阅和发布通讯数据 xff0c 但是这个例子并不是既有接收又有发送
  • Px4源码框架结构图

    此篇blog的目的是对px4工程有一个整体认识 xff0c 对各个信号的流向有个了解 xff0c 以及控制算法采用的控制框架 PX4自动驾驶仪软件 可分为三大部分 xff1a 实时操作系统 中间件和飞行控制栈 1 NuttX实时操作系统 提
  • PX4模块设计之二十七:LandDetector模块

    PX4模块设计之二十七 xff1a LandDetector模块 1 LandDetector模块简介2 模块入口函数2 1 主入口land detector main2 2 自定义子命令custom command 3 LandDetec
  • 【PX4 飞控剖析】06 树莓派加载安装ROS,Mavros以及PX4固件

    PX4 飞控剖析 06 树莓派加载安装Mavros以及PX4固件 1 树莓派 刷镜像1 1 用Win32DiskImager刷入ubuntu mate 16 04 2 desktop armhf raspberry pi的镜像 1 2 开机
  • PX4项目学习::(七)飞控栈:commander

    PX4的飞行控制程序通过模块来实现 xff0c 与飞控相关的模块主要有commander xff0c navigator xff0c pos control xff0c att control这几个 xff0c 分别可以在src modul
  • 大神浅谈无人机飞控软件设计 系统性总结

    写在前面 深感自己对飞控软件 算法的知识点过于杂乱 很久没有进行系统的总结了 因此决定写几篇文章记录一些飞控开发过程的知识点 主要是针对一些软件 算法部分进行讨论 如内容有错误 欢迎指出 1 飞控软件的基本模块 无人机能够飞行主要是依靠传感
  • 用STM32F030F4的SPI总线获取BMP280的气压和温度

    1 用STM32Cube MX生成SPI总线的初始化函数 static void BMP280 SPI Init void LL SPI InitTypeDef SPI InitStruct 0 LL GPIO InitTypeDef GP

随机推荐