PX4模块设计之二十四:内部ADC模块

2023-05-16

PX4模块设计之二十四:内部ADC模块

  • 1. 内部ADC模块简介
  • 2. 模块入口函数
    • 2.1 主入口board_adc_main
    • 2.2 自定义子命令custom_command
  • 3. 内部ADC模块重要函数
    • 3.1 task_spawn
    • 3.2 instantiate
    • 3.3 init
    • 3.4 Run
    • 3.5 sample
    • 3.6 其他函数
  • 4. 总结
  • 5. 参考资料

1. 内部ADC模块简介

该模块在ModuleBase基础命令上,新增定制test测试各个ADC通道采集的原始数据。

### Description
ADC driver.

adc <command> [arguments...]
 Commands:
   start

   test
     [-n]        Do not publish ADC report, only system power

   stop

   status        print status info

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

class ADC : public ModuleBase<ADC>, public px4::ScheduledWorkItem

注:ADC模块采用了ModuleBase和WorkQueue设计。

2. 模块入口函数

2.1 主入口board_adc_main

board_adc_main
 └──> return ADC::main(argc, argv);

2.2 自定义子命令custom_command

ADC::custom_command
 ├──> <!strcmp(verb, "test")><is_running()>
 │   └──> return _object.load()->test()
 └──> return print_usage("unknown command")

内部调用了测试函数test进行20次ADC数据更新(第一次)。

ADC::test
 ├──> px4_usleep(20000)  //等待20ms
 ├──> <!adc_sub_test.update(&adc)>
 │   └──> return 1
 ├──> PX4_INFO_RAW("DeviceID: %" PRId32 "\n", adc.device_id)
 ├──> PX4_INFO_RAW("Resolution: %" PRId32 "\n", adc.resolution)
 ├──> PX4_INFO_RAW("Voltage Reference: %f\n", (double)adc.v_ref)
 ├──> <for (unsigned l = 0; l < 20; ++l)>               // 更新20次ADC数据
 │   ├──> <for (unsigned i = 0; i < PX4_MAX_ADC_CHANNELS; ++i)>  // 将所有ADC有效通道进行原始数据更新
 │   │   └──> <adc.channel_id[i] >= 0>
 │   │       └──> PX4_INFO_RAW("% 2" PRId16 " :% 6" PRId32, adc.channel_id[i], adc.raw_data[i])
 │   ├──> PX4_INFO_RAW("\n")
 │   └──> px4_usleep(500000)  //等待500ms
 ├──> PX4_INFO_RAW("\t ADC test successful.\n")
 └──> return 0

3. 内部ADC模块重要函数

3.1 task_spawn

内部ADC模块采用了PX4 WorkQueue机制。

ADC::task_spawn
 ├──> ADC *instance = new ADC(SYSTEM_ADC_BASE, ADC_CHANNELS)
 ├──> <instance>
 │   ├──> _object.store(instance)
 │   ├──> _task_id = task_id_is_work_queue   // PX4 WorkQueue机制
 │   └──> <instance->init() == PX4_OK>
 │       └──> return PX4_OK
 ├──> <else>
 │   └──> PX4_ERR("alloc failed")
 ├──> delete instance
 ├──> _object.store(nullptr)
 ├──> _task_id = -1
 └──> return PX4_ERROR

内部ADC模块实际上使用了3个通道来检测电压,电流和RSSI ADC模拟信号。

#define ADC_CHANNELS \
	((1 << ADC_BATTERY_VOLTAGE_CHANNEL)       | \
	 (1 << ADC_BATTERY_CURRENT_CHANNEL)       | \
	 (1 << ADC_RSSI_IN_CHANNEL))

3.2 instantiate

注:鉴于该模块不采用任务(线程),所以ModuleBase::run_trampoline无需执行,所以可以不实现。

3.3 init

内部ADC模块数据采样间隔10ms(100Hz)。

ADC::init
 ├──> int ret_init = px4_arch_adc_init(_base_address)
 ├──> <ret_init < 0>
 │   ├──> PX4_ERR("arch adc init failed")
 │   └──> return ret_init
 ├──> ScheduleOnInterval(kINTERVAL, kINTERVAL)  // // schedule regular updates, 10ms
 └──> return PX4_OK

3.4 Run

