基于89C51的单极性PWM控制课程设计.docx

上传人:b****2 文档编号:18038884 上传时间:2023-04-24 格式:DOCX 页数:15 大小:850.15KB
下载 相关 举报
基于89C51的单极性PWM控制课程设计.docx_第1页
第1页 / 共15页
基于89C51的单极性PWM控制课程设计.docx_第2页
第2页 / 共15页
基于89C51的单极性PWM控制课程设计.docx_第3页
第3页 / 共15页
基于89C51的单极性PWM控制课程设计.docx_第4页
第4页 / 共15页
基于89C51的单极性PWM控制课程设计.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

基于89C51的单极性PWM控制课程设计.docx

《基于89C51的单极性PWM控制课程设计.docx》由会员分享,可在线阅读,更多相关《基于89C51的单极性PWM控制课程设计.docx(15页珍藏版)》请在冰豆网上搜索。

基于89C51的单极性PWM控制课程设计.docx

基于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;//开电

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1