拓冰建站拓冰建站
首页 / 资讯中心 / 正文

ADS7950实战:12位8通道SAR ADC的SPI驱动与硬件设计全解析

简介ADS7950-Q1 中文数据手册是一份适合硬件工程师与嵌入式开发者查阅的器件资料围绕 TI 的高性能、低功耗多通道 ADC 展开覆盖汽车电子、工业控制、医疗设备、消费电子等数据采集应用。手册系统整理了 8/10/12 位分辨率、1 MSPS 采样率、2.7~5.25V 模拟电源范围、PGA、自动/手动通道选择、GPIO 等关键特性并标注了 AEC-Q100 车规等级与 -40°C~125°C 温度范围。内容包含设备对照表、引脚配置、电气特性、功能框图、设备功能模式、数字输出代码、GPIO 编程、典型应用、布局指南等章节从选型到硬件设计均有说明英文原版中容易混淆的参数和时序也能对照中文章节快速定位。资源以单个 PDF 文件提供体量约 3.67MB适合离线查阅和团队分享。目前已有 1453 人下载学习适合需要快速熟悉该系列 ADC、完成硬件选型或做驱动开发的工程师参考。 做嵌入式这几年数据采集这块我前前后后摸过不少ADC。ADS7950是我在工业采集板卡上用得比较顺的一颗料12位、8通道、最高1MSPS采样率、SPI接口内置基准还能多片级联妥妥的“小体积多面手”。刚拿到《ads7950中文资料.pdf》那会儿我也被手册里大篇幅的时序图和寄存器表格劝退过后来花了一下午把关键路径理清楚画板写驱动就顺畅多了。这篇文章不打算把数据手册复述一遍而是从硬件连接、SPI时序、驱动代码到调试踩坑把我实测过的方案和心得完整列出来。适合刚拿到这颗芯片准备画原理图的硬件工程师也适合正准备写底层驱动的嵌入式开发照着做可以少走不少弯路。1. 12位8通道SAR ADC究竟强在哪参数解读与选型思路1.1 先把手册里几个关键参数捏在手里ADS7950这名字乍一看和很多ADC差不多但它的组合拳值得细看。我把最核心的几项参数挑出来用表格一次说清楚参数ADS7950典型值选型解读分辨率12位0~2.5V量程下理论最小分辨率约0.61mV工业传感器信号够用通道数8路单端 / 4路差分一路ADC顶多路传感器面积和成本都省采样率最高1MSPS20kHz~50kHz带宽的信号妥妥覆盖接口SPI兼容几乎所有MCU都带驱动简单内部基准2.5V参考源常规应用省一颗基准芯片模拟输入范围0~VREF 或 ±VREF可通过命令字配置灵活性高封装TSSOP-24 / VQFN-24板子上不占地方这里我最在意的其实是“8通道 1MSPS 内置基准”这个组合。很多项目要同时监测多路电压、电流、温度每一路的信号带宽并不高只有几十kHz甚至更小。用一颗ADS7950做时间片轮询采样每一路都能做到几kHz~几十kHz的等效采样率完全够用。SAR架构不像Σ-Δ那样有流水线延迟数据出来就是实时的非常适合做电机控制、电源管理这类需要快速闭环的场合。1.2 内置基准和可配置输入范围意味着什么以前设计ADC外围电路时基准源部分经常要额外花心思外部基准芯片、基准缓冲器、去耦电容一套下来成本不低。ADS7950内部直接集成了2.5V基准对大部分中低精度应用来说直接省掉一颗基准ICBOM成本明显下降电路也简洁很多。输入范围方面手册里清楚写着可以配置成单端0到VREF也可以配置成差分±VREF。后者在处理桥式传感器、电流检测这类双极性信号时特别有用。比如用分流电阻采样电机电流信号在0V上下摆动这时把ADS7950配成差分模式一个通道就能搞定正负电流检测不需要额外加电平抬升电路。这种灵活度是固定输入范围的ADC比不了的。1.3 什么项目适合选它选型这事儿没有万能的芯片只有合适的方案。我总结下来ADS7950特别适合这几类场景一是工业PLC模拟量输入模块多路4~20mA或0~10V信号采集二是电池管理系统和电源测试设备里的电压/电流检测既要求实时性又要求多通道三是便携式仪器仪表需要在低功耗、小体积条件下完成多路模拟信号采样。如果说你的项目信号通道数量不多、采样率要求不高那可能一颗8位或10位ADC就够但如果你需要“同时盯多路信号、每路还要有一定带宽、板上面积还紧张”ADS7950就是那个性价比很高的方案。2. 硬件设计不能偷懒引脚、参考电压与前端电路2.1 先理清最小系统该怎么搭拿到芯片第一步先别急着连SPI把电源和参考电压处理好后面能省掉一半调试时间。ADS7950的模拟电源和数字电源建议分开连接AVDD和DVDD各放一个0.1μF陶瓷电容靠近引脚另外在VREF相关引脚附近加一个大一点的钽电容或10μF陶瓷电容做低频去耦。AGND和DGND建议在芯片下方用一颗0Ω电阻或磁珠做单点连接避免数字开关噪声串进模拟地。参考电压这块要特别说一下。如果直接用内部基准REFP引脚外接一个1μF~10μF电容到地再并联0.1μF高频去耦电容这个组合能让基准噪声明显下降。如果项目对精度有更高要求想用外部基准就要仔细查手册里VREF引脚的输入阻抗要求外部基准输出端同样要加RC去耦。ADC参考电压相当于整个采集系统的“尺子”这路信号不干净后面采样值全是虚的。2.2 模拟输入前端并没有想象中那么简单SAR型ADC的输入结构是开关电容在采样瞬间会从外部源抽取一个短时电流尖峰。如果你的信号源输出阻抗很高或者前端没有缓冲这个电流尖峰会在源电阻上产生压降导致采样结果偏低或跳动。最常规的做法是在每一路模拟输入前加一阶RC低通滤波R和C的取值需要兼顾建立时间和抗混叠两项指标。我常用的起步值是R100Ω、C1nF此时截止频率大约1.6MHz对低频传感器信号足够同时RC时间常数约100ns1MSPS采样率下每个采样周期1μs建立时间绰绰有余。如果信号源阻抗特别大或者走线比较长可以在ADC前面加一级运放缓冲比如OPA350这类轨到轨运放把源阻抗压到几欧姆级别采样稳定性立刻不一样。2.3 PCB布局模拟信号不是你想怎么走就怎么走ADS7950这类混合信号芯片PCB布局的核心原则一句话模拟部分和数字部分尽量物理隔离。SPI时钟线SCLK的翻转频率可能高达十几MHz如果它贴着模拟输入线走耦合过来的噪声很难滤掉。我习惯把模拟输入放在PCB一侧数字接口放在另一侧中间用地平面隔开。另外ADC下方的模拟地平面要完整不要被数字信号过孔切碎。VREF走线要短、要粗并且参考电容要就近放置。SPI信号线上如果走线超过3cm建议在主机端串接33Ω电阻既能抑制振铃又能减小高频辐射。这些小细节在功能验证阶段可能看不出来一到EMC测试或高低温试验就原形毕露了。3. SPI时序和命令字最容易翻车的地方在这3.1 搞清楚CS低电平期间到底发生了什么ADS7950的SPI时序和普通SPI从机有那么一点区别也正是这个区别让很多新手第一次调试时一脸懵。手册里的时序模型是片选CS拉低后主机在SCLK上升沿把12位命令字写入SDI同时芯片在SCLK下降沿把上一次转换结果从SDO输出。整一帧至少要提供16个SCLK周期不然后面的处理过程可能不完整。这里有个非常容易踩坑的点你当下这一帧通过MISO读回来的数据并不是当前命令对应的结果而是上一帧命令的转换结果。因为SAR型ADC是边写入命令边输出上一次结果数据天然有一帧延迟。做单次读取时无所谓但做多通道轮询时如果你第一次发出通道0的命令、第二次发出通道1的命令第二次读回的是通道0的结果要等到第三次才能拿到通道1的数据。很多现场数据错位问题根源就在这里。3.2 SPI模式建议用Mode 0从时序图上看SCLK空闲时是低电平命令在上升沿被芯片锁存数据在下降沿被驱动到SDO。所以主机侧最匹配的模式是SPI Mode 0也就是CPOL0、CPHA0。在这个模式下主机在SCLK上升沿采样MISO正好SDO数据经过半个周期已经稳定。我在STM32和ZYNQ上都用Mode 0跑通过这颗芯片1MSPS采样率下没有出现数据不稳的问题。如果你的项目里用了Mode 1或别的模式也不是绝对不能工作但SCLK速度较高时容易在边沿采样上碰到数据建立不充足的偶发错码建议还是统一用Mode 0省心。使用硬件SPI时要注意帧长度设置有些MCU的SPI外设只支持8位帧可以用连续两次8位传输拼成16位中间要保持CS不被拉高。3.3 命令字结构位段定义一定要对照手册原文ADS7950的命令字一共12位大致由通道选择、工作模式、输入范围等字段组成。中文手册在这部分通常会有翻译但表格里的位定义在不同版本里描述方式不太一样我自己就遇到过中文版把“range select”翻译得含糊其辞、最终还是要回到英文原版核对的情况。所以强烈建议先把中文资料通读一遍建立整体印象具体开发时把命令字位定义对照英文原文确认一次。这里给个通用的命令字拼装思路uint16_t ads7950_build_cmd(uint8_t ch, uint8_t mode, uint8_t range_sel) { // 位段位置以你手上的手册表格为准这里只演示拼接逻辑 // ch: 0~7mode: 手动/自动序列range_sel: 单端/差分、0~VREF/±VREF uint16_t cmd ((uint16_t)ch 9) | ((uint16_t)mode 7) | ((uint16_t)range_sel 6); return cmd; }这段代码不是让你直接抄而是表达一个思路命令字本质就是一个按位组织的控制字开发时把每个字段定义成宏代码可读性和可维护性会好很多。3.4 连续扫描和级联扩展怎么玩多通道场景下你既可以在程序里手动切换通道命令也可以用芯片支持的自动序列模式。自动序列模式的好处是芯片自己按顺序扫完指定通道主机只需要持续提供SCLK省去每条命令里反复构造通道号的麻烦。但要注意切换通道后模拟输入前端需要一点建立时间自动序列跑第一轮时数据不要直接用最好先跑一遍“预热”。ADS7950还支持级联简单说就是多片ADC的SDO串联到下一片的SDI最后一颗芯片的SDO接到主机的MISO片选CS可以共用用一套SPI总线控制多片芯片。这样通道数可以从8路扩展到16路、24路甚至更多对高密度采集板非常友好。级联模式下命令字和数据字会逐帧延迟需要等流水线填满之后每一帧读回的数据才和当前命令对齐这块中文资料里写得不细我建议用逻辑分析仪抓一遍波形再写驱动。4. 驱动代码一套可直接落地的轮询读取逻辑4.1 用软件SPI把时序彻底跑通很多MCU的硬件SPI在帧长、字节序上有限制碰到ADS7950这种16位传输反而要多绕几个弯。我第一次调这颗芯片时就先用GPIO模拟SPI把时序彻底跑通再换到硬件SPI提速。这样有个好处每一行代码对应一个信号跳变出问题时用示波器一量就知道哪里不对。下面是一份极简的软件SPI单帧交换函数static uint16_t ads7950_xfer(uint16_t cmd) { uint16_t rx 0; CS_LOW(); for (int i 15; i 0; i--) { // 命令字从高到低逐位发送数据位同样从高到低接收 if (cmd (1 i)) SDO_HIGH(); else SDO_LOW(); SCLK_HIGH(); // 上升沿芯片锁存SDI if (MISO_READ()) rx | (1 i); // 在同一时刻采样SDO SCLK_LOW(); // 下降沿芯片更新SDO输出 } CS_HIGH(); return rx; }注意循环里是16位而不是12位多出来的4个SCLK是给芯片内部处理留的时间。如果你只打12个时钟多数情况下也能出数据但有时高采样率下偶尔会错码统一打满16位更保险。4.2 单通道读取记得先做一次丢弃帧前面提过MISO读回的数据对应的是上一次命令的结果。所以读单通道时正确的做法是连续发两次相同命令第一次的结果扔掉第二次才是当前通道的稳定数据。写成函数就是uint16_t ads7950_read_single_channel(uint8_t ch) { uint16_t cmd ads7950_build_cmd(ch, MODE_SINGLE, RANGE_UNIPOLAR); ads7950_xfer(cmd); // 丢弃帧让芯片完成通道切换并输出稳定结果 uint16_t raw ads7950_xfer(cmd); return raw; }有的工程师嫌两次传输浪费采样率想提前把命令发出去下一次调用直接读。这也可以但状态管理容易乱我倒建议新手阶段老老实实做丢弃帧先把正确性保证好后面优化有的是时间。4.3 多通道轮询与电压换算多通道采集时的基本套路是维护一个通道列表循环调用上面的读取函数。比如要采集CH0到CH3四路电压#define ADC_CH_NUM 4 uint16_t raw_buffer[ADC_CH_NUM]; float volt_buffer[ADC_CH_NUM]; void ads7950_poll_channels(void) { for (int i 0; i ADC_CH_NUM; i) { raw_buffer[i] ads7950_read_single_channel(i); // 12位ADC满量程对应VREF volt_buffer[i] (float)raw_buffer[i] * VREF / 4096.0f; } }这里VREF就是当前参考电压。用内部基准时取2.5V用外部基准时换成实际基准电压。换算公式本身不复杂但要提醒一点如果是差分±VREF模式读回来的原始码是二进制补码格式先要判断符号位不能直接套无符号公式否则负电压会算出一个很大的正数。4.4 提高传输效率的进阶思路轮询模式下如果要逼近1MSPS采样率软件SPI基本撑不住这时候就用硬件SPI。初始化时配置成Mode 0、16位帧或不支持16位帧就连续两次8位传输、MSB先行片选CS用普通GPIO控制。效率最高的一种做法是开启SPI的RX和TX中断用DMA把连续帧的命令数组发送出去同时把接收数据读入缓冲。这样CPU只需要在DMA结束后统一处理数据不再一个字节一个字节地干预采样率可以跑得很接近芯片极限。但用DMA时务必注意第一帧数据要对齐命令。我习惯的做法是命令缓冲数组的第一个元素故意填一个无效命令比如针对最后一帧正常命令的重复然后从接收缓冲的第2个元素开始解析这样能天然避开通道切换时的乱序问题。5. 调试实录那些手册里没写透的坑5.1 SDO全是0或者全是1这是最常见的问题症状就是读回来的数据纹丝不动。按我的排查顺序走一遍先确认CS低电平期间波形正常MISO有没有被占空比错误拉低再用示波器单通道看SDO引脚有没有翻转如果SDO始终是高可能是芯片没真正进入SPI模式查一下CS空闲高电平电平是否达标如果SDO始终是低多半是MISO引脚配置成了推挽输出互相打架或者内部基准没起振查VREF引脚对地电容是不是没焊上。5.2 多通道切换后数据错位切换通道后读到的数据还是上一个通道的值这基本就是上篇文章里说的“一帧延迟”问题。解决思路就两条要么读取后丢弃第一帧要么在切换通道后额外发一次空命令。还有一种情况是自动序列模式下通道顺序和自己代码里维护的顺序不一致这时候用逻辑分析仪把SDI命令抓出来对照命令字的通道号字段基本一眼就能定位。5.3 读数跳动大、噪声明显如果采样值在理想值附近来回跳好几个LSB先不要怀疑芯片去测参考电压纹波。VREF引脚如果只放了一个小电容高频噪声很容易耦合进去我建议至少在VREF引脚放一个10μF电容加0.1μF电容并联。输入信号源阻抗太高也会导致开关电容的建立不完整这时在ADC输入前面加RC低通或运放缓冲效果立竿见影。最后还要查一下系统里面有没有开关电源DC-DC的开关噪声如果串进模拟地读数跳动会非常明显这种情况需要优化地平面分割和电源滤波。5.4 中文资料阅读的特别提醒《ads7950中文资料.pdf》这类翻译资料整体可用但有几个地方要加倍小心。一是命令字位定义表格翻译版本偶尔会把“reserved”位漏掉导致命令字组错二是时序图里的建立时间和保持时间数值翻译版可能简化省略做高速设计时还是要翻英文原版三是封装引脚图翻译版有极小概率出现引脚名和下方注释不一致的情况画封装前一定要对照英文版逐个核对。我的建议是中文资料用来了解芯片特性和大致的用法流程真正画原理图、写驱动、调时序时把英文版数据手册和中文版放在一起对照着看两边不一致时以英文原版为准。这不是崇洋而是芯片原始行为定义都在英文文档里翻译过程多少会有信息损耗。最后再分享一个挺实用的调试技巧新板子第一次上电先别急着接任何真实传感器把某个模拟输入通道直接短接到VREF用函数创建这个通道的读取命令观察采样结果。如果示波器上看到SPI波形正常采回来的码值在4095附近说明SPI时序和命令字都对了。接下来再把输入接到VREF的一半也就是1.25V左右确认码值稳定在2048附近这样整个信号链路的基本健康状态一目了然。调过几块板子之后你就会发现ADS7950这颗芯片其实脾气挺好的只要把参考电压和时序伺候舒服了它就能老老实实交出稳定的12位数据。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门