江科协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 + 按键)→ 再确认固件确实更新 → 最后补外围显示,与视频现象逐项对齐。

相关推荐
TDengine (老段)5 小时前
TDengine 常见问题 TOP7
大数据·数据库·时序数据库·常见问题·tdengine·涛思数据
+VX:Fegn08955 小时前
计算机毕业设计|基于java+ vue共享单车信息系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
mysqloffice5 小时前
数智时代,核心系统数据库架构往哪走
数据库·人工智能
l1t5 小时前
DeepSeek总结的 pgColumnar 1.0-alpha4 发布说明
数据库·postgresql
DBA_G6 小时前
南大通用GBase 8s数据库助力某农商行核心系统投产
数据库
工业涂料百问6 小时前
【环保合规】系列(四)工业涂料碳足迹怎么算?边界定义、因子选择与减排优先级拆解
数据库
wuyk5557 小时前
【Socket 进阶之路】第 7 章 IO 多路复用 select & poll 完整实战|多 fd 监听、超时等待、优缺点横向对比
服务器·开发语言·网络·数据库·物联网
文人sec7 小时前
grant 之后要跟着 flush privileges 吗?要不要使用分区表?
数据库·mysql·adb·数据分析
Omics Pro7 小时前
上海AI Lab孙思琦×高张阳:虚拟细胞代码库智能体
数据库·人工智能·算法·机器学习·自然语言处理
旺仔不是程序员8 小时前
相关子查询与性能优化:PostgreSQL 逐行执行的代价与 JOIN 重写
数据库·后端·sql