用ARM控制直流电动机并测量转速.docx
《用ARM控制直流电动机并测量转速.docx》由会员分享,可在线阅读,更多相关《用ARM控制直流电动机并测量转速.docx(20页珍藏版)》请在冰豆网上搜索。
用ARM控制直流电动机并测量转速
基于ARM的实验报告
——用ARM控制直流电动机并测量转速
ARM技术的发展
ARM公司的IP核已经由ARM7,ARM9发展到今天的ARM11版本。
ARM11囊括了Thumb-2,CoreSight,TrusZone等众多业界领先技术,同时由单一的处理器内核向多核发展,为高端的嵌入式应用提供了强大的处理平台。
高集成度SOC芯片的采用可以带来一系列好处,诸如减少了外围器件和PCB面积,提高系统抗干扰能力,缩小产品体积,降低功耗等。
ARM公司是一家IP供应商,其核心业务是IP核以及相关工具的开发和设计。
半导体厂商通过购买ARM公司的IP授权来生产自己的微处理器芯片。
由此以来,处理器内核来自ARM公司、各芯片厂商结合自身已有的技术优势以及芯片的市场定位等因数使芯片设计最优化,从而产生了一大批高度集成、各据特色的SOC芯片。
例如Intel公司的XScale系列集成了LCD控制器、音频编/解码器,定位于智能PDA市场;Atmel公司的AT91系列片内集成了大容量Flash和RAM、高精度A/D转换器以及大量可编程I/O端口,特别适合于工业控制领域;Philips公司的LPC2000系列片内集成了128位宽的零等待Flash存储器以及I2C, SPI,PWM,UART等传统接口,极高的性价比使它对传统的8/16位MCU提出了严峻的挑战。
本次设计仍使用的ARM7系列。
ARM的广泛应用
ARM微处理器及技术的应用几乎已经深入到各个领域:
1、工业控制领域:
作为32的RISC架构,基于ARM核的微控制器芯片不但占据了高端微控制器市场的大部分市场份额,同时也逐渐向低端微控制器应用领域扩ARM微控制器的低功耗、高性价比,向传统的8位/16位微控制器提出了挑战。
2、无线通讯领域:
目前已有超过85%的无线通讯设备采用了ARM技术,ARM以其高性能和低成本,在该领域的地位日益巩固。
3、网络应用:
随着宽带技术的推广,采用ARM技术的ADSL芯片正逐步获得竞争优势。
此外,ARM在语音及视频处理上行了优化,并获得广泛支持,也对DSP的应用领域提出了挑战。
4、消费类电子产品:
ARM技术在目前流行的数字音频播放器、数字机顶盒和游戏机中得到广泛采用。
5、成像和安全产品:
现在流行的数码相机和打印机中绝大部分采用ARM技术。
手机中的32位SIM智能卡也采用了ARM技术。
除此以外,ARM微处理器及技术还应用到许多不同的领域,并会在将来取得更加广泛的应用。
本课题研究目的及意义
直流电动机是最早出现的电动机,也是最早实现调速的电动机。
长期以来,直流电动机一直占据着调速控制的统治地位。
由于它具有良好的线性调速特性,简单的控制性能,高效率,优异的动态特性,现在仍是大多数调速控制电动机的最优选择。
因此研究直流电机的速度控制,有着非常重要的意义。
随着ARM的发展,数字化直流PWM调速系统在工业上得到了广泛的应用,控制方法也日益成熟。
它对ARM的要求是:
具有足够快的速度;有PWM口,用于自动产生PWM波;有捕捉功能,用于测频;有A/D转换器、用来对电动机的输出转速、输出电压和电流的模拟量进行模/数转换。
通过设计基于ARM的嵌入式直流电机调速系统并调试得出结论,在掌握LPC2124和L298的同时进一步加深对直流电动机调速方法的理解,对运动控制的相关知识进行巩固。
用ARM控制直流电动机并测量转速系统方案
硬件设计
本次的设计内容是基于ARM7控制直流电机并测量转速。
以EasyARM2124单片机为主控制芯片,由LM298芯片控制直流电机转动;进行测速并用四位一体的共阴极数码管显示直流电机转速。
系统硬件总体设计框图如所示:
系统硬件原理图
显示模块
此实验显示模块采用的是四个共阴数码管,数码管是一种半导体发光器件,其基本单元是发光二极管。
数码管的分类
数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。
共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。
共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。
当某一字段的阴极为高电平时,相应字段就不亮。
。
共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。
共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。
当某一字段的阳极为低电平时,相应字段就不亮。
数码管的驱动方式
数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。
①静态显示驱动:
静态驱动也称直流驱动。
静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。
静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个呢:
),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。
②动态显示驱动:
数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。
通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。
在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
数码管参数
8字高度:
8字上沿与下沿的距离。
比外型高度小。
通常用英寸来表示。
范围一般为0.25-20英寸。
长*宽*高:
长——数码管正放时,水平方向的长度;宽——数码管正放时,垂直方向上的长度;高——数码管的厚度。
时钟点:
四位数码管中,第二位8与第三位8字中间的二个点。
一般用于显示时钟中的秒。
数码管应用
数码管是一类显示屏通过对其不同的管脚输入相对的电流会使其发亮从而显示出数字可以显示时间日期温度等索用可以用数字代替的参数由于它的价格便宜使用简单在电器特别是家电领域应用极为广泛空调热水器冰箱等等绝大多数热水器用的都是数码管其他家电也用液晶屏与荧光屏数码。
实习心得:
xx的心得:
短短一周的实习在不知不觉中就过去了,这段时间的实习中遇到了很多问题,在实习中才知道实习和平时学习有很大的不一样,硬件由于是实验室就有的所以没有什么太大的问题,在编程的时候遇到了很大的麻烦由于平时很少编程序所以在这次实习的时候很多问题都让人束手无策,所幸的是在同学和老师的帮助下让我学会了不少东西,比如:
2124管脚的设置,电路图的绘制等。
让我认识到了自己很多的不足之处。
经过此次的实习让我对与课本的认识更加深刻。
在此非常感谢老师的指导和同学们的帮助,在今后的学习中我会更加团结友爱,努力学习,争取在以后的实习中做的更好。
xx的心得:
在本次课程设计,通过使用ARM实现控制直流电机并猜测转速的完成,不仅令我对课本上所学的知识有了更加深刻的理解,而且也从设计过程中更加清楚了所学知识如何运用,同时,知道了ARM与以前知识如何结合,从而达到设计的效果,扩宽了知识面,为以后的各项试验打下基础。
在这次的课程设计中,我们遇到了很多的难题。
首先,在我们确定的所做试验的名称以后我们就要开始考虑如何去完成这个试验,我们小组成员分工合作,查找资料,在从中提取出对我们又用的知识进行整合,加上我们已有的知识,确定了我们试验的总方向。
其次,在软件编程方面我们也遇到了比较大的阻碍。
由于编程使我们小组成员的弱项,所以在这方面我们投入的精力比较大,查资料,问指导老师,而且经过不断的修改,程序最终可以正常运行。
最终,经过多次努力,多方查阅资料,虽然不能够按照设计要求仿真使系统稳定运行,但理论上是可以达到的,系统所涉及到的各方面知识也在这次设计中得到了及时的巩固,对曾经不太熟悉的东西也得到了弥补,这也是我个人以为本次设计意义所在。
从这次试验中我学到了很多东西,对以后的学习或者类似的试验中都很有用处,例如:
计划是很重要的,没有一个完好的计划,做事情就会没有一个好的顺序,做事情会比较乱,很难成功。
而有一个好的计划,不管做什么事都会事半功倍,做事心中有数,明确重点和缓急,不会有疏漏。
这样才能提高成功率。
要注意细节。
细节决定成败,这句话在这次课题中不仅一次得到了印证,特别是在软件的编程过程中,一点点的错误就会使你整个程序不能运行。
因此我们不仅仅要有整体意识,也要注意细节,不要因一个关键地方的一个细节而导致满盘皆输。
团队合作很重要。
团队做一件事时,要发挥出门一个人的长处。
人无完人,但一个团队可以互相帮助,互相补充,只要互相合作,个人完成各自专长的,离成功就只有一步之遥。
人人总是有疏漏的方面,但是只要互相合作,互相交流,就会考虑问题更全面化,在本次课题中,我们组团结合作不仅事半功倍,而且发现了一些好的有趣的构想,是我们对ARM这门课有了更浓的兴趣。
xx心得:
通过这次课程设计,我对课本上的知识有了更加深入的了解,通过实践操作使我加深了对理论知识的理解。
在此次课程设计中,我收获了喜悦也遭受过挫折。
尤其是在硬件设计上,由于一心想有仿真结果,所以开始的时候有些浮躁,尤其是电路不按预期目标运行时感觉稍稍受挫,但好奇心还是促使我继续努力,一次次做下去,但当经过各种努力后,还是无法使其运行于可控范围内,受挫感的确很强,不过当稍有进展,或者运行结果正确的情况下,心中也是非常高兴的。
最终,经过多次努力,多方查阅资料,虽然不能够按照设计要求仿真使系统稳定运行,但理论上是可以达到的,系统所涉及到的各方面知识也在这次设计中得到了及时的巩固,对曾经不太熟悉的东西也得到了弥补,这也是我个人以为本次设计意义所在。
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。
此次课程设计,我仍感慨颇多,的确,从选题到定稿,从理论到实践,在这些日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
这次课程设计终于顺利完成了,在设计中遇到了很多问,但被我们一一解决。
看着自己这些天的辛苦有了回报,感觉很踏实。
以后会更加努力!
1:
时钟电路与复位电路如图所示:
2:
直流电机调速系统Proteus仿真电路如图所示:
Proteus仿真电路图
系统采用24MHz晶振提供外部时钟,LPC2124的P0.6,P0.7输出高低电平控制电机转速方向;四个二极管作为续流二极管,起保护作用;四个按键通过上拉电阻与LPC通用端口相连,按键按下,低电平有效,另外通过一个四输入与门与外部中断EINT0相连,通过外部中断方式判断是否有按键按下,四个按键分别实现电机加速、减速、反转、制动的功能。
系统采用PWM方法调整电动机的速度,首先应确定合理的脉冲频率。
脉冲宽度一定时,频率对电机运行的平稳性有较大影响,脉冲频率高电动机运行的连续性好,但带负载能力差;脉冲频率低则反之。
调脉宽的方式有三种:
定频调宽、定宽调频和调宽调频。
我们采用了定频调宽方式,因为采用这种方式,电动机在运转时比较稳定;并且在采用LPC2124产生PWM脉冲的软件实现上比较方便。
PWM输出频率采用系统时钟频率,通过转速调节器调节PWM占空比,实现直流电机的调速驱动。
PWM初始化子程序流程如图所示。
PWM初始化流程图
3:
测速模块
本系统采用T法测速,旋转编码器输出的脉冲由LPC2124的P0.28捕获,电机每转一圈旋转编码器输出60个脉冲,每捕获一个编码器输出脉冲,则进入中断读取定时器的值,计算测速时间.
T法测速原理图
定时器0初始化流程图如图所示。
定时器0初始化流程图
4:
直流电机调速系统Proteus仿真结果
本系统采用简单的按键操作,实现电机的加速、减速、制动、反转功能,由于时间仓促,在判断按键过程,我们只考虑了只有一个按键按下的情况。
本系统各按键的共能如下
1加速键用于电机加速,每按一次电机转速增加10r/min。
2减速键用于电机减速,每按一次电机转速减小10r/min。
3制动键用于电机制动,停止电机旋转。
4反转键用于电机反转,每按一次电机反转。
按键仿真图如图所示。
按键仿真图
当连接好仿真图和载入LPC2124的执行文件后,单击Proteus的仿真启动按钮,则开始对本系统的仿真。
其运行流程如下:
(1)按20次加速键让电机启动正转,达到200r/min,所需时间大致在1.3s左右,如图所示。
加速正转
(2)按一次减速键,电机转速减小10r/min,到达190r/min,如图所示。
减速
(3)按一次反转按键,电机反转,到达-190r/min,如图所示。
反转
(4)按一次制动键,电机制动,转速较大时,电机可以快速制动到接近零,之后缓慢减速,如图所示。
制动
经过仿真调试,发现系统可以实现基本的调速功能,并且可以较快速地启动,系统具有较好的稳定性,误差范围在。
直流电机调速系统软件设计流程图
直流电机调速系统软件设计流程图如图1所示,中断程序如图2图3所示。
图1调速系统软件图2按键中断图3测速中断
设流程图程序流程图程序流程图
源程序:
*File:
Main.c
*功能:
使用PWM6输出PWM信号,通过KEY1,KEY2,KEY3控制电机转速,KEY1按一次加速10r/min,KEY2按一下减速10r/min,KEY3按一下制动,KEY4按一下反转
******************************************************************************/
#include"LPC21xx.h"
typedefunsignedintuint32;
typedefintint32;
#definepwmdata240000/*PWM周期*/
#definef01000000/*计数器频率*/
#defineZ60/*电机每转一圈产生Z个脉冲*/
#definekp0.1/*PI调节器比例系数*/
#defineki0/*PI调节器积分系数*/
#defineKEY0x0b800000/*P0.23,P0.24,P0.25,P0.27引脚连有按键*/
#defineKEY10x00800000/*P0.23引脚连接KEY1*/
#defineKEY20x01000000/*P0.24引脚连接KEY2*/
#defineKEY30x02000000/*P0.25引脚连接KEY3*/
#defineKEY40x08000000/*P0.27引脚连接KEY4*/
uint32t1=0,t2=0,i=0;
uint32flag=0;/*制动标志,flag=1转速接近0*/
uint32fv=0;/*正反转标志,fv=0正转,fv=1反转*/
int32nu=0,n=0;/*nu给定转速,n检测转速*/
__irqvoidIRQ_T0(void)
{
t2=T0CR2;//读取捕获寄存器
T0CR2=0;//捕获寄存器清零
if(t1elseif(t1>t2)n=1.236*60*f0/(Z*(t2-t1+f0));//1.236为修正系数
t1=t2;
T0IR=0x40;//清除捕捉0中断标志(向6位写1)
VICVectAddr=0x00;//中断结束
}
__irqvoidIRQ_EINT0(void)
{
uint32i;
IOCLR0=0x00000001;
for(i=0;i<50;i++);//延时去抖
if((IOPIN0&KEY)!
=KEY)
if((IOPIN0&KEY1)==0)//KEY1按键按下,加速
{
flag=0;
if(nu>=0)nu+=10;
elsenu-=10;
}
elseif((IOPIN0&KEY2)==0)//KEY2按键按下,减速
{
if(nu>10)nu-=10;
elseif(nu<-10)nu+=10;
elsenu=0;
}
elseif((IOPIN0&KEY3)==0){nu=0;}//KEY3按键按下,制动
elseif((IOPIN0&KEY4)==0)//KEY4按键按下,反转
{
if(fv==0)fv=1;
elsefv=0;
nu=-nu;
}
while((IOPIN0&KEY)!
=KEY);//等待按键放开
EXTINT=0x01;//清楚EINT0中断标志
VICVectAddr=0x00;//中断结束
}
voidTargetInit(void)
{
/*管脚配置初始化*/
PINSEL0=0x00080000;//设置PWM6连接到P0.9引脚
PINSEL1=0x02000000;//P0.28捕捉
IODIR0=0x000002c0;//P0.6,P0.7,P0.9输出
/*PWM初始化*/
PWMPR=0x00;//不分频,计数频率为Fpclk
PWMMCR=0x02;//设置PWMMR0匹配时复位PWMTC
PWMMR0=pwmdata;//设置PWM周期
PWMMR6=120000;//设置PWM占空比
PWMLER=0x40;//PWMMR6锁存
PWMPCR=0x4000;//允许PWM6输出,单边PWM
PWMTCR=0x09;//启动定时器,PWM使能
/*EINT0中断初始化*/
PINSEL1=(PINSEL1&0xfffffffc)|0x01;//选择P0.16为EINT0
EXTMODE=EXTMODE&0x0e;//电平触发
EXTPOLAR=EXTPOLAR&0x0e;//低电平中断
/*定时器0初始化*/
T0TC=0;//清除T0计数值
T0PR=23;//24分频(24MHZ分频后变成1MHZ)
T0MR0=1000000;//计数匹配值
T0CCR=0x0140;//第七位写1进入捕捉模式(上升沿捕捉,进入中断)
T0MCR=0x00000002;//匹配后复位T0(不停止)
T0TCR=0x00000002;//复位计数器
T0TCR=0x00000001;//计数器使能
/*中断向量初始化*/
VICIntSelect=0x00000000;//中断向量寄存器选择0,IRQ中断
VICVectCntl0=0x20|4;//定时器0中断分配为向量IRQ通道0
VICVectAddr0=(uint32)IRQ_T0;//向量IRQ通道0的中断服务程序地址为IRQ_T0
VICVectCntl1=0x20|14;//EINT0中断分配为向量IRQ通道1
VICVectAddr1=(uint32)IRQ_EINT0;//向量IRQ通道1的中断服务程序地址为IRQ_EINT0
VICIntEnable=(1<<4)|(1<<14);//定时器0和EINT0中断使能
EXTINT=0x07;//清楚外部中断标志
}
/******************************************************************************
*名称:
main()
*功能:
使用PWM6输出占空比可调的PWM波形,控制直流电机
******************************************************************************/
intmain(void)
{
floatPI=0,sum=0;
int32es=0;
TargetInit();
while
(1)
{
if(nu==0)//制动
if(fv==0)//如果正转
if(n>50)PI=-0.8;
elseif(n>20)PI=-0.5;
elseif(n>10)PI=-0.3;
elseif(n>3)PI=-0.1;
else{PI=0;flag=1;}
else//如果反转
if(n>50)PI=0.8;
elseif(n>20)PI=0.5;
elseif(n>10)PI=0.3;
elseif(n>3)PI=0.1;
else{PI=0;flag=1;}
else
{
if(nu>0)es=nu-n;
elsees=nu+n;
sum=sum+es;
PI=kp*es+ki*sum;
if(PI>0.8)PI=0.8;//过饱和保护
if(PI<-0.8)PI=-0.8;
}
if(flag==1)
{IOSET0=0x000000c0;}
else
if(PI>0)
{
IOSET0=0x00000040;//设置P0.6高电平,P0.7低电平
IOCLR0=0x00000080;//正转
PWMMR0=pwmdata;
PWMMR6=pwmdata*PI;//设置PWM占空比
PWMLER=0x40;//PWMMR6锁存,更新PWM占空比
}
elseif(PI<0)
{
IOCLR0=0x00000040;//设置P0.6低电平,P0.7高电平
IOSET0=0x0000