这里描述的是一个典型的温度采集测量板的结构,涉及:
传感器
恒流源
电阻→电压转换
ADC(AD7177)
CPLD处理
我先帮你整体梳理流程,然后给出细节和潜在的补充点:
你外接的温度传感器,估计是热敏电阻(如PT100、NTC等),其电阻随温度变化。
例如:PT100,0°C 时 100 Ω,100°C 时约 138.5 Ω。
恒流源提供稳定的电流,比如 1 mA。
因为 V = I × R:
温度变化 → 电阻变化 → 电压变化
这样你获得了一个与温度线性相关的电压信号。
为什么用恒流源?
确保电流稳定,避免电阻变化影响电流,提升测量准确性。
通常这里有几个电路模块:
滤波器(防止高频干扰)
放大器(比如仪表放大器,提高弱信号到ADC可识别电平)
保护电路(如TVS管/限流电阻等)
**问题确认:** 是否有加入信号调理放大或滤波?是否是单端输入/差分输入?
AD7177 是高性能的24位 Δ-Σ ADC,其主要功能:
将模拟电压高精度采样为数字值。
可能是单端采集或差分采集(更抗干扰)。
内部具备:
可编程增益放大器(PGA)
多路输入切换
内置/外置参考电压支持
流程:
1️⃣ 模拟信号接入 ADC 输入端(AIN+ / AIN-)
2️⃣ ADC 完成 Δ-Σ 转换 + 数字滤波
3️⃣ 输出数字温度值
CPLD(复杂可编程逻辑器件)的任务:
负责从 ADC7177 获取数据:
SPI/I2C 接口(ADC7177 通常 SPI 通信)
对数据做:
解码/格式化
计算/阈值判断
触发告警/输出到外部总线
它也可能:
控制 ADC 的寄存器设置
管理多路温度通道的扫描切换
输出到主控(MCU/FPGA/上位机)
csharp
复制编辑
[温度传感器] │ │(电阻) ▼ [恒流源驱动] │ │(V = I × R) ▼ [模拟电压信号] │ │(滤波/放大/保护?) ▼ [ADC7177] │ │(SPI数字数据) ▼ [CPLD处理] │ │(计算/告警/传输) ▼ [上位系统 or 存储/显示]
1️⃣ 温度传感器类型?(PT100 / NTC / 热敏电阻 / 热电偶?)
2️⃣ 恒流源规格?
电流值?
自制 or IC?(比如MAX31865一类带恒流源芯片)
3️⃣ 信号调理?
是否有前端放大?
是否差分采集?
4️⃣ ADC7177设置?
输入范围?
参考电压来源?
采样速率?
5️⃣ CPLD任务细节?
单纯数据采集,还是含有预处理算法(如查表转温度)?
6️⃣ 下游通信接口?
是通过 CPLD 输出 SPI/I2C/UART?还是并口/其他接口?
温漂补偿(高精密场景常需要)
校准机制(如两点校准法)
防雷/防浪涌保护
供电系统(ADC、CPLD 是否共用模拟/数字电源)
✅ 总结
这个系统本质上是:
1️⃣ 用恒流源把温度变化转成电压变化
2️⃣ 用高精度ADC把电压变化转成数字信号
3️⃣ 用CPLD完成数字处理、格式化、输出
它的关键点:
恒流源精度
信号调理设计
ADC采集精度
数字处理与通信
能否详细说明cpld从ADC7177怎样获取数据,并说明怎么做数据处理
太好了,这里是关键环节之一!我们来详细拆解 CPLD 如何从 ADC7177 获取数据 以及 怎么做数据处理。
ADC7177 支持 SPI 接口(4线制):
SCLK(时钟)
SDI(主出从入,配置用)
SDO(主入从出,读数据)
CS(片选)
CPLD 扮演 SPI 主机 的角色,控制 ADC 进行:
寄存器配置(SDI)
采样数据读取(SDO)
基本时序如下(参考 ADC7177 datasheet):
CPLD 启动后:
下发寄存器配置命令:
设置输入通道(如 AIN0/AIN1)
采样速率(比如 10 SPS, 50 SPS)
增益选择
参考电压来源
例子(SPI写寄存器):
复制编辑
| CS 低电平 | 发送命令字节 + 数据字节 | CS 高电平
当 ADC 转换完成时,DRDY 引脚(数据就绪)拉低(ADC7177 有专门的 DRDY 引脚)。
CPLD 轮询/中断感知 DRDY 下降沿后,进行数据读取:
例子(SPI读数据):
复制编辑
| CPLD 检测 DRDY 低 | CPLD 拉低 CS | CPLD 发送读取命令(8位)+ 读取24位数据 | CPLD 拉高 CS
✅ 重点: ADC7177 是 24位输出,CPLD 需要拼接3字节数据。
CPLD 内部实现一个 SPI状态机:
IDLE:等待 DRDY 低电平
START:拉低 CS
SEND_CMD:发出 SPI 命令(如读数据指令)
READ_DATA:读取 3 字节
DONE:拉高 CS,进入 IDLE
状态机可以用 Verilog/VHDL 写。
ADC7177 发送 3 个字节(24位):
Byte1(MSB)
Byte2
Byte3(LSB)
CPLD 需要拼成:
ini
复制编辑
Data = {Byte1, Byte2, Byte3}
这是 二进制补码格式,对应 ±FS 范围。
两步转换:
ADC7177 的输出范围是:
makefile
复制编辑
码值范围: -2^23 ~ +2^23 - 1
假设参考电压 Vref = 5V,满量程 ±5V:
电压 = (Data / (2^23)) × Vref
例:
makefile
复制编辑
Data = 0x400000 (~2^22) 电压 ≈ (2^22 / 2^23) × 5V = 2.5V
前面你提到:电压 = 恒流源 × 电阻
而电阻= f(温度),所以 CPLD 内部有三种做法:
1️⃣ 线性算法:
温度 = (电压 - 偏移) / 斜率
(适合简单 NTC)
2️⃣ 查找表(LUT):
CPLD 内部存储温度-电阻对应表
比如 PT100 常用分段查表 + 插值
3️⃣ 高阶拟合:
用三阶多项式计算
例:
70°C 拉高告警引脚
< -20°C 触发低温保护
实现方式:
在数据流中加入比较逻辑
CPLD 内部硬件实现超温标志位
数据处理完成后 CPLD:
将数据:
放到输出寄存器
或通过SPI/UART/并口/其他总线输出给上位机
CPLD 内部通常有握手信号,确认数据准备完毕。
csharp
复制编辑
[DRDY ↓] │ [CPLD SPI 状态机] │ [读取 24位数据] │ [拼接 Data] │ [数值转换] │ │ │ (A) 电压 = Data 转换 │ (B) 温度 = 电压转温度 │ [阈值判断] │ [输出寄存器/接口]
✅ CPLD 内部是 FPGA级别处理?还是只负责数据转发?
✅ 温度转换公式复杂吗?用 LUT 还是直接输出?
✅ 数据是实时输出还是批量输出?
✅ 采样频率/速率有要求吗?
✅ 通信接口是 CPLD → MCU/FPC/其他什么总线?