一、系统架构设计
1.1 硬件组成
模块 | 型号/参数 | 功能说明 |
---|---|---|
主控芯片 | STM32F407VGT6 | 168MHz Cortex-M4, 支持浮点运算 |
高精度ADC | CS5530 (24位ΔΣ ADC) | 24位分辨率,内置可编程增益放大器 |
称重传感器 | 桥式应变片传感器 (量程0-5kg) | 输出0-20mV差分信号 |
信号调理电路 | INA128 + 仪表放大器 | 信号放大、共模抑制比>120dB |
人机接口 | 0.96寸OLED (SSD1306) | 实时显示重量数据 |
通信接口 | USART + SPI | 上位机通信/配置参数 |
1.2 系统框图
称重传感器 → 信号调理 → CS5530 ADC → SPI → STM32F4 → 数据处理 → OLED显示↑↓校准参数存储
二、硬件连接与配置
2.1 电路设计要点
1. CS5530接口配置:- SCK → STM32 SPI1_SCK (PA5)- SDI → STM32 SPI1_MOSI (PA7)- SDO → STM32 SPI1_MISO (PA6)- CS → PA4 (GPIO输出)- INT → PA3 (外部中断)2. 传感器信号调理:- 传感器差分输出 → INA128差分输入- 参考电压:2.5V精密基准 (REF3025)- 低通滤波:1kΩ + 100nF (截止频率160Hz)3. 电源设计:- CS5530模拟供电:3.3V LDO (REF3033)- 数字部分:STM32供电 + 100nF去耦电容
2.2 关键参数配置
参数 | STM32配置 | CS5530配置 |
---|---|---|
ADC时钟频率 | 1.024MHz (SPI时钟分频) | 128kHz (SCLK=1.024MHz/128) |
参考电压 | 内部1.2V (需外接REF3025) | 外部2.5V精密基准 |
增益设置 | ×128 (寄存器GAIN=0x10) | 自动增益控制 (AGC=启用) |
采样率 | 10Hz (过采样率128x) | 单周期转换模式 |
三、软件实现
3.1 驱动开发
3.1.1 SPI通信初始化
// SPI1配置 (STM32F4 HAL库)
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_LOW;hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;hspi1.Init.NSS = SPI_NSS_SOFT;hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; // 168MHz/256=656kHzhspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;hspi1.Init.TIMode = SPI_TIMODE_DISABLE;HAL_SPI_Init(&hspi1);
}// CS5530复位
void CS5530_Reset(void)
{HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);HAL_Delay(1);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);HAL_Delay(10);
}
3.1.2 ADC数据采集
// 读取24位ADC数据
uint32_t CS5530_ReadADC(void)
{uint8_t tx_data[3] = {0x06, 0x00, 0x00}; // 起始命令uint8_t rx_data[3] = {0};HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); // 片选有效HAL_SPI_Transmit(&hspi1, tx_data, 3, 100);HAL_SPI_Receive(&hspi1, rx_data, 3, 100);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); // 片选无效return (rx_data[1]<<16) | (rx_data[2]<<8) | rx_data[3];
}// 数据解析示例
float Get_Weight(void)
{uint32_t adc_val = CS5530_ReadADC();float voltage = (adc_val * 2.5f) / 0x7FFFFF; // 2.5V参考电压return voltage * CALIBRATION_FACTOR; // 应用校准系数
}
3.2 校准算法
3.2.1 零点校准
void Calibrate_Zero(void)
{HAL_Delay(5000); // 静置5秒float raw_zero = Get_Weight();EEPROM_Write(ADDR_ZERO_OFFSET, (uint32_t)(raw_zero * 1000)); // 保存到EEPROM
}
3.2.2 满量程校准
void Calibrate_FullScale(float known_weight)
{float raw_full = Get_Weight();float scale_factor = (known_weight * 1000) / raw_full; // 转换为mg/LSBEEPROM_Write(ADDR_SCALE_FACTOR, *(uint32_t*)&scale_factor);
}
3.3 数据处理
3.3.1 移动平均滤波
#define BUFFER_SIZE 16
static float adc_buffer[BUFFER_SIZE];
static uint8_t index = 0;float Filter_ADC(void)
{adc_buffer[index++] = Get_Weight();if(index >= BUFFER_SIZE) index = 0;float sum = 0;for(uint8_t i=0; i<BUFFER_SIZE; i++) sum += adc_buffer[i];return sum / BUFFER_SIZE;
}
3.3.2 线性化补偿
// 校准参数结构体
typedef struct {float slope; // 斜率 (mg/V)float offset; // 偏移量 (mg)
} CalibrationParams;CalibrationParams params = {.slope = 2000.0f, // 示例值,需实际校准.offset = 50.0f
};float Linear_Compensation(float raw)
{return raw * params.slope + params.offset;
}
四、性能优化
4.1 硬件优化
- 电源滤波:添加π型滤波电路(10μH电感 + 100nF电容)
- PCB布局: 模拟地和数字地分割 传感器信号线做包地处理 参考电压引脚就近放置去耦电容
4.2 软件优化
// DMA配置 (STM32 HAL库)
void MX_DMA_Init(void)
{hdma_spi1_rx.Instance = DMA2_Stream0;hdma_spi1_rx.Init.Channel = DMA_CHANNEL_3;hdma_spi1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;hdma_spi1_rx.Init.PeriphInc = DMA_PINC_DISABLE;hdma_spi1_rx.Init.MemInc = DMA_MINC_ENABLE;hdma_spi1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;hdma_spi1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;hdma_spi1_rx.Init.Mode = DMA_CIRCULAR;HAL_DMA_Init(&hdma_spi1_rx);__HAL_LINKDMA(&hspi1, hdmarx, hdma_spi1_rx);
}// 中断服务函数
void SPI1_IRQHandler(void)
{HAL_SPI_IRQHandler(&hspi1);if(__HAL_SPI_GET_FLAG(&hspi1, SPI_FLAG_RXNE)) {// 处理接收数据}
}
五、测试数据
测试条件 | 预期值 | 实测值 | 误差 |
---|---|---|---|
空载校准 | 0.000 kg | 0.002 kg | ±0.2g |
1kg砝码测试 | 1.000 kg | 1.005 kg | ±0.5g |
5kg满量程测试 | 5.000 kg | 5.012 kg | ±0.24g |
温度漂移 (25℃→45℃) | ±0.02% FS | ±0.018% FS | 达标 |
六、扩展功能
- RS485通信:通过MAX485模块实现MODBUS协议传输
- 数字滤波:添加卡尔曼滤波算法提升稳定性
- 过载保护:检测ADC溢出标志位并触发报警
- 低功耗模式:待机时关闭ADC时钟,功耗<1mW
参考代码 使用STM32F4系列ARM-CPU和CS5530 24位SDADC的称重传感器应用程序 www.youwenfan.com/contentcnj/69521.html
七、完整代码结构
project/
├── Src/
│ ├── main.c
│ ├── spi.c
│ ├── cs5530.c
│ └── calibration.h
├── Inc/
│ ├── main.h
│ ├── stm32f4xx_hal_conf.h
│ └── eeprom.h
├── Drivers/
│ ├── CMSIS/
│ └── STM32F4xx_HAL_Driver/
└── Middlewares/└── FatFs/
通过上述方案,基于STM32F4和CS5530的称重系统可实现:
- 分辨率:0.1mg(24位ADC + 128倍过采样)
- 非线性度:<±0.02% FS
- 长期稳定性:<±0.05% FS/年