基于89C51的单极性PWM控制课程设计.docx
- 文档编号:18038884
- 上传时间:2023-04-24
- 格式:DOCX
- 页数:15
- 大小:850.15KB
基于89C51的单极性PWM控制课程设计.docx
《基于89C51的单极性PWM控制课程设计.docx》由会员分享,可在线阅读,更多相关《基于89C51的单极性PWM控制课程设计.docx(15页珍藏版)》请在冰豆网上搜索。
基于89C51的单极性PWM控制课程设计
基于51单片机的单极性驱动可逆PWM系统的实现
一设计要求和条件
用单片机控制一台直流电动机,并用直流电动机驱动芯片LMD18200实现直流电动机的单极性PWM控制。
要求用5个按钮进行电机的正反转、加减速及停止控制,按一下加速按钮转速增加1r/s,按一下减速按钮转速减少1r/s。
显示要求:
用一个数码管显示转向,两个数码管显示转速,转速范围为20~99r/s,3个数码管显示已转的圈数,圈数范围为0~999。
2、设计目的
单极性可逆直流电动机PWM调速系统采用的是调压调速。
系统主电路采用LMD18200,该器件采用多技术构建的过程,这个过程结合了双极型的CMOS控制电路和DMOS功率器件。
它非常适用于驱动直流电动机和步进电动机。
PWM调制部分是在单片机开发平台之上,运用C语言编程控制。
由定时器来产生宽度可调的矩形波。
通过调节波形的宽度来控制电机输出电压值,以达到调节电机速度的目的。
增加了系统的灵活性和精确性,使整个PWM脉冲的产生过程得到了大大的简化。
本设计以STC89C52单片机为核心,以键盘作为输入达到控制直流电机的启停、速度和方向,完成了基本要求。
在设计中,采用了PWM技术对电机进行控制,通过对占空比的计算达到精确调速的目的。
本文介绍了直流电机的工作原理、脉宽调制(PWM)控制原理和直流电机驱动芯片LMD18200T的基本工作原理。
设计单片机外围器件连接的总体电路结构,利用KeiluVision3软件编程对各个子电路及整体电路进行控制,确保设计的电路能够满足性能指标要求,并给出试验结果。
3、设计方案与论证
电机调速控制模块
LMD18200T是美国国家半导体公司(NS)推出的专用于直流电动机驱动的H桥组件。
同一芯片上集成有CMOS控制电路和DMOS功率器件,利用它可以与主处理器、电机和增量型编码器构成一个完整的运动控制系统。
LMD18200T广泛应用于打印机、机器人和各种自动化控制领域。
PWM调速脉宽方式
调脉宽的方式有三种:
定频调宽、定宽调频和调宽调频。
我们采用了定频调宽方式,因为采用这种方式,电动机在运转时比较稳定。
并且在采用单片机产生PWM脉冲的软件实现上比较方便。
开关的速度很快,稳定性也极佳,是一种广泛采用的PWM调速技术。
PWM软件实现方式
方案一:
采用定时器做为脉宽控制的定时方式,这一方式产生的脉冲宽度极其精确,误差只在几个us。
方案二:
采用软件延时方式,这一方式在精度上不及方案一,特别是在引入中断后,将有一定的误差。
故采用方案一。
4、设计结果与分析
系统硬件电路设计
硬件电路设计框图如下图所示,硬件电路结构初步设想由以下4部分组成:
按键控制电路、单片机、电机驱动电路、数码管显示电路。
驱动部分采用了直流电动机驱动芯片LMD18200T构成。
控制部分采用C语言编程控制,STC89C52芯片的定时器产生PWM脉冲波形,通过调节波形的宽度来控制驱动电动机的电压,便能够实现对电机速度的控制。
根据硬件系统电路设计框图,对各部分模块的原理进行分析,编写个子模块
程序,最终将其组合
矩阵式按键
在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。
在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。
这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显。
矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。
这样,当按键没有按下时,所有的输入端都是高电平,代表无键按下。
行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。
消除键抖动。
一般按键在按下的时候有抖动的问题,即键的簧片在按下时会有轻微的弹跳,需经过一个短暂的时间才会可靠地接触。
若在簧片抖动时进行扫描就可能得出不正确的结果。
因此,在程序中要考虑防抖动的问题。
最简单的办法是在检测到有键按下时,等待(延迟)一段时间再进行“行扫描”,延迟时间为10~20ms。
程序采用查询工作方式,即直接在主程序中插入键盘检测子程序,主程序每执行一次则键盘检测子程序被执行一次,对键盘进行检测一次,如果把没有键按下,则跳过键识别,直接执行主程序;如果有键按下,则通过键盘扫描子程序识别按键,得到按键的编码值,然后根据编码值进行相应的处理,处理完后再回到主程序执行。
单片机开发板
近年来,单片机的发展非常迅速,就通用单片机而言,世界上一些著名的计算机厂家已投放市场的产品就有50多个系列,数百个品种。
尽管单片机的品种很多,但是在我国使用最多的还是Intel公司的MCS—51系列单片机和美国Atmel公司的89C51单片机MCS—51[7]系列单片机包括三个基本型8031、8051、8751。
STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
电机驱动电路
在电动机驱动信号方面,我们采用了占空比可调的周期矩形信号控制。
脉冲频率对电动机转速有影响,脉冲频率高连续性好,但带带负载能力差脉冲频率低则反之。
通过P3.7输入信号对PWM占空比调整来对车速进行调节,P3.3输入高电平控制电动机停止,P3.6输入高低电平分别控制电动机的正转与反转。
驱动电路采用LMD18200直流电机驱动芯片,LMD18200是专用于直流电动机驱动的H桥组件。
同一芯片上集成有CMOS控制电路和DMOS功率器件,利用它可以与主处理器、电机和增量型编码器构成一个完整的运动控制系统。
LMD18200广泛应用于打印机、机器人和各种自动化控制领域。
数码管显示电路
显示电路采用两个8段共阳4位数码管,分别对正、反转,电机旋转圈数和转速进行显示。
74HC573是拥有八路输出的锁存器,加上上拉电阻,单片机通过控制锁存器控制数码管位码的显示。
系统的软件设计
中断处理子程序
采用定时器0中断,定时器0工作在模式1,产生PWM波。
调速档通过(5-95)共8档固定占空比,以实现调速档位的实现。
PWM脉宽控制
一个脉冲周期可以由高电平持续时间t1和低电平持续时间t2组成,占空比为t1/(t1+t2),因此要实现定频调宽的调速方式,只需通过程序改变全局变量speed的值。
5、设计体会
通过对PWM脉宽直流调速系统的设计,使我更深刻的理解课本所学知识,对双闭环系统的设计步骤和设计过程有了更深入的了解。
通过本次课程设计,加深了对所学电力拖动自动控制系统课程知识的理解,特别是单极性闭环pwm直流调速系统的设计,以及PWM在调速中的运用和作用。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到各种各样的问题,由于对很多知识掌握的不够熟练,解决这些问题可以说得是困难重重,通过向同学请教,自己查阅书籍,总算完成了这次的课程设计,这次的课程设计很好的锻炼了自己的操作能力,相信在以后的工作中遇到相似的问题自己一定可以很好的完成任务。
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineGPIO_KEYP2
sbitBRA=P3^3;//制动
sbitPWM=P3^7;//调速
sbitDIR=P3^6;//转向
ucharflag,KeyValue;//方向标志位
ucharspeed=55;//初始转速
uintnum,ON;//圈数
ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
/****************************************************************
*延时函数
****************************************************************/
voiddelay(uintx)
{
uchari;
while(x--)
{for(i=0;i<110;i++);}
}
/****************************************************************
*名称:
init()
*功能:
初始化函数,设置串口,定时器0
*输入:
无
*输出:
无
****************************************************************/
voidinit()
{
TMOD=0x31;//定时器0工作在模式1,产生PWM波
TH0=0xff;//定时100us
TL0=0xa4;
TR0=1;//开定时器0
ET0=1;//开定时器0中断
EA=1;//开总中断
}
/****************************************************************
*名称:
display()
*功能:
显示子函数,显示圈数,转速和转向,停止指示
*输入:
圈数,转速,转向
*输出:
无
****************************************************************/
voiddisplay_sum(num)//圈数显示
{
P0=table[num%1000/100];//显示圈数百位
P1=0x02;
delay
(1);
P1=0;
P0=table[num%100/10];//显示圈数十位
P1=0x04;
delay
(1);
P1=0;
P0=table[num%10];//显示圈数个位
P1=0x08;
delay
(1);
P1=0;
}
voiddisplay_speed(speed)//转速显示
{
P0=table[speed%100/10];//显示转速十位
P1=0x10;
delay
(1);
P1=0;
P0=table[speed%10];//显示转速个位
P1=0x20;
delay
(1);
P1=0;
}
voiddisplay_dir(flag)//方向显示
{
P0=table[flag];
P1=0x01;
delay
(1);
P1=0;
}
voiddisplay_OFF()//停止指示
{
P0=0xc0;
P1=0x01;
delay
(1);
P1=0;
P0=0x8e;
P1=0x02;
delay
(1);
P1=0;
P0=0x8e;
P1=0x04;
delay
(1);
P1=0;
}
/****************************************************************
*名称:
dispose()
*功能:
正反转加减速子函数
*输入:
无
*输出:
无
****************************************************************/
voiddispose()//按键处理
{
chara=0;
GPIO_KEY=0xf0;
if(GPIO_KEY!
=0xf0)//读取按键是否按下
{
delay(5);//延时5ms进行消抖
if(GPIO_KEY!
=0xf0)//再次检测键盘是否按下
{
//测试列
GPIO_KEY=0xf0;
switch(GPIO_KEY)
{
case(0xe0):
KeyValue=0;break;
case(0xd0):
KeyValue=1;break;
case(0xb0):
KeyValue=2;break;
case(0x70):
KeyValue=3;break;
}
//测试行
GPIO_KEY=0x0f;
switch(GPIO_KEY)
{
case(0x0e):
KeyValue=KeyValue;break;
case(0x0d):
KeyValue=KeyValue+4;break;
case(0x0b):
KeyValue=KeyValue+8;break;
case(0x07):
KeyValue=KeyValue+12;break;
}
if(KeyValue==0)//停止
{
BRA=1;
ON=0;//刹车
}
if(KeyValue==1)//正转
{
BRA=0;//关刹车
DIR=1;//电机正转
PWM=1;//开电机
flag=0;//电机正转标志
ON=1;
}
if(KeyValue==2)//反转
{
BRA=0;//关刹车
DIR=0;//电机反转
PWM=1;//开电机
flag=1;//电机反转标志
ON=1;
}
if((KeyValue==3)&&(speed<=90))//加速
{
speed=speed+10;
}
if((KeyValue==4)&&(speed>=10))//减速
{
speed=speed-10;
}
while((a<50)&&(GPIO_KEY!
=0x0f))//检测按键松手检测
{
delay(10);
a++;
}
KeyValue=0;
}
}
}
/****************************************************************
*主函数
****************************************************************/
voidmain()
{
init();
PWM=1;
P0=0xff;
P1=0x00;
while
(1)
{
dispose();//按键处理
if(ON)
{
display_speed(speed);//显示速度
display_sum(num);//显示圈数
display_dir(flag);//显示转向
}
else
display_OFF();
}
}
/****************************************************************
*名称:
timer0()
*功能:
定时器0子函数,产生PWM波
*输入:
无
*输出:
无
****************************************************************/
voidtimer0()interrupt1//PWM频率为1/(100us*100)=10kHz
{
ucharcount;
TH0=0xff;//100us
TL0=0xa4;
if(count==speed)
{
PWM=0;//关电
}
count++;
if(count==100)
{
count=0;
PWM=1;//开电
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 89 C51 极性 PWM 控制 课程设计