第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