嵌入式系统设计实验_第1页
嵌入式系统设计实验_第2页
嵌入式系统设计实验_第3页
嵌入式系统设计实验_第4页
嵌入式系统设计实验_第5页
已阅读5页,还剩10页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

PAGE5嵌入式系统设计实验考试报告课题题目:基于ARM的失重称实验姓名:乔乔日期:2012-目录TOC\o"1-4"\h\u39一、设计内容 1133421.1实验考试目的 132165二、设计方案 2143992.1实验考试设计要求 2114122.2方案论证 326137三、硬件设计 3115653.1设计思路 360073.2系统电路原理 427473.2.1稳压电源电路 421673.2.2可调电源的电路图 4324743.2.3键盘输入与显示电路 5108393.2.4差动信号放大电路 69119四、软件设计 734544.1设计思路 7132904.2程序清单 8一、设计内容1.1实验考试目的1、注重培养综合运用所学知识、独立分析和解决实际问题的能力,培养创新意识和创新能力,并获得科学研究的基础训练。2、了解所选择的ARM9芯片各个引脚功能,工作方式,计数/定时,I/O口,中断等的相关原理,并巩固学习嵌入式的相关内容知识。3、通过软硬件设计实现利用ARM9芯片来完成失重称的设计。二、设计方案2.1实验考试设计要求1、查阅相关文献资料,熟悉所选ARM9芯片及所选择的各个器件。2、总体设计方案规划3、系统硬件设计,包括键盘输入和显示等相关以及重力的变化转换为电压的变化等。4、系统软件设计,包括完成对外部输入信号的AD采样并且将所测得的重量通过SPI发送到键盘显示板上进行显示等。用c语言编程。5、设计心得体会及总结2.2方案论证有许多客观需求促进了ARM处理器的设计改进。首先,便携式的嵌入式系统往往需要电池供电。为降低功耗,ARM处理器已被特殊设计成较小的核,从而延长了电池的使用时间。高的代码密度是嵌入式系统的又一个重要需求。由于成本问题和物理尺寸的限制,嵌入式系统的存储器是很有限的。所以,高的代码密度对于那些只限于在板存储器的应用是非常有帮助的。另外,嵌入式系统通常都是价格敏感的,因此一般都使用速度不高、成本较低的存储器。ARM内核不是一个纯粹的RISC体系结构,这是为了使它能够更好的适应其主要应用领域--嵌入式系统。在某种意义上,甚至可以认为ARM内核的成功,正是因为它没有在RISC的概念上沉入太深。现在系统的关键并不在于单纯的处理器速度,而在于有效的系统性能和功耗。在本实验方案的设计过程中,根据嵌入式系统的基本设计思想,系统采用了模块化的设计方法,并且根据系统的功能要求和技术指标,系统遵循自上而下、由大到小、由粗到细的设计思想,按照系统的功能层次,在设计中把硬件和软件分成若干功能模块分别设计和调试,然后全部连接起来统调。三、硬件设计3.1设计思路1、输出12V的直流稳压电源为传感器供电,输出为3.3V的直流电源为逻辑控制器供电。2、设计出键盘输入与显示电路(键盘显示板),用来显示当前的重量。3、将托盘的重力转换为电压输出,并对输出的差动信号放大。4、运用逻辑控制器将输出放大信号进行A/D采样,完成自动校零与自动校满,并将重量在键盘显示板上进行显示与通过键盘显示板控制系统的运行。3.2系统电路原理在本系统中需要两种不同电压值的直流电源,分别为12V和3.3V。采用LM7812作为电桥及放大电路的供电稳压管。选择LM317将其输出调为3.3V为逻辑控制器件提供电压。运算放大器采用LM324以及移位寄存器采用74LS164。3.2.1稳压电源电路图1为12V稳压电源的电路图。经过变压器后将220V的市电降压为16V的交流电,经过C1将交流电中的高次谐波过滤后接入到整流桥整流后再经过1000uF的C2和220uF的C3平波后接入稳压管LM7812,后面输出为稳定的12V直流压,C4和C5的作用是进一步滤除直流电压中的高频交流成分,使电源更稳定。图1.12V稳压电源的电路图3.2.2可调电源的电路图图2为运用LM317输出可调电源的电路图。将经过LM7812稳压输出的12V电压输入到该电路的端,经电容C1滤波后送入LM317第3脚(输入端),二脚输出稳定的直流电压,调正端(一脚)与输出端的电压为1.25V的基准电压为了保证稳压管的输出特性,R1的电阻应小于240Ω。为了输出电压可调,调整端与地之间接可变电阻器R2,调节R2的值可将输出电压调整为3.3V。输出电压的计算公式为:电路中C1是为了滤除输入电压存在的交流成分,C3是为了旁路基准电压的纹波,提高电源的纹波抑制性能。图2.LM317输出可调电源3.2.3键盘输入与显示电路图3为键盘输入与显示的电路图。数据通过JP1接口中的DATA在CLK的上升沿作用下以串行的方式输入到移位寄存器,可以将CLK端接在SPI的时钟端上,将DATA端接在SPI的MOSI(主出从入)端口上,这样通过SPI就能将所要存入移位寄存器的数发送出去。从图中可见,第一片移位寄存器控制的是数码管的位码,第二位移位寄存器控制的是数码管的段码。因此,在SPI发送数据时应该先将8位段码发送到第一片寄存器中,然后发送8位位码。这样,第一片寄存器中的段码被移入到第二片中,第一片寄存器中保存的是数码管的位码。同时,8个按键的公共端是通过上拉电阻电阻R9接到VCC,而且在JP1中还有一个端口KEY作为按键到ARM的输入端。图3键盘显示板电路3.2.4差动信号放大电路将3个差动信号的正负分别通过10KΩ的电阻接入到运算放大器的正负端,就会通过第一级差动放大器将差动信号放大10倍,然后放大信号输入到第二级的放大电路。电路里接入了一个滑动变阻器,用于调节输出信号的零点。在电路的最后接入了一个470uF的平波电容,是为了使输出的信号更加稳定,减少各种因素带来的电路输出信号的波动。图4为用于对输入的差动电压信号进行放大的电路。图4.差动信号放大电路四、软件设计4.1设计思路本系统软件部分的主要功能是完成对外部输入信号的AD采样,并且在对重量自校零和校满后使AD值与重量的量纲相对应,并且将所测得的重量通过SPI发送到键盘显示板上进行显示,其流程图(图6)如下:图6.程序流程图4.2程序清单#include"config.h"uint8constwm[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};uint8constdm[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};uint8constM_8pai[8]={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09};uint8data_buf[8];uint32xs_cs=0; //需要显示的数值uint32ADC_Data=0;uint8count; //正在发送第几位段码 uint32time_ds=0; //定时共用变量uint8time_20ms_flag=0; //定时20ms标志uint8time_2ms_flag=0; //2ms定时标志uint8key_n=9; //保存第几号键被按下//********************************************************************uint8dw0(uint8n) //对IO0PIN第n位进行读操作{ uint8i; if((IO0PIN&(1<<n))==0)i=0; elsei=1; returni;}//*****************************************************************voidDelayNS(uint32dly) //长软件延时{ uint32i; for(;dly>0;dly--) for(i=0;i<5000;i++);}//*****************************************************************uint8key_sm(void) //按键函数,在使用完key_n后{ //要将key_n置为大于7的数 uint8statickey; uint8statickey_befor=0,key_now=0,ax_flag=0; key_befor=key_now; key_now=dw0(3); if((key_befor==1)&&(key_now==0)&&(ax_flag==0)) { ax_flag=1; key=count; } if((key_befor==1)&&(key_now==1)&&(ax_flag==1)&&(key==count)) {ax_flag=0;returnkey; } return9;}//*****************************************************************voidad_int(void) //AD初始化函数{ PINSEL1=1<<28; //P0.30连接到AD0.3 /*进行ADC模块设置*/ AD0CR=(1<<3) | //SEL=8,选择通道3 ((Fpclk/1000000-1)<<8) | //转换时钟为1MHz (0<<16) | //BURST=0,软件控制转换操作 (0<<17) | //CLKS=0,使用11clock转换 (1<<21) | //PDN=1,正常工作模式 (0<<22) | //TEST1:0=00,正常工作模式 (1<<24) | //START=1,直接启动ADC转换 (0<<27); //直接启动ADC转换时,此位无效 DelayNS(10); ADC_Data=AD0DR; //读取ADC结果并清除DONE标志位}//*****************************************************************voidbin_bcd(uint32xs_data) //二进制转BCD码函数{ uint32sum; uint8i; sum=xs_data; for(i=0;i<8;i++) { data_buf[i]=sum%10; sum=sum/10; }//****************************************************************voidtimer0int(void) //定时器初始化函数{ T0TC=0; T0PR=0; T0MCR=0x03; T0MR0=Fpclk/500; //定时为2ms T0TCR=0x01;}//*****************************************************************voidmspi_send(uint8data) //spi发送程序{ S0PDR=data; while((S0PSR&0x80)==0);}//*****************************************************************void__irqtimer0_isr(void) //定时器0中断服务程序,发送数据{ mspi_send(dm[data_buf[count]]); //发送段码mspi_send(~(wm[count])); //发送位码,数码管共阴,按位取反 key_n=key_sm(); //按键返回部分 count++; //发送下一个if(count>=8)count=0;time_2ms_flag=1; //2ms定时,置1time_ds++;if(time_ds>=5001) //最长定时10s time_ds=0;if(time_ds%10==0) //20ms定时 time_20ms_flag=1; T0IR=0x01; VICVectAddr=0x00;}//*****************************************************************voidvic_timer0_int(void) //定时器0中断初始化函数{ VICIntSelect&=~1<<4; VICVectCntl0=0x20|4; VICVectAddr0=(uint32)timer0_isr; VICIntEnable|=1<<4; IRQEnable();}//*****************************************************************voidmspi_int(void) //SPI初始化函数{ PINSEL0=(PINSEL0&(~(0xFF<<8)))|(0x55<<8); S0PCR=(0<<3)| (1<<4)|(1<<5)|(0<<6)|(0<<7); S0PCCR=10;}intmain(void){ uint8key_7_n=0; uint16adc_base=0; uint16adc_base_400=0; uint8adc_count=0; uint16ad_data_50=0; //求50平均值后的AD值 uint16zl_g=0; //重量,单位为g uint32adc_data_buf=0; PINSEL0&=~(3<<6); //将p0.3设为gpio IO0DIR&=~(1<<3); //p0.3设为输入功能 PINSEL2&=~(1<<3); //选择P1.16~P1.25为GPIO功能 IO1DIR|=0xFF<<18; //将P1.18~P1.25设为输出功能 IO1CLR|=0xFF<<18; //输出低电平 timer0int(); vic_timer0_int(); mspi_int(); ad_int(); while(1) { if(time_20ms_flag==1) { time_20ms_flag=0; if(adc_count<50) { AD0CR|=1<<24; //进行第一次转换 while((ADDR&0x80000000)==0); //等待转换结束 AD0CR|=1<<24; //再次启动转换 while((AD0DR&0x80000000)==0); //等待转换结束 ADC_Data=AD0DR; //读取ADC结果 ADC_Data=(ADC_Data>>6)&0x3ff; ADC_Data=ADC_Data*2480; //参考电压经过3/4分压 ADC_Data=ADC_Data/1024; adc_data_buf+=ADC_Data; adc_count++; } else {adc_count=0; ad_data_50=adc_data_buf/50; adc_data_buf=0; } } if(key_n==0) { key_n=9; key_7_n++; if(key_7_n==1) //按下第一次记下AD基数 adc_base=ad_data_50; if(key_7_n==2) { adc_base_400=ad_data_50;//按下第二次,记下AD key_7_n=0;

温馨提示

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

评论

0/150

提交评论