基于51单片机的单极性驱动可逆PWM系统的实现一设计要求和条件用单片机控制一台直流电动机,并用直流电动机驱动芯片LMD18200实现直流电动机的单极性PWM控制。要求用5个按钮进行电机的正反转、加减速及停止控制,按一下加速按钮转速增加1r/s,按一下减速按钮转速减少1r/s。显示要求:用一个数码管显示转向,两个数码管显示转速,转速范围为20~99r/s,3个数码管显示已转的圈数,圈数范围为0~999。二、设计目的单极性可逆直流电动机PWM调速系统采用的是调压调速。系统主电路采用LMD18200,该器件采用多技术构建的过程,这个过程结合了双极型的CMOS控制电路和DMOS功率器件。它非常适用于驱动直流电动机和步进电动机。PWM调制部分是在单片机开发平台之上,运用C语言编程控制。由定时器来产生宽度可调的矩形波。通过调节波形的宽度来控制电机输出电压值,以达到调节电机速度的目的。增加了系统的灵活性和精确性,使整个PWM脉冲的产生过程得到了大大的简化。本设计以STC89C52单片机为核心,以键盘作为输入达到控制直流电机的启停、速度和方向,完成了基本要求。在设计中,采用了PWM技术对电机进行控制,通过对占空比的计算达到精确调速的目的。本文介绍了直流电机的工作原理、脉宽调制(PWM)控制原理和直流电机驱动芯片LMD18200T的基本工作原理。设计单片机外围器件连接的总体电路结构,利用KeiluVision3软件编程对各个子电路及整体电路进行控制,确保设计的电路能够满足性能指标要求,并给出试验结果。三、设计方案与论证电机调速控制模块LMD18200T是美国国家半导体公司(NS)推出的专用于直流电动机驱动的H桥组件。同一芯片上集成有CMOS控制电路和DMOS功率器件,利用它可以与主处理器、电机和增量型编码器构成一个完整的运动控制系统。LMD18200T广泛应用于打印机、机器人和各种自动化控制领域。PWM调速脉宽方式调脉宽的方式有三种:定频调宽、定宽调频和调宽调频。我们采用了定频调宽方式,因为采用这种方式,电动机在运转时比较稳定。并且在采用单片机产生PWM脉冲的软件实现上比较方便。开关的速度很快,稳定性也极佳,是一种广泛采用的PWM调速技术。PWM软件实现方式方案一:采用定时器做为脉宽控制的定时方式,这一方式产生的脉冲宽度极其精确,误差只在几个us。方案二:采用软件延时方式,这一方式在精度上不及方案一,特别是在引入中断后,将有一定的误差。故采用方案一。四、设计结果与分析系统硬件电路设计硬件电路设计框图如下图所示,硬件电路结构初步设想由以下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档固定占空比,以实现调速档位的实现。12VCC12M1100uFC10.1uFC2104BootS11OUT12DIR3Brake4PWM5VS6GND7CurrentS08ThermalF09OUT210BootS21118KR227KR3方向刹车PWM12345INHeader5+5V1KR112LED+5V10nFC310nFC4VCCVCCPWM脉宽控制一个脉冲周期可以由高电平持续时间t1和低电平持续时间t2组成,占空比为t1/(t1+t2),因此要实现定频调宽的调速方式,只需通过程序改变全局变量speed的值。五、设计体会通过对PWM脉宽直流调速系统的设计,使我更深刻的理解课本所学知识,对双闭环系统的设计步骤和设计过程有了更深入的了解。通过本次课程设计,加深了对所学电力拖动自动控制系统课程知识的理解,特别是单极性闭环pwm直流调速系统的设计,以及PWM在调速中的运用和作用。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到各种各样的问题,由于对很多知识掌握的不够熟练,解决这些问题可以说得是困难重重,通过向同学请教,自己查阅书籍,总算完成了这次的课程设计,这次的课程设计很好的锻炼了自己的操作能力,相信在以后的工作中遇到相似的问题自己一定可以很好的完成任务。#includereg52.h#includeintrins.h#defineucharunsignedchar#defineuintunsignedint#defineGPIO_KEYP2sbitBRA=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;i110;i++);}}/*****************************************************************名称:init()*功能:初始化函数,设置串口,定时器0*输入:无*输出:无****************************************************************/voidinit(){TMOD=0x31;//定时器0工作在模式1,产生PWM波TH0=0xff;//定时100usTL0=0xa4;TR0=1;//开定时器0ET0=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;