基于ARM的多路信号采集及发送系统设计及实现_第1页
基于ARM的多路信号采集及发送系统设计及实现_第2页
基于ARM的多路信号采集及发送系统设计及实现_第3页
基于ARM的多路信号采集及发送系统设计及实现_第4页
基于ARM的多路信号采集及发送系统设计及实现_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

1、基于ARM11的多路信号采集及发送系统设计及实现1. 绪论当今嵌入式系统ARM微处理器发展迅速,这是一种RISC架构下嵌入式系统的核心部件,被广泛地应用到工业控制、无线通讯、消费类电子产品等很多领域。它的指令系统相对简单,它只要求硬件执行很有限且最常用的那部分指令,大部分复杂的操作则使用成熟的编译技术,由简单指令合成。此次课设利用ARM11_S36410及其外围扩展板设计一个嵌入式系统,可通过对ARM植入操作系统或者利用ARM单片机特性实现部分功能。首先研究ARM系统可扩展的电路,根据元器件判断扩展板可实现的功能,其次查询手册,根据外围电路与芯片引脚硬件电路编写程序,最后根据实物测试判断是否实

2、现了功能。我使用的是ADS1.2编写程序,对电路实现了串口,PWM驱动蜂鸣器,AD转换等功能,经过测试表明,功能基本上都达到要求。2. 原理分析2.1 UART接口 串行通信是一种将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的通信方式。UART 是通过产生一个中断或DMA请求,在CPU 和UART 之间传输数据的。每个UART包含两个 64-byte FIFOs用于发送和接收数据。通过配置相关寄存器,我们可以设置通信的波特率、数据位、停止位和奇偶校验位。发送数据之前,首先将数据写入FIFO 存储器 ,然后复制到发送移位寄存

3、器。通过发送数据的引脚(txdn)将数据发送,同时,通过数据接收的引脚(rxdn)将接收到的数据从接收移位寄存器复制到FIFO 存储器。如下图所示:图1 UART发送接收状态图2.3 按键中断 外部中断源控制器EINT一共被分为9个组,每组里面对应不同的IO管脚,S3C6410芯片共有127个外部中断,每个引脚都可以产生一个外部中断。 ARM的总中断控制器是VIC,包括VIC0和VIC1,联合起来控制了64个中断源,每个VIC控制32个,我们可以找到了与外部中断有关的127个外部中断在VIC里的中断号的对应关系。外部中断组0的27个中断占用了VIC里的4个中断号,外部中断组1-9只占用了1个中

4、断号。我们测试板的按键中断如下:图2 按键中断对应图2.3 PWM PWM即脉冲宽度调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。PWM控制技术主要应用在电力电子技术行业,具体讲,包括风力发电、电机调速、直流供电等领域。S3C6410微处理器有五个32 位定时器,用来产生内部中断到ARM子系统。定时器0,1,2 和3 各包含一个PWM 功能,可驱动外部的I/O信号。每个定时器有自己的32位向下计数器,被定时器时钟驱动。下数计数器是最初被加载来自定时器计数缓冲寄存器(TCNTBn)。当下数计数器达到零,定时器产生中断请求通知CPU,定时器操作完成。当定时器下数计数器达到

5、零,相应的TCNTBn 能被自动重新进入下数计数器的下一个周期的开始。然而,如果定时器停止,通过清除定时器的使能位TCONn ,TCNTBn 的值将不被加载到计数器中。PWM使用TCMPBn 寄存器的值,当下数计数器的值匹配于定时器控制器逻辑中的比较寄存器的值时,定时器控制器逻辑改变输出标准。故比较寄存器决定一个PWM 输出的打开时间(或关闭时间)。图3 PWM定时器结构图2.4 AD转换AD转换就是模数转换。顾名思义,就是把模拟信号转换成数字信号。S3C6410微处理器具有10位CMOS的ADC (模数转换器),它是是一种循环类型的装置,具有8位通道模拟输入。它将模拟的输入信号转换成10位二

