51 单片机直流电机 PWM 调速实验------调试过程总结
项目路径:
C:\Users\54200\Desktop\51MCU\14-直流电机实验目标:复现普中教程视频(BV1Mb411e7re P34)中"按独立按键 K1,电机转速 1→2→3 逐步增加,数码管同步显示档位"的实验现象
硬件:普中 51 开发板(STC89C52)+ 直流电机接步进电机模块输出端子 J47 的 5V 与 O1
目录
- 一、问题背景
- 二、原因分析与修复过程
- [第 1 轮:核心功能缺失(PWM + 按键扫描)](#第 1 轮:核心功能缺失(PWM + 按键扫描))
- [第 2 轮:烧录了旧固件](#第 2 轮:烧录了旧固件)
- [第 3 轮:数码管不显示档位](#第 3 轮:数码管不显示档位)
- 三、最终程序结构
- 四、经验要点
- [摘要(110 字)](#摘要(110 字))
一、问题背景
原工程源码 main.c 下载到板子后,现象为:电机全速旋转 5 秒后停止,与视频中"按键分级调速"的现象不符。
二、原因分析与修复过程
第 1 轮:核心功能缺失(PWM + 按键扫描)
诊断 :阅读源码发现,原程序是教程的"基础版"------仅用 GPIO 直接拉高/拉低控制电机通断(DC_Motor=1 转 5 秒 → DC_Motor=0 停止 → 死循环)。整个程序中:
- 没有任何 PWM 生成逻辑(无定时器配置、无占空比概念);
- 没有独立按键 K1 的引脚定义与扫描代码。
修复 :重写 main.c,补全两大模块:
| 模块 | 实现方式 |
|---|---|
| PWM 生成 | 定时器 T0 工作方式 1,100 μs 中断一次;计数 100 次为一个 PWM 周期(10 ms,即 100 Hz);中断内比较 cnt < g_duty 决定 P1.0 输出高/低电平 |
| 按键调速 | key_scan() 带 10 ms 消抖扫描 K1(P3.1,低电平有效);每按一次档位 +1,占空比查表 speed_table[4] = {0, 30, 70, 100},循环:停止 → 低速(30%) → 中速(70%) → 全速(100%) → 停止 |
验证 :Keil 命令行编译,0 Error / 0 Warning,生成新 template.hex。
第 2 轮:烧录了旧固件
现象:烧录后电机"转几下就停",来不及按按键。
诊断 :新程序初始占空比为 0,上电后电机应完全静止;"全速转约 5 秒后停止"恰好是旧程序的行为。结合工程目录时间戳确认 template.hex 已更新,判断是板内运行的仍是旧固件(STC-ISP 选择了错误的 hex 路径,或烧录后未冷启动复位)。
修复:
- 在
main()开头增加DC_Motor = 0;,杜绝上电瞬间电平毛刺导致电机误转; - 重新编译并给出烧录检查清单:确认选择本项目文件夹内的
template.hex、下载时对板子断电再上电(STC 依赖冷启动进入 ISP)。
判据 :上电电机纹丝不动即为新程序;上电自转即为旧程序。
第 3 轮:数码管不显示档位
现象:电机按键调速功能正常,但数码管无 1/2/3 档位显示。
诊断 :代码中完全没有数码管驱动代码------没有段码表、没有位选控制。
修复:按普中开发板数码管电路补充显示模块:
- P0 作为段选数据口(共阴极数码管段码表
gsmg_code[10]); - 位选由 74HC138 译码器完成,输入端 LSA/LSB/LSC 接 P2.2/P2.3/P2.4;
smg_display()将 LSA/LSB/LSC 全部拉低选中第 1 位数码管,主循环中实时调用smg_display(g_speed_level)刷新;- 显示逻辑与档位一一对应:0=停止,1/2/3=三档转速。
验证:重新编译 0 Error / 0 Warning,烧录后电机调速与数码管显示均与教学视频一致。
三、最终程序结构
text
main.c
├── 硬件接口定义
│ ├── DC_Motor (P1.0) ------ 电机 PWM 输出
│ ├── KEY1 (P3.1) ------ 独立按键 K1
│ ├── LSA/LSB/LSC (P2.2~P2.4) ------ 数码管位选(74HC138)
│ └── GPIO_DIG (P0) ------ 数码管段选
├── delay_ms() ------ 软件毫秒延时(按键消抖用)
├── key_scan() ------ 按键扫描(带消抖、支持连续触发)
├── time0_init() ------ T0 初始化,100 μs 定时中断
├── smg_display() ------ 第 1 位数码管显示档位
├── main() ------ 按键处理 + 显示刷新
└── time0_isr() (T0中断) ------ 100 μs 计数,生成 100 Hz PWM
最终实验现象对照表:
| 按键操作 | 电机状态 | 数码管 |
|---|---|---|
| 上电 | 停止(占空比 0%) | 0 |
| 按 K1 第 1 次 | 低速(30%) | 1 |
| 按 K1 第 2 次 | 中速(70%) | 2 |
| 按 K1 第 3 次 | 全速(100%) | 3 |
| 按 K1 第 4 次 | 停止(回到初始档) | 0 |





四、经验要点
- 现象对照定位法:上电自转 5 秒 = 旧固件特征;上电静止 = 新固件特征。用可区分的"指纹现象"快速判断烧录是否成功。
- STC 烧录两个坑:hex 路径选错(同名文件存在于多个资料文件夹中);下载需要冷启动配合。
- TT 电机启动死区:低速档占空比过低时电机可能不转或嗡嗡响,可把 30% 提高到 40%~50%。
- 模块化排查顺序:先核心功能(PWM + 按键)→ 再确认固件确实更新 → 最后补外围显示,与视频现象逐项对齐。