当ScheduleOnInterval时间一到,HRT模块将会新增一个WorkQueue,此时WorkQueue会调用Run函数。

ADC::Run
 ├──> <_first_run>
 │   ├──> open_gpio_devices()
 │   └──> _first_run = false
 ├──> hrt_abstime now = hrt_absolute_time()
 ├──> <for (unsigned i = 0; i < _channel_count; i++)>
 │   └──> _samples[i].am_data = sample(_samples[i].am_channel)   //对每个通道进行数据采集
 ├──> update_adc_report(now)
 └──> update_system_power(now)

3.5 sample

ADC::sample
 ├──> perf_begin(_sample_perf)
 ├──> uint32_t result = px4_arch_adc_sample(_base_address, channel)
 ├──> <result == UINT32_MAX>
 │   └──> PX4_ERR("sample timeout")
 ├──> perf_end(_sample_perf)
 └──> return result

3.6 其他函数

【1】void ADC::update_adc_report(hrt_abstime now)
【2】void ADC::update_system_power(hrt_abstime now)

注:这里的接和uORB主题相关的消息发布函数,主要是将ADC模块的数据通过消息总线向PX4系统发布,让订阅这些主题的应用获取最新ADC数据。

4. 总结

基于PX4应用平台的HRT、WorkQueue、ModuleBase三个基础组件,ADC模块整体看上去并不复杂,且也易于理解。

注1:adc_report主要是MCU使用ADC管脚对ADC_BATTERY_VOLTAGE_CHANNEL、ADC_BATTERY_CURRENT_CHANNEL、ADC_RSSI_IN_CHANNEL三个通道进行数据采集。
注2:system_power主要针对飞控USB供电的情况所报告的系统电压,holybo_kakutef7板子就未使能这个功能。

5. 参考资料

【1】PX4开源软件框架简明简介
【2】PX4模块设计之十一:Built-In框架
【3】PX4模块设计之十二:High Resolution Timer设计
【4】PX4模块设计之十三:WorkQueue设计
【5】PX4模块设计之十七:ModuleBase模块
【6】PX4 modules_main

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