6、进制数字编码,最大转换率是500KSPS和2.5MHz的ADC时钟。ADC转换器的操作带有片上采样保持功能。电源中断模式的支持。S3C6410微处理器的ADC 及触摸屏模块是共用的。当触摸屏装置被使用,触摸屏的 I/F,XM 或 YM 只接地。当触摸屏的装置未被使用,为正常 ADC 转换,XM 或 YM 是连接模拟输入信号的。该模块具体功能框图见下图:图4 ADC 和触摸屏接口的功能结构框图3 程序设计3.1 串口模块本程序是用串口通道0进行串口通信,分别使用IO口A0、A1作为RXD和TXD。进行串口通信前,先初始化串口,要配置寄存器ULCON0、UCON0、UFCON0、UMCON0来设置

7、串口通信模式,配置寄存器UBRDIV0和UDIVSLOT0来设置波特率。进行串口通信时,直接读取或者写入相应缓冲寄存器即可。本模块代码见附录1,具体流程如下图:图5 串口模块流程图3.2 按键中断模块本程序共设置了8个按键中断,按键IO口分别是N0-N5和L11、L12,分别对应EINT0-5和EINT19-20。初始化外部中断时,先配置IO口,再通过配置寄存器EINT0CON0、EINT0CON1、EINT0MASK、EINT0PEND来设置外部中断模式,配置寄存器VICxINTENCLEAR、VICxINTSELECT和VICxADDRESS等来设置总中断。本模块代码见附录2,具体初始化流

8、程如下图:图6 按键中断初始化流程图当发生外部中断时,系统自动进入中断处理程序,先检查按键值,在根据按键值进行相应操作,最后清除中断标志后回到主程序。具体中断处理见下图:图7 按键中断处理流程图3.3 PWM模块本程序通过GPF14口产生PWM波来驱动蜂鸣器发声,改变PWM波的频率可以改变蜂鸣器发声频率。初始化PWM模块时,先配置IO口,再通过配置寄存器TCON来设置定时器开启与关闭,配置寄存器TCFG0、TCFG1来设置定时器时钟,配置寄存器TCNTB0、TCMPB0来设置定时器计数值。本模块代码见附录3,具体初始化流程如下图:图8 PWM模块初始化流程图3.4 AD转换模块本程序通过端口A

9、IN0来接收模拟信号,通过调节开发板上的可调电阻W1可以调节输入电压,通过配置寄存器ADCCON可以设置ADC工作模式,也可以读取ADC工作状态,通过寄存器ADCCON可以读取AD转换的值。本模块代码见附录4,AD转换流程如下图:图9 AD转换流程图3.5 主程序主程序开始后,先初始化端口以及串口、AD转换等模块,然后通过串口发送欢迎字符和菜单,再初始化外部中断,在进入无限循环,等待串口输入命令,并处理命令,同时等待按键中断发生。本模块代码见附录5,具体程序流程见下图:图10 主程序流程图4.测试结果4.1 串口发送与接收结果串口发送数据与接收命令字符结果如下图:图11串口发送与接收结果由上图

10、可以看出,设置好串口端口号和波特率后,上位机可以接收串口发送的欢迎字符和菜单等数据,并且可以发送命令字符,说明串口发送与接收功能正常。4.2 按键中断处理结果按键中断处理结果如下图:图12按键中断处理结果由上图可以看出,在程序运行时,按下每个按键后,串口都会接收到相应提示字符,说明按键中断功能正常。4.3 蜂鸣器发声结果使用串口输入命令c以后,蜂鸣器开始发声,按动按键K3,蜂鸣器叫声先变尖利再变平和,如此反复变化。说明PWM波产生正常,并且可以通过按动按键改变其频率。4.4 AD转换结果AD转换结果如下图:图13 AD转换结果由上图可以看出,缓慢调节开发板上的滑动变阻器W1,AD转换的值可以从

