嵌入式系统及应用开放性实验报告题目:0-50mV直流电压采集专业名称:电气工程及其自动化学生姓名:班级:时间:2016-12-14得分:第一章实验内容基于ARM的0-50mV直流电压采集1具体要求在ARM开发板AD功能基础上,自行搭建相应的调理电路,完成0-50mV直流电压的采集并给出相应的演示效果。2总体设计方案首先通过对实验室提供的5V直流电进行分压得到0-50mV之间的直流电压,再将分得电压放大到接近3V,输入到AD模块。通过AD采样与串口通信将数据传入PC机,通过串口调试软件查看数据。第二章具体设计2.1调理电路2.1.1调理电路总电路图图2-1调理电路图2.1.2电路各部分阐述使用200Ω滑动变阻器与20kΩ电阻对5V直流电源进行分压,则电位计输出电压最大为:(2-1)可知电位计输出电压大约在0-50mV之间。为防止后续电路对电位计分压产生影响,需使用电压跟随器来进行隔离,设计时使用的是实验室提供的LM358中的一个运算放大器。由于ADC模块上的模拟复用管脚能承受的电压为3.3V,所以50mV输入相对较小且会导致最后显示结果不精确,所以需要将其放大。设计时使用LM358的另一个运算放大器,如图3-2设计放大电路,则放大倍数为:(2-2)放大器输出电压为:(2-3)此电压即为AD模块的输入电压。2.1.3保护电路设计图2-2加入保护电路的调理电路图保护电路主要是为了防止输入到AD模块的电压高于3.3V,设计方案如下:使用常闭继电器,传输端分别接需要传输的电压信号和AD模块,控制端接比较器的输出。将要输入给AD模块的电压Vo与3.3V电压做比较,当Vo3.3V时,比较器输出低电平,继电器保持常闭状态,电压信号Vo正常传输;当Vo3.3V时,比较器输出高电平,继电器触发而关断,电压信号Vo停止传输。其中比较器可使用LM358中的运算放大器,3.3V比较电压由5V经实验室提供的B0503S-1WR2模块转换而成。常闭继电器可使用HH52P–DC24V,传输中断的同时,继电器上的红灯会亮起,起到报警作用。上述保护电路主要是应对5V输入电压由旋转式调节旋钮控制的直流电压源提供且操作者将电压源输出调得很大的极端情况。由于实验室提供的电源是5V确定输出,调理电路输出电压不会超过3V,所以就本次实验而言可不加保护电路。2.2程序设计2.2.1设计思路概述0-50mV电压采集实验与第三次实验——环境温度采样通信很接近,区别主要在于实验三用到的是与热敏电阻固定匹配的AD0.0,而综合性实验使用的是AD0.1或其他未被占用的通道。在主函数中,首先需要对各外设及其寄存器进行初始化设置,主要包括AD相关寄存器的设置、UART0的设置、定时器设置和中断的设置。在while循环中,启动AD转换,通过AD全局寄存器AD0GDR的高四位是否置1判断AD转换是否完成,完成后停止AD转换,则AD0GDR的6-15位存储了转换结果,实验中将其值右移六位与0x03FF相与可得到将转换结果移动到低十位且其余位为0的addata。将addata与0xff相与则得到低八位addata1,将addata右移八位后与0xff相与则得到含有八、九两位的高八位addata2。定时时间设置为0.5s,则每隔0.5s进入中断,将addata1与addata2依次输出。退出中断后继续while循环的AD采样转换。采集结果可以通过串口调试软件查看,将此结果转换为十进制进行比例换算便可得出电位计上的分压。2.2.2程序流程图图2-3程序流程图2.2.3程序代码#includeLPC23xx.H#defineFpclk12000000//12MHzunsignedintaddata=0;unsignedintaddata1=0;unsignedintaddata2=0;unsignedlongbaudrate=57600;//9600;unsignedlongFdiv;voiddelay(unsignedintdly){unsignedinti;for(;dly0;dly--)for(i=0;i50000;i++);}void__irqIRQ_Timer0(void){U0THR=addata1;//发送保持寄存器delay(10);U0THR=addata2;T0IR=0x01;//清楚中断标志VICVectAddr=0x00;//通知VIC中断处理结束,更新VIC}intmain(void){PINSEL10=0;//禁止ETM/*定时器0设定*/T0TC=0;//定时器0的计数器清0T0PR=0;//时钟不预分频T0MCR=0x03;//设置T0MR0匹配后复位T0TC,并产生中断标志T0MR0=6000000;//TIM0的PCLK=CCLK/4=48/4=12M,//设定T0MR0为6M,每0.5s状态变换一次T0TCR=0x01;//启动定时器/*设置IRQTIM0中断对应的是VIC中断通道的中断向量4*/VICIntSelect=0x00;//所有中断通道都设置为IRQ中断VICVectPriority4=00;//设置中断向量4的优先级为0级VICVectAddr4=(unsignedint)IRQ_Timer0;//设置中断向量4的中断程序地址为TIM0中断VICIntEnable=10x04;//使能中断向量4,即允许定时器0中断PINSEL0=0x00000050;/*RxD0andTxD0*/U0LCR=0x83;/*8bits,noParity,1Stopbit允许访问除数锁存*/Fdiv=(Fpclk/16)/baudrate;/*baudrate*/U0DLM=Fdiv/256;//除数高八位U0DLL=Fdiv%256;//除数低八位U0LCR=0x03;/*禁止访问除数锁存*/U0FCR=0x07;//FIFO使能,清空读写缓存U0IER=0x07;/*EnableUART0interrupt*/PCONP|=(112);//AD外设ON//硬件连接关系:AD0.1即P0.24接入外加电压PINSEL1=0x00010000;//P0.24功能设定为AD0.1while(1){AD0CR=0x01000002|0x00200300;//A/D:10位AD时钟为PCLK/(3+1)=12/4=3MHz,启动ADdo{addata=AD0GDR;//读AD全局寄存器}while((addata&0x80000000)==0);//判断AD是否转换完成AD0CR&=~0x01000002;//AD0CR的最低位与第七位清零,停止AD运行addata=(addata6)&0x03FF;//获取AD值,得到存储转换结果的十位addata1=addata&0xff;//获取低八位addata2=(addata8)&0xff;//获取高两位}}第三章实验结果分析3.1实验步骤简述使用5V直流电对调理电路和开发板供电,调节滑动变阻器,使用万用表测出电位计输出电压和调理电路输出电压,测量结果分别如图3-1和图3-2,调节电位计输出电压,再测两组数据,测量结果为图3-3和图3-4,图3-5和图3-6。图3-1电位计输出电压1图3-2调理电路输出电压1图3-3电位计输出电压2图3-4调理电路输出电压2图3-5电位计输出电压3图3-6调理电路输出电压3经三次测量后串口调试助手显示结果如图3-7:图3-7串口调试软件显示结果3.2实验结果分析首先计算调理电路放大倍数:(3-1)(3-2)(3-3)(3-4)测量第一组数据时,由串口调试助手知AD转换结果为0x0115,则可求出输入AD模块的电压为:(3-5)与万用表测量值Vo1=0.901V相符;测量第二组数据时,由串口调试助手知AD转换结果为0x01A5,则可求出输入AD模块的电压为:(3-6)与万用表测量值Vo2=1.361V相符;测量第三组数据时,由串口调试助手知AD转换结果为0x0312,则可求出输入AD模块的电压为:(3-7)与万用表测量值Vo3=2.53V相符。计算可得三次采集误差分别为δ1=0.78%,δ2=0.22%,δ3=0.24%,可见不仅实现了电压采集,而且采集精度很高。在电位计输出电压未知的情况下,只要将串口调试助手显示结果通过计算求出输入AD模块的电压,再除以调理电路的放大倍数k就可以精确求出电位计输出的大小介于0-50mV间的电压值。第四章实验总结与感悟本次实验为0-50mV直流电压采集,硬件电路十分简单,短短一个晚上就焊好并完成了调理电路的测试。后来考虑了由于操作疏忽而造成的调理电路供电电压大于5V很多的极端情况,为此设计了保护电路。直接想法便是将输入AD模块的电压与3.3V相比较,如果小于后者,则允许输入,反之则阻断输入。立即想到了以前用过的常闭继电器,后来焊好了加入保护电路的调理电路。由于有实验三的铺垫,软件编程也困难较小,主要需要做的就是将相关寄存器设置由AD0.0改为AD0.1。但是实际操作时却发现测试时串口调试助手的输出一直是0000……。后来仔细查看代码才发现由于启动AD时将AD0CR的1位置1,所以停止AD时应该让此位清零,所以使用的语句应该是AD0CR&=~0x01000002,而AD0CR&=~0x01000001是停止AD0.0的。改正错误后测试成功,而且效果超出意外的好,精度很高。总的来说,这次实验自己收获很大,既锻炼了焊板子的动手能力,又加强了编程能力,进一步加深了对各寄存器的理解。代码中的那个错误也警示我编程时一定要仔细查看寄存器各位的说明,认真才能减少这种错误的发生。