第二讲:硬件平台介绍——主控芯片选型与驱动电路设计
各位同学,大家好。这一讲我们来聊聊硬件平台。做嵌入式RTOS移植,硬件是地基。地基没打好,后面跑RTOS就是空中楼阁。
我个人习惯,选型之前先想清楚三个问题:
- 项目需要多少算力?
- 外设接口够不够用?
- 成本控制在什么范围?
智能照明项目,说白了就是灯要聪明一点。能根据光线自动调亮度,有人经过就亮,没人就灭。听起来简单,但硬件选型上还是有不少门道的。
2.1 主控芯片选型:STM32 vs ESP32
这两款芯片,是我在智能照明项目里用得最多的。各有各的脾气。
| 对比项 | STM32F103(经典款) | ESP32(WiFi款) |
|---|---|---|
| 内核 | Cortex-M3 | Xtensa LX6 双核 |
| 主频 | 72MHz | 240MHz |
| SRAM | 20KB~64KB | 520KB |
| Flash | 64KB~512KB | 4MB~16MB |
| 联网能力 | 需外挂WiFi模块 | 内置WiFi+蓝牙 |
| RTOS适配难度 | 简单(资料极多) | 中等(FreeRTOS原生支持) |
| 典型成本 | 8~15元 | 15~25元 |
我的建议:
- 如果做有线控制的智能灯(比如DALI、0-10V调光),STM32F103足够了。我做过一个项目,用STM32F103C8T6跑FreeRTOS,控制6路LED灯带,稳得很。
- 如果要做手机APP控制、语音控制、OTA升级,直接上ESP32。省一个WiFi模块的钱,还省PCB面积。
避坑指南: 我曾经在一个项目中选了STM32F030(Cortex-M0),结果RTOS跑起来后,任务切换开销占了CPU的15%。后来换成了F103,问题就解决了。所以,跑RTOS的话,建议至少Cortex-M3起步。
2.2 LED驱动电路设计
LED驱动,说白了就是恒流源。LED是电流型器件,电压稍微波动,电流就会剧烈变化。我见过不少新手直接用电阻限流,结果LED亮度忽明忽暗。
推荐方案:PT4115 恒流驱动
PT4115是我用得最多的LED驱动芯片。外围元件少,成本低,效率能到90%以上。
// 典型电路参数(以350mA输出为例)
// VIN = 12V ~ 24V
// RS = 0.1Ω(设定电流:I = 0.1 / RS = 1A)
// L = 47μH(功率电感)
// D = SS34(肖特基二极管)
// 电流计算公式:
// I_LED = 0.1 / RS
// 例如:RS = 0.33Ω → I_LED ≈ 300mA
PWM调光接口:
PT4115的DIM引脚可以直接接PWM信号。我习惯用1kHz~5kHz的PWM频率,太低会看到闪烁,太高会增加MOS管开关损耗。
小技巧: 如果你用ESP32的LEDC外设做PWM,记得设置分辨率。我一般设12位分辨率(0~4095),调光曲线会非常平滑。
2.3 传感器接口设计
智能照明离不开传感器。这里重点讲两个:光敏传感器和人体红外传感器。
2.3.1 光敏传感器(环境光检测)
我推荐用数字光敏传感器BH1750。为什么不用光敏电阻?因为光敏电阻的线性度太差了,而且受温度影响大。BH1750是I2C接口,直接输出lux值,精度高,省心。
// BH1750 I2C地址:0x23(ADDR引脚接GND)
// 初始化代码片段(伪代码)
bh1750_init(I2C1, 0x23);
bh1750_set_mode(CONTINUOUS_HIGH_RES_MODE); // 1lux分辨率
// 读取光照强度
uint16_t lux = bh1750_read_light();
if (lux < 50) {
// 光线暗,开灯
led_set_brightness(100);
} else {
// 光线充足,关灯或调暗
led_set_brightness(0);
}
注意: BH1750的测量范围是1~65535lux。如果你用在户外强光环境,记得加一个遮光罩,否则传感器会饱和。我吃过这个亏,大太阳底下读数一直是65535,还以为传感器坏了。
2.3.2 人体红外传感器(PIR)
PIR传感器,最经典的就是HC-SR501。便宜、好用、资料多。
关键参数:
- 检测距离:3~7米(可调)
- 延时时间:5秒~5分钟(可调)
- 输出信号:TTL电平(高电平触发)
接口电路:
HC-SR501的输出是3.3V TTL电平,可以直接接STM32或ESP32的GPIO。但我建议加一个10kΩ上拉电阻,防止输出悬空时误触发。
// PIR中断处理(FreeRTOS任务中)
void pir_task(void *pvParameters) {
while (1) {
if (gpio_get_level(PIR_PIN) == 1) {
// 检测到人体
led_set_brightness(100);
// 启动延时关灯定时器
xTimerReset(light_off_timer, 0);
}
vTaskDelay(pdMS_TO_TICKS(100));
}
}
经验之谈: PIR传感器有个「冷启动」问题。刚上电时,传感器需要30~60秒的稳定时间。我一般会在RTOS的启动任务里加一个延时,等传感器稳定后再开始检测。否则一上电就误触发,用户体验很差。
2.4 硬件设计总结
嗯,这一讲内容不少。我们来捋一捋重点:
- 主控选型: 有线控制用STM32,联网控制用ESP32
- LED驱动: PT4115恒流驱动,PWM调光频率1~5kHz
- 光敏传感器: BH1750数字输出,I2C接口,精度高
- 人体红外: HC-SR501,注意冷启动延时
下一讲,我们会开始搭建RTOS开发环境。到时候我会手把手教大家配置FreeRTOS的工程模板。咱们下节课见。