11、0增加到4095,说明AD转换功能正常。5.小结与体会这次课程设计我做的是ARM11的多路信号采集及发送系统。通过各方面努力,本团队实现了开发版的某些功能,比如串口传输,PWM波驱动蜂鸣器,AD转换,LED流水灯等等,并通过把这些功能集成在一个软件系统中,系统运行稳定,性能良好。由于是第一次接触嵌入式系统,再加上设备有限,所以没有做出特别有意义的东西出来,没有能在S3C6410芯片上运行嵌入式系统,只能自己写裸机程序,但是也实现了一些基本功能。通过本次课程设计,我熟悉了ARM11结构体系,以及S3C6410微处理器,学会了如何使用ADS软件进行编程,以及如何通过SD卡给ARM11的芯片烧写程序

12、。总之这次课设我学到了很多,从一开始的什么都不懂到现在的基本了解它的功能,都是靠平时的一点一滴积累的。俗话说得好,失败是成功之母,这次课设中我不停地失败,修改调试程序,再失败,再修改调试程序,直到成功。什么东西都需要一个尝试过程,这也是一个学习过程,不懂不重要,关键要肯努力去学习去尝试,即便最后仍没多大成就,但只要你认真地做过了,努力过了,在这段努力的过程中你也会有所收获。参考文献1周立功.ARM嵌入式系统实验教程(三)M.北京:北京航空航天大学出版社,2009.72冷洪滨,邬义杰.基于计数器/定时器的步进电机可编程控制接口电路设计J.北京:组合机床与自动化加工技术,2011.53周明德.微型

