☰
PX4 Autopilot ADC 驱动模块完全指南:板载 ADC 与外部 I2C/SPI 采样芯片的接入与调试
2026/9/26 2:55:41 网站建设 项目流程
  • 嵌入式
  • 物联网
  • 机器人
  • 自动驾驶
  • 智能硬件

【免费下载链接】PX4-Autopilot

PX4 Autopilot Software

项目地址:https://gitcode.com/gh_mirrors/px/PX4-Autopilot
点击查看免费下载

本指南以 docs/en/modules/modules_driver_adc.md 为骨架,系统讲解 PX4 Autopilot 中全部 ADC(模数转换)驱动模块:板载adc驱动以及ads1115、ads7128、tla2528、ads7953四类外部采样芯片驱动。读完本文,你将掌握每个驱动的启动/停止/状态查询命令、全部命令行参数含义、I2C 与 SPI 总线挂载方式,并能结合src/drivers/adc/下的源码理解 ADC 数据如何经由 uORB 消息(adc_report、system_power)服务于电池电压监测等上层功能。

ADC 驱动在 PX4 中的角色

ADC 在飞控中承担两类核心任务:一是采集模拟电压信号(如电池电压、传感器供电电压、USB 连接状态),二是为没有内部模数转换器的飞控板提供外部采样通路。PX4 的 ADC 驱动统一位于 src/drivers/adc 目录,包含五个模块:

模块通信总线典型用途
adc(board_adc)芯片内置 ADC板载电压/温度采样、系统电源监测
ads1115I2C无内部 ADC 板卡(如 PilotPi、CUAV Nora)的外部采样
ads7128I2C外部 8 通道采样
tla2528I2C外部 12 通道采样
ads7953SPI外部 16 通道采样

所有 ADC 驱动最终通过 uORB 消息对外发布数据。核心消息定义见 msg/AdcReport.msg,其字段包括:

uint64 timestamp # [us] 系统启动以来的时间 uint32 device_id # [-] 传感器唯一 ID,断电重启后保持不变 int16[16] channel_id # [-] ADC 通道 ID,不存在的通道为负值 int32[16] raw_data # [-] 各通道原始采样值,仅在 channel_id 为正时有效 uint32 resolution # [-] ADC 分辨率(满量程数字计数) float32 v_ref # [V] ADC 电压参考,用于计算 LSB 电压(lsb = v_ref / resolution)

该消息"将 ADC 原始数据传递给其他模块,例如电池状态模块",因此 ADC 驱动是电源监测、电池信息上报等功能的底层数据来源。

板载 ADC 驱动(adc / board_adc)

功能描述

adc驱动(源码位于 src/drivers/adc/board_adc)读取芯片内置 ADC,周期性发布adc_report与system_power两类 uORB 消息。其底层硬件接口由 src/drivers/drv_adc.h 定义,包括:

  • px4_arch_adc_init()/px4_arch_adc_uninit():初始化/反初始化 ADC 硬件;
  • px4_arch_adc_sample():读取指定通道采样值;
  • px4_arch_adc_reference_v():获取参考电压;
  • px4_arch_adc_temp_sensor_mask():温度传感器通道掩码;
  • px4_arch_adc_dn_fullcount():ADC 满量程数字计数。

采样数据结构为px4_adc_msg_t:am_channel(8 位通道号)+am_data(32 位采样结果),单次最多返回PX4_MAX_ADC_CHANNELS(即adc_report中channel_id数组长度)个通道。内置 ADC 的设备 ID 为BUILTIN_ADC_DEVID(0xffffffff)。

命令行用法

adc <command> [arguments...] Commands: start test [-n] Do not publish ADC report, only system power stop status print status info
  • adc start:启动驱动。从 ADC.cpp 的task_spawn()可知,启动时会以SYSTEM_ADC_BASE基地址和ADC_CHANNELS通道掩码创建实例,并在 init() 中调用px4_arch_adc_init()后按固定周期调度采样任务。构造时始终将温度传感器通道并入采样列表(见 ADC.cpp)。
  • adc test [-n]:进入自检模式。test() 会订阅adc_report,等待 20ms 后打印DeviceID、Resolution、Voltage Reference,随后连续 20 次(每次间隔 500ms)打印各有效通道的channel_id与raw_data,成功则输出 "ADC test successful."。-n参数表示不发布 ADC report,仅发布系统电源信息。
  • adc stop:停止驱动;adc status:打印运行状态。

