《基于ARM的步进电机控制课程设计(共19页).doc》由会员分享,可在线阅读,更多相关《基于ARM的步进电机控制课程设计(共19页).doc(19页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上ARM课程设计 专 业: 电子信息工程 班 级: 姓 名: 学 号: 指导教师: 目录基于ARM的步进电机控制一、设计的目的与要求1.1 设计目的(1)本次课程设计是在学习了深入浅出ARM7LPC213X/214X课程之后综合利用所学知识完成一个计算机应用系统设计并在实验室实现。(2)通过课程设计,巩固和加深了对“微机原理与接口技术”课程中所学的理论知识和实验能力,基本掌握计算机接口应用电路的一般设计方法,提高电子电路的设计和实验能力。(3)加深对计算机软硬知识的理解,获得初步的应用经验,为以后从事生产和科研工作打下一定的基础。1.2 设计要求(1) 设计一个步进电机
2、的控制系统。(2) 用LPC2134+L298+L297使用中断方式以及串口方式进行控制。(3) 可通过按键设定转速和方向。二、方案的设计与论证 2.1 设计分析步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。本次课程设计所设计的步进电机的控制系统可通过键盘设定转速和方向,并能显示转速。 2.2 方案论证 方案一:采用ARM7的脉宽调制器PWM产生脉冲对步进电机进行控制。 方案二:利用定时器定时中断进行步进电机的控制。 2.3 方案选择 第一种方案中PWM技术是采
3、用脉宽调制技术,即占空比不同的方波电压产生不同的平均电流使步进电机转动,通过调节占空比即可调节电机转速。虽然很精确,但设置较繁琐。 第二种方案中采用定时器定时中断的方式,只需要几条简单的指令就可以产生具有一定频率和数目的脉冲信号,而且在整个脉冲产生过程中,CPU 可用来处理其他工作,大大提高了系统的实时处理能力。 考虑到系统的实时性及程序的繁简程度我选择了第二种方案。三、结构和基本原理 3.1 ARM最小系统(1)PHILIPS单片32位ARM微控制器LPC2134 LPC2131/2132/2134/2136/2138微控制器是基于一个支持实时仿真和嵌入式跟踪的16/32位ARM7TDMI-
4、S CPU,并带有32kB、64kB、128kB、256kB和512kB嵌入的高速Flash存储器。128位宽度的存储器接口和独特的加速结构使32位代码能够在最大时钟速率下运行。对代码规模有严格控制的应用可使用16位Thumb模式将代码规模降低超过30%,而性能的损失却很小。 特性 16/32位ARM7TDMI-S核,超小LQFP64封装。 8/16/32kB的片内静态RAM和32/64/128/256/512kB的片内Flash程序存储器。128位宽度接口/加速器可实现高达60MHz工作频率。 通过片内boot装载程序实现在系统编程/在应用编程(ISP/IAP)。单个Flash扇区或整片擦除
5、时间为400ms。256字节行编程时间为1ms。 EmbeddedICE RT和嵌入式跟踪接口通过片内RealMonitor软件对代码进行实时调试和高速跟踪。 1个(LPC2131/32)或2个(LPC2134/36/38)8路10位的A/D转换器,共提供16路模拟输入,每个通道的转换时间低至2.44us。 1个10位的D/A转换器,可产生不同的模拟输出。(LPC2132/34/36/38) 2个32位定时器/外部事件计数器(带4路捕获和4路比较通道)、PWM单元(6路输出)和看门狗。 低功耗实时时钟具有独立的电源和特定的32kHz时钟输入。 多个串行接口,包括2个16C550工业标准UART
6、、2个高速I2C总线(400 kbit/s)、SPI和具有缓冲作用和数据长度可变功能的SSP。 向量中断控制器。可配置优先级和向量地址。 小型的LQFP64封装上包含多达47个通用I/O口(可承受5V电压)。 多达9个边沿或电平触发的外部中断管脚。 通过片内PLL(100us的设置时间)可实现最大为60MHz的 CPU操作频率。 片内集成振荡器与外部晶体的操作频率范围为130 MHz,与外部振荡器的操作频率范围高达50MHz。 低功耗模式:空闲和掉电。 可通过个别使能/禁止外部功能和外围时钟分频来优化功耗。 通过外部中断或BOD将处理器从掉电模式中唤醒。 单电源,具有上电复位(POR)和掉电检
7、测(BOD)电路:CPU操作电压范围:3.03.6 V (3.3 V10%),I/O口可承受5V的电压。 图1 LPC2134内部方框图 (2)原理图:图 2 ARM最小系统 3.2 按键电路 图 3 按键的连接图不按下时为高电平,按下时变为低电平。 3.3 步进电机驱动电路 在步进电机驱动电路中我们用的是L298+L297控制步进电机。(1)L297的工作原理介绍 L297是意大利SGS半导体公司生产的步进电机专用控制器,它能产生4相控制信号,可用于计算机控制的两相双极和四相单相步进电机,能够用单四拍、双四拍、四相八拍方式控制步进电机。芯片内的PWM斩波器电路可开关模式下调节步进电机绕组中的
8、电机绕组中的电流。该集成电路采用了SGS公司的模拟/数字兼容的I2L技术,使用5V的电源电压,全部信号的连接都与TFL/CMOS或集电极开路的晶体管兼容。L297的芯片引脚特别紧凑,采用双列直插20脚塑封封装,其引脚见图3。 图4 L297引脚图 (2) L298简介: L298N 为SGS-THOMSON Microelectronics 所出产的双全桥步进电机专用驱动芯片( Dual Full-Bridge Driver ) ,内部包含4信道逻辑驱动电路,是一种二相 和四相步进电机的专用驱动器,可同时驱动2个二相或1个四相步进电机,内含二个H-Bridge 的高电压、大电流双全桥式驱动器,
9、接收标准 TTL逻辑准位信号,可驱动46V、2A以下的步进电机,且可以直接透过电源来调节输出电压;此芯片可直接由单片机的IO端口来提供模拟时序信号, 但在本驱动电路中用L297来提供时序信号,节省了单片机IO 端口的使用。L298N 之接脚如图4所示,Pin1 和Pin15 可与电流侦测用电阻连 接来控制负载的电路; OUTl、OUT2 和OUT3、OUT4 之间分别接2 个步进电机;input1input4 输入控制电位来控制电机的正反转;Enable 则控制电机停转。 图 5 L298引脚图(3) L298+L297组成的步进电机驱动电路如图5所示 图 6 步进电机驱动电路 3.4 虚拟终
10、端输入部分电路 图 7 虚拟终端输入3.5 总原理图 图 8 总原理图3.5 器件连接 (1)在EasyARM2138开发板上,当跳线JP6分别选择TXD0和RXD0端时方可进行UART0通信实验。(2)KEY1连接P0.16;KEY2连接P0.17;KEY3连接P0.18, KEY4连接P0.19, KEY5连接P0.20,KEY6连接P0.21。(3)步进电机的四个输入端口分别接EasyARM2138开发板上P2.2P2.5四个端口。四、软件设计系统软件采用C语言编程,程序详情请参见附录。程序的流程图如下: 开始初始化参数:设置SPI管脚连接,P0.30连接到AD0.3,P125:16连接
11、GPIO,设置bjdj_qd控制口为输出,初始化SPI,IRQ中断使能,定时器0初始化,启动定时器,设置并启动定时器0中断IRQ 。步进电机进入最近一次设定的模式(初始时为模式0)是否有按键按下否进入模式0:八拍正转。在数码管上显示0,同时在上位机上显示转速。是KEY按 下?是进入模式1:八拍反转。在数码管上显示1,同时在上位机上显示转速。KEY2按 下?否是进入模式2:双四拍正转。在数码管上显示2,同时在上位机上显示转速。KEY3按 下?否 是KEY按下?否进入模式3:双四拍反转。在数码管上显示3,同时在上位机上显示转速。 是否进行减速。在数码管上显示5,同时在上位机上显示转速。KEY5按
12、下? 是 否进行加速。在数码管上显示6,同时在上位机上显示转速。KEY6按 下?是 五、调试在proture软件中运行程序,开始调试。在一开始的时候,由于用定时器设置的中断时间太长导致看不见电机有明显的转动。通过修改定时时间,渐渐地电机转动变得明显了。然后测试按键功能时发现,案件的检测不够灵敏,有时候需要按几下才能检测到,后来经过修改延时消抖的时间,将其变短且在每次按下按键时不急于松开而保持一会儿,这样按键检测变得较为灵敏了。在调试中发现:单双八拍和双四拍要比单四拍的转动更加有效。单四拍模式的时候电机只是震动并没有转动,用肉眼观察不到转速的快慢,故最后舍弃了这种模式。调试的最终结果是:程序开始
13、时电机进入模式0,如果没有按键按下则一直保持模式0。当有按键按下时,且按键为KEY1KEY4则电机根据不同按键的按下进入不同的转动模式(KEY1对应模式0:八拍正转,KEY2对应模式1:八拍反转,KEY3对应模式2:双四拍正转,KEY4对应模式3:双四拍反转)。当按键KEY5按下时,电机转速变慢,且随着KEY5按下次数的增多电机逐渐变慢直至停止;当按键KEY6按下时,电机转速变快,且随着KEY5按下次数的增多电机逐渐变快。同时在上位机上可以看见当前的转速。六、课程设计体会一方面,通过这一周的课程设计,我对课本上关于LPC2134的硬件结构的知识有了更加深刻的理解,而且对其用法掌握得更加熟练。在
14、课程设计过程中,能够不断地发现问题,并想办法解决,如此提高了我自己解决问题的能力。在编写程序方面,我对ARM7编程结构和技巧也有了深刻的理解和领会。此次课程设计还让我知道什么是实时系统以及如何构建一个简单的实时系统。现在我已经基本掌握了构建实时系统的方法。还有我明白了流程图的重要性,以前在编程的时候,我从不写流程图,直接开始写程序,这样出现了不该出现的问题。但这次课程设计时,我试着先写出流程图然后按照流程图编写程序,结果错误少了很多,即使有错误只要根据流程图一查就知道错在哪里,这让我节省了大量的时间和精力。所以我认识到,以后要编写程序时,先写流程图是很有必要的。另一方面,我感觉这一周的课程设计
15、我自己的效率太低。有时候被一些问题困惑了很久,但经过老师的指点,我才恍然大悟,原来只要换个方式思考问题就能想到很好的方法。七、参考文献1 周立功.深入浅出ARM7LPC213X/214X(上册)M.北京:北京航空航天大学出版社,2008:146-175,226-240,275-286.2 周立功.ARM嵌入式系统实验教程(三)M.北京:北京航空航天大学出版社,2005:134-140.3 冷洪滨,邬义杰.基于计数器/定时器的步进电机可编程控制接口电路设计J北京:组合机床与自动化加工技术,2004.4 周明德.微型计算机硬件软件及其应用.北京:清华大学出版社 ,1993.附录:程序#includ
16、e config.hint DelayTime=60;/延时参数typedef struct UartModeuint8 datab;/字长度,5/6/7/8可选uint8 stopb;/停止位,1/2可选uint8 parity;/奇偶校验位,0:无校验;1:奇检验;2:偶检验UARTMODE;uint8 rcv_buf;/UART0数据接收缓冲区uint8 rcv_new;/接收数据标志/延时函数原型声明void delay(int dly);/工作模式设置函数原型声明void SetWorkMode(char WorkMode);/中断服务程序原型声明void _irq IRQ_Eint
17、0(void);void _irq IRQ_Eint1(void);void _irq IRQ_Eint2(void);void _irq IRQ_Eint3(void);/中断初始化函数void Int_Init(void);/串口0接收中断服务程序void _irq IRQ_UART0(void);/串口0数据发送函数void UART0_SendByte(uint8 dat);/串口0初始化函数uint8 UART0_Init(uint32 baud, UARTMODE set);/*/主函数int main (void)UARTMODE set;set.datab=8;/设置字长度为8
18、位set.stopb=1;/设置停止位为1位set.parity=0;/设置检验方式为无校验rcv_new=0;/接收数据标志初始化/配置引脚功能PINSEL0=0x0005c0c5; PINSEL1=0x;IO0DIR=0x0321;/设P0.21-P0.22为输出UART0_Init(9600, set);/串口初始化U0FCR=0x01;/使能FIFO,并设置触发点为1字节U0IER=0x01;/允许RBR中断,即接收中断Int_Init();/中断初始化(外部中断、串口中断)while(1)if(rcv_new=1)rcv_new=0;SetWorkMode(rcv_buf);/根据输
19、入的控制信号改变步进电机的工作模式UART0_SendByte(rcv_buf);/把键盘输入发回虚拟终端回显/模拟脉冲信号驱动步进电机转动IO0SET=0x0122;delay(DelayTime);IO0CLR=0x0122;delay(DelayTime); return 0;/*/延时函数void delay(int dly)int i,j;for(i=0; idly; i+)for(j=0; j1200; j+);/*/工作模式设置函数void SetWorkMode(char WorkMode)/WorkMode:控制信号 /+:加速-:减速:顺时针switch(WorkMode)
20、case +:if(DelayTime20)DelayTime=DelayTime-20;/减少延时,即加速break;case -:if(DelayTime100)DelayTime=DelayTime+20;/增加延时,即减速break;case :IO0CLR=0x01:IO0SET=0x0121;/设置的步进电机的运转方向为顺时针break;default :break;/*/外部中断0服务程序void _irq IRQ_Eint0(void)IO0CLR=0x0121;/设置的步进电机的运转方向为逆时针while(EXTINT&0x01)!=0)EXTINT=0x01;/清除中断标志
21、VICVectAddr=0;/*/外部中断1服务程序void _irq IRQ_Eint1(void)IO0SET=0x0120)DelayTime=DelayTime-5;/减少延时,即加速while(EXTINT&0x04)!=0)EXTINT=0x04;/清除中断标志VICVectAddr=0;/*/外部中断3服务程序void _irq IRQ_Eint3(void)if(DelayTime100)DelayTime=DelayTime+5;/增加延时,即减速while(EXTINT&0x08)!=0)EXTINT=0x08;/清除中断标志VICVectAddr=0;/*/中断初始化函数
22、void Int_Init(void)EXTMODE=0x00;/设置外部中断为电平触发IRQEnable();/使能IRQ中断VICIntSelect=0x;/设置所有分配为IRQ中断VICVectCntl4=0x20|0x0e;/分配外部中断4到向量中断0VICVectCntl1=0x20|0x0f;/分配外部中断1到向量中断0VICVectCntl2=0x20|0x10;/分配外部中断2到向量中断0VICVectCntl3=0x20|0x11;/分配外部中断3到向量中断0VICVectCntl0=0x20|0x06;/分配Uart0中断到向量中断0/设置中断服务程序地址VICVectAd
23、dr4=(uint32)IRQ_Eint0;VICVectAddr1=(uint32)IRQ_Eint1;VICVectAddr2=(uint32)IRQ_Eint2;VICVectAddr3=(uint32)IRQ_Eint3;VICVectAddr0=(uint32)IRQ_UART0;EXTINT=0x0f;/清除所有外部中断标志VICIntEnable=(10x0e)|(10x0f)|(10x10)|(10x11)|(1)return(0);if(set.datab8)return(0);if(set.stopb=0)|(set.stopb2)return(0);if(set.parity4)return(0);/设置串口的波特率U0LCR=0x80;/DLAB=1bak=(Fpclk4)/baud;U0DLM=bak8;U0DLL=bak&0xff;/设置串口模式bak=set.datab-5;/设置字长if(set.stopb=2)bak|=0x04;/判断是否为2位停止位if(set.parity!=0)set.parity=set.parity-1;bak|=0x08;bak|=set.parity4;/设置奇偶校验U0LCR=bak;return(1);专心-专注-专业
限制150内