江科协15-2 直流电机实验调试总结

51 单片机直流电机 PWM 调速实验------调试过程总结

项目路径:C:\Users\54200\Desktop\51MCU\14-直流电机实验

目标:复现普中教程视频(BV1Mb411e7re P34)中"按独立按键 K1,电机转速 1→2→3 逐步增加,数码管同步显示档位"的实验现象

硬件:普中 51 开发板(STC89C52)+ 直流电机接步进电机模块输出端子 J47 的 5V 与 O1


目录


一、问题背景

原工程源码 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 路径,或烧录后未冷启动复位)。

修复

  1. main() 开头增加 DC_Motor = 0;,杜绝上电瞬间电平毛刺导致电机误转;
  2. 重新编译并给出烧录检查清单:确认选择本项目文件夹内的 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

四、经验要点

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

相关推荐
小王C语言16 分钟前
MySQL 用户管理:创建用户、给用户授权
数据库·mysql
程序员夏洛31 分钟前
Redis 的持久化机制有哪些?
java·数据库·redis
l1t32 分钟前
DeepSeek总结的修复pgrust v0.2 #83:generate_series 聚合及其底层的两个成本 - #84
数据库·postgresql
厦门德仔1 小时前
【YiFeiWebApi】易飞ERP与WMS系统接口对接实战:从0到1全流程指南
大数据·数据库
内存漫游1 小时前
Page 到底是什么:数据库如何把一条条记录放进磁盘
数据库
小镇敲码人1 小时前
【深入浅出】之Qt 事件系统实战:鼠标、键盘、滚轮、窗口与定时器事件
数据库·qt·网络协议·mysql·http
Sirens.1 小时前
MySQL数据库:索引
数据库·mysql
treacle田2 小时前
达梦数据库-Linux DM主备集群动态增加节点-记录总结
linux·运维·数据库·达梦主备集群动态扩展
一只专注api接口开发的技术猿2 小时前
Open Claw 实战|快速搭建电商商品监控与数据分析能力
大数据·数据库·数据挖掘·数据分析