采样与系统电源上报的实现细节

板载 ADC 的采样主循环在 Run() 中:逐通道调用sample()采集原始数据,然后分别执行update_adc_report()(发布adc_report)与update_system_power()(发布system_power)。

update_system_power()是电源监测的关键路径(见 ADC.cpp):

  • 依据ADC_SCALED_V5_SENSE宏计算 5V 电源电压:voltage5v_v = raw × (ADC_V5_V_FULL_SCALE / 3.3) × (v_ref / dn_fullcount);
  • 依据ADC_SCALED_V3V3_SENSORS_SENSE计算传感器 3.3V 供电电压并置位sensors3v3_valid;
  • 依据ADC_SCALED_PAYLOAD_SENSE计算载荷供电电压;
  • 同时打包 USB 连接/有效状态、电池组(brick)有效位、舵机供电有效位、外设/高功率 5V 过流标志等硬件状态。

由此可见,adc驱动不只是采样器,更是system_power消息(msg/SystemPower.msg)的唯一生产者,上层电源与电池模块均依赖它。

外部 I2C ADC:ADS1115

功能与适用场景

ads1115驱动(源码位于 src/drivers/adc/ads1115)用于启用通过 I2C 连接的外部 [ADS1115] ADC 芯片。该驱动默认编译进固件的板卡包括没有内部模数转换器的型号,例如 PilotPi 和 CUAV Nora(可在板卡配置文件中搜索CONFIG_DRIVERS_ADC_ADS1115确认)。

驱动通过参数 ADC_ADS1115_EN 启用或禁用,默认禁用;一旦启用,内部 ADC 将不再使用。参数定义见 src/drivers/adc/ads1115/ads1115_params.yaml:布尔类型、默认值 0、修改后需要重启生效(reboot_required: true)。

命令行用法

ads1115 <command> [arguments...] Commands: start [-I] Internal I2C bus(es) (onboard sensors; shared bus only if -b is given) [-X] External I2C bus(es) (connector sensors, including shared buses) [-b <val>] board-specific bus (default=all) (external SPI: n-th bus (default=1)) [-f <val>] bus frequency in kHz [-q] quiet startup (no message if no device found) [-a <val>] I2C address default: 72 stop status print status info

源码级要点

  • 默认地址 72(即 0x48),这是 ADS1115 的常见默认 I2C 地址;
  • 探测机制:probe() 说明该芯片没有 ID 寄存器,驱动通过读取低/高阈值寄存器并与出厂默认值0xFF7F0080比对来识别芯片;
  • 采样配置:readChannel() 将通道配置为 PGA ±6.144V、单次转换模式、250 SPS 采样率,并以 4 分之一采样间隔轮询就绪状态(见 init() 中的ScheduleOnInterval(SAMPLE_INTERVAL / 4, ...))。

外部 I2C ADC:ADS7128 与 TLA2528

这两款驱动均通过 I2C 连接外部多通道 ADC 芯片,源码分别位于 src/drivers/adc/ads7128 与 src/drivers/adc/tla2528。

ADS7128

ADS7128 <command> [arguments...] Commands: start [-I] Internal I2C bus(es) (onboard sensors; shared bus only if -b is given) [-X] External I2C bus(es) (connector sensors, including shared buses) [-b <val>] board-specific bus (default=all) (external SPI: n-th bus (default=1)) [-f <val>] bus frequency in kHz [-q] quiet startup (no message if no device found) [-a <val>] I2C address default: 16 stop status print status info

从 ads7128_main.cpp 的print_usage()与主函数可知:其默认 I2C 频率为 400 kHz,默认地址为0x10(十进制 16)。驱动以DRV_ADC_DEVTYPE_ADS7128作为设备类型标识,通过I2CSPIDriverBase框架实现实例管理与状态打印。

TLA2528

