基于89C51的直流电机转速的测量与控制毕业论文.doc_第1页
基于89C51的直流电机转速的测量与控制毕业论文.doc_第2页
基于89C51的直流电机转速的测量与控制毕业论文.doc_第3页
基于89C51的直流电机转速的测量与控制毕业论文.doc_第4页
基于89C51的直流电机转速的测量与控制毕业论文.doc_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目 录中文摘要 1英文摘要 21 引言 31.1 课题的研究意义 31.2 设计任务 32 系统设计及模块分析 5 2.1系统平台简介 52.2 PWM模块 5 2.3 DAC模块 9 2.4 LCD模块 12 2.5 8279键盘模块 163 系统的软件设计与实现 193.1 系统软件简介 193.2 编程语言简介 203.3 设计流程及分析 204 调试与实验结果 26 4.1 系统测试结果 26 4.2 设计心得 27结 论 29谢 辞 30参考文献 31附录1 系统硬件原理图 32附录2 设计源程序1(计数器计数) 34附录3 设计源程序2(中断计数) 51基于AT89C51直流电机控制系统的设计与实现摘 要:转速是直流电机运行中的一个重要物理量,如何准确、快速而又方便地测量电机转速,极为重要。本文阐述了基于单片机的直流电动机转速控制系统的特点和优势,介绍了在ZY15MCU12BC2单片机实验开发平台上,对直流电动机进行测速和控制的相关算法及软、硬件实现。设计中软件设计采用C语言编程,硬件设计采用PWM方式和DAC方式驱动电动机,利用霍尔元器件测量电动机的转速,在液晶显示屏(LCD)上实时显示电机的转速值。另外还可以通过28矩阵键盘输入电动机转速的设定值,在电动机转速的可控范围内控制电动机转速,使电动机的实际转速值等于设定值,并在液晶显示屏(LCD)上同时显示设定值与实际转速值,便于比较。最后对实验数据进行了分析。关键词:直流电动机,PWM,液晶显示屏(LCD),转速测量Abstract: Speed is an important physical quantity in the operation of the DC-motor. How to measure the speed of DC-motor exactly, rapidly and conveniently is highly significant. The design expatiates on the advantages of SCM in the DC-motor speed modification system. The algorithm about the measurement and the control of the DC-motor, as well as the software and hardware methods to realize the requirement based on the ZY15MC12BC2 SCM experiment development platform is introduced. In this design, the PWM manner and the DAC manner are used to drive the motor, while the Hall device is utilized to measure the speed of the motor. The numerical value will have a real-time display on the LCD screen. In addition, the setting value of the speed can be inputted through the 28 matrix keyboard. It can control the speed of the DC-motor in its controllable bounds, which makes the actual speed value equal to the setting value. The LCD screen will display the setting value and the actual speed value simultaneously that is convenient for the comparison between the two values. In conclusion, the data got from the experiment have been analyzed.Keywords: DC-motor, PWM, LCD, speed measurement1 引言 1.1 课题的研究意义直流电机具有良好的起动、制动性能,宜于在大范围内平滑调速,在许多需要调速或快速正反向的电力拖动系统中得到了广泛的应用。近年来,交流调速系统发展很快,然而直流拖动系统无论是在理论上还是在实践上都比较成熟,并且从反馈闭环控制的角度来看,它又是交流拖动控制系统的基础,所以直流调速系统在生活中有着举足轻重的作用。虽然随着电力技术的发展,特别是在大功率电力电子器件问世以后,直流电机拖动将有逐步被交流电机拖动所取代的趋势,但在中、小功率场合,常采用永磁直流电动机。早期的直流电动机的控制均以模拟电路为基础,采用运算放大器、非线性集成电路以及少量的数字电路组成,控制自通的硬件部分非常复杂,功能单一,而且系统非常不灵活,调试困难。随着单片机技术的不断进步,使得许多控制功能及算法可以采用软件技术来完成,为直流电动机的控制提供了更大的灵活性,并使系统能够达到更高的稳定性能,同时还具有软特性好,过载能力强,可进行pid调节,调速稳定等优势。因此,本课题的研究具有很好的实际意义。1.2 设计任务根据课题要求研制以单片机为核心的直流电机测速控制系统。系统设计主要包含以下任务:1、实现对直流电机转速的测量。2、通过键盘输入电机转速的设定值,在电机转速的可控范围内控制电机转速等于设定值。3、实时显示直流电机转速的设定值和实际测量值。4、利用控制电机定子电压接通和断开的占空比(PWM),即脉宽调速。5、采用DAC方式驱动及调速。本设计采用霍尔传感器将转速转换成频率与速度一一对应的脉冲信号,将脉冲信号送给单片机进行检测,最终计算出电机的转速。采用点阵式LCD显示器,显示测量值和由键盘输入的设定值。对于直流电机的转速控制,选择合适的PWM方式和DAC方式驱动实现。设计(实验)的总体模块化方案如图1.1所示,整个设计采用模块化设计、分布调试、整体组合的方法。显示器直流电机驱动电路PWM/DAC直流电机键盘测速电路单片机(测速、调速、计算、显示、输入设定值及系统控制)图1.1 系统总体模块化方案2 系统设计及模块分析2.1 系统平台简介本设计以ZY15MCU12BC2单片机实验箱为仿真平台,在Keil Vision2环境中编写设计程序。ZY15MCU12BC2单片机实验箱可以作为51系列单片机的开发系统。本设计中使用到了单片机实验箱上的PWM模块、DAC模块、LCD模块和8279的键盘模块。系统模块及功能框图如图2.1所示。LCD8279 键盘测速调速单片机DAC/PWM直流电机图2.1 系统模块及功能框图2.2 PWM模块2.2.1单片机测量电机转速的原理2.2.1.1 转速的测量原理转速是电机的一个最常用的参数,电机的转速常以每分钟的转数来表示,其单位为r/min。转速的测量方法有很多,由于转速是以单位时间内的转数来衡量的,因此采用霍尔元器件测量转速是较为常用的一种测量方法。霍尔器件是由半导体材料制成的一种薄片,器件的长、宽、高分别为l、b、d。若在垂直于薄片平面(沿厚度d)方向施加外加磁场B,在沿l方向的两个端面加以外电场,则有一定的电流经过。由于电子在磁场中运动,所以将受到一个洛仑兹力,其大小为f1=qVB,其中,f1 为洛仑兹力,q为载流子电荷,V为载流子运动速度,B为磁感应强度。这样使得电子的运动轨迹发生偏移,在霍尔元器件薄片的两个侧面分别产生电子积聚或电荷过剩,形成霍尔电场,霍尔元器件两个侧面间的点位差UH称为霍尔电压。霍尔电压的大小为:UH =RH IB/d(mV)。其中,RH 为霍尔常数,d为元件厚度,B为磁感应强度,I为控制电流。设KH = RH /d,则UH = KH IB(mV)。KH 为霍尔器件的灵敏系数(mV/mA/T),表示该霍尔元件在单位磁感应强度和单位控制电流在输出的霍尔电动势的大小。根据霍尔效应原理,将一块永久磁钢固定在ZY15MCU12BC2单片机实验箱直流电机转轴上的转盘边沿,转盘随转轴旋转,磁钢也将跟着同步旋转。在转盘附近安装一个霍尔开关传感器3020T,当转盘随转轴旋转时,受磁钢所产生的磁场影响,霍尔器件输出脉冲信号,其脉冲信号的频率和转速成正比,这样只要测出脉冲信号的频率或周期即可计算出直流电机的转速。本设计的PWM驱动直流电机电路如图2.2所示,图2.2的右下角为霍尔传感器电路。图2.2 PWM驱动直流电机电路图2.2.1.2 测速方法数字测速方法目前有比较常用的三种:M法、T法和M/T法。M法的测速原理为在一定时间T内测取旋转编码器输出的脉冲个数M,用以计算这段时间内的平均转速。把M除以T就可得到旋转编码器输出脉冲的频率f=M/T,所以又叫频率法。电动机每转一圈共产生Z个脉冲(Z=倍频系数编码器光栅数),把f除以Z就得到电动机的转速。在习惯上,时间T以秒为单位,而转速是以每分钟的转速r/min为单位,则电动机的转速为n=60M/(ZT)。在上式中,Z和T均为常值,因此转速n正比于脉冲个数M。高速时M大,量化误差小,随着转速的降低误差增大,转速过低时M将小于1,测速装置便不能正常工作。所以M法测速只适用于高速段。T法的测速原理为在编码器两个相邻输出脉冲的间隔时间内,用一个计数器对已知频率为f的高频脉冲进行计数,并由此来计算转速。在这里,测速时间缘于编码器输出脉冲的周期,所以又称周期法。在T法测速中,准确的测速时间T是用所得的高频时钟脉冲个数M计算出来的,即T=M/f,则电动机转速为n=60f/(ZM)。高速时M小,量化误差大,随着转速的降低误差减小,所以T法测速适用于低速段与M法恰好相反。把M法和T法结合起来,既检测T时间内旋转编码器输出的脉冲个数M,又检测同一时间间隔的高频时钟脉冲个数M,用来计算转速,称作M/T法测速。设高频时钟脉冲的频率为f,则准确的测速时间T=M/f,而电动机转速为n=60M1f/(ZM2)。采用M/T法测速时,应保证高频时钟脉冲计数器与旋转编码器输出脉冲计数器同时开启与关闭,以减小误差,只有等到编码器输出脉冲前沿到达时,两个计数器才同时允许开始或停止计数。由于M/T法的计数值M1和M2都随着转速的变化而变化,高速时,相当于M法测速,最低速时,M1=1,自动进入T法测速,因此,M/T法测速能适用的转速范围明显大于前两种,是目前广泛应用的一种测速方法。本设计中采用了M法进行测速。有两种测速方案:方案1:利用单片机外部中断引脚计数。即通过单片机外部中断信号,在中断程序对电机转速脉冲信号进行计数,测量电机转速。将传感器电路的输出端CKMOT与单片机外部中断引脚(P3.2/P3.3)相连,用于输入计数脉冲,设定单片机T0为定时器,定时器时间为1秒,并定义一个外部中断变量作软件计数器。电机每转一周(CKMOT输出一个脉冲信号)中断信号产生一次中断请求,CPU响应中断后在中断程序中对软件计数器作加1运算。当定时器T0计时1秒到时,停止中断计数,软件计数器计数值为电机当前的转速。(方案1的源程序见附录3)方案2:利用单片机计数器外部计数引脚测量电机转速。将传感电路的输出端CKMOT与单片机计数器T1的计数脉冲的输入引脚P3.5相连,用于输入计数脉冲,将TH1和TL1的初值定为0,设定单片机T0为定时器,定时器时间为1秒,当定时器T0计时1秒时,T1停止计数,此时TH1和TL1中的计数值为电机当前的转速。(方案2的源程序见附录2)2.2.2 PWM驱动电机原理PWM(Pulse Width Modulation)即脉冲宽度调制是通过控制固定电压的直流电源开关频率,从而改变负载两端的电压,进而达到控制要求的一种电压调制方法。在PWM驱动控制的调制系统中,按一个固定的频率来接通和断开电源,并根据需要改变一个周期内“接通”和“断开”时间的长短。通过改变直流电机电枢上电压的“占空比”来改变平均电压的大小,从而控制电动机的转速。如图2.3所示,在脉冲作用下,当电机通电时,速度增加;电机断电时,速度逐渐减少。只要按一定规律,改变通、断电的时间,即可让电机转速得到控制。t1t2T脉冲信号最大值Vmax平均值Vd图2.3 PWM脉冲信号及占空比与平均电压关系图设电机始终接通电源时,电机转速最大为Vmax,设占空比为D=t2/T,则电机的平均速度为 Vd=VmaxD,其中,Vd 为电机的平均速度;Vmax 为电机全通电时的速度(最大);D=t2/T为占空比。由公式可见,当我们改变占空比D时,就可以得到不同的电机平均速度 ,从而达到调速的目的。PWM驱动直流电机电路如图2.2所示,将K8拨至右端,则连接上PWM驱动电路,PWM的输出经过TIP127放大后才足以驱动电机旋转。在程序运行过程中,LCD上会有提示:“K8拨上:PWM”,即把K8拨至上端则选中了PWM驱动方式。在本设计中,PWM信号是通过软件方法产生的,通过延时控制脉冲信号高低电平的比例来驱动电机。脉冲周期T设为255,低电平所占时长设为变量del(del最小值为0,最大值为255),实验测试时发现低电平所占比例越大,电机转速越快。2.2.3 PWM调速原理本设计中,单片机实验箱中的数字按键共用到11个:用来设定转速的数字键09,以及分别作为加速、减速功能键的“A”和“B”。键盘输入设置为外部中断1,当有按键按下时,就启动外部中断1服务程序。转速值输入方法:PWM方式下输入值范围为079,若想设定转速值为50,则通过28矩阵键盘依次按下“0”“5”“0”。在本设计中,软件PWM调速的算法思想是:设计中占空比为D=del/255,在矩阵键盘上有数字按键按下时,开启外部中断1被启动,从键盘上输入三位数字,当三位数字均为09时,输入值作为占空比的改变标准:将测得的电机当前转速值与输入值进行比较,若转速值大于输入值时,del值会逐渐减小,使得占空比逐渐减小,进而实现减速;当转速值小于输入值时,del值会逐渐增大,使得占空比会逐渐增大,进而实现加速。直到转速值与输入值相等,电机转速后才会固定。另外,当从键盘上输入的值为“00A”或“00B”时,del值自动增加或减少,此时没有设定目标转速值,通过改变del值来改变占空比,从而实现自动加速或减速。 2.3 DAC模块2.3.1 DAC0832工作原理及主要性能数/模转换器的基本功能是将输入的二进制数字量转换成与输入量成比例的模拟量,多数数/模转换器把数字量变成模拟电流,如果要将其变成模拟电压,还要使用I/V(电流/电压)转换器来实现。数/模转换器DAC0832由1个8位DAC寄存器、1个8位D/A转换器和控制逻辑组成,DAC0832的内部结构图如图2.4所示。图2.4 DAC0832内部结构DAC0832的主要性能如下:1.分辨率8位的并行D/A转换器。2.双列直插式(DIP)封装,CMOS低功耗(功耗为20mW)器件。3.单电源供电。参考电压为-10V+10V,从-5V+15V均可正常工作。4.电流输出型芯片,需外接运算放大器。5.电流建立时间为1s。6.片内二级数据锁存,数据输入可采用双缓冲、单缓冲和直通方式。7.与MCS-51连接方便。2.3.2 DAC工作电路本设计的DAC调速电路如图2.5所示。在图2.5中,将K8拨至左端,则连接上了DAC0832电路来驱动直流电机。在程序运行过程中,LCD上会有提示:“K8拨下:DAC”,即把K8拨至下端则选中了DAC驱动方式。DAC0832输出为电流信号,需经过运放UA741将电流信号转化成电压信号,才能用来驱动电机。电压信号在到达电机前,需要经过3DG12A进行信号放大,才能驱动电机旋转。图2.5 DAC0832及直流电机电路图2.3.3 DAC驱动与调速原理在此模块中,也是通过给变量del赋值来驱动电机的。在程序中先给del赋一个初值,并将此值赋给0832数据口,转化为相应的电压值后,驱动电机旋转。调速则是通过改变del的值实现的。转速值的输入方法与PWM方式相同,但DAC方式下输入值范围为0132。在矩阵键盘上有数字按键按下时,外部中断1被启动。从键盘上输入三位数字,当三位数字均为09时,输入值则作为del值的改变标准:将测得的电机当前转速值与输入值进行比较,若转速值大于输入值时,del值会逐渐减小,驱动电压也相应减小,进而实现减速;当转速值小于输入值时,del值会逐渐增大,驱动电压也相应增大,进而实现加速。直到转速值与输入值相等,电机转速后才会固定。另外,当从键盘上输入的值为“00A”或“00B”时,del值自动增加或减少,此时没有设定目标转速值,通过改变del值来改变驱动电压,从而实现自动加速或减速。 2.4 LCD显示模块2.4.1 FM12232A LCD工作原理本设计中选用的是单片机试验箱内置的FM12232A液晶显示模块。FM12232A是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及12232全点阵液晶显示器组成,可完成图形显示,也可以显示十六个(1616点阵)汉字。说明书中说明的是可以显示7个半汉字,但准确地说,上下两片SED1520(见图2.8)分别可以显示7.625个1616点阵的汉字。RAM中的一位数据控制液晶显示屏上一个像素的亮、暗,“1”为亮,“0”为暗。其主要技术参数和性能如下。1.电源:VDD=+2.7V+5V;LCD外接驱动电压VDD-V0=5.0V。2.显示内容:122(列)32(行)点。3.显示颜色:绿底蓝字。4.显示角度:6点钟直视。5.STN正视反射模式。6.驱动方式:1/32 Duty,1/6 Bias。7.工作温度:-20+60;存储温度:-30+70。8.连接方式:外部接口由带缆连接。FM12232A的机械尺寸如表2.1所示。表2.1 FM12232A的机械尺寸一览表项目标准尺寸单位模块体积67.127.28.4mm视域54.818.3mm行列点阵数12232dots点距离0.400.45mm点大小0.360.41mmLCD显示屏大小为67.1mm27.2mm,分为主屏(MASTER)和从屏(SLAVE)两部分,主屏和从屏均分为03页、060列,每页8行,如图2.6所示。 15 30 45 0 15 30 45page0page1page2page3主屏从屏图2.6 LCD显示屏及其控制位示意图主屏与从屏的读写由引脚E1和E2的控制信号选择,高电平为读操作,低电平为写操作。页由引脚D0和D1来选择,选择规则如表2.2所示。LCD中有两个片选信号:CS1和CS2。两个片选信号都是低电平有效,CS1控制第0、1页的启动,CS2控制第2、3页的启动。数据口D1和D0的组合控制页的选择,组合对应的页数如表2.2所示。表2.2 D1、D0与页的对应D1 D0Page0 000 111 021 13液晶显示接口电路如图2.7所示。CPU通过8255芯片与LCD液晶显示屏连接,即通过8255芯片对LCD进行控制。由图2.7可知,CPU通过8255芯片的A口向LCD传输数据,通过8255芯片的C口传输控制字,所以在对8255芯片的初始化中,将A、C口均设置为“输出”。同时对LCD的片选、复位和A0脚的设置,需要将对应的方式字写入C口,而对数据口D0D7的设置,则需将相应的数据写入A口。由图2.8可见,液晶点阵为12232,实际由两片SED1520控制,每一片控制6132的点阵,由CS1、CS2来选择锁存,所以当片选信号有效时,通过8255的A口写入相应的RAM地址的页号及RAM单元号,然后才是要显示的编码,由于FM12232A中不自带字库,所以输入的是字符的编码,各字符的点阵码由点阵取模软件得到。每当需要显示字符时,都要指定该字符所要显示的位置,包括主、从屏,页,起始列等。图2.7 液晶显示接口电路图2.8 液晶显示内部结构框图液晶显示屏的引脚特征如表2.3所示。表2.3 液晶显示屏的引脚特征管脚号管脚名称LEVEL管脚功能描述1VSS0V电源地2VDD+3V+5V电源电压3VLCD0+5V OR -5VLCD外接驱动负电压4A0H/LD/I=“H”,表示DB0DB7为显示数据05E1H/L读写功能信号(MASTER)6E2H/L读写功能信号(SLAVE)7R/WH/L读写选择信号8D0H/L数据线9D1H/L数据线10D2H/L数据线11D3H/L数据线12DB4H/L数据线13D5H/L数据线14D6H/L数据线15D7H/L数据线16RESH/L复位信号(低电平有效)17VLED+-LED(+5V)或EL背光源18VLED-LED(0V)或EL背光源表2.4 液晶显示屏指令表使用说明书编 码功 能R/WD/ID7D6D5D4D3D2D1D0开/关显示屏0010101111/0选择整个显示屏的开启、关闭,与显示器内部状态或RAM的数据无关。 1:开 0:关显示屏起始行00110显示起始行031决定了要显示的RAM数据行在显示屏上的起始行。页地址设置00101110页(03)在地址表(水平方向)中设置显示的页。列地址设置000列地址 079在列地址表(垂直方向)中设置显示的列。读状态10BUSYADCON/OFFRES0000读状态BUSY=1:内部运作;BUSY=0:准备好。ADC=1:向右输出;ADC=0:向左输出。RST=1:重启;RST=0:正常。ON/OFF=1:关显示;ON/OFF=0:开显示。写显示数据01写数据在数据总线上向RAM写数据。读显示状态11读数据到数据总线上读来自显示器RAM中的数据。ADC 选择0010100000/1决定显示器数据RAM顺时针或逆时针读取。0:顺时针开/关静态驱动0010100100/1选择动态或静态驱动。1:静态驱动0:动态驱动占空比选择0010101000/1选择占空比。1:1/320:1/16读修改写0011100000写的时候修改列地址表,但是读的时候不会改变。结束0011100010从读修改写模式中释放出来。复位0011100010设置显示起始行表至第一行,列地址数至0,页地址表至0。省电(双重控制)0001010110通过选择显示器关和静态驱动来设置省电模式。00010101012.5 8279键盘模块2.5.1 可编程键盘/显示器接口芯片8279的工作原理图2.9 8279及相应电路图2.10 8279键盘阵列电路图图2.9和图2.10是8279及其扩展的键盘电路。8279是通用可编程键盘、显示器接口芯片,能完成键盘输入和显示器的控制功能。8279的键盘接口电路可连接64键矩阵式键盘,具有对两键或N键同时按下处理功能,能够自动进行键盘扫描、自动将键值存储起来、自动消除按键抖动、给出闭合键的键码,可以用中断的方式来通知CPU当前有按键按下等功能。本设计使用的8279扩展了一个28的键盘(如图2.10),8279可以自己进行键盘扫描,当有键按下时,8279将会通过中断的方式通知CPU,由于8279产生的中断信号为一个正脉冲,所以(如图2.9左下部分)在其引脚4(IRQ)出增加了一个反相器。2.5.2 8279键盘输入的实现本设计中,使用到12个键:用来设定转速的数字键09,以及分别作为加速、减速功能键的“A”和“B”。在图2.9所示的电路图中,8279管脚RL7RL0 为回送线,键入值存入FIFO RAM中,再通过向8279控制口写入命令字0x40,令CPU按先进先出的方式读键入值。本设计中,键盘输入采用中断方式,利用外部中断1进入键盘输入程序,并采取移位的方式将键入值存储起来,再通过移位的方式将键入值显示在LCD液晶显示屏上。在此模块中,8279与LCD显示结合在一起使用。在程序运行的过程中,可以多次输入值,每次的输入值都会作为新的转速比较值。要注意每次设定转速都要输入三个数字,例如若设定目的转速为50转/秒,则应输入“050”。在这个过程中,电机的转速、键盘输入值以及电机速度变化的过程都会实时显示在LCD上。3 系统的软件设计与实现3.1 系统软件简介本设计使用的软件是Keil编程软件。Keil软件是目前最流行的开发MCS-51系列单片机的软件,Keil提供了包括C51编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(Vision)将这些部分组合在一起。使用Keil Software工具时的项目开发流程和其他软件开发项目的流程极其相似:创建一个项目,从器件库中选择目标器件,配置工具设置。用C语言或汇编语言创建源程序。用项目管理器生成应用。修改源程序中的错误。测试连接应用。Vision2集成开发环境C51ANSI C编译器A51宏编译器ANSI C标准库LIB51库管理器RTX51实时操作系统BL51连接器/定位器Vision2 调试器高速CPU/外设模拟器Monitor-51目标调试器仿真器与PROM编程器高级仿真与目标调试GDI接口一个完整的8051工具集的框图可以最好地表述上述开发流程,如图3.1所示。图3.1 Keil Vision2 软件开发流程3.2 编程语言简介本设计采用C语言进行编程。虽然汇编语言在控制底层硬件方面有着良好的性能且执行效率高,但是编程效率低,可移植性和可读性差,维护极其不便,从而导致整个系统的可靠性也较差。C语言与汇编语言相较而言有以下优势:可以大幅加快开发进度,特别是开发一些复杂的系统,程序量越大,用C语言就越有优势。可以实现软件的结构化编程,C语言使得软件的逻辑结构变得清晰、有条理。省去了人工分配单片机资源(包括寄存器、RAM等)的工作。在汇编语言中要每一个子程序分配单片机的资源,而在C语言中,只要在代码中声明一下变量的类型,编译器就会自动分配相关资源,从而有效地避免了人工分配单片机资源可能带来的差错。当写好一个算法后,需要移植到不同的MCU上时,在汇编语言中只有重新编写代码,因而汇编语言的可移植性很差;而用C语言开发时,符合ANSI C标准的程序基本不必修改,只要将一些与硬件相关的代码做适度的修改,就可以移植到其他种类的单片机上。C语言提供data、idata、pdata、xdata、和code等存储器类型,针对单片机的内部数据存储空间、外部数据存储空间和程序空间自动为变量合理地分配空间,而且C语言提供复杂的数据类型,如指针、数组、结构体等,极大地增强了程序的处理能力和灵活性。C语言较汇编语言的不足之处就是使用C语言写出来的代码会比用汇编语言占用的空间大5%20%,所以执行起来效率就不及汇编语言。3.3 设计流程及分析3.3.1 设计整体介绍设计中采用PWM和DAC两种方式驱动电机,利用霍尔效应原理,用计数器T1对脉冲进行计数,用定时器T0计时,计时1秒时间到后停止计数并存储计数值,同时将计数值实时显示在LCD液晶显示屏上。键盘输入定义为外部中断,键盘输入值显示在LCD指定位置,输入操作停止后,系统会自动比较输入值与电机实时转速值,并根据差值进行调速,调速的过程也会显示在LCD上。图3.2为本设计的系统软件模块图。系统初始化系统主程序键盘输入外部中断服务程序定时器T0中断服务程序LCD显示子程序图3.2 系统软件模块图3.3.2 程序流程图3.3.2.1 PWM模块流程图PWM模块程序流程图如图3.3所示。图3.3 PWM模块程序流程图在图3.3中,A、B值在程序中自行设定,A/(A+B)即为占空比。改变A的值,即可改变转速。3.3.2.2 LCD模块流程图由于LCD显示程序里有较多的参数设置,在这里对怎样显示就不做过多的讲述,具体内容请看附录2的程序及3.3.3.1部分的程序解释。图3.4是总体的显示过程。图3.4 LCD显示流程概图3.3.2.3 8279及键盘模块流程图8279命令字:读键盘RAM每次要键入3个数字:S=2,S-键入值左移一位存储最低位读入键入值S0是否3.5 8279及键盘模块流程图3.3.2.4 主程序流程图定义定时器T0、T1并赋初值8279定义8255定义调用子程序lcd_dis,使LCD显示输入字符,并通过8255 A口输入相应的值,对LCD进行软件复位,并启动LCD工作调用子程序lcd_dis,使LCD显示输入字符,并通过8255 A口输入相应的值,对LCD进行显示开启操作,并启动LCD工作逐页逐点清屏d=0;d+依次赋所要显示的字符串的首地址,并调用子程序dis_num,在指定位置上显示字符调用子程序de50ms,延时50ms是d80?否逐页逐点清屏依次赋所要显示的字符串的首地址,并调用子程序dis_num,在指定位置上显示字符开中断结束图3.6 主程序流程图3.3.2.5 片内计数器0(T0)中断服务程序关中断开启计数器T1工作计数器清零调用子程序dis_num()将TL1中的十六进制数转换成十进制数将TL1中的计数值赋给count开启定时器T0工作定时器T0赋初值计时值+0832输入值减小/PWM占空比减小8032输入值增大/PWM占空比增大0832数据口赋初值TL1计数值的十进制数赋值给out计时1s到?输出值键入值?有值键入?是否是否是否图3.7 片内计数器0(T0)中断程序流程图3.3.3 部分子程序分析3.3.3.1 LCD子程序LCD模块的程序较多,其中最主要的子程序dis_num中调用了该系列中的其他子程序,而且变量较多,流程图不便于解释,而其他的子程序均较短,功能单一,也用文字进行的简要的说明即可。下面就对照着附录2中的源程序和2.4节中LCD的相关知识,介绍一下LCD模块中一系列的子程序。 子程序master():向8255控制口写入命令字,使片选信号CS1处于低电平状态,启动主屏工作。 子程序slave():向8255控制口写入命令字,使片选信号CS2处于低电平状态,启动从屏工作。 子程序lcd_dis():向8255控制口写入命令字0x0e,使LCD显示输入字符,然后调用子程序act_cs()。 子程序act_cs():向8255控制口写入命令字,使片选信号CS1、CS2均处于低电平状态,启动LCD工作。 子程序wdat():向8255控制口写入命令字0x0f,使LCD显示数据0。子程序dis_num():在LCD指定的位置上显示指定的字符。具体说明如下:四个参数中,p是指针,用来选择要显示的字符;r用来确定显示的页;loc用来指定起始列;n用来选择显示的屏。设定变量a和b,均赋值为第0页的值0xb8,将a与r相或后作为整体参数调用子程序lcd_dis()。再将指定的起始列号作为参数,调用子程序lcd_dis()。指定要显示的字符串首地址,将字符串里的内容依次作为参数,调用wdat(),再根据是在主屏还是在从屏上显示来选择调用master()还是slave()。再将b与(r+1)相或,其他步骤与a与r相或及之后的步骤相同。3.3.3.2 PWM子程序本设计中通过P10口输出脉冲,PWM是通过调整占空比来调整电机转速的。在单片机试验箱中可能加了反相器,所以在实验箱中P10=0占的比例越大,电机转速越大。先令P10=0,延时del条语句的时间,再令P10=1,再延时255-del条语句的时间。随着del值的改变,占空比也在不断改变,本设计中,占空比为del/255。4 调试与实验结果4.1 系统测试结果4.1.1 硬件连接在程序编译通过后,将Keil设置成硬件仿真,连接单片机上的串口仿真线。单片机实验箱中开关KC拨上,KF拨至A端,PWM电机驱动输出口P1.0接至PWM端口。若采用计数器计数,则将脉冲输出端口CKMOT接至计数器T1口P3.5;若采用中断计数,则将脉冲输出端口CKMOT接至外部中断0口P3.2。打开单片机电源,进行调试。程序运行时,开始时会有一个时长4秒的提示,若采用PAM方式驱动电机,就将开关K8拨上;若采用DAC方式驱动电机,就将开关K8拨下。4.1.2 测试结果与分析程序中设置的P1.0输出的高低电平时间比为(255-del)/del,在实际测试中发现低电平所占比例越大,电机转速越快,所以本设计中的占空比为del/255。电机转速测量值比预计的值要大,这里的原因主要是程序中语句导致的延时。表4.1 测试数据键盘输入值PWM方式DAC方式显示转速值 转/秒占空比显示转速值 转/秒132131133120119121100991008584867994.1%788078806547.1%646664665028.6%495149512616.5%25272527191820151416测试结果说明:1.在程序中设定del的初值为0,运行程序后通过键盘输入“00A”,使电机持续加速,最终可测得电机最大转速值。DAC方式的最大转速值为134转/秒,PWM方式的最大转速值为80转/秒。2.由于电机转动时会有速度值的波动,所以从键盘输入设定值时,无法达到两种驱动方式的最大值。一旦电机旋转速度超过其最大速度界限,电机就会停转。所以在表4.1中,DAC方式下的最大输入值为132,PWM方式下的最大输入值为79。3.表4.1中的键盘输入值的范围是指能够使电机稳定旋转的值。这里的“稳定”定义为电机的最终转速值在设定值附近有1的波动。另外,在表4.1中也能看出,PWM方式输出的最大转速不如DAC方式,这有两种可能的原因:三极管TIP127的驱动能力不如3DG12A强,或者TIP127已经老化。因为程序语句本身就有一定的延时,再加上用C语言编程,一条C语句在进行编译时能够编译成好几条汇编语句,有的甚至十几条,这样就增加了延时。虽然程序中设定1s显示转速值,但由于语句延时问题的存在,显示的值可能是多于1s的转数,所以转速值有偏大的问题。本设计比较突出的功能就是调速。在28矩阵键盘上输入表中转速范围内的数值(一次输入三个数字),电机的转速会从它的初始转速向输入值靠近,并最终在输入值大小附近波动1。在程序运行过程中可以多次输入转速值,一旦停止输入,程序就会自动比较输入值与转速值的大小,并作调整。4.2 设计心得这个设计的几大模块比较明确,在编写程序时,我选择先编写出每一个模块,让每一个模块实现其基本的功能,然后再逐步合并模块,来实现设计的要求。在编写程序的过程中遇到了一些问题,通过解决这些问题,我也有了一些收获。PWM模块不需要很多的语句去描述,只要理解了它的工作原理,而且要实际测量转速与P10口置1的关系,才能得出正确的调速语句。编写8279键盘/显示器程序时出现的问题就是数字显示问题。开始时数字显示顺序的设置有问题,六位LED均显示数字,但六位显示的数字相同。后来请教了同学,发现数组赋值的顺序颠倒了。开始时我的键盘显示循环语句是:for(s=0;s0;s-) key_ins=key_ins-1; key_in0=data_8279;显示就正确了。这时程序是从最高位开始读数,虽然也是赋值给key_in0,但高位都未被依次赋值,所以显示就正确了。这点是理解出现了偏差,值得注意。LCD模块是这几大模块里最生疏的一块,以前用的都是LED,不会涉及到页、行等的设置。编写LCD模块程序的关键是要看懂它的说明书和命令字,负责很难掌握其显示规则。这一段程序我弄了四天,其实真的静下心来看懂说明书和命令字,很快就写出来了。在汇编语言中,只需要在主程序前定义中断入口。在C语言中,中断函数有它自己的格式,不同的中断号对应不同的中断源。一开始我闹了个很大的笑话,中断号是随便写的,后来调试时中断不起作用,这才发现中断号的作用。在我最初设计的程序中,主函数里有很多不必要的语句。通过查阅资料我了解到,由于主函数肩负着入口和出口的重任,所以最好不要把太多的细节方面的逻辑直接放在主函数内,这样不利于维护和扩展。主函数应该尽量简洁,具体的实现细节应该放到被调用的子函数里面去。指针、数组是C语言的优势所在,但在使用时要注意定义变量的数据类型的范围。例如在附录2的源程序中有一个包含320个元素的数组,在调用数组里的内容时要注意所设变量的取值范围。例如,程序中用来作为显示模块变量的u、v、w,它们的数据类型就要定义为unsigned int(无符号整型),其值域范围是065535。开始时我全都设置成了unsigned char(无符号字符型),其值域范围是0到255,调用数组元素进行显示时需要用u、v、w乘以32。当需要显示的数字是8和9时,832与932的值都超过了255,这时8和9就分别显示为0和1。在调试程序时我一直不明白转速值为什么速度值总有一个跳变,后来发现在整个变速过程中,LCD上一直没有出现过8和9,所以才发现了这个问题。在最后的程序组合中,要注意各模块放置的位置。由于有1秒的定时,计数的停止、转速值的显示、转速的调整等都要以计时为1秒为前提。在根据设定值调速那部分程序里,比较输入值和输出值的大小后,del的加减量可以自定,不一

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论