十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

单片机控制直流电动机课程设计:PWM调速、H桥换向与闭环测速

单片机控制直流电动机课程设计:PWM调速、H桥换向与闭环测速 简介这份课程设计文档面向单片机、嵌入式及电气类学生围绕基于89C51单片机的直流电动机调速与测速项目完整整理了从设计目的、任务要求、PWM调速原理、硬件资源、程序框图与关键代码到Proteus仿真和设计心得的全流程内容可作为课程设计报告、实验参考或答辩准备材料。文档按设计目的、任务要求、原理分析、硬件电路、程序框图、程序、调试运行、仿真截图与心得体会等模块组织结构清晰。资源包仅含1个docx文件大小229KB轻量易读便于直接打印或按章节对照修改使用。已有659人学习适合需要在较短时间内完成单片机控制直流电动机选题的初学者以及需要快速梳理PWM直流调速思路的读者。文档重点介绍了调压调速、电枢电压占空比与平均电压的关系、89C51定时器生成PWM波的方法以及L298驱动芯片和H桥电路的应用能够帮助读者理解硬件连接与软件控制的结合方式并借此掌握A/D、D/A转换和PWM波的实际运用。1. 单片机控制直流电动机——课程设计的真实边界在哪里很多人在拿到单片机控制直流电动机——课程设计这个题目时第一反应是找一个现成例程改一改最后演示时板子上只有按键、电机和数码管。速度能变、方向能换、按下停止键电机安静停转这在不少评审眼里已经及格了。但这个题目的真正分量在于你能不能讲清楚几件事PWM的占空比是怎么变成电枢端的平均电压的H桥四个管子为什么不能同时导通电机转速到底是用M法还是T法测出来的。按理论、硬件、代码、收尾四条线往下走你会发现能控制和能讲清控制之间的差距恰恰是这门课设最想考察的东西。2. 先立理论PWM调速、H桥换向与测速的完整链路2.1 直流电动机为什么用PWM而不是线性调压永磁直流电机的转速近似正比于电枢电压电压降下来转速就掉下来这是调压调速的物理基础。但线性调压时调整管的电流与压降乘积全部变成热量500mA的电机配上12V电源线性模式可能要烧掉好几瓦功率散热就是大问题。PWM斩波则让功率管只工作在饱和导通和完全截止两个状态损耗只与开关瞬态相关平均电压由占空比决定U_avg D × VCC。这个是整套课设最核心的公式——占空比50%时12V电源给到电机端子的平均电压就是6V转速约为额定转速的一半。但PWM频率不能随心所欲。频率越低电枢电流纹波越大低速时转矩脉动明显电机可能一顿一顿地转频率太高功率管的开关损耗线性增加。我用51单片机做课设时一般取1kHz~5kHz如果换STM32方案通常直接上20kHz因为STM32的定时器硬件输出PWM不占CPU频率可以超过人耳听觉上限。提示电枢电流纹波近似等于 VCC×D×(1−D)/(f×L)占空比越接近50%纹波越大频率越高纹波越小。答辩时能说出这个因果关系评审一般不会再深问。如果手头没有示波器先用脚本把PWM参数核算一遍能避免很多想当然的错误。举个简单例子# 核算51单片机定时器方案下的PWM参数 machine_cycle_us 1.0 # 12MHz晶振1个机器周期1us timer_interval_us 20 # 定时器中断间隔由TH0重装值决定 pwm_steps 50 # 占空比级数对应pwm_duty的范围0~50 pwm_freq 1000000 / (timer_interval_us * pwm_steps) print(fPWM频率: {pwm_freq:.1f} Hz) print(f占空比分辨率: {100 / pwm_steps:.2f} %) print(f最小可调脉宽: {timer_interval_us * pwm_steps} us)参数含义机器周期由晶振决定12MHz下是1μs定时器中断间隔是重装值(256−TH0)乘以机器周期PWM频率等于中断频率除以占空比级数。脚本算出来的值是理论值实际还要用示波器或仔细核对定时器初值因为你一旦把中断频率提到1MHz以上51单片机的主循环就基本停摆了。2.2 H桥的四种工作状态与死区时间H桥的四个开关管按位置记为Q1左上、Q2右上、Q3左下、Q4右下电机接在两个桥臂中点。正转导通Q1Q4反转导通Q2Q3同侧上下管同时导通则是短路——这是绝对要避免的状态。状态导通管电机行为备注正转Q1、Q4正向转动驱动芯片HIN1, LIN0反转Q2、Q3反向转动驱动芯片HIN0, LIN1刹车Q1、Q3迅速停转反电动势被短路消耗滑行全部关断惯性转动无制动电流转速自然衰减2.2.1 换向保护代码先关断、留死区、再导通MOS管栅极有电容开关过程需要电荷充放时间如果Q1还没完全关断就打开Q2电源直接短路这是H桥烧毁的第一原因。分立MOS管方案里高端通常配IR2104之类的栅极驱动芯片延迟匹配在150ns左右低端由单片机IO直接推。为了保险换向时必须先关断两路输出、延时、再导通新方向/* H桥换向保护先关断全部输出等待死区再切换方向 */ sbit PWM_HIN P1^0; /* 接IR2104的HIN */ sbit PWM_LIN P1^1; /* 接IR2104的LIN */ void H_Bridge_Set_Dir(unsigned char dir) { PWM_HIN 0; /* 先关高端 */ PWM_LIN 0; /* 再关低端 */ DelayXus(100); /* 100us死区足够MOS完全关断 */ if(dir) { PWM_HIN 1; /* 方向A */ PWM_LIN 0; } else { PWM_HIN 0; PWM_LIN 1; /* 方向B */ } }逻辑说明函数先把两个控制脚全部拉低让H桥进入全关断状态100μs的死区对IRLZ44N约200ns的关断时间来说余量已非常大。如果驱动电路里加了光耦隔离光耦传输延迟是微秒级这100μs仍然安全。死区的代价只是换向瞬间停顿几十微秒换来的是功率管不会被直通电流击穿这笔交易在课程设计里非常划算。2.3 测速的M法与T法精度取决于转速范围闭环调速需要转速反馈最经济的方案是码盘加霍尔传感器或光电对射管。码盘旋转时输出脉冲测速有两种策略M法在固定时间内数脉冲个数适合高速T法测量相邻两个脉冲的时间间隔适合低速。低速时M法一个单位时间可能只有几个脉冲量化误差巨大高速时T法两次中断间隔太短定时器分辨率不够。测速方法计算公式低速精度高速精度51实现M法n 60×N/(T×PPR)差好定时器计数器T法n 60/(t×PPR)好差外部中断定时器课程设计里电机转速通常在每分钟几百转到一两千转20脉冲/转的码盘T法的脉冲间隔在毫秒级51的16位定时器完全数得过来。所以我在课设里偏向T法测速代码放到第4章一起讲。3. 从最小系统到驱动电路硬件方案的选型与连接3.1 51单片机最小系统四个电路缺一不可STC89C52是课程设计出镜率最高的单片机内置8KB Flash和512字节RAM串口直接下载程序不需要额外烧录器这对原型验证来说是最省事的方式。最小系统只需要四部分5V电源AMS1117-5.0或7805、12MHz晶振加两个20pF负载电容、上电复位电路10μF电容与10kΩ电阻、USB转TTL下载口CH340方案。复位电路的正确接法是电容一头接VCC、一头接RST电阻一头接RST、一头接GND上电瞬间RST被电容拉到高电平完成复位随后通过电阻放电回到低电平。51单片机的IO口在复位期间是高电平这个特性直接影响H桥的初始化——如果单片机复位瞬间H桥控制脚为高电机可能突然转一下。所以驱动电路初始化时必须先软件拉低控制脚再延时等待电源稳定第3.3节会给具体代码。3.1.1 电源设计电机和单片机必须分路供电这是整个硬件部分最大的坑。电机启动电流是额定电流的5~10倍一个额定500mA的玩具电机启动瞬间可能拉走3A电流。如果单片机稳压芯片和电机共用一条电源线电机一转线上压降就让单片机不断复位现象就是数码管乱跳。正确做法是电机用12V适配器直接供驱动板单片机用5V的LM2596降压模块单独供电两个电源只共地、不共线。共地是为了让PWM和测速信号有统一的参考电位。模块供电方式电流消耗关键约束STC89C52最小系统USB 5V或AMS1117约50mA禁止与电机共用一个LDOL298N/TB6612逻辑侧5V可取自单片机约10mA最好单独引出直流电动机6~12V外部电源0.5~3A电源回路与信号回路分离码盘与霍尔5V约20mA与单片机同一供电轨电机的两个端子之间要反接续流二极管否则断电瞬间电感的反向电动势会击穿驱动管。L298N内部已集成自制MOS管H桥时必须自己加方向别接反否则上电就短路。3.2 L298N与TB6612课程设计该怎么选L298N是实验室最常提供的H桥驱动芯片单芯片两路H桥持续2A逻辑电源和电机电源分开。缺点有两个饱和压降接近2V12V电源到电机端子只剩10V左右内部用三极管在大电流下发热明显。TB6612FNG是东芝的MOS管H桥饱和压降只有0.3V左右体积小支持1.2A持续电流对课程设计常见的520电机绰绰有余。我的选择原则是只要实验室有TB6612优先用TB6612手里只有L298N也没问题但答辩时要主动讲出饱和压降影响了最高转速这个边界条件。即使方案简单评审也知道你理解器件差异而不是只会插线。3.3 自制MOS管H桥的接线与初始化有些课程要求自己搭H桥不允许用整块驱动板。最常用的方案是4个IRLZ44N加两个IR2104IR2104负责高端驱动和自举低压侧由单片机直接控制。接线要点VCC接电机电源正极GND共地高端管源极接电机一端低端管漏极接电机另一端IR2104的VS接高端管源极VB与VS之间接10μF~100μF自举电容HIN接单片机引脚LIN接另一个引脚HIN和LIN不能同时为高上电瞬间51单片机IO默认是高电平如果不处理IR2104的HIN直接为高可能在复位不稳时导通高端管导致电机误动。因此初始化代码要先把控制脚拉低延时等电源稳定再打开使能/* H桥IO初始化防止上电瞬间误导通 */ sbit PWM_HIN P1^0; sbit PWM_LIN P1^1; sbit MOTOR_EN P1^2; /* 可选接IR2104的使能端 */ void H_Bridge_Init(void) { PWM_HIN 0; /* 先全部关闭 */ PWM_LIN 0; MOTOR_EN 0; DelayXms(100); /* 等待电源稳定 */ MOTOR_EN 1; /* 打开使能H桥进入待命 */ }逻辑说明初始化阶段先把三个控制口全部拉低再置能使能端避免上电毛刺让H桥误导通。PWM_HIN和PWM_LIN在第一次换向之前维持低电平此时电机两端都被拉低处于刹车状态这是安全待机状态不会因为意外信号自己转动。4. 单片机控制直流电动机的代码实现从PWM生成到闭环调速4.1 51定时器生成PWM频率、占空比和CPU开销的平衡STC89C52没有硬件PWM外设常见做法是定时器周期中断在中断里翻转引脚。PWM频率和占空比分辨率是矛盾的中断频率 PWM频率 × 占空比级数如果PWM要1kHz、占空比分50级中断频率就是50kHz如果PWM要10kHz且保持50级分辨率中断频率500kHz主循环会被中断拖死。我一般取1kHz PWM和50级占空比分辨率定时器中断每20μs一次一个完整PWM周期正好1ms。12MHz晶振下机器周期1μs所以TH0重装值取256−20。#include reg52.h sbit MT_PWM P1^0; /* PWM输出引脚接驱动芯片使能端 */ unsigned char pwm_cnt 0; /* 周期内计数 */ unsigned char pwm_duty 25; /* 占空比设置范围0~50 */ void Timer0_Init(void) { TMOD 0xF0; /* 清T0模式位保留T1设置 */ TMOD | 0x02; /* T0模式28位自动重装 */ TH0 256 - 20; /* 20us中断一次12MHz晶振 */ TL0 TH0; ET0 1; /* 开T0中断 */ EA 1; /* 开总中断 */ TR0 1; /* 启动T0 */ } void Timer0_ISR(void) interrupt 1 { pwm_cnt; if(pwm_cnt 50) { pwm_cnt 0; /* 50×20us1ms即1kHz PWM */ } MT_PWM (pwm_cnt pwm_duty) ? 1 : 0; }逻辑说明pwm_duty取0~50的整数实际占空比等于pwm_duty/50。MT_PWM引脚接驱动芯片的使能端方向控制脚另接两个IO这样PWM损伤频率与换向逻辑完全解耦。代码里的TMOD先用与运算保留T1设置避免影响后面测速定时器的配置。注意如果板子是11.0592MHz晶振机器周期约1.085μs20μs中断对应的重装值是256−18示波器量到频率不对时先检查晶振频率再调TH0。4.2 按键控制与H桥方向切换的完整逻辑有了PWM下一步把按键、方向、显示串起来。三个按键的预期行为定义如下按键功能每次变化量范围KEY_UP加速pwm_duty 20~50KEY_DOWN减速pwm_duty - 20~50KEY_DIR换向方向标志取反正转/反转按键处理用延时10ms消抖虽然会阻塞主循环但课设的按键操作是人按一下、系统动一下不会有人要求1ms响应。换向时按先降速、再切换、延时恢复的顺序走避免高速正转瞬间切反转造成反电动势叠加击穿MOS管sbit KEY_UP P3^0; sbit KEY_DOWN P3^1; sbit KEY_DIR P3^2; unsigned char motor_dir 0; /* 0正转1反转 */ void Switch_Direction(void) { pwm_duty 0; /* 先降到0让电机滑行 */ DelayXms(50); /* 等待反电动势衰减 */ H_Bridge_Set_Dir(!motor_dir);/* 再切换方向 */ motor_dir !motor_dir; DelayXms(20); /* 换向稳定后再恢复速度 */ } void main(void) { Timer0_Init(); H_Bridge_Init(); while(1) { if(KEY_UP 0) { DelayXms(10); if(KEY_UP 0) { if(pwm_duty 48) pwm_duty 2; /* 上限50 */ while(KEY_UP 0); /* 松手检测 */ } } if(KEY_DOWN 0) { DelayXms(10); if(KEY_DOWN 0) { if(pwm_duty 2) pwm_duty - 2; /* 下限0 */ while(KEY_DOWN 0); } } if(KEY_DIR 0) { DelayXms(10); if(KEY_DIR 0) { Switch_Direction(); while(KEY_DIR 0); } } } }逻辑说明Switch_Direction先置零占空比让电机靠惯性滑行50ms然后调换H桥方向。按键判断里用while等待松手每次按键只触发一次不会因为长按而连续加到底。需要注意的是pwm_duty加减用2作为步进每次按键改变4%占空比视觉上转速变化明显但不会跳变如果你想做长按连续加速把while松手检测去掉改成每100ms自动加一次那就是另一种交互逻辑。4.3 霍尔码盘测速T法实现与转速显示按第2.3节的分析课设电机转速范围内T法更精确。码盘每转输出20个脉冲外部中断0接霍尔信号定时器1作为计时器。每次进中断读取定时器1的当前值并与上次相减得到脉冲间隔。定时器1时钟周期设1μs码盘20脉冲/转转速nrpm 3,000,000 / interval。volatile unsigned char speed_ready 0; volatile unsigned long last_tick 0; volatile unsigned long interval 0; void INT0_ISR(void) interrupt 0 { unsigned long now (unsigned long)TH1 * 256 TL1; interval now - last_tick; /* 两次脉冲间隔单位us */ last_tick now; speed_ready 1; }主循环里做转速换算和显示unsigned int speed_rpm 0; if(speed_ready) { speed_ready 0; speed_rpm 3000000UL / interval; /* 20脉冲/转单位rpm */ Display_Speed(speed_rpm); }参数说明TH1和TL1要组合成16位变量所以定时器1应工作在16位计时模式TMOD的T1部分为模式1。interval单位是微秒除数3e6等于60除以脉冲数20再乘以1e6。如果换装60脉冲/转的码盘除数就是1e6更换码盘后第一件事是改除数否则显示转速整体偏小两倍。数码管显示用动态扫描以下是常见的共阴4位数码管驱动代码unsigned char code seg_tab[] {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; sbit SEG_LATCH P2^0; /* 段选锁存 */ sbit DIG_LATCH P2^1; /* 位选锁存 */ void Display_Speed(unsigned int val) { unsigned char i, sel 0x01; for(i 0; i 4; i) { P0 seg_tab[val % 10]; /* 送段码 */ SEG_LATCH 1; SEG_LATCH 0; P0 sel; /* 送位选 */ DIG_LATCH 1; DIG_LATCH 0; DelayXms(2); /* 每位点亮2ms */ val / 10; sel 1; } }动态扫描周期是4×2ms8ms刷新率125Hz人眼看到的就是稳定数字。如果主循环里还要跑PID和按键显示带来的阻塞会很明显可以把显示放到定时器中断里但注意中断服务函数不能调用DelayXms这类耗时函数要改成计数标志去触发刷新。4.4 最简单的闭环调速比例与积分的配合如果课程要求电机在负载变化时保持转速稳定就需要闭环。基于T法测速先实现一个最简比例调节器目标速度对应一个目标脉冲间隔target_interval实际interval大于target_interval说明转速偏慢增大占空比反之减小。完整代码unsigned long target_interval 3000; /* 对应1000rpm单位us */ #define KP 1 /* 比例系数先取1 */ if(speed_ready) { speed_ready 0; if(interval target_interval) { if(pwm_duty 50) { pwm_duty KP; /* 转速偏低加大占空比 */ } } else { if(pwm_duty 5) { /* 保留5%下限避免彻底停转 */ pwm_duty - KP; } } }逻辑说明速度误差 interval − target_interval占空比修正量 KP × 误差符号。这是纯比例控制可能出现稳态误差——负载增大后比例调节只能让转速接近目标但永远差一点。要消除稳态误差再加积分项每次采样把误差累加误差和乘以Ki后加到占空比上。调Ki的经验是从KP开始把Ki设为KP的1/10左右跑10秒看转速是否趋稳若超调严重就把Ki减半。5. 答辩前必做把课设从能转变成能讲清5.1 按这个顺序自测五分钟找出问题不要一上来就全系统联调。按五步走先只烧PWM程序用示波器看P1.0波形没有示波器就用万用表量平均电压占空比从0调到100%平均电压线性变化说明PWM正常。再测H桥方向不接电机测两个输出端的电压差正反切换时电压差极性要翻转。第三步接电机记录电机开始转动的最小占空比这就是启动死区。第四步测速手拨码盘看数码管数值变化方向是否与转速一致。最后才做闭环稳定测试。每一步都能独立定位问题出故障不用全板排查。5.2 四个高频故障的定位表实际调试中最容易踩的坑集中在电源和自举电路上现象原因定位方法电机颤抖不转占空比低于启动死区手动把pwm_duty加高记录最低启动值反转无力或不动高端MOS没导通自举电容缺失或极性反万用表量VB与VS间电压应在10V以上电机一转数码管乱跳共电源导致单片机复位断开电机供电用独立电源测试换向瞬间单片机复位反电动势经共地串扰换向码先降速完善地线布局前三个现象在验收现场出现率最高。尤其是第一个——很多课设代码把pwm_duty初始值设得很低按下加速键前电机纹丝不动评审会以为坏了。我建议初始化占空比直接设到30%pwm_duty15一上电电机就低速转动演示效果要生动得多也方便后续按键加减速的演示节奏。5.3 答辩问为什么选1kHz PWM时怎么回答这个问题几乎必被问到。标准答法分三层第一层1kHz对应的开关损耗小电机和码盘系统在这个频率下不会产生明显噪声第二层51单片机的定时器中断频率是PWM频率的50倍因为占空比分50级如果PWM升到10kHz中断频率500kHz主循环会被中断拖死按键和显示都跑不动第三层如果换STM32定时器硬件自动输出PWM可以直接上20kHz。第三层是加分项说明你知道平台边界在哪里。同理反转时为什么要先减速再换向的答题要点是反电动势。电机高速运行时自身就是发电机反电动势接近电源电压此时直接反向加电MOS管两端承受的是电源电压与反电动势的叠加很容易超出管子耐压。先降到0占空比让电机滑行几十毫秒反电动势衰减后再换向整个H桥就工作在安全区。如果评审追问怎么判断衰减够了回答是用示波器量电机两端电压滑行时电压从12V量级指数衰减到2V以下时再切换这个阈值可以直接写进代码里做判断比固定延时更可靠。本文还有配套的精品资源点击获取
返回列表