尧图精选

STM32驱动CS5532 24位ADC:称重传感器高精度采集实战

🕒 发布时间:2026/8/31 22:10:09 📁 来源:尧图网络
简介本资源是一套面向嵌入式开发工程师与STM32进阶学习者的CS5532高精度ADC驱动实战例程聚焦解决STM32微控制器与CS5532芯片之间的SPI通信配置、寄存器初始化、连续采样读取及基础异常处理等核心问题适用于工业传感、精密测量等对ADC性能要求较高的应用场景。压缩包仅含2个精炼文件1个C源文件1个头文件总大小4KB结构清晰.c文件实现SPI初始化、CS5532配置命令发送、AD数据读取及超时保护逻辑.h文件封装函数接口、关键寄存器定义与采样参数宏便于快速集成到现有工程。目前已有1804人学习下载代码注释完整、时序逻辑严谨涵盖片选控制、时钟极性匹配、命令帧格式等易错细节并隐含电源去耦与噪声抑制的工程提示可直接编译运行是理解高精度ADC底层驱动的高效入门参考。 搞称重、测压力、做精密仪器的时候我第一反应是直接用STM32自带的ADC。但一算分辨率就傻眼了12位 ADC3.3V基准下最低能分辨0.8mV做一般电压采集还行放到50kg量程、需要显示到克级的秤上根本没法用。后来换了外挂24位ADC CS5532配合STM32的SPI接口一路调下来踩了不少坑也沉淀了一套比较完整的驱动写法。这篇就把硬件连接、SPI时序、寄存器操作、校准流程和滤波处理一次说透。1. 为什么是CS5532这颗24位ADC的定位和选型逻辑1.1 核心参数和特性CS5532是Cirrus Logic现在归到TI旗下推出的一款24位Delta-Sigma型ADC最大特点就是高分辨率、内置可编程放大器、带自校准和系统校准能力。它有两个差分输入通道具体看后缀CS5532-BS是双通道CS5532-AS是单通道非常契合称重传感器、应变片、压力变送器这类输出微弱差分信号的场景。关键参数我这里汇总一下参数典型值说明分辨率24位二进制补码输出正满量程0x7FFFFF负满量程0x800000通道数1或2差分BS后缀双通道AS后缀单通道内置PGA1/2/4/8/16/32/64倍微弱信号直接放大省掉外部仪表放大器输出速率7.5 SPS ~ 3840 SPS由配置寄存器OWR位控制接口SPI兼容串口3线或4线CS低有效数据就绪DRDY引脚转换完成后自动拉低校准自校准/系统校准消除偏移和增益误差供电VA/VA-/VD模拟电源和数字电源分开这颗芯片内部结构可以简单理解成三部分前端是Delta-Sigma调制器中间是数字滤波器后端是串行接口和校准寄存器。模拟信号进来后直接被采样调制再通过数字滤波得到24位数据所以它对模拟噪声非常敏感后文会专门讲布线问题。1.2 和HX711、ADS1256这些常见ADC放一起怎么选很多新手容易在CS5532、HX711、ADS1256之间纠结我根据实际项目经验做个对比型号分辨率通道PGA接口校准能力典型应用HX71124位1差分32/64/128自定义两线无电子秤成本敏感CS553224位1/2差分1~64SPI自校准/系统校准精密称重、压力、工业采集ADS125624位8可配单端/差分1~64SPI自校准/系统校准多通道数据采集、便携仪表HX711的优势是便宜、外围简单但增益档位少、没有真正的寄存器配置能力稳定性一般。ADS1256通道多适合多路采集。CS5532强在校准机制它能在芯片内部自动修正偏移和增益误差这一点在长期稳定性要求高的工业场景里非常关键。它的SPI接口很标准配合STM32的硬件SPI或GPIO模拟都能跑起来。1.3 适合场景和限制我建议在以下场景优先考虑CS5532称重传感器桥路信号采集量程从几十克到几吨压力变送器、差压传感器信号调理热电偶、热电阻等微弱电压信号的前端采集需要长期漂移小的精密仪器但要注意它的输出速率上限约3.84kSPS如果要做高速振动分析等动态测量就力不从心了。而且它本身不带内部基准需要外部基准电压源设计时多一个器件。2. 硬件连接从引脚定义到电源布线的关键细节2.1 引脚一览与STM32接线表CS5532常见封装是SSOP-20引脚分成四类电源类、模拟输入类、基准电压类、串行接口类。引脚功能连接到VA模拟正电源5VVA-模拟负电源-5V 或 GND单电源应用VD数字正电源3.3VAGND模拟地模拟地DGND数字地数字地AIN1/AIN1-模拟输入通道1传感器差分信号AIN2/AIN2-模拟输入通道2传感器差分信号VREF/VREF-基准电压输入2.5V或5V基准SCLK串行时钟STM32 SPI SCKSDI串行数据输入STM32 SPI MOSISDO串行数据输出STM32 SPI MISOCS片选STM32 GPIODRDY数据就绪STM32 GPIOXIN/XOUT时钟输入/输出外部晶振或时钟以STM32F103C8T6为例我通常把CS5532挂在SPI1上CS5532STM32F103说明CSPA4普通GPIO输出手动控制片选SCLKPA5SPI1_SCKSDIPA7SPI1_MOSISDOPA6SPI1_MISODRDYPA8普通GPIO输入检测数据就绪VD3.3V数字电源VA5V模拟电源2.2 电源、基准电压和时钟怎么接CS5532的模拟电源和数字电源是分开的我强烈推荐模拟部分用单独稳压器不要直接从STM32开发板的3.3V取电。数字部分VD接3.3V模拟部分VA接5VVA-接GND也可以做单电源应用但输入信号共模范围会受限如果传感器输出有负压或者需要双极性采集最好用正负电源。基准电压VREF和VREF-非常关键它的稳定性直接决定ADC精度。可以用REF5025这类精密基准芯片产生2.5V也可以用高精度稳压源。千万别用STM32板载的3.3V LDO输出当基准那种LDO噪声和温漂都比较大和CS5532的24位分辨率完全不在一个量级。时钟方面CS5532需要外部提供时钟源常用的做法是在XIN和XOUT之间接晶振。我项目里用的4.9152MHz晶振效果就不错当然也可以直接由外部信号源给XIN输入CMOS时钟XOUT悬空。时钟频率会影响输出字速率配置寄存器里OWR位对应的速率都是基于特定时钟算出来的。2.3 布线和去耦要点CS5532是24位ADC它对噪声的敏感程度远超普通MCU外设PCB布线时我总结了几条硬性经验模拟地和数字地在芯片下方单点相连不要大面积敷铜连成一片每个电源引脚就近放0.1uF陶瓷电容再并联10uF钽电容做低频去耦传感器信号线尽量短并做好屏蔽屏蔽层单端接地SCLK、SDI、SDO这些数字信号线远离模拟输入引脚模拟输入走线两侧加地包围减少串扰如果在面包板上做实验噪声会大不少这是正常的不代表芯片不行后面滤波部分会再讲。3. SPI配置CS5532的时序陷阱与STM32初始化3.1 先说清楚CS5532到底要什么样的SPI时序CS5532的串口虽然叫做SPI兼容但它不是完全标准的SPI从机有几个特点容易踩坑。CS5532的SCLK空闲电平是高数据在SCLK下降沿被采样对应到STM32的SPI模式就是CPOLHigh、CPHA2Edge也就是SPI Mode 3。很多人在网上搜到的代码如果用了Mode 0或者Mode 2通讯就会莫名其妙出错读回来的数据全是0xFF或者乱跳。还有一个关键点CS5532的片选CS不是简单的拉低选中在发送命令和读取数据的过程中CS必须保持低电平整个操作完成后才拉高。如果中途CS抖动或者由SPI硬件NSS自动拉高芯片就会把当前传输判定为无效。另外一个容易被忽略的点是SCLK频率。CS5532数据手册上串行时钟频率上限不算高实际用下来2.25MHz以下比较稳超过这个值偶尔会出现字节错位。3.2 基于ST标准外设库的SPI1初始化我用标准外设库的初始化代码关键就是SPI模式、时钟极性和相位void SPI1_Init_For_CS5532(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1, ENABLE); // SCK: PA5, MOSI: PA7, MISO: PA6 复用推挽 GPIO_InitStructure.GPIO_Pin GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_2MHz; GPIO_Init(GPIOA, GPIO_InitStructure); // CS: PA4 普通推挽输出默认拉高 GPIO_InitStructure.GPIO_Pin GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_2MHz; GPIO_Init(GPIOA, GPIO_InitStructure); GPIO_SetBits(GPIOA, GPIO_Pin_4); // DRDY: PA8 上拉输入 GPIO_InitStructure.GPIO_Pin GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU; GPIO_Init(GPIOA, GPIO_InitStructure); SPI_InitStructure.SPI_Direction SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode SPI_Mode_Master; SPI_InitStructure.SPI_DataSize SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL SPI_CPOL_High; SPI_InitStructure.SPI_CPHA SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler SPI_BaudRatePrescaler_32; SPI_InitStructure.SPI_FirstBit SPI_FirstBit_MSB; SPI_Init(SPI1, SPI_InitStructure); SPI_Cmd(SPI1, ENABLE); }这里把SPI1挂在APB2总线上F103的APB2时钟是72MHz分频32得到2.25MHz比较接近CS5532的上限。如果你在实际调试中偶尔读到错误数据可以把分频改成64降到1.125MHz试试稳定性和速率之间找个平衡。3.3 HAL库写法用HAL库的工程初始化部分和标准库本质一样代码更简洁SPI_HandleTypeDef hspi1; void MX_SPI1_Init(void) { hspi1.Instance SPI1; hspi1.Init.Mode SPI_MODE_MASTER; hspi1.Init.Direction SPI_DIRECTION_2LINES; hspi1.Init.DataSize SPI_DATASIZE_8BIT; hspi1.Init.CLKPolarity SPI_POLARITY_HIGH; hspi1.Init.CLKPhase SPI_PHASE_2EDGE; hspi1.Init.NSS SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler SPI_BAUDRATEPRESCALER_32; hspi1.Init.FirstBit SPI_FIRSTBIT_MSB; HAL_SPI_Init(hspi1); }HAL库发送单个字节时我习惯用TransmitReceive而不是Transmit因为读取SDO数据时也需要同时给时钟static void SPI1_ExchangeByte(uint8_t tx, uint8_t *rx) { while (HAL_SPI_GetState(hspi1) ! HAL_SPI_STATE_READY); HAL_SPI_TransmitReceive(hspi1, tx, rx, 1, 1000); }3.4 为什么有经验的开发者会改用GPIO模拟SPICS5532的SPI时序其实非常简单发送命令加读取数据总共就几种固定模式所以我周围不少做仪器的工程师干脆不用SPI外设直接拿GPIO模拟。模拟SPI的好处有三个引脚自由不受SPI外设引脚映射限制时序完全可控想加延时就在关键点加调试方便逻辑分析仪看着清清楚楚坏处也明显实时性差一些CPU占用高一点但对CS5532这种低速ADC来说完全不是问题。我在后期维护的项目里甚至把SPI1留出来干别的CS5532全用GPIO驱动了。如果你在自己项目里SPI外设不够用完全可以照这个思路走。4. 寄存器、命令和通信验证协议没想象中复杂4.1 寄存器结构CS5532内部寄存器不算多最常用的有四个寄存器位宽功能偏移寄存器24位存放偏移校准值增益寄存器24位存放增益校准值配置寄存器8位输出速率、通道选择、中断使能等通道设置寄存器32位增益、极性、单端/差分配置配置寄存器的输出字速率位和通道选择位决定了一次转换的节奏和控制对象通道设置寄存器里的PGA增益位则决定前端放大倍数。具体每一位的编号不同批次手册略有差异我建议你拿到芯片后先对着数据手册确认但整体功能就是上面这几类。需要特别注意通道设置寄存器和配置寄存器是两个不同的东西配置寄存器管怎么转换通道设置寄存器管输入怎么处理。很多新手上手只写了配置寄存器忘记写通道设置寄存器导致PGA增益不生效读数始终很小。4.2 命令发送封装与校准命令CS5532的命令有两个字节当CS拉低后先通过SDI发高字节再发低字节然后根据命令类型决定是继续写数据还是读数据。我封装了一个函数void CS5532_SendCommand(uint8_t cmd0, uint p a hrefhttps://download.csdn.net/download/ZCY5202015/85970211 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p
上一篇/下一篇内容由系统自动关联 返回资讯列表 →