PX4模块设计之二十四:内部ADC模块 的相关文章

  • PX4 ---- Mixer

    文章目录 Mixer 混合控制 作用输入输出装载混控文件MAVROS代码解析总结示例MAINAUX Mixer 混合控制 作用 经过位置控制和姿态控制后 xff0c 控制量通过 actuator controls发布 xff0c 其中 co
  • PX4 ---- Indoor Flight

    文章目录 室内飞行ROS amp PX4Pose Data 飞机配置MAVROS 基于工训赛 VIO 飞行总结 室内飞行 ROS amp PX4 Pose Data 飞机配置 VIO 参考此处 xff0c 采用 T265 配置 相机与飞控机
  • PX4 -- EKF2

    文章目录 EKF2参数高度估计Range Finder滤波 单变量更新单变量更新对多变量的影响 EKF2 参数 EKF2 中有一类 GATE 参数 当测量值在 VAR GATE 范围内才会更新值 高度估计 四种高度控制方法 xff1a 气压
  • PX4模块设计之四:MAVLink简介

    PX4模块设计之四 xff1a MAVLink简介 1 MAVLink PX4 应用简介2 MAVLink v2 0新特性3 MAVLink协议版本4 MAVLink通信协议帧4 1 MAVLink v1 0 帧格式4 2 MAVLink
  • PX4模块设计之九:PX4飞行模式简介

    PX4模块设计之九 xff1a PX4飞行模式简介 关于模式的探讨1 需求角度1 1 多旋翼 MC multi copter 1 1 1 RC控制模式1 1 1 1 Position Mode1 1 1 2 Altitude Mode1 1
  • 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模块设计之三十一:ManualControl模块

    PX4模块设计之三十一 xff1a ManualControl模块 1 ManualControl模块简介2 模块入口函数2 1 主入口manual control main2 2 自定义子命令custom command 3 Manual
  • PX4模块设计之三十六:MulticopterPositionControl模块

    PX4模块设计之三十六 xff1a MulticopterPositionControl模块 1 MulticopterPositionControl模块简介2 模块入口函数2 1 主入口mc pos control main2 2 自定义
  • PX4模块设计之三十九:Commander模块

    PX4模块设计之三十九 xff1a Commander模块 1 Commander模块简介2 模块入口函数2 1 主入口commander main2 2 自定义子命令custom command 3 Commander模块重要函数3 1
  • mavros连接px4失败的usb-ttl原因

    问题描述 xff1a 最近在搞mavros xff0c 以方便协处理器和pixhawk通讯 xff0c 在按照官网教程安装mavros xff0c 设置px4 xff0c 连接硬件之后发现mavros卡在中间下不去 xff1a MAVROS
  • px4_simple_example和uorb机制

    px4 simple app PX4 Autopilot src exampes px4 simple app xff0c 这个程序是用c语言调用orb API和poll机制订阅和发布通讯数据 xff0c 但是这个例子并不是既有接收又有发送
  • PX4-4-任务调度

    PX4所有的功能都封装在独立的模块中 xff0c uORB是任务间数据交互和同步的工具 xff0c 而管理和调度每个任务 xff0c PX4也提供了一套很好的机制 xff0c 这一篇我们分享PX4的任务调度机制 我们以PX4 1 11 3版
  • Px4源码框架结构图

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

    终于还是走上了这一步 xff0c 对飞控下手 xff0c 可以说是一张白纸了 记录一下学习的过程方便以后的查阅 目录 一 ubuntu18 04配置px4编译环境及mavros环境 二 PX4的OffBoard控制 1 搭建功能包 2 编写
  • PX4:Policy “CMP0097“ is not known to this version of CMake.

    make px4 fmu v3 时报的错 CMake版本的问题 由https blog csdn net zhizhengguan article details 118380965推测 xff0c 删除cmake policy也没事 ma
  • RT-Thread记录(十四、I/O 设备模型之ADC设备)

    RT Thread ADC 设备学习使用 目录 前言 一 ADC 采样基础 1 1 ADC 通道 1 2 ADC 分辨率 1 3 ADC 采样计算 二 ADC 设备操作函数 2 1 查找 ADC 设备 2 2 使能 关闭 ADC 通道 2
  • 关于OELD屏显示电池电量的简易方法

    如何采集电源电压大家可能都熟悉 stm32的ADC DMA能很方便迅速的帮我们采集到自己想要的电压数据 使用DMA进行数据搬运也能很好的减轻CPU的一部分压力 但是这样只是第一步 数据 用户想看到的有时候并不是数据 他们想要更直观方便的看到
  • DSP T320F2803x 模数转换模块 ADC

    一 ADC 概览 1 1 特点 29803x 的 ADC 模块是12位循环 ADC 部分 SAR 部分流水线 其核心是 12 位的转换器 有两个采样保持器 可同时或顺序采样 通过多路复用后有 16 个模拟转换输入通道 转换器可以配置为与内部
  • SAR ADC基本原理学习

    今天我们来学习SAR ADC喽 逐次逼近寄存器型模数转换器 Successive Approximation Analog to Digital Converter 是一种常用的A D转换结构 其较低的功耗表现 还不错的转换速率 在有低功耗
  • 栅压自举采样电路(bootstrap技术)

    栅压自举采样电路 bootstrap技术 参考 CMOS模 数转换器设计与仿真 编著 张锋 陈铖颖 范军 文章目录 栅压自举采样电路 bootstrap技术 一 电路结构 二 工作原理 一 电路结构 二 工作原理