13、计算机硬件软件及其应用北京:清华大学出版社 ,2011.44赵星寒.ARM开发工具ADS原理与应用M.北京:北京航空航天大学出版社,2010.85季昱,林俊超,宋飞编.ARM嵌入式应用系统开发典型实例M.北京:中国电力出版社,2012.7附录附录1:串口模块代码/串口初始化void Uart_Init(void) rGPACON = (rGPACON & (0xff<<0) | (0x22<<0); rGPAPUD = (rGPAPUD & (0xf<<0) | (0x1<<0); rULCON0 = (0<<

14、;6)|(0<<3)|(0<<2)|(3<<0); rUCON0 = (0<<10)|(1<<9)|(1<<8)|(0<<7)|(0<<6)|(0<<5)|(0<<4)|(1<<2)|(1<<0); rUFCON0 = (0<<6)|(0<<4)|(0<<2)|(0<<1)|(0<<0); / rUMCON0 = (0<<5)|(0<<4)|(0<<0);

15、rUBRDIV0 = 35; rUDIVSLOT0 = 0x80;/aSlotTableDivSlot;/串口发送void Uart_SendByte(int data) while(!(rUTRSTAT0 & 0x2); Delay(); WrUTXH0(data);/串口接收void Uart_SendString(char *pt) while(*pt) Uart_SendByte(*pt+);附录2:按键中断模块代码/*外部中断EINT初始化*/void EINT_init(void)rGPNCON = rGPNCON&0xfff | 0xaaa;/EINT模式rGPN

16、PUD = rGPNPUD&0xfff | 0xaaa;/上拉模式rGPLCON1 = (rGPLCON1&(0xff<<12) | (0x33<<12);rGPLPUD = (rGPLPUD&(0x33<<22) | (0x22<<22);rEINT0CON0 = (rEINT0CON0&0x0) | 0x333;/下降沿触发rEINT0CON1 = (rEINT0CON1&0x0) | (0x3<<4) | (0x3<<8);rEINT0MASK = rEINT0MASK&

17、;(0x3f|0x3<<19);/开启外部中断EINT0-5,EINT19-20rEINT0PEND = 0xffffffff;/清除挂起寄存器/VICrVIC0INTENCLEAR = 0xffffffff;/关闭每一位中断rVIC1INTENCLEAR = 0xffffffff;rVIC0INTSELECT &= 0x0;/设置中断为ISRrVIC1INTSELECT &= 0x0;rVIC0ADDRESS = 0x0;/清除矢量地址寄存器rVIC1ADDRESS = 0x0;rVIC0VECTADDR0 = (unsigned)KEY_irq;/导入到VIC向

18、量表地址中rVIC0VECTADDR1 = (unsigned)KEY_irq;rVIC1VECTADDR0 = (unsigned)KEY_irq;rVIC1VECTADDR1 = (unsigned)KEY_irq;rVIC0INTENABLE = rVIC0INTENABLE | 0x3;/打开EINT0-1中断rVIC1INTENABLE = rVIC1INTENABLE | 0x3;/*中断服务子程序*/void _irq KEY_irq(void)switch(rEINT0PEND&0x1fffff)case 1:Uart_SendString("rnKEY1 i

19、s be pressed !rn"); Uart_SendString("rnStop the current command !rn"); flag0 = 1; PWMDisable(); sendMenu(); break;case 2:Uart_SendString("rnKEY2 is be pressed !rn"); if(flag1 = 1)flag1=0;Buffer_Off(); else if(flag1 = 0)flag1=1;Buffer_On(); break;case 4:Uart_SendString("

20、rnKEY3 is be pressed !rn");if(cnt < 40) cnt = 200;else cnt = cnt - 50;PWMSetFeq(cnt);break;case 8:Uart_SendString("rnKEY4 is be pressed !rn");break;case 16:Uart_SendString("rnKEY5 is be pressed !rn");break;case 32:Uart_SendString("rnKEY6 is be pressed !rn");brea

21、k;case 0x80000:Uart_SendString("rnKEY7 is be pressed !rn");break;case 0x100000:Uart_SendString("rnKEY8 is be pressed !rn");break;default:Uart_SendString("rnunknow KEY is be pressed!rn");break;/清中断rEINT0PEND = 0xffffffff;/清除挂起寄存器rVIC0ADDRESS = 0x0;/清除当前中断rVIC1ADDRESS = 0

22、x0;/清除当前中断附录3:PWM模块代码void PWMInit(int cnt,int cmp) rGPFCON = (rGPFCON&(0x3<<28)|(0x2<<28); rGPFPUD &= (0x3<<28); rTCON &= 0x1f; rTCFG0 &= 0xff; rTCFG0 |= 255; rTCFG1 &=0xf; rTCFG1 |= 4; rTCNTB0 = cnt; rTCMPB0 = cmp; rTCON |= 0xb; rTCON &= 0x2;void PWMEnable(

23、void) rTCON |= 0x1; rGPFCON |= (0x2<<28);void PWMDisable(void) rTCON &= 11; rGPFCON &= (0x3<<28);void PWMSetFeq(int cnt) rTCON &= 0x1; rTCNTB0 = cnt; rTCMPB0 = cnt/2; rTCON |= 0x2; rTCON |= 0x1; rTCON &= 0x2;附录4:AD转换模块代码void Adc_Init(void)rADCCON = (rADCCON & (0x1<

24、<16)|(0x1<<16);/设置ADC分辨率rADCCON = (rADCCON & (0x1<<2)|(0x0<<2);/待机选择正常的操作模式rADCCON = (rADCCON & (0x7<<3)|(0x0<<3);/选择转化通道rADCCON = (rADCCON & (0x1ff<<6)|(0x1<<14)|(PRESCALE<<6);/设置转换频率void Adc_Start(void)rADCCON = (rADCCON & (0x1<

25、<0)|(0x1<<0);/开始AD转换while(rADCCON & 0x1);/已经开始转换了unsigned int Adc_GetVal(void)while(!(rADCCON & (0x1<<15);/等到AD转换结束return (rADCDAT0 & 0xfff);/返回AD转换的值附录5:主程序代码int main(void)char c;unsigned int ad,i;Port_Init(); Uart_Init(); Adc_Init(); Adc_Start(); ledFlow(); Uart_SendStri

26、ng("rn Hello ! Tiny6410 !rn"); Uart_SendString("rnt Hello ! Tiny6410 !rn"); Uart_SendString("rntt Hello ! Tiny6410 !rn"); sendMenu(); EINT_init();while(1) do c = getchar();if (c = 'n' | c = 'r')Uart_SendString("nr");elseputchar(c); while (c = 'n'

温馨提示

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

评论

0/150

提交评论