《ARM课程设计报告(共17页).doc》由会员分享,可在线阅读,更多相关《ARM课程设计报告(共17页).doc(17页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上物理与机电学院课程设计报告 课程名称: ARM课程设计 系 部: 物理与机电工程学院 完成时间: 2010年5月17日22日 报告成绩: 评阅意见: 评阅教师 日期 【摘要】在前一段时间我学习了32位嵌入式单片机ARM7的相关知识,初步地掌握了其各种功能部件的用法。在这次课程设计中,我利用ARM7进行简单的系统设计,设计了一个步进电机的控制系统,步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。本次课程设计设计的步进电机的控制系统可通过键盘
2、设定转速和方向,并能显示转速。设计过程步骤如下: 一、方案的选择、分析和设计:从老师所给的参考选题中选取一个自己感兴趣的题目。根据设计任务和要求,分析所要设计的系统应实现的功能,并将总体功能分解成若干个单元功能。在编写程序前,先采用定时器中断构建一个基本的实时系统,该实时系统具有按键输入和输出显示(通过UART0将需要显示的内容发送到上微机上显示)的功能,然后再往这个实时系统中逐个添加各单元功能,最后形成所要设计的整个系统。二、程序的编写:首先根据步骤一中的分析和设计画好程序的流程图和实时系统的时序图,然后按照程序流程图及实时系统的时序图进行程序的编写。三、程序的调试:对编写好的程序需要进行反
3、复的调试。调试分为软件调试和硬件调试。软件调试的主要目的在于检查程序的语法错误及逻辑错误等;软件调试通过后即可进行硬件调试,将程序下载到LPC2138芯片中同时配合外部电路进行系统功能测试。直至正确地实现系统功能。 【关键词】ARM7、步进电机控制系统、定时器、中断、按键、UART0、上微机软件EasyARM、实时系统LPC2138芯片、调试。目 录1.设计目的与要求 41.1设计目的 4 1.2设计要求 4 2.方案设计与论证 4 2.1设计分析 4 2.2方案论证4 2.3方案选择43. 硬件电路 4 3.1硬件结构4 3.2器件连接说明 74.软件设计75调试 96.结论与心得97.参考
4、文献9附录 程序 101、设计的目的与要求1.1 设计目的(1)本次课程设计是在学习了深入浅出ARM7LPC213X/214X课程之后综合利用所学知识完成一个计算机应用系统设计并在实验室实现。(2)通过课程设计,巩固和加深了对“微机原理与接口技术”课程中所学的理论知识和实验能力,基本掌握计算机接口应用电路的一般设计方法,提高电子电路的设计和实验能力。(3)加深对计算机软硬知识的理解,获得初步的应用经验,为以后从事生产和科研工作打下一定的基础。1.2 设计要求(1)设计一个步进电机的控制系统。(2)可通过键盘设定转速和方向。(3)能够显示当前的转速。2、方案的设计与论证2.1 设计分析步进电机是
5、将电脉冲信号转变为角位移或线位移的开环控制元件。电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。本次课程设计所设计的步进电机的控制系统可通过键盘设定转速和方向,并能显示转速。2.2 方案论证 方案一:采用ARM7的脉宽调制器PWM产生脉冲对步进电机进行控制。 方案二:利用定时器定时中断进行步进电机的控制。2.3 方案选择 第一种方案中PWM技术是采用脉宽调制技术,即占空比不同的方波电压产生不同的平均电流使步进电机转动,通过调节占空比即可调节电机转速。虽然很精确,但设置较繁琐。 第二种方案中采用定时器定时中断的方式,只需要
6、几条简单的指令就可以产生具有一定频率和数目的脉冲信号,而且在整个脉冲产生过程中,CPU 可用来处理其他工作,大大提高了系统的实时处理能力。 考虑到系统的实时性及程序的繁简程度我选择了第二种方案。3、硬件电路3.1 硬件结构 (1)EasyARM2138开发板是广州周立功公司设计的EasyARM系列开发套件之一,采用了PHILIPS公司基于ARM7TDMI-S 核、单电源供电、LQFP64封装的LPC2138,具有JTAG仿真调试、ISP编程等功能。 开发板上提供了一些键盘、LED、蜂鸣器等常用功能部件,还具有RS232接口电路、I2C存储器电路。另外,用户也可以更换兼容的CPU进行仿真调试,如
7、LPC2132、LPC2138、LPC2142等。灵活的跳线组合(开发板内使用的所有I/O均可断开连接),还有用户I/O接口,极大地方便了用户进行32位ARM嵌入式系统的开发实验。 (2) 定时器(3)中断LPC2138 通过向量中断控制器(VIC )管理中断。外设中断信号需要经过2 个开关才能 到达ARM 内核,真正产生异常,逻辑示意图如下图所示。如果在VIC中使能了相应外 设的中断,外设中断才能到达VIC并向内核发送中断请求;只有使能了内核中断IRQ或者 FIQ,内核才能真正产生异常。硬件图如下中断的过程示意图如下:(4)按键的连接图不按下时为高电平,按下时变为低电平。(5) UART0
8、特性:管脚描述:(6) 步进电机接口 由于LPC2138的GPIO驱动能力有限,必须通过ULN2003达林顿集成驱动芯片驱动步进电机,在步进电机和驱动电路间连接了电阻,防止控制紊乱而造成的电机损坏。3.2 器件连接说明(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四个端口。4、软件设计系统软件采用C语
9、言编程,程序详情请参见附录。程序的流程图如下: 开始初始化参数:设置SPI管脚连接,P0.30连接到AD0.3,P125:16连接GPIO,设置bjdj_qd控制口为输出,初始化SPI,IRQ中断使能,定时器0初始化,启动定时器,设置并启动定时器0中断IRQ 。步进电机进入最近一次设定的模式(初始时为模式0)是否有按键按下否进入模式0:八拍正转。在数码管上显示0,同时在上位机上显示转速。是KEY1按 下?是进入模式1:八拍反转。在数码管上显示1,同时在上位机上显示转速。KEY2按 下?否是进入模式2:双四拍正转。在数码管上显示2,同时在上位机上显示转速。KEY3按 下?否 是KEY4按 下?否
10、进入模式3:双四拍反转。在数码管上显示3,同时在上位机上显示转速。 是否进行减速。在数码管上显示5,同时在上位机上显示转速。KEY5按 下? 是 否进行加速。在数码管上显示6,同时在上位机上显示转速。KEY6按 下?是 否 4、调试按照器件连接说明连接好EasyARM2131开发板上的跳线,然后将步进电机与EasyARM2131开发板连接上。运行程序,开始调试。在一开始的时候,由于用定时器设置的中断时间太长导致看不见电机有明显的转动。通过修改定时时间,渐渐地电机转动变得明显了。然后测试按键功能时发现,案件的检测不够灵敏,有时候需要按几下才能检测到,后来经过修改延时消抖的时间,将其变短且在每次按
11、下按键时不急于松开而保持一会儿,这样按键检测变得较为灵敏了。在调试中发现:单双八拍和双四拍要比单四拍的转动更加有效。单四拍模式的时候电机只是震动并没有转动,用肉眼观察不到转速的快慢,故最后舍弃了这种模式。 调试的最终结果是:程序开始时电机进入模式0,如果没有按键按下则一直保持模式0。当有按键按下时,且按键为KEY1KEY4则电机根据不同按键的按下进入不同的转动模式(KEY1对应模式0:八拍正转,KEY2对应模式1:八拍反转,KEY3对应模式2:双四拍正转,KEY4对应模式3:双四拍反转)。当按键KEY5按下时,电机转速变慢,且随着KEY5按下次数的增多电机逐渐变慢直至停止;当按键KEY6按下时
12、,电机转速变快,且随着KEY5按下次数的增多电机逐渐变快。同时在上位机上可以看见当前的转速。5、课程设计体会一方面,通过这一周的课程设计,我对课本上关于LPC2138的硬件结构的知识有了更加深刻的理解,而且对其用法掌握得更加熟练。在课程设计过程中,能够不断地发现问题,并想办法解决,如此提高了我自己解决问题的能力。在编写程序方面,我对ARM7编程结构和技巧也有了深刻的理解和领会。此次课程设计还让我知道什么是实时系统以及如何构建一个简单的实时系统。现在我已经基本掌握了构建实时系统的方法。还有我明白了流程图的重要性,以前在编程的时候,我从不写流程图,直接开始写程序,这样出现了不该出现的问题。但这次课
13、程设计时,我试着先写出流程图然后按照流程图编写程序,结果错误少了很多,即使有错误只要根据流程图一查就知道错在哪里,这让我节省了大量的时间和精力。所以我认识到,以后要编写程序时,先写流程图是很有必要的。另一方面,我感觉这一周的课程设计我自己的效率太低。有时候被一些问题困惑了很久,但经过老师的指点,我才恍然大悟,原来只要换个方式思考问题就能想到很好的方法。6、 参考文献1 周立功.深入浅出ARM7LPC213X/214X(上册)M.北京:北京航空航天大学出版社,2008:146-175,226-240,275-286.2 周立功.ARM嵌入式系统实验教程(三)M.北京:北京航空航天大学出版社,20
14、05:134-140.3 冷洪滨,邬义杰.基于计数器/定时器的步进电机可编程控制接口电路设计J北京:组合机床与自动化加工技术,2004.4 周明德.微型计算机硬件软件及其应用.北京:清华大学出版社 ,1993.附录:实训程序#include config.h#define HC595_CS (1 29) / P0.29口为74HC595的片选#define LED1 118 /P1.18#define LED2 119 /P1.19#define LED3 120 /P1.20#define LED4 121 /P1.21#define bj_qd 0x0f 22 /步进电机驱动脚p1.22p
15、1.25uint32 bj8=1 22,3 22,1 23,3 23,1 24,3 24,1 25,9 22;/0A, 1AB 2B3BC4C 5CD 6D7DAconst uint32 KEY1 = 1 16;/ P0.16连接KEY1const uint32 KEY2 = 1 17;/ P0.17连接KEY1const uint32 KEY3 = 1 18;/ P0.18连接KEY1const uint32 KEY4 = 1 19;/ P0.19连接KEY1const uint32 KEY5 = 1 20;/ P0.20连接KEY1const uint32 KEY6 = 1 0; dly-
16、) for(i=0; i= 80)x = 0;y+;/* 函数名称:MSPI_Init()* 函数功能:初始化SPI接口,设置为主机。* 入口参数:无* 出口参数:无*/void MSPI_Init(void) PINSEL0 = (PINSEL0 & (0xFF 8) | (0x55 8) ; SPCCR = 0x52; / 设置SPI时钟分频 SPCR = (0 3) |/ CPHA = 0, 数据在SCK 的第一个时钟沿采样 (1 4) |/ CPOL = 1, SCK 为低有效 (1 5) |/ MSTR = 1, SPI 处于主模式 (0 6) |/ LSBF = 0, SPI 数据
17、传输MSB (位7)在先 (0 7);/ SPIE = 0, SPI 中断被禁止/* 函数名称:MSPI_SendData()* 函数功能:向SPI总线发送数据* 入口参数:data待发送的数据* 出口参数:返回值为读取的数据*/uint8 MSPI_SendData(uint8 data) IOCLR = HC595_CS; / 片选74HC595 SPI_SPDR = data; while( 0 = (SPI_SPSR & 0x80);/ 等待SPIF置位,即等待数据发送完毕 IOSET = HC595_CS; return(SPI_SPDR);/* 此表为LED0F以及L、P的字模 *
18、/uint8 const DISP_TAB10 = / 0 1 2 3 4 5 6 7 8 9 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90 ;/* 函数名称:qudong()* 函数功能:驱动步进电机转动* 入口参数:无* 出口参数:无*/void qudong()IO1SET=0x0f22;/不输出switch ( bj_mod)case 0: /八拍正转IO1CLR=bjcnt%8;break;case 1:/八拍反转IO1CLR=bj7-(cnt%8);break;case 2:/双四拍正转IO1CLR=bj(cnt%4)*2+1
19、;break;case 3:/双四拍反转IO1CLR=bj7-(cnt%4)*2;break;default:break;T0IR = 0x01;/* 清除中断标志*/VICVectAddr = 0x00;/* 通知VIC中断处理结束*/* 函数名称 :IRQ_Timer0()* 函数功能 :定时器0中断服务程序,定时调用qudong()程序,使步进电机按节拍转动。* 入口参数 :无* 出口参数 :无*/void _irq IRQ_Timer0 (void) t+; cnt+; qudong();MSPI_SendData(DISP_TABi);/ 发送显示T0IR = 0x01;/* 清除中
20、断标志*/VICVectAddr = 0x00;/* 通知VIC中断处理结束*/* 函数名称 :main()* 函数功能 :程序初始化,AD采样和按键调节电机转速,通过串口向上位机发送显示数据。* 调试说明 :需要将跳线JP6分别选择TXD0和RXD0端* KEY1KEY6连接P0.16P0.21,步进电机四个输入端分别接P1.22P1.25。*/uint8 rcv_data; int main (void) uint32 ADC_Data,temp,zhuansu=100,zhuansu1=100,zhuansu2=200; uint32 bapaizhengzhuan,bapaifanzh
21、uan,shsipaizhengzhuan,shsipaifanzhuan; char str20;PINSEL0 = 0x; / 设置SPI管脚连接 PINSEL1 = 0x; /PINSEL1 = 1 28;/ P0.30连接到AD0.3 IODIR = HC595_CS; PINSEL2 = PINSEL2 & (0x08);/ P125:16连接GPIOIO1DIR =bj_qd;/ 设置bjdj_qd控制口为输出 UART0_Init(); MSPI_Init();/ 初始化SPIIRQEnable();/* IRQ中断使能*/* 定时器0初始化 */T0TC = 0;/* 定时器设
22、置为0*/T0PR = 0;/* 时钟不分频*/T0MCR = 0x03; /* 设置T0MR0匹配后复位T0TC,并产生中断标志*/T0MR0 = Fpclk /zhuansu;/* 0.5秒钟定时*/T0TCR = 0x01;/* 启动定时器*/* 设置定时器0中断IRQ */VICIntSelect = 0x00;/* 所有中断通道设置为IRQ中断*/VICVectCntl0 = 0x20 | 0x04;/* 设置定时器0中断通道分配最高优先级*/VICVectAddr0 = (uint32)IRQ_Timer0;/* 设置中断服务程序地址*/VICIntEnable = 1 0x04;
23、/* 使能定时器0中断*/while (1) if(IO0PIN & KEY1) = 0) /KEY1 MIDE0 DelayNS(10); if(IO0PIN & KEY1) = 0) bj_mod=0; i=0; MSPI_SendData(DISP_TAB0);/ 发送到数码管显示 bapaizhengzhuan = 3*zhuansu/20;sprintf(str, bapaizhengzhuan:%4d,bapaizhengzhuan);/ 发送到上位机显示 ISendStr(0,4,0x30,str); while(IO0PIN & KEY1) = 0); if(IO0PIN &
24、KEY2) = 0) /KEY2 MODE1 DelayNS(10); if(IO0PIN & KEY2) = 0) bj_mod=1; i=2; MSPI_SendData(DISP_TABi);/ 发送到数码管显示 bapaifanzhuan=3*zhuansu/20; sprintf(str, bapaifanzhuan:%4d,bapaifanzhuan);/ 发送到上位机显示 ISendStr(0,6,0x30,str); while(IO0PIN & KEY2) = 0); if(IO0PIN & KEY3) = 0) /KEY3 MODE2 DelayNS(10); if(IO0
25、PIN & KEY3) = 0) bj_mod=2; i=3; MSPI_SendData(DISP_TABi);/ 发送到数码管显示 shsipaizhengzhuan=3*zhuansu/10; sprintf(str, shsipaizhengzhuan:%4d,shsipaizhengzhuan);/ 发送到上位机显示 ISendStr(0,8,0x30,str); while(IO0PIN & KEY3) = 0); if(IO0PIN & KEY4) = 0) /KEY3 MODE3 DelayNS(10); if(IO0PIN & KEY4) = 0) bj_mod=3; i=4
26、; MSPI_SendData(DISP_TABi);/ 发送到数码管显示 shsipaifanzhuan=3*zhuansu/10; sprintf(str, shsipaifanzhuan:%4d,shsipaifanzhuan);/ 发送到上位机显示 ISendStr(0,10,0x30,str); while(IO0PIN & KEY4) = 0); if(IO0PIN & KEY5) = 0) DelayNS(10); if(IO0PIN & KEY5) = 0) i=5; zhuansu2+=20;zhuansu1=zhuansu; / 按键KEY5减速 MSPI_SendData
27、(DISP_TABi);/ 发送到数码管显示 if(zhuansu2!=zhuansu1)zhuansu=zhuansu2; / 发送到上位机显示 while(IO0PIN & KEY5) = 0); if(IO0PIN & KEY6) = 0) DelayNS(10); if(IO0PIN & KEY6) = 0) i=6; zhuansu2-=20; / 按键KEY6加速 zhuansu1=zhuansu; MSPI_SendData(DISP_TABi);/ 发送到数码管显示 if(zhuansu2!=zhuansu1)zhuansu=zhuansu2; / 发送到上位机显示 while(IO0PIN & KEY6) = 0); sprintf(str, ADC_Data:%4d,ADC_Data); ISendStr(0,0,0x30,str); sprintf(str, zhuansu:%4d,zhuansu); / 发送到上位机显示 ISendStr(0,2,0x30,str); return 0;/* End Of File*/专心-专注-专业
限制150内