3. 硬件平台搭建:STM32微控制器选型、ADC采集电路设计、温度传感器选型与接口
好,咱们进入第三章。硬件平台搭建,说白了就是给算法找个靠谱的「家」。你算法写得再漂亮,硬件底子不行,数据一塌糊涂,那全是白搭。我这些年踩过的坑,有一半都出在硬件选型和电路设计上。今天咱们就把这块掰开揉碎了讲清楚。
3.1 STM32微控制器选型:够用、好用、皮实
选MCU,我个人的习惯是三步走:先看算力需求,再看外设资源,最后看供货和价格。压力传感器温度补偿,说白了就是做数学运算,对主频要求其实不高。但ADC的精度和采样率,那是硬指标。
我推荐几个常用型号:
| 型号 | 内核 | 主频 | ADC特性 | 适用场景 |
|---|---|---|---|---|
| STM32F103C8T6 | Cortex-M3 | 72MHz | 12位,1μs转换 | 入门级,成本敏感 |
| STM32G431 | Cortex-M4F | 170MHz | 12位,支持过采样 | 需要浮点运算,中等精度 |
| STM32L4系列 | Cortex-M4F | 80MHz | 12位,低功耗模式 | 电池供电,便携设备 |
| STM32H7系列 | Cortex-M7 | 480MHz | 16位,高精度ADC | 工业级,高精度补偿 |
3.2 ADC采集电路设计:信号链的「咽喉」
ADC电路,是整个系统的瓶颈。传感器信号再准,ADC采歪了,一切都白费。这里我重点讲三个关键点:参考电压、前端调理、抗混叠滤波。
3.2.1 参考电压:精度之源
STM32内部有VREF引脚,但内部参考电压精度一般,温漂也大。我个人建议,外部独立参考电压芯片是必须的。
常用的参考电压芯片:
- REF3030:3.0V输出,精度0.2%,温漂50ppm/℃。性价比高,我常用。
- ADR4525:2.5V输出,精度0.02%,温漂2ppm/℃。高精度场景首选。
- MAX6126:超低噪声,适合24位ADC前端。
3.2.2 前端调理电路
压力传感器的输出信号,通常很微弱。比如电阻应变式压力传感器,满量程输出可能只有10-20mV。直接进ADC,分辨率根本不够。所以需要放大。
我常用的方案:
- 仪表放大器:比如AD620、INA128。共模抑制比高,适合差分信号。
- 运放+电阻网络:成本低,但需要精密电阻。我一般用0.1%精度的电阻。
放大倍数怎么选?举个例子:传感器满量程输出20mV,ADC参考电压3.0V,12位ADC的分辨率是3.0V/4096 ≈ 0.732mV。如果直接采,20mV只能对应约27个LSB,精度太差。放大100倍到2V,就能对应2730个LSB,精度提升100倍。
3.2.3 抗混叠滤波
ADC采样前,一定要加低通滤波器。为什么?因为传感器信号里可能混有高频噪声,比如50Hz工频干扰、电机噪声等。如果不滤波,这些高频分量会被「混叠」到低频段,造成测量误差。
我一般用一阶RC低通滤波器,截止频率设置在采样率的1/10左右。比如采样率1kHz,截止频率就设在100Hz。
// 一阶RC低通滤波器参数计算
// 截止频率 fc = 1 / (2 * π * R * C)
// 假设 R = 10kΩ,C = 0.1μF
// fc = 1 / (2 * 3.14 * 10000 * 0.0000001) ≈ 159Hz
// 实际代码中,我习惯用软件滤波做二次处理
// 简单的一阶滞后滤波:
float lowPassFilter(float input, float lastOutput, float alpha) {
// alpha = 采样周期 / (采样周期 + RC时间常数)
return alpha * input + (1 - alpha) * lastOutput;
}
3.3 温度传感器选型与接口
温度补偿,核心就是测温度。温度传感器的精度,直接决定了补偿效果的上限。
3.3.1 常见温度传感器对比
| 类型 | 典型型号 | 精度 | 接口 | 优点 | 缺点 |
|---|---|---|---|---|---|
| 数字式 | DS18B20 | ±0.5℃ | 1-Wire | 单总线,连线少 | 速度慢,不适合快速变化 |
| 数字式 | LM75 | ±2℃ | I2C | 接口标准,多设备 | 精度一般 |
| 模拟式 | PT100 | ±0.1℃ | 模拟电压 | 精度高,稳定性好 | 需要调理电路 |
| 模拟式 | NTC热敏电阻 | ±0.2℃ | 模拟电压 | 灵敏度高,响应快 | 非线性严重 |
| 集成式 | BME280 | ±0.5℃ | I2C/SPI | 集成温湿度气压 | 成本稍高 |
3.3.2 接口设计要点
不管用哪种传感器,接口设计有几个通用原则:
- 屏蔽线:温度传感器信号线,尤其是模拟信号,一定要用屏蔽线。屏蔽层单端接地。
- 远离热源:传感器要尽量靠近压力传感器本体,但远离MCU和电源等发热器件。
- 滤波电容:在传感器电源引脚附近,加一个0.1μF的陶瓷电容,滤除高频噪声。
对于I2C接口的传感器,我习惯加上拉电阻。STM32内部虽然有上拉,但驱动能力弱。我一般用4.7kΩ的外部上拉电阻,这样信号更稳定。
// I2C读取LM75温度示例
// 假设LM75地址为0x48(A0、A1、A2接地)
uint8_t lm75_init(void) {
// 配置LM75为正常模式,9位精度
uint8_t config = 0x00;
return i2c_write_byte(0x48, 0x01, config);
}
float lm75_read_temp(void) {
uint8_t buf[2];
if (i2c_read_bytes(0x48, 0x00, buf, 2) != 0) {
return -999.0f; // 读取失败
}
int16_t raw = (buf[0] << 8) | buf[1];
raw >>= 5; // 右移5位,得到11位有效数据
return raw * 0.125f; // 9位精度,分辨率0.125℃
}
3.4 整体硬件架构
说了这么多,咱们画个图总结一下。下面这张图,是我做压力传感器项目时常用的硬件架构。
嗯,这张图基本把咱们今天讲的内容串起来了。压力传感器和温度传感器分别采集信号,经过调理电路和参考电压的「加持」,最后进入STM32的ADC。MCU内部跑温度补偿算法,算出补偿后的压力值,再通过UART或CAN发出去。
公众号:蓝海资料掘金营,微信deep3321