2.3. ADC16 差分采样
2.3.1. 概述
本示例演示 ADC16 差分输入:master/slave ADC 对以 sequence 模式运行,配合硬件 触发与 DMA,采样结果通过控制台 UART 打印。
2.3.2. 板级设置
ADC 实例、引脚与连接器说明见目标 board README 中 ADC16 差分输入 小节
按板级文档连接差分输入
2.3.3. 运行示例
按目标 board 编译并烧录
在控制台 UART 查看周期性打印的差分采样结果
2.3.4. 运行现象
串口终端先显示 board 初始化信息(clock summary、banner 等,内容因板卡而异),随后进入示例输出
示例启动后打印一行标题,之后约每 500 ms 打印一次差分结果(间隔由主循环
board_delay_ms(500)决定,非 ADC 硬件采样周期)打印前缀随板级 master/slave ADC 配对而定,可能为
ADC2/ADC3或ADC0/ADC1,详见目标 board README每行
0xXXXX (N):0xXXXX为 DMA 低 16 位 raw 十六进制;(N)为按 master 侧差分配置解码的十进制。默认配置下(N)为有符号,近零差分时常在 0 附近小幅波动;编码规则见下文 差分结果码值 一节下列示例均假设默认配置
position_mode=differential、full_resolution=0:ADC16 differential sample ADC2/ADC3 diff result: 0x0003 (3) ADC2/ADC3 diff result: 0xfffc (-4) ADC2/ADC3 diff result: 0x0001 (1)
使用 ADC0/ADC1 配对的 board 可能显示:
ADC16 differential sample ADC0/ADC1 diff result: 0x0000 (0) ADC0/ADC1 diff result: 0xfff8 (-8)
下列标称电压示例均在 Vref 约 3.3 V、默认配置下;码值为理论示意(非 mV),板级实测可在一定范围内波动。
master 引脚 1.5 V、slave 引脚 1.0 V(差分约 0.5 V)时,本 sample 典型输出类似:
ADC0/ADC1 diff result: 0x1388 (5000)master 引脚 1.5 V、slave 引脚 0.5 V(差分约 1.0 V)时,本 sample 典型输出类似:
ADC2/ADC3 diff result: 0x2710 (10000)
2.3.5. 差分 master/slave 与极性
master/slave 由目标 board 的
board.h定义:ADC2/ADC3 固定配对使用BOARD_APP_ADC16_DIFF_PAIR23_*宏,ADC0/ADC1 固定配对使用BOARD_APP_ADC16_DIFF_PAIR01_*宏(PAIR23/PAIR01表示 SoC 差分配对编号,非 ADC 实例号);若 board 已将配对内一路设为 master,sample 从该路 DMA 读取并打印;若需对调 master,须修改diff_cfg_*_master.master并将 DMA 与打印改到新 master 侧ADC0/ADC1 与 ADC2/ADC3 配对适用相同的 master/slave 与极性规则
2.3.6. 差分结果码值(position_mode / full_resolution)
master 侧 CONV_CFG0 用两个字段决定差分结果在 16 位总线上的编码(与模拟差分接线方式无关):
full_resolution(FULL):为 1 时把代数差分小于 0 钳为 0,并忽略 position_mode
position_mode(POS_MODE):仅当 full_resolution 为 0 时有效
full_resolution |
position_mode |
总线语义 |
零差分 |
|---|---|---|---|
0 |
differential(POS=0) |
有符号 −32768~+32767;master 引脚高于 slave 为正,反接为负 |
0(0x0000) |
0 |
single_ended(POS=1) |
无符号 0~65535 偏移码 |
32768(0x8000) |
1 |
(任意,无效) |
无符号 0~65535;代数差分小于 0 时钳为 0 |
0(0x0000) |
2.3.6.1. 本 sample 默认配置
adc16_differential.c 将 master 设为 position_mode=differential、full_resolution=0(驱动 adc16_get_default_diff_mode_config 默认分别为 single_ended、1)
串口 0x%04x (N) 中 0x%04x 为 DMA raw 均值;(N) 按上表解码,与硬件总线一致,不做零点平移
2.3.6.2. 电压与极性示例
下列示例均在 Vref 约 3.3 V、默认配置(full_resolution=0、position_mode=differential)下;码值为 raw 单位(约),非 mV
差分约 0.5 V(如 master 1.5 V、slave 1.0 V):master 高于 slave 约 +5000(0x1388);反接约 −5000(0xec78)
差分约 1.0 V(如 master 1.5 V、slave 0.5 V):master 高于 slave 约 +10000(0x2710);反接约 −10000(0xd8f0)
若仅将 master 的 full_resolution 改为 1 并重新编译(POS_MODE 无效):0.5 V 差分时正接约 +9930(0x26ca);反接约为 0
表格先列 ADC0/ADC1,再列 ADC2/ADC3;对调 master/slave 实例时极性随 master 定义翻转,规则相同
Master |
Slave |
master 引脚电压 |
slave 引脚电压 |
结果(约) |
|---|---|---|---|---|
ADC0 |
ADC1 |
1.5 V |
1.0 V |
+5000(0x1388) |
ADC0 |
ADC1 |
1.0 V |
1.5 V |
-5000(0xec78) |
ADC2 |
ADC3 |
1.5 V |
1.0 V |
+5000(0x1388) |
ADC2 |
ADC3 |
1.0 V |
1.5 V |
-5000(0xec78) |
2.3.7. 注意
SoC 差分配对固定:ADC0 仅与 ADC1 配对,ADC2 仅与 ADC3 配对,不可交叉组合(如 ADC0 与 ADC3)
配对内的 master 与 slave 两路 ADC 须 同时使能 差分模式,不可单独一路使能
DIFF_MASTER=1的那一路输出 本路 − 配对路,同一对内 有且仅有一路 为 masterADC16 差分模式 不支持软件触发;除序列模式外也可通过抢占模式采样,均须使用硬件 同源触发 (本 sample 演示序列模式下的硬件触发)
差分输入的正端与负端对地电压均不宜过于接近 0 V 或 3.3 V,否则任一端 ADC 均可能饱和,导致差分结果出现偏差