还剩18页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
实验四综合实验设计
一、实验目的通过熟悉实验箱各模块的功能,再结合自己所学的专业知识以及各模块的程序设计方MagicARM2410法,设计一个综合实验
二、实验要求设计一个综合实验,要求通过键盘改变控制直流电机的转速,同时通过和模块,在机RTC UARTPC超级终端处显示步进机转速的级别以及时间在此实验中包括了、定时器中断、、键盘UART RTCLED数码管显示、直流步进电机等模块
三、实验设计思路本实验通过设计一个控制数码管显示并接收键盘输入的主程序,在主程序中通过键盘输入调用直LED流电机中控制转速的子程序,不同的键值输入对应不同的直流电机转速并且在改变转速的同时,通过调用和模块,分别向机发送时间和转速的级别因此关键是设计好主程RTC UARTPC发送时间到上显示PC序,解决好各调用子程序之间的矛盾和冲突,使他们可以很好的共存实验框图如下:直流电机的转速改变是通过改变电压来完成的,电压越大,直流电机的转速越快,而不同电压所需要的占空比是不一样的,本实验就是通过改变占空比来实现不同电压的转变,从而控制直流电机的转速
四、实验程序由于实验程序比较长,现只将实验的主程序的函数表示出来,其他调用程序见附件一mainvoid mainvoidint i,j;int temp;uintl6key;附件一实验主程序#include config.h//定义显示缓冲区char disp_buf
[50];char disp_bufO[l0];char disp_bufl
[10];char disp_buf2
[10];char disp_buf3
[10];控制数码管闪烁命令//ZLG7290LED#define Glitter_COM0x70//定义当前时间变量uint8g_year=0;uint8g_month=0;uint8g_date=0;uint8g_day=0;uint8g_hour=0;uint8g_min=0;uint8g_sec=0;//定义星期字符串网={「”「「char*str_day Monday:Tuesday”:Wednesday Thursday,Friday Saturday,//定义初始化时钟值年*/#define INIT_YEAR0x11/*2011月*/#define1NIT_MONTH0x05/*5#define INIT_DATE0x21/*21日*/#define INIT_DAY/*星期六*/0x06#define INIT_HOUR时*/0x09/*20#define INIT_MIN分*/0x30/*30#define INIT_SEC秒*/0x00/*0“Sunday”};〃延时void DelayNSuint32dlyuint32i;for;dly0;dly-fori=0;i50000;i++;初始化//RTCvoid RTC_Initint forceinterr;uint32bak;//判断当前是否正确运行RTCerr=0;//若为则判断当前时钟是否正确ifforce==0force0,//禁止接口只允许计数和读数rRTCCON=0x00;RTC RTCbak=rBCDYEAROxFF;//年判断ifbak0x99err++;bak=rBCDMON0xlF;//月判断ifbak0xl2err++;bak=rBCDDATE0x3F;//日判断ifbak0x31err++;bak=rBCDHOUR0x3F;//时判断ifbak0x24err++;bak=rBCDMIN0x7F;//分判断ifbak0x59err++;bak=rBCDSEC0x7F;//秒判断ifbak0x59err++;//若时钟正确,则直接返回iferr==0return;〃标准模式,接口使能允许写rRTCCON=0x01;RTCrBCDYEAR=INIT_YEAROxFF;rBCDMON=INIT MONTH0xlF;rBCDDATE=INIT_DATE0x3F;星期,rBCDDAY=INIT.DAY0x07;//MON:1TUE:2WED:3THU:4FRI:5SAT:6SUN:7rBCDHOUR=INIT HOUR0x3F;rBCDMIN=INIT_MIN0x7F;rBCDSEC=INIT SEC0x7F;//禁止接口只允许计数和读数rRTCCON=0x00;RTC RTC//读时间void RTC_Readuint32date{ifdate g_year=rBCDYEAR;g_month=rBCDMON;g_date=rBCDDATE;g_day=rBCDDAY;g_hour=rBCDHOUR;g_min=rBCDMIN;g_sec=rBCDSEC;〃显示时间void DispRTCvoid{sprintfdisp_buf,n%02x:%02x:%02x%10s,%2x/%2x/20%02x\n\g_hour,g_min,g_sec,str_day[g_day],g_month,g_date,g_year;UART_SendStrdisp_buf;〃初始化定时器PWM voidPWM_Inituint16cycle,uintl6duty//参数过滤ifdutycycle duty=cycle;//设置定时器即周期和占空比0,PWM时钟分频配置为即〃预分频器//Fclk=200MHz,1:2:4,Pclk=50MHz rTCFGO=97;0设置为取得再取分频,取得98,510204Hz rTCFGl=0;//TIMER01/2255102Hz//设置占空比//定时值周期rTCMPBO=duty;PWM rTCNTBO=cycle;PWM//更新定时器数据取反输出位ifrTCON0x04rTCON=1«1;inverterelse rTCON=1«2|1«1;//启动定时器rTCON=1«0|1«3;〃外部中断初始化void EINT_initvoid〃设置弓脚为夕卜部中断rGPFCON=rGPFCONOxFFFFFCFF|0x02«8;GPF4I EINT4功能//外部中断设置为下降沿触发rEXTINT0=0x216;EINT4//使能中断rINTMSK=HNTMSK〜11;EINT4rEINTMASK=-0x0000010;〃中断服务程序void IRQ_Eint4voidinti;int temp;//按键去抖动//设置为输入方式rGPFCON=rGPFCON-0x03«8;GPIO fori=0;i10000;i++;//延时去抖动//若是假按键,则直接退出ifrGPFDAT设置回中断口rGPFCON=rGPFCON|0x02«8;//EINT4//清除中断标志rEINTPEND=1«4;rSRCPND=1«4;二rINTPND rINTPND;return;}//设置回中断口rGPFCON=rGPFCON|0x02«8;EINT4//执行串口发送数据//选择UART_Select0;UART0//初始化UART_Init;UART0UART_SendStrnstop time\nn;//初始化非强行方式RTCJnitO;RTC〃读日期RTC_Readl;temp=0;whiletemp==rBCDSEC;temp=rBCDSEC;//读时间RTC_Read0;〃输出时间显示DispRTCO;〃清除中断标志rEINTPEND=1«4;rSRCPND=1«4;rINTPND=rINTPND;//定时器初始化1void IRQ_TimInitvoid时钟分频配置为即//Fclk=200MHz,1:2:4,Pclk=50MHz//预分频器设置为取得0250,200KHz再取分频,取得//TIMER01/450KHz//设置定时器为0//定时秒1//更新定时器数据〃定时中断服务程序void IRQ_Time0void//void IRQ_Time0void inti;//rTCFGO=255;//选择UART_SelectO;UART0//rTCFGl=3;//初始化UART_Init;UART0rTCMPB1=0x0000;DelayNS50;rTCNTB1=255102;rTCON=l«8;rTCON=l«7|1«10;//启动定时器IRQEnable;//使能中断IRQ CPSRfori=0;i10;i++UART_SendStrHcontinue time!\nn;〃清除中断标志rSRCPND=1«10;rINTPND=rINTPND;〃主函数void mainvoidintij;int temp;uintl6key;disp_bufO[O]=O;disp_bufl
[0]=l;disp_buf2
[0]=2;disp_buf3[O]=3;//直流电机设置口设置//TOUTO设rGPBCON=rGPBCON-0x03«0|0x02«0;//rGPBCON[l:0]=10b,置功能TOUTO//禁止口的上拉电阻rGPBUP=rGPBUP|0x0001;TOUTO//设置为输出模式GPH9GPIO口rGPHCON=rGPHCON-0x03«18|0x01«18;//GPH9//输出电平rGPHDAT=rGPHDAT〜19;0rGPHUP=rGPHUP|l«9;设置为输出模式GPH10I/O//设置中断服务程序〃定时中断向量地址设置VICVectAddr
[10]=uint32IRQ_Time0;//外部中断向量地址设置VICVectAddr
[4]=uint32IRQ_Eint4;//设置中断控制器//使用默认的固定的优先级rPRIORITY=0x00000000;//所有中断均为中断rINTMOD=0x00000000;IRQ设置//GPIO灯控制口rGPACON=rGPACON-1«21;//A□,RUN GPA21rGPHCON=rGPHCON-0x03«20|0x01«20;//rGPHCON[21:20]=01b,设置为输出模式GPH10I/O//初始化接口I2CInitI2C//使能中断rINTMSK=OxFFFFFBEF;EINT4rEINTMASK=-0x0000010;//显示whilei==0forj=0;jl;j++disp_buf[j]=i;ZLG7290_SendBufuint8*disp_buf,8;DelayNSlO;//读取按键,设置键值对应的显示位闪烁whilelDelayNSl;key=ZLG7290_GetKey;ifkey0xFF00==0{key=keyOxOOFF;switchkeyZLG7290_SendBufuint8*disp_bufOJ;PWM_Init255,255/4;直流电机以运行UART_SendStr speel\n;DelayNS20;//初始化非强行方式RTCJnitO;RTCRTC_Read⑴;〃读日期temp=0;whiletemp==rBCDSEC;temp=rBCDSEC//读时间RTC_ReadO;//输出时间显示DispRTCO;break;ZLG7290_SendBufuint8*disp_bufl,1;PWM_Init255,2*255/4;UART_SendStr直流电机以speed2运行\n;DelayNS20;//初始化非强行方式RTC_InitO;RTC〃读日期RTC_Readl;temp=0;whiletemp==rBCDSEC;break;ZLG7290_SendBufuint8*disp_buG,1;」PWM nit255,3*255/4;UART_SendStr直流电机以speed3运行\n;DelayNS20;//初始化非强行方式RTCJnitO;RTC〃读日期RTC_Readl;temp=0;whiletemp==rBCDSEC;temp=rBCDSEC;//读时间RTC_ReadO;//输出时间显示DispRTC;break;ZLG7290_SendBufuint8*disp_buf3J;」PWM nit255,4*255/4;UART_SendStr直流电机停止运行\n”;DelayNS20;//初始化非强行方式RTCJnitO;RTC〃读日期RTC_Readl;temp=0;whiletemp==rBCDSEC;disp_bufO[O]=O;disp_bufl[O]=l;disp_buf2
[0]=2;disp_buf3
[0]=3;//直流电机初始化设置口设置//TOUTO设置rGPBCON=rGPBCON〜0x030|0x02«0;//rGPBCON[l:0]=10b,功能TOUTO//禁止口的上拉电阻rGPBUP=rGPBUP|0x0001;TOUTO//设置为输出模式GPH9GPIO口rGPHCON=rGPHCON-0x03«18|0x01«18;//GPH9二〃输出电平rGPHDAT rGPHDAT〜19;rGPHUP=rGPHUP|l«9;设置//GPIOrGPACON=rGPACON-1«21;〃A口,RUN灯控制口GPA21rGPHCON=rGPHCON-0x03«20|0x01«20;//rGPHCON[21:20]=01b,设置为输出模式GPH10I/O//设置中断服务程序〃定时中断向量地址设置VICVectAddr
[10]=uint32IRQ_Time0;//外部中断向量地址设置VICVectAddr
[4]=uint32IRQ_Eint4;//设置中断控制器〃使用默认的固定的优先级PRIORITY=0x00000000;//所有中断均为中rINTMOD=0x00000000;IRQ设置//GPIOrGPACON=rGPACON-1«21;〃A口,RUN灯控制口GPA21设置rGPHCON=rGPHCON〜0x0320|0x01«20;//rGPHCON[21:20]=01b,为输出模式GPH10I/O//初始化接口I2CInitI2C;//使能中断rINTMSK=OxFFFFFBEF;EINT4二rEINTMASK-0x0000010;break;default:break;}//end ofswitchkey...//控制数码管显示LEDwhilei==O{forj=0;jl;j++disp_buf[j]=i;ZLG7290_SendBufuint8*disp_buf,8;DelayNSlO;//读取按键,设置键值对应的显示位闪烁whilelDelayNSl;key=ZLG7290_GetKey;ifkeyOxFFOO=0key=keyOxOOFF;switchkeyZLG7290_SendBufuint8*disp_bufO,l;」〃以占空比改变直流电机的转速PWM nit255,255/4;1/4UART_SendStr直流电机以sped运行\n;延时’DelayNS20;////初始化非强行方式RTCJnitO;RTC〃读日期RTC_Readl;temp=0;whiletemp==rBCDSEC;temp=rBCDSEC;RTC_ReadO;//读时间DispRTCQ;〃输出时间显示break;ZLG7290_SendBufuint8*disp_bufl,l;」〃以占空比改变直流电机的转速PWM nit255,2*255/4;2/4直流电机以运行UART_SendStr”speed2\n延时DelayNS20;////初始化非强行方式RTCJnitO;RTC〃读日期RTC_Readl;temp=0;whiletemp==rBCDSEC;temp=rBCDSEC;//读时间RTC_Read0;//输出时间显示DispRTC;break;ZLG7290_SendBufuint8*disp_buf2,l;」〃以占空比改变直流电机的转速PWM nit255,3*255/4;3/4UART_SendStr”直流电机以speed3运行\n“;//延时DelayNS20;//初始化非强行方式RTCJnitO;RTC〃读日期RTC_Readl;temp=0;whiletemp==rBCDSEC;temp=rBCDSEC;//读时间RTC_ReadO;//输出时间显示DispRTCO;break;ZLG7290_SendBufuint8*disp_buf3J;」;〃使直流电机全占空比停止转动PWM nit255,4*255/4UART_SendStr直流电机停止运行\n”;延时DelayNSQO;////初始化非强行方式RTCJnitO;RTCRTC_Read⑴;〃读日期temp=0;whiletemp==rBCDSEC;temp=rBCDSEC;//读时间RTC_ReadO;//输出时间显示DispRTCO;break;default:break;}//end ofswitchkey...}
五、实验步骤启动集成开发环境,选择【】->【…】,使用工程模
1.ADS
1.2IDE File New ARMExecutable Image板建立一个工程,名称为目录为qiub,D:\arm\myproject\qiub0选择【】->【…】建立一个新的文件设置直接添加到项目中,在一栏中
2.FileNewmain.c,Targets选择.输入主程序的程序代码,并保存,此时在工程窗口中可以看到文件Debug main.c打开所建的工程,选择向该工程添加实验所需要的各个模块,如图所示
3.ADD Flies,工程文件添加完毕后保存,然后选择【】【】,将编译链接整个工程如果有错误按照
4.Project Make错误提示栏提示的错误进行修改,直到链接正确打开仿真器软件,并且在电脑开始菜单找到附件一>数据通讯一>超级终端;打开超级终端,
5.JTAG设计超级终端的参数,用于观察数据的接收选择【】->【】,环境就会启动调试软件,如果首次运行要记得加载初始化
6.Project DebugIDE AXD文件初试完毕后,可以执行单步或全速运行调试ARM
2410.txt,全速运行后,改变键盘上的键值从键到键,观察直流电机的转速改变情况以及超级终端的数据
7.3接受情况
六、实验结果及分析通过改变键盘的输入值,直流电机的转速发生改变,当键盘按下键时,数码上显示代表0LED1,直流电机以占空比模式运行,同时可以从超级终端处观察到发送来的数据“直流电机以运行”,1/4speel后面紧接着显示时间如图所示同样按下键和键时可以分别看到数码上显示和他们分112LED23,别代表直流电机以占空比模式运行和占空比模式运行在接收端可以从超级终端分别观察到“直2/43/4流电机以运行”和“直流电机以运行”后面紧跟着的是他们开始旋转的时间当按下键speed2speed3时,数码上显示表示直流电机切换到全占空比模式,即直流电机停止转动,此时可以从超级3LED4,终端收到“直流电机停止运行”以及开始停止的时间通过观察得知直流电机的转速与占空比有关,当占空比小于时,且逐渐增大时,直流电机的转1速越来越快,也就是;实验截图如下:speed1speed2speed3文件9编辑d)查看9呼叫©传送夏)帮助但)口自绮32台直直流电机以speel运行20:57:46Tuesday,直流电机以speed3运行20:57:49Tuesday,直流电机以speed2运行1/10/200620:57:51Tuesday,直流电机停止运行20:57:531/10/2006Tuesday,直流电机以speel运行1/10/200620:57:58Tuesday,1/10/2006直流电机以speed2运行20:57:59Tuesday,直流电机停止运行1/10/200620:58:01Tuesday,直流电机以speel运行1/10/200620:58:03Tuesday,1/10/2006直流电机以speel运行20:58:04Tuesday,1/10/2006直流电机以speel运行20:58:06Tuesday,1/10/2006直流电机以speed2运行20:58:07Tuesday,1/10/2006直流电机以speed3运行1/10/200620:58:09Tuesday,直流电机以speed2运行1/10/200620:58:11Tuesday,直流电机以speed2运行1/10/20069A•19TIiorr4^ii1从截图可以看出各个模式之间可以通过按下不同的键值相互跳转,如果没有其他键按下要求跳转,则直流步进电机一直以该模式运行
七、实验心得:
(一)本次实验虽然只是一个小型的综合性实验,但是对于我这么一个初次接触嵌入式的人来说,还是遇到了很多困难首先在硬件方面上感到很吃力,很多以前学过的东西都忘了,比如中断的优先级,以及各寄存器的组织结构等,加上本身复杂的体系结构,使得我不得不一边操作一边学习,遇到ARM哪里不懂的,就去翻书找相应的知识,或到网上去找相关资料其次是软件方面的知识还很欠缺,虽然以前学习过语言,以及汇编语言,但好久没有用过,很多指令都忘了,加上本身的指令集,C ARM要想自己真正编写一个完整的程序显得是那么困难幸好实验室有很多已经编好的实验程序模板,我可以参照上面的实验程序,通过一些修改,达到实现所要的功能如果没有那些源程序,我想我可能会遇到更多的问题我知道自己还停留在初级水平,甚至连初级水平都没有达到,因为嵌入式所需要的知识很广,很全,而你必须在各个方面都很熟悉,才能得心应手还有经验很重要,对于我们初学者来说,最缺乏的就是经验,获取经验的最好的方法就是学习那些已经编好的实验模板,因为那些模板是经验的总结,那正是我们所要需要的通过不断的学习他人的实验成果,才能不断的积累,当积累经验到一定的程度的时候,你就可以得心应手的实现自己想要实现的各个功能,那时你就可以有自己的东西,可以有自己的创新
(二)在设计这个实验的过程中,主要经历三个过程构思,设计,调试首先是想怎么把各个实验综合到一起,实现各个模块的功能,同时又要有一定的实际意义经过反复斟酌决定采用键盘控制直流电机的转速,同时输出转速级别以及转速改变的时间,这样就把实验要求的各个模块基本都整合到一起了初步思路出来了以后,就是开始设计主程序了,这一阶段花了很多时间因为自己是第一次设计程序,很多东西不是很了解,所以必须先学习一些例子,了解程序设计的一些基本原则我把实验室电脑中光盘的基础实验的各个程序仔细研究了一下,同时也熟悉了各个功能模块MagicARM2410功能实现的原理,这也为我后面程序设计提供了一种参考有了这些准备工作,就是开始设计自己的实验程序,通过不断的添加和修改,再经过编译,确定没有问题了保存好工程文件最后就是调试了,这是最关键的一步,也是最繁琐的一步,同时也是学东西最多的一个阶段我们不可能设计程序出来了就一点问题都没有,很多时候都是通过一步步调试,不断的修改,一个个问题的解决,才能最终成功我的也不例外,一开始时什么功能都不能实现,那时真的很失落,很受打击但我告诉自己,必须耐心的调试,才有可能成功我通过单步运行,观察程序的运行,分析模块的功能不能实现的原因,一个一个模块单独调试在调试的过程中运到了很多问题,比如模块之间共用相同寄存器而带来的冲突以及寄存器的某些功能没有开启或是关闭了等这些问题很多都是通过回过头去研究实验模板的设计,再结合英文的文件的介绍,了解各寄存器的初始化以及寄存器每位所代表的功能来解S3c
2410.pdf决的当这些问题都解决了,实验朝着理想的方向前进,很多功能都能实现了此时先前的挫败感,一下就消失了,那种调试成功的喜悦是无法用言语来表达的调试过程是一个很磨砺人的一个过程,在反复失败的时候还要继续尝试,这是很痛苦的很多人就是因为不能承受折磨而最终放弃了,而成功就是建立在无数次失败之上的,快乐也是建立在痛苦之上的,只有经历了那个过程的点点滴滴,才能体会成功的那份喜悦
(三)在此次实验中,我还遇到了一些不知道怎么解释的问题,比如说我改变了输出的字符时,整个实验程序就不能正常运行,机上也不能接受发送的数据,而当我改回来时,,程序又能正常运行还pc有就是当我打开定时中断时,按下某一键时,程序不能跳转了,一直停留在此,好像死机了一样而当卧关闭定时中断时,程序又可以正常运行我猜这可能与直流电机中的定时器有冲突或是共用了0定时器才导致了这样0
(四)这次实验让我学到了很多东西,懂得了实验要付出很多艰辛的努力,而所有的这些努力都是值得的它不仅提升了你的动手能力、学习能力,分析问题和解决问题的能力,同时也教会了我如何学习,如何查找资料这些东西在课本上是学不到的,你必须自己亲自通过实验这个过程来体验感知实验过程的点点滴滴都将是我们日后学习、工作的一笔宝贵的财富。
个人认证
优秀文档
获得点赞 0