AD7606B 使用总结报告

发布时间:2026/6/5 11:34:08

AD7606B 使用总结报告 AD7606B 使用总结报告项目: BCU 电池管理系统平台: Linux ARM 嵌入式平台 (Forlinx)日期: 2026-06-04文档作者: 基于代码分析整理一、AD7606B 芯片概述AD7606B 是 ADIAnalog Devices公司推出的8 通道、16 位、同步采样模数转换器ADC主要特性如下特性规格通道数8 路同步采样分辨率16 bit输入范围±10V / ±5V本系统使用±10V最大采样率200 kSPS每通道接口SPI 串行 / 并行数据输出模式1线(DOUTA) / 2线(DOUTADOUTB) / 4线(DOUTA~DOUTD)供电AVCC 5V, VDRIVE 2.3~5.25V特性内置模拟前端、二阶抗混叠滤波器、片上基准源二、硬件接口设计2.1 整体接线框图┌──────────────────────┐ ┌─────────────────────┐ │ ARM Linux 主板 │ │ AD7606B │ │ (Forlinx) │ │ │ │ │ SPI │ │ │ SPI2 CLK ──────────┼──────────► SCLK │ │ SPI2 MOSI ─────────┼──────────► SDI (寄存器配置用) │ │ SPI2 MISO ─────────┼──────────► DOUTA (数据输出) │ │ SPI2 CS ───────────┼──────────► /CS │ │ │ GPIO │ │ │ GPIO0_B6 ──────────┼──────────► CONVST (转换启动) │ │ GPIO0_C6 ──────────┼──────────► BUSY (忙信号) │ │ │ 模拟 │ │ │ 待测信号源 ─────────┼──────────► V1~V8 (模拟输入) │ └──────────────────────┘ └─────────────────────┘2.2 关键引脚说明引脚连接功能描述CONVSTGPIO0_B6 (偏移 14)转换启动信号上升沿触发采样下降沿启动转换BUSYGPIO0_C6 (偏移 22)忙信号输出高电平表示正在转换低电平表示转换完成SCLKSPI2 CLK串行时钟用于数据读出和寄存器访问DOUTASPI2 MISO串行数据输出单线模式输出 8 通道转换结果SDISPI2 MOSI串行数据输入用于配置内部寄存器/CSSPI2 CS片选信号2.3 SPI 参数配置参数配置值说明设备节点/dev/spidev2.0SPI2 总线第 0 个片选SPI 模式SPI_MODE_3(CPOL1, CPHA1)AD7606B 要求在 SCLK 下降沿锁存数据时钟频率12 MHz最大支持 60 MHzVDRIVE 2.7V/ 40 MHzVDRIVE 2.7V位宽8 bit标准字节传输GPIO 芯片gpiochip0控制 CONVST 和 BUSY三、软件架构设计3.1 整体线程架构本项目 ADC 采集运行在独立线程adc_thread()中与主线程、GPIO 采集线程并行工作main() ├── attach_shared_memory() // 挂载共享内存 /bcu_shared_data ├── init_gpio() // 初始化 DI/DO GPIO ├── [线程] collect_thread() // 10ms 周期 DI 读取 DO 写入 ├── adc_spi_init() // SPI 初始化 ├── adc_gpio_init() // ADC GPIO 初始化 ├── adc_config_init() // ADC 寄存器配置 ├── [线程] adc_thread() // 20kHz ADC 采集循环 └── 主循环等待 (SIGINT/SIGTERM 退出)3.2 ADC 采集流程adc_thread() 循环 (采样率 20kHz 50μs/次) │ ├── 1. trigger_convst() │ └── CONVST ↑ (1μs) → CONVST ↓ // 产生≥10ns的正脉冲 │ ├── 2. wait_busy_low() │ └── 轮询 BUSY 引脚等待转换完成超时100μs │ ├── 3. read_all_channels() │ └── SPI 连续传输 128 个 SCLK (16字节) │ 读取 8 通道 × 16bit 128bit │ ├── 4. MovingAvgFilter[8] 滑动平均 │ └── 窗口大小 8去除噪声干扰 │ ├── 5. 工程值转换 写入共享内存 │ ├── CH2~CH5: ADC→电压→电阻→NTC查表→温度 → 共享内存点604~607 │ └── CH6~CH8: ADC→电压→0.1V分辨率 → 共享内存点627~629 │ └── 6. 周期控制 (50μs补偿等待)3.3 关键数据结构// 滑动平均滤波器 (每个通道独立)structMovingAvgFilter{int16_tbuf[8];// 环形缓冲区intidx;// 当前写入位置int32_tsum;// 累加和增量更新避免全量遍历intcount;// 已采样点数};四、初始化配置详解4.1 SPI 初始化 (adc_spi_init())// 核心步骤open(/dev/spidev2.0,O_RDWR)// 1. 打开 SPI 设备ioctl(SPI_IOC_WR_MODE,SPI_MODE_3)// 2. 设置模式 (CPOL1, CPHA1)ioctl(SPI_IOC_WR_BITS_PER_WORD,8)// 3. 设置字长 8bitioctl(SPI_IOC_WR_MAX_SPEED_HZ,12000000)// 4. 设置时钟 12MHz关键提示AD7606B 数据手册规定SPI 时钟空闲为高电平CPOL1数据在 SCLK 下降沿输出、上升沿采样对应SPI_MODE_3。4.2 GPIO 初始化 (adc_gpio_init())信号方向初始电平说明CONVST (GPIO0_B6)输出低 (0)空闲保持低采集时发送正脉冲BUSY (GPIO0_C6)输入—检测转换完成状态4.3 CONFIG 寄存器配置 (adc_config_init())AD7606B 上电默认值CONFIG(0x02) 0x08即 DOUT_FORMAT[4:3] 012线串行输出模式。本系统将其修改为1线模式写入序列SPI 两帧 16bit共 4 字节 ┌──────┬─────────┬──────────────────┐ │ 位域 │ 值 │ 含义 │ ├──────┼─────────┼──────────────────┤ │[15] │ 0 │ 写操作 │ │[14:8]│ 0x02 │ CONFIG 寄存器地址 │ │[7:0] │ 0x00 │ DOUT_FORMAT00 │ ├──────┼─────────┼──────────────────┤ │[15:0]│ 0x0000 │ 退出寄存器模式 │ └──────┴─────────┴──────────────────┘DOUT_FORMAT 00→ 仅 DOUTA 一条数据线输出单线模式数据包格式在/CS低有效期间连续 128 个 SCLK 依次读出 CH1→CH8 的 16bit 结果五、数据采集与处理5.1 采样时序┌─────────┐ CONVST ─┘ └──────────────────────────── (≥10ns 正脉冲) ┌──────────────┐ BUSY ──────┘ └────────────────── (典型 ~4.15μs 200kSPS) ┌────...──┐ /CS ─────────────────────────────┘ └ (128 SCLK 读数据)采样触发: 软件控制 CONVST 产生 ≥1μs 正脉冲手册要求 ≥10ns转换等待: 轮询 BUSY 引脚直到变低含 100μs 超时保护数据读出:/CS拉低后发送 128 个 SCLK空数据 0x00同时从 MISO 读回 8×16bit5.2 数据读取代码 (read_all_channels())voidread_all_channels(int16_t*ch_values){uint8_ttx[16]{0};// 发送全零时钟用于移位输出uint8_trx[16]{0};// 接收 16 字节spi_transfer(tx,rx,16);// 一个字传输// 按大端序拼接每 2 字节为一个通道的 16bit 有符号结果for(inti0;i8;i){ch_values[i](int16_t)((rx[2*i]8)|rx[2*i1]);}}5.3 滑动平均滤波为抑制工频干扰和随机噪声每通道使用窗口大小为 8 的滑动平均滤波器int16_tupdate(int16_traw){sum-buf[idx];// 减去最旧值buf[idx]raw;// 存入新值sumraw;// 加上新值idx(idx1)%MA_WINDOW_SIZE;// 指针前移环形缓冲if(countMA_WINDOW_SIZE)count;return(int16_t)(sum/count);// 算术平均}参数值窗口大小8滤波延迟4 个采样周期 200μs截止频率~1.25 kHz (fs/16)计算开销O(1)增量更新无循环遍历5.4 通道分配与工程值转换通道点ID测量量转换公式精度输出类型CH1—未使用———CH2604NTC温度V→R→NTC查表1°Cint16CH3605NTC温度同上1°Cint16CH4606NTC温度同上1°Cint16CH5607NTC温度同上1°Cint16CH6627电压ADC→V×100.1Vuint16CH7628电压同上0.1Vuint16CH8629电压同上0.1Vuint16温度通道转换链路 (CH2~CH5)ADC原始值 (int16, ±32768) │ ▼ voltage adc_val × 10.0 / 32768.0 电压值 (float, V) │ resistance voltage × 10.0 / (5.0 - voltage) ▼ 备注: NTC分压电路 — 10kΩ上拉电阻, 5V参考电压 电阻值 (float, kΩ) │ temperature_fun_connector(resistance) // 二分查找 线性插值 ▼ 温度值 (int16, °C) 范围: -55 ~ 125°C电压通道转换链路 (CH6~CH8)ADC原始值 (int16, ±32768) │ ▼ voltage adc_val × 10.0 / 32768.0 电压值 (float, V) │ val (uint16_t)(voltage × 10.0 0.5) // 四舍五入到0.1V ▼ 电压值 (uint16, 精度0.1V)NTC 查表算法查表采用二分查找定位 线性插值的方法在精度和速度之间取得平衡1. 二分查找确定电阻值所在区间 [index, index1] 2. 线性插值: temp table[index].temp (table[index].res - R) / (table[index].res - table[index1].res) 3. 限幅至 [-55, 125]°C查找表包含 181 个标定点-55°C ~ 125°C覆盖 NTC 热敏电阻全温度范围。六、AD7606B 寄存器操作6.1 寄存器访问时序AD7606B 的寄存器读写需要在 SPI 帧中嵌入地址/命令信息16bit/帧写寄存器格式: ┌──────┬────────────┬──────────┐ │ [15] │ [14:8] │ [7:0] │ │ 0 │ 寄存器地址 │ 数据 │ │ (写) │ (0x02等) │ │ └──────┴────────────┴──────────┘ 读寄存器格式: ┌──────┬────────────┬──────────┐ │ [15] │ [14:8] │ [7:0] │ │ 1 │ 寄存器地址 │ 任意值 │ │ (读) │ │ │ └──────┴────────────┴──────────┘访问流程在/CS上升沿时如果接收到非零数据进入寄存器模式在寄存器模式下每 16 个 SCLK 处理一帧寄存器命令写入0x0000后退出寄存器模式回到ADC 转换模式6.2 本系统配置的寄存器寄存器地址默认值设定值含义CONFIG0x020x080x00DOUT_FORMAT00 (1线串行输出)未配置的寄存器保持默认值RANGE_CHx: 默认 0±10V 输入范围OS_RATIO: 默认 0无过采样STATUS_HEADER: 默认 1包含状态头七、性能分析7.1 采样率项目数值目标采样率20 kSPS每通道采样间隔50 μsBUSY 持续时间~4.15 μs典型值SPI 读取时间128 × 83.3ns ≈ 10.7 μs12MHz 时单次转换总耗时≈ 15 μs含 CONVST 脉冲 等待 SPI 读取CPU 占用余量约 70%50μs 中仅 15μs 忙碌7.2 精度估算参数值ADC 分辨率16 bit理论 LSB10V / 32768 ≈305 μV温度分辨率 (NTC)取决于 NTC 灵敏度常温区 25°C 附近约为0.1°C电压通道分辨率0.1V软件精度7.3 滤波效果滑动平均窗口 8等效降低随机噪声 √8 ≈ 2.83 倍相当于增加约1.5 个有效位ENOB八、关键注意事项与调试建议8.1 硬件层面SPI 模式必须匹配AD7606B 要求 SPI_MODE_3 (CPOL1, CPHA1)时钟空闲为高电平。SPI 时钟频率上限AD7606B 手册表5规定 VDRIVE 2.7V 时最大 60 MHz、VDRIVE 2.7V 时最大 40 MHz本系统使用 12 MHz 留有充足裕量。CONVST 脉冲宽度手册要求 ≥ 10ns代码使用 1μs 确保可靠触发。BUSY 超时保护代码设置 100μs 轮询超时防止 GPIO 异常导致死循环。去耦电容AD7606B 每个电源引脚需靠近放置 0.1μF 10μF 去耦电容。8.2 软件层面滤波窗口选择窗口 8 是延迟和噪声抑制的折中减小窗口响应快但噪声大增大则相反。SPI 传输原子性read_all_channels()使用一次SPI_IOC_MESSAGE(1)传输完成全部 16 字节避免分段传输导致的数据错位。共享内存保护所有写共享内存操作在pthread_mutex_lock/g_shared-mutex保护下进行。NTC 公式验证代码中使用的分压公式resistance voltage × 10.0 / (5.0 - voltage)假设 NTC 上端接 10kΩ 上拉至 5V需确认实际硬件是否与此一致。8.3 常见问题排查现象可能原因排查方向读数恒为 0 或满量程SPI 通信异常检查 SPI 模式、时钟、接线读数跳变大噪声干扰增大滑动平均窗口、检查模拟前端滤波BUSY 超时CONVST 脉冲异常用示波器检查 CONVST 和 BUSY 波形温度偏差大NTC 参数不匹配核对分压电阻值和参考电压是否与代码一致寄存器配置不生效未正确退出寄存器模式确认最后发送了 0x0000 退出序列九、代码文件索引文件功能Collect.cppADC 主采集程序含 SPI 驱动、GPIO 控制、数据处理NTCLookTable.hNTC 查表函数声明NTCLookTable.cNTC 电阻-温度对照表181点和插值查表算法实现bcu_shared.h共享内存数据结构定义十、总结本系统基于AD7606B实现了 8 通道同步模拟量采集在 Linux 嵌入式平台上通过SPI GPIO进行驱动。经过初始化配置SPI_MODE_3 / 12MHz / 单线DOUT模式以20 kSPS的采样率持续采集 8 路模拟信号其中 4 路用于 NTC 温度测量配合查表算法实现 -55~125°C 范围测温3 路用于电压监测0.1V 精度1 路预留。软件上采用滑动平均滤波窗口8提升数据稳定性通过共享内存将采集结果实时输出给其他进程如数据库记录、IEC104 远动通信整体架构清晰、实时性良好满足 BMS 电池管理系统的模拟量采集需求。

相关新闻