1. 项目背景与核心价值
交通信号灯控制系统是现代城市交通管理的基础设施之一。传统交通灯多采用PLC或专用控制器实现,存在成本高、灵活性差的问题。基于STM32的方案将微控制器技术引入交通控制领域,具有以下显著优势:
- 成本效益:STM32F103C8T6等主流型号市场价仅20-30元,相比PLC方案降低80%以上硬件成本
- 开发灵活性:支持C语言编程,可方便实现多时段方案切换、紧急车辆优先等复杂逻辑
- 扩展性强:内置丰富外设接口,可轻松扩展车流量检测、远程控制等功能
我在实际项目中验证,一套完整的四向十字路口控制系统(含PCB制板)总成本可控制在150元以内,而商业系统价格通常在2000元以上。这种方案特别适合:
- 校园、厂区等封闭区域的交通管理
- 智能交通教学实验平台
- 低成本智慧城市试点项目
2. 系统架构设计
2.1 硬件组成框图
code复制[STM32F103] ←→ [LED驱动电路] → [交通灯组]
↑ ↑
[按键模块] [倒计时显示屏]
↓
[蜂鸣器]
2.2 核心器件选型
- 主控芯片:STM32F103C8T6(72MHz主频,64KB Flash,20KB RAM)
- 选型理由:性价比极高,GPIO数量充足(37个),支持硬件PWM
- LED驱动:ULN2003达林顿阵列
- 每路500mA驱动能力,可直接驱动高亮度LED模组
- 显示屏:4位共阳数码管(TM1637驱动)
- 通信仅需2个IO口,亮度可软件调节
关键提示:交通灯LED需选择高亮度型号(>5000mcd),建议采用φ10mm食人鱼LED,红黄绿各4颗串联,工作电流控制在15-20mA
3. 软件设计实现
3.1 状态机建模
典型四相位控制状态转换图:
code复制相位1(南北直行)
→ 黄闪3秒 →
相位2(南北左转)
→ 全红1秒 →
相位3(东西直行)
→ 黄闪3秒 →
相位4(东西左转)
代码实现示例:
c复制typedef enum {
PHASE1_NS_THROUGH = 0,
PHASE2_NS_LEFT,
PHASE3_EW_THROUGH,
PHASE4_EW_LEFT
} TrafficPhase;
void PhaseHandler(void) {
static uint32_t lastTick = 0;
if(HAL_GetTick() - lastTick < phaseDuration[currentPhase]) return;
lastTick = HAL_GetTick();
switch(currentPhase) {
case PHASE1_NS_THROUGH:
SetLights(NS_GREEN | EW_RED);
if(++counter > 30) { // 30秒周期
currentPhase = PHASE2_NS_LEFT;
phaseDuration = 3000; // 黄灯3秒
}
break;
// 其他相位处理...
}
}
3.2 关键外设配置
- GPIO配置:
c复制GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
- 定时器中断(1ms时基):
c复制void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
if(htim->Instance == TIM2) {
sysTick++;
// 状态机处理每毫秒执行一次
TrafficFSM_Update();
}
}
4. 硬件电路设计要点
4.1 LED驱动电路设计
code复制 +12V
|
[330Ω]
|
STM32 IO ---[ULN2003]--- LED+
|
GND
- 电阻计算:假设LED Vf=2V,12V电源需(12-4*2)/0.02=200Ω,实际选用330Ω限流
- ULN2003输入端接10kΩ上拉电阻,防止MCU复位时误触发
4.2 电源方案对比
| 方案 | 优点 | 缺点 |
|---|---|---|
| 7805线性稳压 | 电路简单 | 效率低(约40%) |
| MP2307 DC-DC | 效率>90% | 成本高2元 |
| 直接12V供电 | 无需转换 | 增加MCU发热 |
实测建议:当LED数量>16颗时,必须采用DC-DC方案,否则7805可能过热保护
5. 进阶功能实现
5.1 自适应配时算法
c复制void AdjustTiming(void) {
static uint16_t vehicleCount[4] = {0};
// 通过地磁传感器获取各方向车流量
GetVehicleCount(vehicleCount);
// 动态调整绿灯时长(基础30秒,每检测到5辆车增加1秒)
phaseDuration[0] = 30000 + (vehicleCount[0]/5)*1000;
phaseDuration[2] = 30000 + (vehicleCount[2]/5)*1000;
}
5.2 无线远程控制
添加ESP8266模块实现:
- AT指令配置:
c复制void WIFI_Init(void) {
HAL_UART_Transmit(&huart2, "AT+CWMODE=1\r\n", 13, 100);
HAL_UART_Transmit(&huart2, "AT+CWJAP=\"SSID\",\"PASSWORD\"\r\n", 30, 100);
}
- TCP服务器数据包格式:
code复制[0xAA][CMD][PARAM][0x55]
示例:强制切换到相位3 → AA 03 00 55
6. 常见问题排查
6.1 LED亮度不足
可能原因及解决方案:
- 驱动电流不足 → 检查限流电阻值,确保单颗LED电流≥15mA
- 电源带载能力差 → 测量12V电源在负载下的实际输出电压
- LED老化 → 更换新LED测试
6.2 状态切换不同步
调试步骤:
- 用逻辑分析仪捕捉GPIO变化时序
- 检查中断优先级配置(定时器中断应设为最高优先级)
- 验证系统时钟配置(确保HSI/HSE正确初始化)
6.3 死机重启问题
典型解决方案:
- 增加看门狗:
c复制IWDG_HandleTypeDef hiwdg;
hiwdg.Instance = IWDG;
hiwdg.Init.Prescaler = IWDG_PRESCALER_32;
hiwdg.Init.Reload = 0xFFF;
HAL_IWDG_Init(&hiwdg);
// 主循环中喂狗
while(1) {
HAL_IWDG_Refresh(&hiwdg);
// ...其他代码
}
- 检查堆栈大小(建议至少Stack_Size=0x400)
7. 实测性能数据
经72小时连续运行测试:
- 电流消耗:常态85mA,全亮状态220mA
- 温度变化:MCU表面温度≤45℃(环境25℃)
- 时序误差:<±10ms/24h(使用32.768kHz外部晶振时)
- 无线控制响应延迟:局域网内<150ms
优化建议:
- 如需更低功耗,可选用STM32L系列
- 对时序要求严苛的场景,建议外接GPS模块校时
8. 项目扩展方向
- 车流量统计:添加红外对管或地磁传感器
- 违章抓拍:联动摄像头模块,检测闯红灯行为
- 联网管理:通过4G模块上传状态数据至交通管理中心
- 应急优先:集成RFID识别救护车、消防车等特种车辆
实际部署时发现,增加太阳能供电系统可使设备完全脱离电网运行,特别适合临时施工路段的交通管制。一套典型配置包括:
- 50W太阳能板
- 12V/24Ah蓄电池
- PWM充电控制器
整体成本增加约500元,但可节省电缆铺设费用。
