- 嵌入式
- 物联网
- 机器人
- 自动驾驶
- 智能硬件
【免费下载链接】PX4-Autopilot
PX4 Autopilot Software
本指南以 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 | 板载电压/温度采样、系统电源监测 |
ads1115 | I2C | 无内部 ADC 板卡(如 PilotPi、CUAV Nora)的外部采样 |
ads7128 | I2C | 外部 8 通道采样 |
tla2528 | I2C | 外部 12 通道采样 |
ads7953 | SPI | 外部 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 infoadc 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
相关推荐
Arduino-ESP32外设驱动详解:GPIO、ADC、I2C、SPI实战应用
Arduino ESP32外设驱动详解:GPIO、ADC、I2C、SPI实战应用 引言:为什么选择Arduino ESP32进行嵌入式开发? 还在为ESP32复
嵌入式物联网驱动开发RIOT 外设自检指南:使用 Peripheral Selftest Shield 全面测试 ADC/GPIO/I2C/PWM/SPI/UART
RIOT 外设自检指南:使用 Peripheral Selftest Shield 全面测试 ADC/GPIO/I2C/PWM/SPI/UART 导读 本文基于
物联网嵌入式操作系统实时系统RT-Thread 中 SAMC21J18A BSP 深入解析:从芯片特性到 CAN-FD、ADC 与 I2C 实战
RT Thread 中 SAMC21J18A BSP 深入解析:从芯片特性到 CAN FD、ADC 与 I2C 实战 导读 本文以 RT Thread 仓库中
操作系统嵌入式物联网嵌入式OSRTOS
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考