1. 项目概述
这个基于PWM控制的直流电机速度控制系统设计项目,是我在嵌入式系统课程中的一次实践作业。通过这个项目,我完整实现了从电路设计、PCB制作到软件编程的全流程开发,最终构建了一个可实际运行的电机控制系统。
系统采用LM3S8962微控制器作为核心,配合自制的H桥驱动电路,实现了对直流电机的PWM调速控制。用户可以通过四个按键控制电机的正反转、三档速度调节(高速、低速、制动),所有状态信息都实时显示在1602液晶屏上。
2. 系统设计原理
2.1 PWM调速基本原理
PWM(脉宽调制)是控制直流电机速度最常用的方法之一。其核心原理是通过快速开关电源来控制电机两端的平均电压。具体来说:
- 当开关导通时,电源电压直接加在电机两端
- 当开关断开时,电机通过续流二极管维持电流
- 通过改变导通时间与周期时间的比例(占空比),可以调节平均电压
平均电压的计算公式为:
U_avg = α × U_supply
其中α是占空比(0 ≤ α ≤ 1)
2.2 H桥驱动电路
为了实现电机的正反转控制,我们采用了经典的H桥电路设计。H桥由四个功率MOSFET组成,通过不同的开关组合可以实现:
- 正转:Q1和Q4导通,Q2和Q3截止
- 反转:Q2和Q3导通,Q1和Q4截止
- 制动:Q1和Q3导通(或Q2和Q4导通)
- 停止:所有MOSFET截止
注意:H桥设计中必须确保同一侧的MOSFET不会同时导通,否则会造成电源短路。因此在实际电路中需要加入死区时间控制。
3. 硬件设计实现
3.1 电路原理图设计
使用Protel软件设计了完整的电机驱动电路,主要包括以下部分:
- 电源模块:12V输入,通过7805稳压芯片提供5V逻辑电源
- H桥驱动:采用IR2104驱动芯片配合IRF540N MOSFET
- 保护电路:包括自举电容、续流二极管、电流检测等
- 接口电路:与LM3S8962开发板的连接接口
3.2 PCB设计与制作
PCB设计时特别注意了以下要点:
- 大电流走线加宽(至少2mm)
- 功率地和信号地分开布局,单点连接
- MOSFET散热考虑,预留足够铜皮面积
- 关键信号线(如PWM)尽量短且远离干扰源
制作过程:
- 使用热转印法制作双面板
- 钻孔(0.8mm和1.0mm两种孔径)
- 焊接元件,先贴片后直插
- 检查短路和虚焊
4. 软件程序设计
4.1 系统架构
软件采用模块化设计,主要包含以下功能模块:
| 模块 | 功能 | 实现方式 |
|---|---|---|
| 主程序 | 系统初始化和主循环 | 初始化各外设,循环检测状态 |
| 按键处理 | 处理用户输入 | GPIO中断+消抖处理 |
| PWM生成 | 电机速度控制 | 定时器PWM输出 |
| 方向控制 | 电机正反转 | GPIO控制H桥使能 |
| 显示模块 | 状态信息显示 | 1602液晶驱动 |
4.2 关键代码实现
4.2.1 PWM初始化
c复制void PWM_Init(void)
{
// 配置PWM引脚
SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
GPIOPinTypePWM(GPIO_PORTD_BASE, GPIO_PIN_0);
// 配置PWM发生器
PWMGenConfigure(PWM_BASE, PWM_GEN_0,
PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC);
// 设置PWM频率为20kHz
PWMGenPeriodSet(PWM_BASE, PWM_GEN_0, SysCtlClockGet() / 20000);
// 初始占空比50%
PWMPulseWidthSet(PWM_BASE, PWM_OUT_0,
PWMGenPeriodGet(PWM_BASE, PWM_GEN_0) / 2);
// 启用PWM输出
PWMGenEnable(PWM_BASE, PWM_GEN_0);
PWMOutputState(PWM_BASE, PWM_OUT_0_BIT, true);
}
4.2.2 按键中断处理
c复制void Key_ISR(void)
{
static uint32_t last_time = 0;
uint32_t current_time = SysTickValueGet();
// 消抖处理(20ms)
if((last_time - current_time) > (SysCtlClockGet()/50)) {
uint8_t key_val = GPIOPinRead(GPIO_PORTC_BASE, 0xF0);
switch(key_val) {
case 0xE0: // KEY1 - 方向切换
motor_dir = !motor_dir;
Set_Motor_Direction(motor_dir);
break;
case 0xD0: // KEY2 - 高速档
Set_Motor_Speed(SPEED_HIGH);
break;
case 0xB0: // KEY3 - 低速档
Set_Motor_Speed(SPEED_LOW);
break;
case 0x70: // KEY4 - 制动
Set_Motor_Speed(SPEED_STOP);
break;
}
Update_Display(); // 更新显示
}
last_time = current_time;
GPIOPinIntClear(GPIO_PORTC_BASE, 0xF0); // 清除中断标志
}
5. 系统调试与优化
5.1 常见问题与解决
在实际调试过程中遇到了以下几个典型问题:
-
电机启动困难
- 现象:电机在低速时无法启动,需要手动助力
- 原因:静摩擦力大于启动转矩
- 解决:加入启动Boost,初始给较高占空比(70%),100ms后恢复到设定值
-
MOSFET发热严重
- 现象:连续工作几分钟后MOSFET烫手
- 原因:
- 开关损耗大(PWM频率过高)
- 死区时间不足导致直通
- 解决:
- 将PWM频率从50kHz降到20kHz
- 增加死区时间到500ns
-
显示闪烁
- 现象:液晶屏显示内容偶尔闪烁
- 原因:PWM信号对显示通信造成干扰
- 解决:
- 将显示通信线远离PWM走线
- 在通信线上加入100Ω电阻
5.2 性能测试数据
对不同占空比下的电机转速进行了实测,结果如下:
| 占空比 | 空载转速(rpm) | 带载转速(rpm) | 电流(A) |
|---|---|---|---|
| 30% | 1200 | 800 | 0.5 |
| 50% | 2000 | 1500 | 0.8 |
| 70% | 2800 | 2200 | 1.2 |
| 90% | 3400 | 2800 | 1.8 |
提示:测试使用12V/10W直流电机,负载为0.1Nm转矩
6. 项目总结与改进方向
通过这个项目,我深刻理解了PWM控制直流电机的完整技术链。从最初的原理分析,到电路设计制作,再到软件编程调试,每个环节都遇到了各种挑战,但也收获了宝贵的实践经验。
几个关键体会:
- 硬件设计要考虑实际工况,不能只停留在理论计算
- 软件需要充分考虑异常情况和边界条件
- 调试过程要系统化,先确认各模块单独工作正常,再集成测试
可能的改进方向:
- 加入PID算法实现闭环速度控制
- 增加电流检测和保护功能
- 改用更高效的MOSFET驱动方案(如集成驱动IC)
- 开发上位机监控界面
这个项目虽然基础,但涵盖了嵌入式开发的多个核心技能点,对理解硬件与软件的协同工作非常有帮助。在实际操作中,我特别注意到细节处理的重要性,比如PCB布局对系统稳定性的影响,软件时序对控制精度的影响等。