TLA2528 <command> [arguments...] Commands: start [-I] Internal I2C bus(es) (onboard sensors; shared bus only if -b is given) [-X] External I2C bus(es) (connector sensors, including shared buses) [-b <val>] board-specific bus (default=all) (external SPI: n-th bus (default=1)) [-f <val>] bus frequency in kHz [-q] quiet startup (no message if no device found) stop status print status info

与 ADS7128 类似(见 tla2528_main.cpp),TLA2528 默认 I2C 频率同样为 400 kHz、默认地址0x10,但命令行不提供-a地址参数,地址直接以默认值0x10初始化,设备类型为DRV_ADC_DEVTYPE_TLA2528。

外部 SPI ADC:ADS7953

ads7953驱动(源码位于 src/drivers/adc/ads7953)通过 SPI 总线连接外部 ADS7953 芯片,是文档中唯一使用 SPI 而非 I2C 的 ADC 驱动:

ads7953 <command> [arguments...] Commands: start [-s] Internal SPI bus(es) (onboard sensors; shared bus only if -b is given) [-S] External SPI bus (connector sensors, including shared buses) [-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

从 ads7953_main.cpp 可以确认其默认配置:SPI 模式为SPIDEV_MODE0,默认 SPI 频率为 10 MHz(10 * 1000 * 1000Hz),设备类型为DRV_ADC_DEVTYPE_ADS7953。启动时可指定片选引脚(内部 SPI)或片选索引(外部 SPI)、SPI 模式与总线频率,-s/-S分别对应内部/外部 SPI 总线。

命令行参数速查与总线选择

五个 ADC 驱动共享同一套由BusCLIArguments解析的命令行参数体系(均通过px4_platform_common/getopt.h的parseDefaultArguments()解析),归纳如下:

参数含义适用驱动
-I内部 I2C 总线(板载传感器;仅在同时给出-b时共享总线)ads1115、ads7128、tla2528
-X外部 I2C 总线(连接器传感器,含共享总线)ads1115、ads7128、tla2528
-s内部 SPI 总线ads7953
-S外部 SPI 总线ads7953
-b <val>板级总线(默认 all);外部 SPI 时为第 n 条总线(默认 1)全部
-c <val>片选引脚(内部 SPI)或索引(外部 SPI)ads7953
-m <val>SPI 模式ads7953
-f <val>总线频率(kHz)全部
-q静默启动(未找到设备时不打印消息)全部
-a <val>I2C 地址ads1115(默认 72)、ads7128(默认 16)

总线选择遵循 PX4 驱动惯例:-I/-s面向板载传感器总线,-X/-S面向连接器(外置)总线,-b用于精确指定某条板级总线。start、stop、status是全部驱动共有的基本命令。

如何启用与编译配置

外部 ADC 驱动的可用性由 Kconfig 体系控制。src/drivers/adc/Kconfig 通过rsource "*/Kconfig"递归引入各子驱动的 Kconfig 项(如src/drivers/adc/ads1115/Kconfig),板卡配置文件中以CONFIG_DRIVERS_ADC_ADS1115之类的开关决定是否编译进固件。以 ADS1115 为例,其运行时开关是ADC_ADS1115_EN参数(默认关闭、重启生效),启用后内部 ADC 不再参与采样,适合 PilotPi、CUAV Nora 这类没有内置模数转换器的飞控板。

总结

PX4 的 ADC 驱动栈层次清晰:adc(board_adc)负责板载采样与system_power电源监测;ads1115、ads7128、tla2528通过 I2C、ads7953通过 SPI 扩展外部采样能力;所有数据统一通过adc_reportuORB 消息向上层供电。掌握了本文的命令行用法、总线参数语义和各驱动的默认配置(地址、频率、SPI 模式),即可在实际板卡上完成 ADC 的启动、探测、自检与状态排查。

  • 嵌入式
  • 物联网
  • 机器人
  • 自动驾驶
  • 智能硬件

【免费下载链接】PX4-Autopilot

PX4 Autopilot Software

项目地址:https://gitcode.com/gh_mirrors/px/PX4-Autopilot
点击查看免费下载
上一篇:B站视频转文字工具bili2text:解锁视频内容价值的三层技术架构
下一篇:bili2text:B站视频转文字神器,三步解锁知识宝藏

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询