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/ADC3ADC0/ADC1,详见目标 board README

  • 每行 0xXXXX (N)0xXXXX 为 DMA 低 16 位 raw 十六进制;(N) 为按 master 侧差分配置解码的十进制。默认配置下 (N) 为有符号,近零差分时常在 0 附近小幅波动;编码规则见下文 差分结果码值 一节

    下列示例均假设默认配置 position_mode=differentialfull_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 的那一路输出 本路 − 配对路,同一对内 有且仅有一路 为 master

  • ADC16 差分模式 不支持软件触发;除序列模式外也可通过抢占模式采样,均须使用硬件 同源触发 (本 sample 演示序列模式下的硬件触发)

  • 差分输入的正端与负端对地电压均不宜过于接近 0 V 或 3.3 V,否则任一端 ADC 均可能饱和,导致差分结果出现偏差