随机推荐

  • PX4开源软件框架简明简介

    PX4开源软件框架简明简介 1 PX4系统构架1 1 飞控 43 地面站 RC控制1 2 飞控 43 伴飞电脑 43 地面站 集成RC控制 2 PX4软件构架2 1 设计概念2 2 软件构架2 1 中间件2 2 飞控代码 3 PX4运行环境
  • PX4模块设计之一:SITL & HITL模拟框架

    PX4模块设计之一 xff1a SITL amp HITL模拟框架 1 模拟框架1 1 SITL模拟框架1 2 HITL模拟框架 2 模拟器类型3 MAVLink API4 总结 基于PX4开源软件框架简明简介的框架设计 xff0c 逐步分
  • PX4模块设计之二:uORB消息代理

    PX4模块设计之二 xff1a uORB消息代理 1 uORB模块接口1 1 uORB服务接口1 2 uORB消息注册 去注册接口1 3 uORB消息发布接口1 4 uORB消息订阅 去订阅接口1 5 uORB辅助功能接口2 Hello W
  • PX4模块设计之三:自定义uORB消息

    PX4模块设计之三 xff1a 自定义uORB消息 1 新增自定义uORB消息步骤2 应用ext hello world消息示例3 编译执行结果4 参考资料 基于PX4开源软件框架简明简介和PX4模块设计之二 xff1a uORB消息代理
  • PX4模块设计之四:MAVLink简介

    PX4模块设计之四 xff1a MAVLink简介 1 MAVLink PX4 应用简介2 MAVLink v2 0新特性3 MAVLink协议版本4 MAVLink通信协议帧4 1 MAVLink v1 0 帧格式4 2 MAVLink
  • PX4模块设计之五:自定义MAVLink消息

    PX4模块设计之五 xff1a 自定义MAVLink消息 1 MAVLink Dialects1 1 PX4 Dialects1 2 Paprazzi Dialects1 3 MAVLink XML File Format 2 添加自定义M
  • PX4模块设计之六:PX4-Fast RTPS(DDS)简介

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

    PX4模块设计之九 xff1a PX4飞行模式简介 关于模式的探讨1 需求角度1 1 多旋翼 MC multi copter 1 1 1 RC控制模式1 1 1 1 Position Mode1 1 1 2 Altitude Mode1 1
  • PX4模块设计之十:PX4启动过程

    PX4模块设计之十 xff1a PX4启动过程 1 硬件 飞控硬件上电2 硬件 飞控硬件初始化3 硬件 43 软件 飞控bootloader初始化4 硬件 43 软件 飞控系统初始化5 软件 飞控应用初始化6 配置 SD卡配置文件6 1 e
  • atop安装和使用

    atop就是一款用于监控Linux系统资源与进程的工具 xff0c 它以一定的频率记录系统的运行状态 xff0c 所采集的数据包含系统资源 CPU 内存 磁盘和网络 使用情况和进程运行情况 xff0c 并能以日志文件的方式保存在磁盘中 at
  • PX4模块设计之十一:Built-In框架

    PX4模块设计之十一 xff1a Built In框架 1 Nuttx Built In框架2 PX4 Built In框架2 1 NSH Built In关联文件2 2 NSH Built In关联文件生成2 3 NSH Built In
  • PX4模块设计之十二:High Resolution Timer设计

    PX4模块设计之十二 xff1a High Resolution Timer设计 1 HRT模块特性2 HRT模块基本功能2 1 循环触发接口2 2 延迟触发接口2 3 定时触发接口2 4 其他功能 3 HRT模块精度3 1 精度粒度3 2
  • 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模块设计之十六:Hardfault模块

    PX4模块设计之十六 xff1a Hardfault模块 1 Hardfault模块初始化2 Hardfault模块主程序3 Hardfault命令3 1 hardfault check status3 2 hardfault rearm3
  • PX4模块设计之十七:ModuleBase模块

    PX4模块设计之十七 xff1a ModuleBase模块 1 ModuleBase模块介绍2 ModuleBase类介绍3 ModuleBase类功能介绍3 1 模块入口3 2 模块启动3 3 模块停止3 4 状态查询3 5 任务回调3
  • PX4模块设计之十八:Logger模块

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

    PX4模块设计之二十 xff1a PX4应用平台初始化 1 PX4应用平台介绍2 PX4应用平台初始化实现3 讨论和思考4 参考资料 在PX4启动过程章节的基础上 xff0c 可以深入分析下PX4应用平台 xff08 框架 xff09 的实
  • PX4模块设计之二十一:uORB消息管理模块

    PX4模块设计之二十一 xff1a uORB消息管理模块 1 uORB模块构建模式2 uORB消息管理函数2 1 状态查询2 2 资源利用2 3 模块启动2 4 模块停止3 uORB消息接口3 1 消息主题注册3 2 消息主题去注册3 3
  • PX4模块设计之二十三:自定义FlightTask

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

    PX4模块设计之二十四 xff1a 内部ADC模块 1 内部ADC模块简介2 模块入口函数2 1 主入口board adc main2 2 自定义子命令custom command 3 内部ADC模块重要函数3 1 task spawn3