1. 项目概述
这个基于STM32F103C8T6单片机的超速控制系统设计,是我在指导毕业设计时经常推荐的一个经典案例。它涵盖了嵌入式系统开发的多个核心环节:传感器数据采集、PWM电机控制、人机交互界面设计以及无线通信功能实现。系统通过红外测速模块实时监测运动物体的速度,当检测到超速时,不仅会触发声光报警,还能通过继电器执行相应的保护动作。
在实际应用中,这种系统可以很好地模拟车辆速度监控场景。比如在校园内的电动巡逻车、工厂AGV小车等低速车辆上,都可以采用类似的方案来实现速度管控。相比市面上成熟的工业级产品,我们这个设计更注重教学价值,能够让学习者全面掌握嵌入式系统开发的完整流程。
2. 硬件系统设计
2.1 核心器件选型
主控芯片选用STM32F103C8T6这款经典的Cortex-M3内核单片机,主要基于以下几点考虑:
- 72MHz主频完全满足实时控制需求
- 内置PWM发生器,可直接驱动电机
- 丰富的外设接口(USART、I2C、GPIO等)
- 性价比高,开发资源丰富
电机驱动选用MX1508双H桥芯片,它能够提供2A的持续电流输出,足以驱动我们实验用的小型直流电机。相比L298N这类传统驱动芯片,MX1508体积更小、效率更高,而且内置了续流二极管,简化了外围电路设计。
2.2 传感器模块设计
速度检测采用红外对管方案,由红外发射管和接收管组成。当电机转轴上的编码盘(贴有反光片)旋转时,红外接收管会输出脉冲信号。通过测量脉冲频率,就可以计算出当前转速。
这种方案相比霍尔传感器有几个优势:
- 无需磁铁,安装更方便
- 响应频率高,适合高速测量
- 成本低廉,易于采购
注意:红外对管的安装位置需要精确调整,确保反射信号强度足够。实际调试时可以用示波器观察接收管输出波形,必要时可以增加聚光透镜。
2.3 电源系统设计
整个系统采用5V供电,通过TYPE-C接口输入。考虑到STM32需要3.3V工作电压,我们使用了AMS1117-3.3稳压芯片进行电压转换。电机驱动部分则直接使用5V电源,确保足够的驱动能力。
电源设计中有几个关键点:
- 在电机电源输入端并联大容量电解电容(建议1000μF以上)来吸收电机启停时的电流冲击
- 数字地和模拟地之间用0Ω电阻或磁珠隔离
- 每个IC的VCC引脚附近都要放置0.1μF的去耦电容
3. 软件架构实现
3.1 主程序流程设计
系统软件采用典型的前后台架构:
c复制int main(void)
{
Hardware_Init(); // 硬件初始化
while(1)
{
Key_Scan(); // 按键扫描
Speed_Measure(); // 速度测量
Display_Update();// 显示更新
Bluetooth_Process(); // 蓝牙通信
Alarm_Check(); // 报警检查
}
}
这种设计保证了系统的实时响应性,同时保持了代码结构的清晰。每个功能模块都有独立的处理函数,通过全局变量进行数据交互。
3.2 PWM电机控制实现
电机速度控制采用PWM调压方式,通过改变占空比来调节电机两端电压。STM32的定时器3被配置为PWM模式,关键配置代码如下:
c复制void PWM_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
// 时钟使能
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
// 定时器基础配置
TIM_TimeBaseStructure.TIM_Period = 999; // PWM周期=1000
TIM_TimeBaseStructure.TIM_Prescaler = 71; // 72MHz/72=1MHz
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
// PWM通道配置
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 500; // 初始占空比50%
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_Cmd(TIM3, ENABLE);
TIM_CtrlPWMOutputs(TIM3, ENABLE);
}
通过按键可以调整PWM占空比,每次按键按下增加或减少5%的占空比。为了防止电机突然加速,软件中还加入了加速度限制功能。
3.3 速度测量算法
红外对管输出的脉冲信号被连接到STM32的外部中断引脚。我们使用输入捕获功能来测量脉冲间隔时间,进而计算转速。具体实现分为三个步骤:
- 捕获两个相邻上升沿的时间间隔T(单位:us)
- 计算转速:Speed = (1/(T×编码盘孔数))×60×10^6 (RPM)
- 通过滑动平均滤波消除测量噪声
为了提高测量精度,编码盘上均匀分布着20个透光孔。这样每转一圈会产生20个脉冲,将角度分辨率提高到18度。
4. 人机交互设计
4.1 OLED显示界面
系统使用0.96寸OLED显示屏来实时显示状态信息,界面设计分为三个主要区域:
- 顶部状态栏:显示系统模式和蓝牙连接状态
- 中部数据区:显示当前速度和设置阈值
- 底部控制区:显示PWM占空比和电机状态
显示刷新采用了局部刷新策略,只有数据变化的部分才会被更新,这样可以减少屏幕闪烁并提高刷新率。SSD1306驱动代码中实现了专门的缓冲机制:
c复制void OLED_Refresh(void)
{
static uint8_t last_speed = 0;
static uint8_t last_pwm = 0;
if(current_speed != last_speed) {
OLED_ShowNum(30, 2, current_speed, 3, 16);
last_speed = current_speed;
}
if(pwm_duty != last_pwm) {
OLED_ShowNum(80, 4, pwm_duty, 3, 16);
last_pwm = pwm_duty;
}
}
4.2 蓝牙通信协议
ECB02蓝牙模块通过串口与STM32通信,自定义了简单的通信协议:
| 指令头 | 数据长度 | 指令类型 | 数据内容 | 校验和 |
|---|---|---|---|---|
| 0xAA | 1字节 | 1字节 | N字节 | 1字节 |
常用指令包括:
- 0x01:设置速度阈值
- 0x02:设置PWM占空比
- 0x03:读取当前速度
- 0x04:读取系统状态
手机端APP采用MIT App Inventor开发,界面包含速度仪表盘、设置滑动条和状态指示灯等元素。通过蓝牙可以实现远程监控和控制功能。
5. 系统调试与优化
5.1 硬件调试要点
在PCB组装完成后,建议按照以下顺序进行硬件调试:
- 电源测试:先不插主控芯片,测量各点电压是否正常
- 最小系统测试:只连接ST-Link调试器,测试单片机能否正常编程
- 外设单独测试:依次测试OLED、按键、蓝牙等模块
- 电机驱动测试:先用示波器观察PWM波形,再接电机
常见问题及解决方法:
- 电机不转:检查MX1508的使能端电平,测量电机两端电压
- OLED无显示:检查I2C地址是否正确(通常0x78或0x7A)
- 蓝牙无法连接:确认模块处于配对模式(LED快闪)
5.2 软件调试技巧
使用STM32CubeIDE进行调试时,有几个实用技巧:
- 实时变量监控:将speed_value等关键变量添加到"Live Expressions"窗口
- 断点条件设置:可以为断点设置触发条件,如"speed_value > 100"
- 逻辑分析仪:利用STM32的SWO接口输出调试信息
在速度测量算法调试时,我建议先用信号发生器模拟红外对管输出,验证算法的准确性。然后再接实际传感器进行现场调试。
5.3 系统抗干扰设计
在实际应用中,电机运行会对系统产生较大干扰。我们采取了以下措施来提高稳定性:
- 电源隔离:数字部分和电机驱动部分使用不同的LC滤波电路
- 信号隔离:红外测速信号通过光耦隔离后再接入单片机
- 软件滤波:除了滑动平均滤波,还增加了中值滤波算法
- 看门狗:启用独立看门狗(IWDG),超时时间设为1s
经过这些优化后,系统在电机启停和负载突变时都能保持稳定工作,速度测量误差控制在±2%以内。
6. 项目扩展方向
这个基础框架可以进一步扩展更多实用功能:
- 增加SD卡存储:记录速度历史数据,用于后续分析
- 加入GPS模块:实现位置和速度的同步记录
- 开发上位机软件:通过蓝牙或USB导出数据并生成报表
- 实现PID控制:使电机速度更加稳定,不受负载变化影响
我在实际教学中发现,学生在完成基础功能后,如果选择其中一个方向进行深入,能够更好地掌握嵌入式系统开发的完整流程。特别是PID控制算法的实现,对理解闭环控制原理非常有帮助。