一、简介ADS1220是TI推出的低功耗、24位精度、Delta-Sigma架构ADC专为高精度传感器测量设计。二、主要技术特性分辨率24位有效分辨率高达20位采样率最高2kSPS支持单周期稳定通道2路差分或4路单端通过MUX配置可编程增益放大器(PGA)1~128 V/V内置基准2.048V温漂5ppm/℃典型双路可编程激励电流源(IDAC)10μA~1.5mA适用于RTD测温内置温度传感器精度0.5℃数字滤波器20SPS下同时抑制50Hz/60Hz接口SPI Mode 1CPOL0CPHA1供电2.3V~5.5V功耗120μA占空比模式PGA禁用封装TSSOP-16 / VQFN-16三、主要应用RTD、热电偶、热敏电阻测温压力传感器、应变计、电子秤便携式仪器、工业过程控制四、引脚定义ADS1220引脚功能STM32Lxxx对应引脚备注AVDD模拟电源3.3V并联0.1μF10μF退耦DVDD数字电源3.3V同AVDDAVSS模拟地GNDDGND数字地GNDCS片选GPIO推挽输出软件控制SCLKSPI时钟SPI_SCK最大4MHz由内部时钟决定DINSPI主机输出SPI_MOSIDOUT/DRDYSPI主机输入 数据就绪SPI_MISO EXTI下降沿触发中断DRDY可选数据就绪另一GPIOEXTI若与DOUT共用则无需单独连接AIN0~3模拟输入传感器信号根据应用配置差分/单端REFP0/REFN0外部基准可选2.048V或外部基准若不使用则接AVDD/AVSS五、内部原理框图六、头文件#ifndef __ADS1220_H#define __ADS1220_H#ifdef __cplusplusextern C {#endif/* Includes */#include main.h // 含SPI_HandleTypeDef、GPIO定义#include stdbool.h#include stdint.h/** 寄存器命令定义 (SPI通信)**//* 命令字节bit7:1读,0写bit6-5:00bit4-0:寄存器地址 */#define ADS1220_CMD_RESET 0x06 // 复位FFh强制复位#define ADS1220_CMD_START 0x08 // 启动转换#define ADS1220_CMD_PWRDOWN 0x02 // 进入关断模式#define ADS1220_CMD_RDATA 0x1C // 读数据当DRDY0时#define ADS1220_CMD_RREG 0x20 | // 读寄存器后跟地址及字节数-1#define ADS1220_CMD_WREG 0x40 | // 写寄存器后跟地址及字节数-1/** 寄存器地址**/#define ADS1220_REG_CONFIG0 0x00#define ADS1220_REG_CONFIG1 0x01#define ADS1220_REG_CONFIG2 0x02#define ADS1220_REG_CONFIG3 0x03/** CONFIG0 寄存器位定义 (MUX, GAIN, PGA_BYPASS)**/#define ADS1220_MUX_AIN0_AIN1 (0x00 4) // 差分 AIN0(), AIN1(-)#define ADS1220_MUX_AIN2_AIN3 (0x10 4) // 差分 AIN2(), AIN3(-)#define ADS1220_MUX_AIN0_AIN2 (0x20 4)#define ADS1220_MUX_AIN1_AIN3 (0x30 4)#define ADS1220_MUX_AIN0_AVSS (0x40 4) // 单端 (AIN0 - AVSS)#define ADS1220_MUX_AIN1_AVSS (0x50 4)#define ADS1220_MUX_AIN2_AVSS (0x60 4)#define ADS1220_MUX_AIN3_AVSS (0x70 4)#define ADS1220_MUX_VREF_DIV4 (0x80 4) // 内部测试#define ADS1220_MUX_TEMP_SENSOR (0x90 4) // 内部温度传感器#define ADS1220_GAIN_1 (0x00 0)#define ADS1220_GAIN_2 (0x01 0)#define ADS1220_GAIN_4 (0x02 0)#define ADS1220_GAIN_8 (0x03 0)#define ADS1220_GAIN_16 (0x04 0)#define ADS1220_GAIN_32 (0x05 0)#define ADS1220_GAIN_64 (0x06 0)#define ADS1220_GAIN_128 (0x07 0)#define ADS1220_PGA_BYPASS (1 3) // 1: 旁路PGA增益最大4/** CONFIG1 寄存器位定义 (DR, MODE, CLK)**/#define ADS1220_DR_20SPS (0x00 5) // 20 SPS (50/60Hz抑制)#define ADS1220_DR_45SPS (0x01 5) // 45 SPS#define ADS1220_DR_90SPS (0x02 5) // 90 SPS#define ADS1220_DR_175SPS (0x03 5) // 175 SPS#define ADS1220_DR_330SPS (0x04 5) // 330 SPS#define ADS1220_DR_600SPS (0x05 5) // 600 SPS#define ADS1220_DR_1000SPS (0x06 5) // 1k SPS#define ADS1220_DR_2000SPS (0x07 5) // 2k SPS#define ADS1220_MODE_NORMAL (0x00 3) // 正常模式#define ADS1220_MODE_DCYCLE (0x01 3) // 占空比模式#define ADS1220_MODE_TURBO (0x02 3) // 保留#define ADS1220_CLK_INTERNAL (0x00 1) // 内部振荡器#define ADS1220_CLK_EXTERNAL (0x01 1) // 外部时钟/** CONFIG2 寄存器位定义 (VREF, IDAC)**/#define ADS1220_VREF_INTERNAL (0x00 5) // 内部2.048V基准#define ADS1220_VREF_EXTERNAL (0x01 5) // REFP0/REFN0#define ADS1220_VREF_AVDD_AVSS (0x02 5) // 电源作为基准#define ADS1220_VREF_REFP1_REFN1 (0x03 5) // AIN0/REF1, AIN3/REFN1/* IDAC电流值 */#define ADS1220_IDAC_OFF (0x00 0)#define ADS1220_IDAC_10UA (0x01 0)#define ADS1220_IDAC_50UA (0x02 0)#define ADS1220_IDAC_100UA (0x03 0)#define ADS1220_IDAC_250UA (0x04 0)#define ADS1220_IDAC_500UA (0x05 0)#define ADS1220_IDAC_1000UA (0x06 0)#define ADS1220_IDAC_1500UA (0x07 0)/** CONFIG3 寄存器位定义 (IDAC路由等)**/#define ADS1220_IDAC1_DISABLED (0x00 5) // IDAC1关闭#define ADS1220_IDAC1_AIN0 (0x01 5) // IDAC1输出到AIN0#define ADS1220_IDAC1_AIN1 (0x02 5)#define ADS1220_IDAC1_AIN2 (0x03 5)#define ADS1220_IDAC1_AIN3 (0x04 5)// IDAC2类似移位2/** 硬件抽象层用户需根据原理图实现**/#define ADS1220_CS_LOW() HAL_GPIO_WritePin(ADS1220_CS_GPIO_Port, ADS1220_CS_Pin, GPIO_PIN_RESET)#define ADS1220_CS_HIGH() HAL_GPIO_WritePin(ADS1220_CS_GPIO_Port, ADS1220_CS_Pin, GPIO_PIN_SET)#define ADS1220_DRDY_READ() HAL_GPIO_ReadPin(ADS1220_DRDY_GPIO_Port, ADS1220_DRDY_Pin)/** API函数声明**/void ADS1220_Init(void);void ADS1220_Reset(void);void ADS1220_Start(void);void ADS1220_PowerDown(void);uint8_t ADS1220_ReadRegister(uint8_t regAddr);void ADS1220_WriteRegister(uint8_t regAddr, uint8_t value);int32_t ADS1220_ReadADC(void);float ADS1220_ReadTemperature(void);void ADS1220_SetIDAC(uint8_t idac1_routing, uint8_t idac2_routing, uint8_t current);void ADS1220_DRDY_IRQHandler(void); // 外部中断回调#ifdef __cplusplus}#endif#endif /* __ADS1220_H */七、源文件#include ads1220.h#include string.h/* 静态句柄由用户在外部分配*/static SPI_HandleTypeDef *hspi_ads1220;/*-----------------------------------------------------------------------------* 私有函数SPI全双工收发*----------------------------------------------------------------------------*/static uint8_t ADS1220_SPI_Transceive(uint8_t txData){uint8_t rxData;HAL_StatusTypeDef ret;ADS1220_CS_LOW();/* SPI通信CPOL0, CPHA1 (Mode 1) 需在SPI初始化时设置 */ret HAL_SPI_TransmitReceive(hspi_ads1220, txData, rxData, 1, 10);if (ret ! HAL_OK) {/* 错误处理重发或复位 */}ADS1220_CS_HIGH();return rxData;}/*-----------------------------------------------------------------------------* 函数: ADS1220_Init* 说明: 初始化SPI句柄、复位ADC、配置默认寄存器*----------------------------------------------------------------------------*/void ADS1220_Init(void){/* 1. 绑定SPI句柄建议在main中调用此函数前设置hspi_ads1220 hspi1;*/extern SPI_HandleTypeDef hspi1;hspi_ads1220 hspi1;/* 2. 硬件复位CS高发送FFh多个字节*/ADS1220_Reset();/* 3. 配置寄存器默认值PGA启用、增益1、内部基准、20SPS */ADS1220_WriteRegister(ADS1220_REG_CONFIG0, ADS1220_MUX_AIN0_AIN1 | ADS1220_GAIN_1);ADS1220_WriteRegister(ADS1220_REG_CONFIG1, ADS1220_DR_20SPS | ADS1220_MODE_NORMAL | ADS1220_CLK_INTERNAL);ADS1220_WriteRegister(ADS1220_REG_CONFIG2, ADS1220_VREF_INTERNAL | ADS1220_IDAC_OFF);ADS1220_WriteRegister(ADS1220_REG_CONFIG3, 0x00); // 无IDAC路由/* 4. 启动连续转换 */ADS1220_Start();}/*-----------------------------------------------------------------------------* 函数: ADS1220_Reset*----------------------------------------------------------------------------*/void ADS1220_Reset(void){ADS1220_CS_LOW();for (uint8_t i 0; i 8; i) {HAL_SPI_Transmit(hspi_ads1220, (uint8_t[]){0xFF}, 1, 10);}ADS1220_CS_HIGH();HAL_Delay(1); // 等待复位完成}/*-----------------------------------------------------------------------------* 函数: ADS1220_Start / ADS1220_PowerDown*----------------------------------------------------------------------------*/void ADS1220_Start(void){ADS1220_SPI_Transceive(ADS1220_CMD_START);}void ADS1220_PowerDown(void){ADS1220_SPI_Transceive(ADS1220_CMD_PWRDOWN);}/*-----------------------------------------------------------------------------* 函数: ADS1220_ReadRegister / ADS1220_WriteRegister*----------------------------------------------------------------------------*/uint8_t ADS1220_ReadRegister(uint8_t regAddr){uint8_t cmd ADS1220_CMD_RREG | (regAddr 2); // 寄存器地址左移2位低2位为字节数-1uint8_t lenByte 0x00; // 读1个字节uint8_t value;ADS1220_CS_LOW();HAL_SPI_Transmit(hspi_ads1220, cmd, 1, 10);HAL_SPI_Transmit(hspi_ads1220, lenByte, 1, 10);HAL_SPI_Receive(hspi_ads1220, value, 1, 10);ADS1220_CS_HIGH();return value;}void ADS1220_WriteRegister(uint8_t regAddr, uint8_t value){uint8_t cmd ADS1220_CMD_WREG | (regAddr 2);uint8_t lenByte 0x00; // 写1个字节ADS1220_CS_LOW();HAL_SPI_Transmit(hspi_ads1220, cmd, 1, 10);HAL_SPI_Transmit(hspi_ads1220, lenByte, 1, 10);HAL_SPI_Transmit(hspi_ads1220, value, 1, 10);ADS1220_CS_HIGH();}/*-----------------------------------------------------------------------------* 函数: ADS1220_ReadADC* 说明: 当DRDY为低时发送RDATA命令读取24位转换结果* 返回: 24位有符号整数左对齐*----------------------------------------------------------------------------*/int32_t ADS1220_ReadADC(void){uint8_t rxBuf[3];int32_t result;/* 检查DRDY若引脚独立建议用中断方式此处为查询*/while (ADS1220_DRDY_READ() GPIO_PIN_SET); // 等待转换完成ADS1220_CS_LOW();HAL_SPI_Transmit(hspi_ads1220, (uint8_t[]){ADS1220_CMD_RDATA}, 1, 10);HAL_SPI_Receive(hspi_ads1220, rxBuf, 3, 10);ADS1220_CS_HIGH();/* 合并24位数据并符号扩展至32位 */result ((int32_t)rxBuf[0] 16) | ((int32_t)rxBuf[1] 8) | ((int32_t)rxBuf[2]);if (result 0x800000) { // 负值扩展result | 0xFF000000;}return result;}/*-----------------------------------------------------------------------------* 函数: ADS1220_ReadTemperature* 说明: 切换到内部温度传感器模式读取ADC并转换为摄氏度* 公式: T(°C) (output_code * 0.125) / 2^15 (内部基准2.048V)*----------------------------------------------------------------------------*/float ADS1220_ReadTemperature(void){int32_t adcCode;float temp;/* 1. 配置MUX为温度传感器 */uint8_t cfg0 ADS1220_ReadRegister(ADS1220_REG_CONFIG0);cfg0 0x0F; // 清除高4位cfg0 | ADS1220_MUX_TEMP_SENSOR;ADS1220_WriteRegister(ADS1220_REG_CONFIG0, cfg0);HAL_Delay(1); // 等待MUX稳定/* 2. 丢弃第一次转换结果 */HAL_Delay(10);(void)ADS1220_ReadADC();/* 3. 读取有效温度值 */adcCode ADS1220_ReadADC();/* 4. 恢复原MUX配置需用户保存—— 此处简化未恢复 *//* 5. 转换为温度0x8000对应0°CLSB0.125°C */temp (float)adcCode * 0.125f / 32768.0f;return temp;}/*-----------------------------------------------------------------------------* 函数: ADS1220_SetIDAC* 说明: 设置IDAC输出引脚和电流大小*----------------------------------------------------------------------------*/void ADS1220_SetIDAC(uint8_t idac1_routing, uint8_t idac2_routing, uint8_t current){uint8_t cfg2, cfg3;/* CONFIG2 设置电流 */cfg2 ADS1220_ReadRegister(ADS1220_REG_CONFIG2);cfg2 0xF8; // 清除低3位cfg2 | (current 0x07);ADS1220_WriteRegister(ADS1220_REG_CONFIG2, cfg2);/* CONFIG3 设置路由 */cfg3 (idac1_routing 0xE0) | ((idac2_routing 0xE0) 2) | 0x02; // 注意位对齐详见手册ADS1220_WriteRegister(ADS1220_REG_CONFIG3, cfg3);}/*-----------------------------------------------------------------------------* 中断服务例程模板在stm32l4xx_it.c中调用*----------------------------------------------------------------------------*/void ADS1220_DRDY_IRQHandler(void){/* 清除EXTI中断标志位 *//* 可选设置一个全局标志主循环读取ADC */volatile int32_t adcValue ADS1220_ReadADC();/* 将adcValue存入环形缓冲区或进行后续处理 */}八、应用示例#include ads1220.hint main(void){HAL_Init();SystemClock_Config(); /* 配置系统时钟建议使能MSI或HSE */MX_GPIO_Init(); /* 包含CS、DRDY等GPIO */MX_SPI1_Init(); /* SPI1: 模式1, 分频后SCLK ≤ 4MHz *//* 初始化ADS1220 */ADS1220_Init();/* 配置为AIN0-AIN1差分输入PGA增益8倍 */ADS1220_WriteRegister(ADS1220_REG_CONFIG0, ADS1220_MUX_AIN0_AIN1 | ADS1220_GAIN_8);/* 若使用RTD开启IDAC250uA至AIN0 */// ADS1220_SetIDAC(ADS1220_IDAC1_AIN0, ADS1220_IDAC2_DISABLED, ADS1220_IDAC_250UA);while (1){/* 轮询方式读取 */if (ADS1220_DRDY_READ() GPIO_PIN_RESET) {int32_t raw ADS1220_ReadADC();/* 转换为电压: V (raw / 2^23) * (2.048 / Gain) */float voltage (float)raw * 2.048f / 8388608.0f / 8.0f; // Gain8printf(ADC: %ld, Voltage: %.3f mV\r\n, raw, voltage * 1000);}HAL_Delay(100);}}