温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,汇文网负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
网站客服:3074922707
2023
基于
51
单片机
直流电机
控制系统
郑州轻工业学院
课程设计说明书
题目:基于51单片机的直流电机控制系统设计
姓 名:
院 〔系〕: 电气信息工程学院
专业班级: 电子信息工程专业
学 号:
指导教师:
成 绩:
时间: 2023 年 12 月 12 日至 2023 年 12 月 26 日
郑州轻工业学院
题目 基于51单片机的直流电机控制系统设计
专业、班级 电子信息工程08级1班 学号 姓名
主要内容、根本要求、主要参考资料等:
主要内容:控制系统主要是以8051单片机为核心组成的控制系统, 本系统中的电机转速与电机两端的电压成比例, 而电机两端的电压与控制波形的占空比成正比, 因此, 由MCU内部的可编程计数器阵列输出PWM波, 以调整电机两端电压与控制波形的占空比, 从而实现调速。
根本要求:
1、掌握汇编编程的原理和方法。
2、熟悉单片机根本特征和电路设计的方法。
3、掌握直流电机的控制方法。
4、熟练运用定时器设计PWM波控制直流电机。
5、形成一篇设计文档。
主要参考资料:
[1] 孙涵芳 徐爱卿.MCS-51/96系列单片机原理及应用[M].北京:北京航空航天大学出版社,1977..
[2] 何立民.单片机应用技术选编[M].北京:北京航空航天大学出版社,2023..
[3] 史国生.交直流调速系统[M].北京:化学工业出版社,2023.161-174.
完 成 期 限: 2023.12.12-2023.12.26
指导教师签名:
课程负责人签名:
2011年 12月 11日
本文主要研究了利用MCS-51系列单片机控制PWM信号从而实现对直流电机转速进行控制的方法。控制系统主要是以8051单片机为核心组成的控制系统, 本系统中的电机转速与电机两端的电压成比例, 而电机两端的电压与控制波形的占空比成正比, 因此, 由MCU内部的可编程计数器阵列输出PWM波, 以调整电机两端电压与控制波形的占空比,从而实现调速。
关键词:8051单片机 PWM信号 直流电机
目录
第一章:设计任务 5
第二章:总体设计方案 5
第三章 系统硬件电路设计 6
第四章 系统的软件设计 7
第五章:程序 8
第六章:PCB图 8
第七章:元件清单 8
第八章:参考文献 8
第九章:心得体会 8
第一章:设计任务
任务: 单片机为控制核心的直流电机PWM调速控制系统设计的主要内容以及技术参数:
功能主要包括:
1) 直流电机的正转;
2) 直流电机的反转;
3) 直流电机的加速;
4) 直流电机的减速;
5) 直流电机的转速在数码管上显示;
6) 直流电机的启动;
7) 直流电机的停止;
第二章:总体设计方案
总体设计方案的硬件局部详细框图如图一所示。
数码管显示
按键控制
8051单片机
PWM电机驱动
键盘向单片机输入相应控制指令,由单片机通过P1.0与P1.1其中一口输出与转速相应的PWM脉冲,另一口输出低电平,经过ULN2023芯片控制电路,实现电动机转向与转速的控制。电动机的运转状态通过数码管显示出来。电动机所处速度级以速度档级数显示。正转时最高位显示“三〞 ,其它三位为电机转速;反转时最高位显示“F〞,其它三位为电机转速。每次电动机启动后开始显示,停止时数码管显示出“0000〞。
第三章 系统硬件电路设计
整体框图如下
第四章 系统的软件设计
本系统编程局部工作采用KELI-C51语言完成,采用模块化的设计方法,与各子程序做为实现各局部功能和过程的入口,完成键盘输入、按键识别和功能、PWM脉宽控制和数码管显示等局部的设计。
单片机资源分配如下表:
P0
显示模块接口
键盘中断
P1
键盘模块接口
P1.0/P1.1
PWM电机驱动接口
系统时钟
①PWM脉宽控制:本设计中采用软件延时方式对脉冲宽度进行控制,延时程序函数如下:
/xxxxxxxxxxxxxxxxx延时函数xxxxxxxxxxxxxxxxxxxxxxxxx/
delays()
{
uchar i;
for(i=5000;i>0;i--);
}
②键盘中断处理子程序:采用中断方式,按下键,完成延时去抖动、键码识别、按键功能执行。
要实现按住加/减速键不放时恒加或恒减速直到放开停止,就需在判断是否松开该按键时,每进行一次增加/减少一定的占空比。
③显示子程序:利用数组方式定义显示缓存区,缓存区有8位,分别存放各个数码管要显示的值。
④定时中断处理程序:采用定时方式1,因为单片机使用12M晶振,可产生最高约为65.5ms的延时。对定时器置初值B1E0H可定时20ms,即系统时钟精度可达0.02s。当20ms定时时间到,定时器溢出那么响应该定时中断处理程序,完成对定时器的再次赋值,并对全局变量time加1,这样,通过变量time可计算出系统的运行时间。
3、软件设计中的特点:
对于电机的启停,在PWM控制上使用渐变的脉宽调整,即开启后由停止匀加速到默认速度,停止那么由于当前速度逐渐降至零。这样有利于保护电机。键盘处理上采用中断方式,不必使程序对键盘反复扫描,提高了程序的效率。
第五章:程序
见附件1
第六章:PCB图
见附件2
第七章:元件清单
见附件3
第八章:参考文献
[1] 孙涵芳 徐爱卿.MCS-51/96系列单片机原理及应用[M].北京:北京航空航天大学出版社,1977..
[2] 何立民.单片机应用技术选编[M].北京:北京航空航天大学出版社,2023..
[3] 史国生.交直流调速系统[M].北京:化学工业出版社,2023.161-174.
第九章:心得体会
本次课程设计虽然只有两周,但短短两周我掌握了汇编编程的原理和方法。熟悉了单片机根本特征和电路设计的方法。掌握了直流电机的控制方法。熟练了运用定时器设计PWM波控制直流电机。总之,收获很多。
附件1
/xxxxxxxxxxxx头文件xxxxxxxxx/
#include<reg51.h>
#include<absacc.h>
#include <intrins.h>
/xxxxxxxxxxxxxxxxxxxxxxxxxx /
/xxxxxxxx自定义变量xxxxxxxx/
#define uint unsigned int //自定义变量
#define uchar unsigned char
char gw,sw,bw,qw;
uchar j; //定时次数,每次20ms
uchar f=5; //计数的次数
sbit P10=P1^0; //PWM输出波形1
sbit P11=P1^1; //PWM输出波形2
sbit P12=P1^2; //正反转
sbit P13=P1^3; //加速
sbit P14=P1^4; //减速
sbit P15=P1^5; //停止
sbit P16=P1^6; //启动
uchar k;
uchar t; //脉冲加减
/xxxxxxxxxxxxxxxxxxxxxxxxxx/x
/xxxxxxxxx控制位定义xxxxxxxxxxxxxxxxxxxx/
uchar code smg[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x73,0x71};//程序存储区定义字型码表
char data led[4]={0x08,0x04,0x02,0x01}; //位码
uint x; //数码管显示的数值
display(); //数码管显示
delays(); //延时函数
key();
displays();
/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/
/xxxxxxxxxxxxxxx主函数xxxxxxxxxxxxxxxxxxxx/
main (void)
{
TMOD=0x51; //T0方式1 定时计数 T1方式1计数
TH0=0xb1; //装入初值 20MS
TL0=0xe0;
TH1=0x00; // 计数567
TL1=0x00;
TR0=1; //启动 t0
TR1=1; //启动t1
gw=sw=bw=qw=0; //数码管初始化
P0=0xc0;
P2=1;
while(1) //无限循环
{
display(); //数码管显示
key();
}
}
/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/
/xxxxxxxxxxxxxxx数码管显示xxxxxxxxxxxxxxxx/
display()
{
uchar i;
gw=x%10; //求速度个位值,送到个位显示缓冲区
sw=(x/10)%10; //求速度十位值,送到十位显示缓冲区
bw=(x/100)%10; //求速度百位值,送到百位显示缓冲区
qw=x/1000; //求速度千位值,送到千位显示缓冲区
for(i=0;i<4;)
{
P2=led[i];
if(i==0) //显示个位
{
P0=smg[gw];
delays();
}
else if(i==1) //显示十位
{
P0=smg[sw];
delays();
}
else if(i==2) //显示百位
{
P0=smg[bw];
delays();
}
else if(i==3) //显示千位
{
if(k==0) //正转时显示"三"
{
P0=0x49;
delays();
}
else
{
P0=0x71; //反转时显示"F"
}
}
i++;
}
}
/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/
/xxxxxxxxxxxxxxxxx延时函数xxxxxxxxxxxxxxxxxxxxxxxxx/
delays()
{
uchar i;