第2章:嵌入式系统基础:微控制器选型与传感器接口
大家好,我是老李。在暖通空调行业摸爬滚打了十几年,从最早的8位单片机一路做到现在的双核处理器。今天咱们聊聊嵌入式系统的基础——微控制器选型、RTOS概念,还有传感器接口。这些东西看着基础,但选错了,后面全白干。
2.1 微控制器选型:STM32 vs ESP32
做暖通空调的嵌入式方案,微控制器就是大脑。选型不对,就像给空调装了个赛扬处理器,跑不动。我个人习惯,先看项目需求,再看芯片资源。
2.1.1 STM32:工业级的稳定之选
STM32系列,尤其是F4和H7系列,在工业控制领域是绝对的主力。为什么?
- 稳定性高:工作温度范围宽(-40°C ~ 85°C),抗干扰能力强。我在项目中遇到过,某国产芯片在夏季高温下频繁死机,换成STM32F407后,再没出过问题。
- 外设丰富:多路ADC、DAC、定时器、CAN总线,非常适合暖通空调的多传感器采集和电机控制。
- 生态成熟:HAL库、LL库、FreeRTOS移植,网上资料一抓一大把。
重要提示:STM32的功耗相对较高,如果做电池供电的无线传感器节点,建议考虑STM32L系列(超低功耗)。
2.1.2 ESP32:Wi-Fi/BLE一体化的性价比之王
ESP32这两年火得不行。为什么?因为它把Wi-Fi、蓝牙、双核处理器、大容量Flash全集成在一个芯片上,价格还不到20块钱。
- 无线通信:内置Wi-Fi和BLE,非常适合做暖通空调的远程监控、数据上云。
- 双核处理:一个核跑协议栈,一个核跑应用逻辑,互不干扰。
- 开发便捷:Arduino IDE、ESP-IDF、MicroPython都能用,上手快。
避坑指南:我曾经在一个项目中用ESP32做PID控制,发现它的ADC精度不够(12位,且线性度一般)。后来我改用外部ADC(比如ADS1115)才解决问题。所以,ESP32适合做通信和逻辑控制,但不适合做高精度模拟量采集。
2.1.3 选型对比表
| 对比项 | STM32F4 | ESP32 |
|---|---|---|
| 核心架构 | Cortex-M4 | Xtensa LX6双核 |
| 主频 | 168 MHz | 240 MHz |
| 无线功能 | 无(需外挂) | Wi-Fi + BLE |
| ADC精度 | 12位/16位 | 12位(精度一般) |
| 工作温度 | -40~85°C | -40~85°C |
| 典型价格 | 30~80元 | 15~25元 |
| 适用场景 | 工业控制、电机驱动 | 物联网、数据上云 |
我的建议是:如果项目需要高可靠性和高精度控制,选STM32;如果需要无线通信和快速原型开发,选ESP32。当然,也可以两者结合——STM32做控制,ESP32做通信,通过UART或SPI互联。
2.2 RTOS概念:为什么需要实时操作系统?
很多初学者觉得,裸机编程也能跑,为什么要上RTOS?
嗯,这里要注意。暖通空调系统通常需要同时处理多个任务:读取温度传感器、控制压缩机、响应按键、更新显示屏、处理通信数据。如果用裸机,你得写一个超级大的while循环,把所有任务串起来。一旦某个任务卡住,整个系统就瘫痪了。
RTOS(实时操作系统)的核心思想就是:把大循环拆成多个独立的小任务,让它们看起来像是同时运行的。
2.2.1 常用RTOS对比
| RTOS | 特点 | 适用场景 |
|---|---|---|
| FreeRTOS | 轻量、开源、移植性好 | STM32/ESP32通用 |
| RT-Thread | 国产、组件丰富、支持设备驱动框架 | 复杂物联网设备 |
| uC/OS-III | 商业级、稳定、文档齐全 | 工业控制、医疗设备 |
我个人习惯用FreeRTOS,因为它免费、轻量,而且STM32CubeMX直接支持一键生成。你想想看,省了多少配置时间。
2.2.2 任务调度示例
下面是一个简单的FreeRTOS任务示例,模拟暖通空调的传感器读取和压缩机控制:
// 任务1:读取温度传感器(每100ms执行一次)
void vTaskSensorRead(void *pvParameters) {
for (;;) {
temperature = read_temperature_sensor();
vTaskDelay(pdMS_TO_TICKS(100));
}
}
// 任务2:控制压缩机(根据温度调整PWM)
void vTaskCompressorControl(void *pvParameters) {
for (;;) {
if (temperature > SETPOINT) {
set_compressor_speed(HIGH);
} else {
set_compressor_speed(LOW);
}
vTaskDelay(pdMS_TO_TICKS(500));
}
}
// 主函数中创建任务
int main(void) {
xTaskCreate(vTaskSensorRead, "Sensor", 256, NULL, 1, NULL);
xTaskCreate(vTaskCompressorControl, "Compressor", 256, NULL, 2, NULL);
vTaskStartScheduler();
// 程序不会执行到这里
}
提示:任务优先级不要设太多,一般3~5级就够了。优先级越高,越容易抢占CPU。我曾经见过有人设了10个优先级,结果高优先级任务把低优先级任务饿死了。
2.3 传感器接口:I2C、SPI、UART
暖通空调系统里,传感器是眼睛和耳朵。温度、湿度、压力、流量、CO2浓度……这些数据怎么传到微控制器?靠的就是通信接口。
2.3.1 I2C:两线制,适合短距离、多设备
I2C只有两根线:SCL(时钟)和SDA(数据)。它支持多主机、多从机,每个设备有唯一地址。
- 优点:引脚少,接线简单,支持多个传感器挂在同一总线上。
- 缺点:速度相对慢(标准模式100kHz,快速模式400kHz),距离短(一般不超过1米)。
- 典型应用:温湿度传感器(SHT30、BME280)、光照传感器、EEPROM。
我在项目中遇到过一个问题:I2C总线上挂了5个传感器,结果通信不稳定。排查了半天,发现是总线电容太大,上拉电阻没选对。后来我把上拉电阻从10kΩ换成4.7kΩ,问题解决。
避坑指南:I2C总线上挂的设备越多,总线电容越大。如果超过400pF,信号就会失真。建议:一条I2C总线上不要超过8个设备,且走线长度控制在30cm以内。
2.3.2 SPI:四线制,高速、全双工
SPI有四根线:SCLK(时钟)、MOSI(主出从入)、MISO(主入从出)、CS(片选)。
- 优点:速度快(可达几十MHz),全双工通信,适合大数据量传输。
- 缺点:引脚多(每增加一个从机,需要多一根CS线),不支持多主机。
- 典型应用:高精度ADC(如ADS1256)、Flash存储器、显示屏驱动。
举个例子,我之前用STM32F407通过SPI读取一个24位ADC(ADS1256),采样率跑到30kSPS,完全没问题。如果用I2C,同样的ADC只能跑到2kSPS左右。
2.3.3 UART:异步串口,简单可靠
UART只需要两根线:TX(发送)和RX(接收)。它不需要时钟线,靠波特率同步。
- 优点:硬件简单,几乎所有的微控制器都支持,通信距离远(RS232可达15米,RS485可达1200米)。
- 缺点:只能点对点通信(一主一从),速度相对慢(一般115200bps)。
- 典型应用:调试日志输出、与Wi-Fi模块(ESP8266/ESP32)通信、与上位机通信。
重要提示:在暖通空调项目中,UART经常用于与变频器、PLC等设备通信。这时候建议使用RS485接口(差分信号),抗干扰能力强,传输距离远。
2.3.4 接口选型总结
| 接口 | 引脚数 | 速度 | 距离 | 典型传感器 |
|---|---|---|---|---|
| I2C | 2 | 100k~400kbps | <1m | SHT30, BME280 |
| SPI | 4+ | 1M~50Mbps | <1m | ADS1256, Flash |
| UART | 2 | 9600~115200bps | 15m(RS232) | GPS, 蓝牙模块 |
我的建议是:温湿度、气压等低速传感器用I2C;高精度ADC、显示屏用SPI;与外部设备通信用UART(RS485)。这样搭配,既省引脚,又保证性能。
2.4 实战经验:一个典型的暖通空调传感器节点
最后,我分享一个实际项目的传感器节点设计思路。这个节点用于采集空调回风口的温度、湿度和CO2浓度,并通过RS485上传到中央控制器。
- 主控:STM32F103C8T6(性价比高,资源够用)
- 温度/湿度:SHT30(I2C接口,精度±0.3°C)
- CO2浓度:MH-Z19B(UART接口,量程0~5000ppm)
- 通信:MAX3485(RS485芯片,UART转RS485)
- 电源:24V AC转3.3V DC(暖通空调系统常用24V供电)
这个方案成本不到50元,但稳定运行了两年多,没出过问题。所以说,选型不在贵,在于合适。
好了,这一章就到这里。下一章我们聊聊传感器驱动开发,包括I2C和SPI的底层时序实现。到时候我会手写代码,带大家一步步调试。
公众号:蓝海资料掘金营,微信deep3321