




已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
武汉理工大学智能仪器课程设计说明书目录前言1一、总体方案设计与选择21、设计要求32、设计原理33、方案选择3二 硬件设计部分 41、AD转换电路设计 52、滤波器电路设计63、微处理器电路及外围电路设计64、按键扫描电路与报警电路设计65.显示电路设计66串口通信电路设计6三 软件设计部分61、按键扫描程序62、显示程序设计63、定时器中断程序64、串口通信程序65、AD转换程序设计66、数据处理程序6四 个人总结6附录1:完整程序清单6附录2:硬件连接图6附录3:软件流程图6参考文献6前言随着微电子技术的不断发展,集成了CPU、存储器、定时器/计数器、并行和串行接口、看门狗、前置放大器甚至A/D、D/A转换器等电路在一块芯片上的超大规模集成电路芯片(即单片机)出现了。以单片机为主体,将计算机技术与测量控制技术结合在一起,又组成了所谓的“智能化测量控制系统”,也就是智能仪器。为了在教学的过程中联系理论与实践,学校安排了这次课程设计。其旨在提高学生分析问题、解决的能力,了解智能仪器的发展趋势,拓宽知识面。为以后的学习、工作和科学研究打下扎实的理论和实践基础。一 总体方案设计与选择1、设计要求本次课程设计要求设计一个智能化的数据采集和电压监控系统,该系统以单片机为核心并具有如下功能:1、能对24v范围变化的模拟信号进行连续采样(模拟信号中有尖峰脉冲干扰和50Hz工频干扰)和实时数字显示,采样频率为10Hz,保存最近的50个连续采样值;2、当采样值小于2v时第一个报警灯闪烁,大于4v时第二个报警灯闪烁;3、能对存在的系统误差进行线性插值校正;4、能和上位机进行串行通信,根据上位机的要求随时将采样数据上传;5、能产生占空比为20%幅度为5v的50Hz 脉冲波供外设用。2、设计原理智能仪器由硬件和软件来那个大部分组成。硬件包括微处理器、存储器、输入通道、输出通道、人机接口电路、通信接口电路等部分。本次设计即从硬件和软件两部分来设计系统。硬件基本结构如下图所示 RS232USB本次设计硬件部分仅要求考虑输入通道、微处理器、人机接口电路和串口通信几部分。其中包括元器件的选择、相关电路参数的计算以及电路的连接。软件部分则要考虑AD转换、定时中断、串口通信以及数据分析与处理等部分。为满足设计要求,我的设计思路为:采用低通滤波器或采用50Hz陷波器对工频干扰信号进行滤除,然后利用AD转换器将模拟信号转换为数字信号送入微处理器进行分析预处理,同时微处理器利用软件滤波滤除尖峰脉冲干扰、进行人机接口交互、串口通信以及产生占空比位20%的50Hz的脉冲波供外部使用。滤波器我们可以采用数字滤波器,也可以采用模拟滤波器;为保证1mv的分辨率我们可以选择量程为4V分辨率为12Bit的AD转换器,也可采用量程为5V分辨率为16Bit的AD转换器;微处理器我们可以从51、ARM和DSP等微处理器中选择;对于显示部分我们可以利用数码管或者液晶屏显示,也可通过led点阵显示;对于串口同行我们可以使用RS232或者USB。3、方案选择在本次设计中我采用50Hz陷波器进行滤除50Hz工频干扰,利用5V量程的16Bit分辨率AD转换器;微处理器采用51单片机;显示部分利用数码管显示;串口通信利用RS232通信。软件部分采用中间值滤波去除尖峰干扰。详情请见硬件设计部分和软件设计部分二 硬件设计部分1、AD转换电路设计在设计中我采用的是5V量程16Bit的AD转换器AD7705BR。AD7705是一种片内带数字滤波的-A/D转换器,它包括一个-(或电荷平衡)ADC、片内带静态RAM的校准微控制器、时钟振荡器、数字滤波器和一个双向串行通信端口。 AD7705包括2个可编程增益全差分模拟输入通道,输入通道的可选增益为1、2、4、8、16、32、64和128。输入到模拟输入端的信号被持续采样,采样频率由主时钟 MCLKIN的频率和选定的增益决定。模拟输入端的可编程增益功能配合-调制器,修正输入的采样频率,以获得更高的增益。AD7705还具有自校准功能和手动校准功能。 AD7705的数字滤波器是一个Sinc3低通滤波器,它处理-调制器的输出并以一定的速率更新输出寄存器,这速率由滤波器 第一个陷波的频率决定。数字滤波器的第一个陷波频率(以及-3dB频率)可以通过设置寄存器的FS0和FS1编程。当主时钟的频率为2.4576MHz时,第一陷波频率的可编程范围为50Hz500Hz,-3dB频率的范围为13.1Hz131Hz。主时钟频率为1MHz时,第一陷波频率的可编程范围为20Hz200Hz,-3dB频率的范围为5.24Hz52.4Hz。)下图表示了AD7705可设置的输出更新率和截止频率。(注1)图1.AD7705输出更新率(陷波频率)设置下图表示当设置输出更新率为60Hz时增益-频率图:图2.增益-频率图因此我们可以利用微处理器的控制功能来设置不同的输出更新率来控制低通滤波器的的截止频率和陷波器的陷波频率。这也是我选用这款芯片的原因。它集成的低通滤波器和陷波器不仅使电路结构更为简单,测量更为准确,价格也更加低廉。图3表示的是AD7705的电路连接图:图3.AD转换电路图2、滤波器电路设计由于AD7705中带有一个数字低通滤波器,顾可以不用考虑滤波器部分,仅仅用软件修改几个参数就可以控制滤波器的截止频率和陷波频率,详情请见AD转换电路设计和AD转换软件设计。3、微处理器电路及外围电路设计在这次设计中我采用的是51系列单片机,我选用的型号是STC90C516RD。在这个系统中我们需要存储50个采样数据,而对于我用的16位AD转换器来说需占用100个字节的空间,而且进行数据运算也需要大量的存储空间,同时也为了以后有更好的升级空间,对于仅有128字节的51单片机就有点相形见绌了。我所采用的STC90C516在芯片内部扩展了64Kb的程序存储空间和1Kb的数据存储空间,而且完全兼容传统的80C51系列单片机。这款单片机完全能满足该系统的需求。其电路连接图如下:图4.MCU电路连接图微处理器必须有一些外围电路才可以正常工作,比如必备的时钟电路,复位电路。单片机的P0口为数据线与地址线共用的三态IO口,如果用它做普通IO是还必须外接上拉电阻。其电路图如下所示:图5.时钟电路连接图 图6.复位电路图 图7.上拉电阻连接图4、按键扫描电路与报警电路设计虽然AD7705具有自动校准功能,但为了更准确的校准数据,我才用了手动校准功能。这里我设计了两个按键用来提供校准的选择功能。在校准时输入校准电压后也必须按确认键才能校准下一个电压(需要校准零电压和基准电压)。由于按键比较少,我们采用独立按键的方式连接。在电压小于2V或大于4V需要有提示电压范围错误,我采用蜂鸣器来报警进行提示。电路连接图如下: 图8.按键扫描电路 图9.蜂鸣器驱动电路5.显示电路设计显示部分采用4位8段数码管进行显示,其电路连接图如下所示:图10.显示电路连接图其中38译码器来控制位选,P0口决定输出的字形。6串口通信电路设计单片机具有串口通信功能,其基于RS232通信协议。但单片机的输出电平为TTL电平,位05V,而RS232总线电压远远高于这个值,因此需要一个电平转换元件。这里采用的是MAX232,它可以将TTL电平与RS232电平进行转换。其电路连接图如下:图12.RS232电路连接图至此所有的硬件电路就完成了,接下来的就是软件部分了。三 软件设计部分1、按键扫描程序图13.按键扫描程序流程图2、显示程序设计在显示部分我采用38译码器进行位选,用P0口进行字选。其程序如下:void display(INT8U date,INT8U bite,INT8U mode)bite=bite2;/左移两位BITE=BITE&0xE3;BITE=BITE|bite; /输出位选信号if(mode=0)DATE=tabledate; /输出字形if(mode=1)DATE=chdate;if(mode=2)DATE=table1date;该函数实现的功能在在某一位数码管显示某一字形,其中模式包括显示数字、显示带小数点的数字以及显示表示运行状态的字符三种。在显示电压值等过程中经常被调用3、定时器中断程序在程序中我采用定时器0工作为方式1,利用中断产生占空比为20%的50Hz的脉冲信号,同时也控制AD转换器进行10Hz的转换。在考虑串口通信问题,我采用了11.0592M的晶振,以2ms为时基进行一次中断,由此可确定写入计数器的初值:T=1211.0592M=1.085usN=(65535-20001.085)63692化为16进制数位0xF8CC。中断程序如下:void Time0_handdle() interrupt 1TH0 = 0xF8;/装计数器初值TL0 = 0xCC;beat+;if(beat%10=2) pwm=0; /输出低电平if(beat%10=0) pwm=1; /输出高电平if(beat=50)/开启转换开关start=1;beat=0;该函数实现的功能是每逢10个时基(2ms)中,前两个时基显示高电平,然后把电平拉低,后8个时基显示低电平,然后把电平拉高。这样就输出了占空比20%的50Hz的外部脉冲,同时每50个时基后把AD转换开关打开。4、串口通信程序在程序中我使能了串口的发送与接收功能,并通过串口的接收功能来实现对系统的简单控制(类似于按键)。在串口通信程序中我设置为模式1;定时器1采用模式2,波特率设为9600,由查表可知计数初值为0xFD。中断程序如下:void usart_handdle() interrupt 4if(RI=1)RI=0;COM=SBUF;if(TI=1)该函数实现的功能是不停地想上位机发送提示信息,表示程序运行的状态,在可按键操作时也可通过想串口发送数据进行控制。其中发送字符采用查询方式,接收字符采用中断方式。5、AD转换程序设计系统采用的AD转换器由基于SPI协议的串口总线控制。但由于单片机没有SPI控制器,故需要利用单片机的IO口来模拟SPI总线协议。此外由于AD转换器具有自动校准和数字滤波功能,需要在利用AD转换器的时候对AD转换器进行初始化。其程序如下:void write_date(uchar cmd)uchar i;DATA=1;CLK=1;for(i=0;i8;i+)/循环写入8个数据CLK=0;_Nop();_Nop();_Nop();if(cmd&0x80)DATA=1;/如果最高位为1就输出1elseDATA=0;CLK=1;_Nop();_Nop();_Nop();cmd=cmd1;DATA=1;/拉高数据线是系统更可靠/读AD的采样值(16位)uint read_date()uint ad;uchar i;write_date(0x38);/ 选通数据寄存器,确定下次读取数据寄存器CLK=1;ad=0x0000;for(i=0;i16;i+)/循环读16次串口数据ad=ad1;CLK=0;_Nop();if(DATA)ad=ad|0x0001;CLK=1;CLK=1;DATA=1;return ad ;上面两个程序为利用IO端口模拟SPI协议来对AD7705进行控制的程序。void AD7705_Init()uchar i;CLK=1;/时钟和数据线都拉高确保可靠DATA=1;for(i=0;i40;i+)/数据拉高连续超过32个时钟信号完成AD复位CLK=0;_nop_();CLK=1;_nop_();delay(1200);DATA=1;write_date(0x20);/选通数据寄存器,确定下次往时钟寄存器中写值write_date(0x04);/设置数据输出刷新率为50HZ,CLK=0,FS1=0,FS0=0write_date(0x10);/选通数据寄存器,确定下次往设置寄存器中写值write_date(0x04);/不校正,增益1,单极性,无缓冲,不同步上述程序为AD7705初始化程序,其中将CLK,FS1和FS0位设为1,0,0;由图1可知AD转换器的截止频率为13.1Hz,陷波频率为50Hz,可以去除工频脉冲。6、数据处理程序在程序中我采用中间值滤波法滤除尖峰脉冲。具体实现过程如下:val_rec=read_date();/接收最新数据数据start=0;checkcheck_head=val_rec; /将最新的数据替换check数组最旧的值check_head+; /修改check首地址if(check_head=size)check_head=0;for(i=0;isize;i+) /中间值滤波for(j=i+1;jsize;j+)if(checkicheckj)checki=val_rec;checki=checkj;checkj=val_rec;valval_head=checksize/2; /将中间值存储val_head+;if(val_head=50)val_head=0;该部分采用的中值滤波法利用size个采样值进行排序,并将中间值作为有效的测量值进行存储。至此,主要的程序部分就设计完成了。完整程序请见附录。最终系统设计完成的功能为:在上电后数码管提示字符“P”,表示此时为初始状态,用户可通过按键或利用上位机向系统发送数据来选择是否进入手动校准模式;在手动手动校准模式后会显示字符“L”提示请输入零点电压,并想上位机发送提示信息;在按下按键或发送字符选择确定后显示“H”以提示请输入基准电压并向上位机发送提示信息;然后按下确认键或发送字符后如主程序,测量外部电压并将电压值发送至上位机。在等待按键期间按下取消键则可直接进入主循环。以下为程序仿真图:图14上位机通信界面四 个人总结经过这次课程设计,我感觉收获甚多。最为重要的是我认识到了自己的不足。在刚开始准备做实物的时候我就考虑到自己的单片机开发板硬件功能不强。一般板载的AD芯片无法满足测量24V电压,分辨为1mv的要求。当我匆匆的赶到电子元器件广场,买回一大堆元器件之后,我就陷入了困境之中。自己的动手能是实在太弱了,面对以一堆元器件我无法将他们组成自己想要的电路。特别是还有一个SOICR-16封装的AD7705,由于芯片很小,我无法将它焊在板子上。后来匆匆赶到电子市场,请别人帮我焊上去。我一直对自己对单片机的内核和c语言的编程感到自豪的,但经历了这次课设,我发现了很多问题。对于嵌入式系统来说,硬件和软件是密不可分的。仅仅了解硬件或软件都无法完成一个系统的设计。对于一个系统的设计最为重要的并不是你如何的精通一门知识,而是你如何将你所学会的知识应用到实践中。要有一份清晰的设计流程。在设计程序中不能妄想一次就将整个内容设计好,反复修改。不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人能一看就能明白你的思路。通过这次课程设计,我懂得了学习的重要性,更加明白了理论知识与实践相结合的重要意义,学会了坚持、耐心和努力,这将为自己今后的学习的工作做出来最好的榜样。附录1:完整程序清单/Mytypedef.h#ifndef _MYTYPEDEF_H_#define _MYTYPEDEF_H_#define uchar unsigned char#define uint unsigned int/*Data type definations*/typedef unsigned char INT8U;typedef signed char INT8S;typedef unsigned int INT16U;typedef signed int INT16S;typedef unsigned long INT32U;typedef signed long INT32S;#endif/_MYTYPEDEF_H_/main.c#include#include key.h#include ad.h#includetime.h#includeusart.h#define size 5char code *p1=date is clloceting,please wait for some scondn;char code *p2=please enter 0n;char code *p3=please enter 5n;char code *p4=the voltage is too larger!n;char code *p5=the voltage is too small!n;char code *p6=the date is:;INT8U key=0;INT16U v0,vr;float a0=0;float ar=0.0195;INT16U val50;INT16U checksize;INT16U val_rec;INT8U val_head=0,check_head;INT32U sum;INT16U val_ave;INT32U val_out;void Main(void)bit En=0;INT8U i,j=0;INT8U qian,bai,shi,ge;Time0_Init();usartinit();AD7705_Init(); /AD初始化display(0,0,1); /显示开始send(this is a collect systerm!n); /发送字符串 while(key=0&COM!=Y&COM!=y&COM!=n&COM!=N)/检测是否有按键按下或接受到字符 key=keyscan();/扫描按键 if(key=1|COM=y|COM=Y)/按下确认键 send(p2);/显示“请输入零电压” display(1,7,1);keyinit;/按键初始化COMINIT;/接受字符初始化while(key=0&COM!=Y&COM!=y&COM!=n&COM!=N)key=keyscan();if(key=1|COM=y|COM=Y)while(READY=1);/判断数据是否可读v0=read_date();/测试零点电压校正零点误差display(2,7,1);send(p3); /发送“输入高电平”keyinit;COMINIT;while(key=0&COM!=Y&COM!=y&COM!=n&COM!=N)key=keyscan();if(key=1|COM=y|COM=Y)while(READY=1);/测试基准电压vr=read_date();/校正基准电压ar=5.0/(vr-v0);/计算校正值a0=ar*v0;else ;/按下取消键else ; else ; send(p1);/发送“正在采集数据” for(i=0;isize;i+) /将最近的5个数据保存到check数组中while(READY=1);checki=read_date(); while(1) if(start) /扫描启动信号 j+;if(j=100) /设置发送频率j=0;En=1; while(READY=1);val_rec=read_date();start=0;checkcheck_head=val_rec; /将最新的数据输入check数组check_head+; /修改check首地址if(check_head=size)check_head=0;for(i=0;isize;i+) /中间值滤波for(j=i+1;jsize;j+)if(checkicheckj)checki=val_rec;checki=checkj;checkj=val_rec;valval_head=checksize/2; /将中间值存储val_head+;if(val_head=50)val_head=0; val_ave=valval_head; /输出平均值 val_out=(val_ave*ar+a0)*1000; if(val_out4000) beep=!beep;if(En)send(p4); qian=val_out/1000; /分位显示 bai=val_out%1000/100; shi=val_out%100/10; ge=val_out%10; display(qian,4,2);/显示电压 delay_ms(1); display(bai,5,0); delay_ms(1); display(shi,6,0); delay_ms(1); display(ge,7,0); delay_ms(1); if(En) /发送电压值 En=0; send(p6);sendchar(qian+48);sendchar(.);sendchar(bai+48);sendchar(shi+48);sendchar(ge+48);sendchar(V);sendchar(n); /key.h#ifndef _key_h#define _key_h#include #include MyTypeDef.h#define uchar unsigned char#define uint unsigned int#define keyinit key=0#define DATE P0#define BITE P2sbit KEY1=P10;sbit KEY2=P11;sbit beep=P12;void delay_ms(unsigned char del); INT8U keyscan(void); void display(INT8U date,INT8U bite,INT8U mode);#endif/key.c#includekey.huchar code table10=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;uchar code table110=0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef;uchar code ch=0x73,0x38,0x76,0x80;/p l hvoid delay_ms(unsigned char del)unsigned int i,j;for(i=0; idel; i+)for(j=0; j182; j+) ;unsigned char keyscan(void)if(KEY1=0 | KEY2=0)delay_ms(10); /20毫秒软件防抖if(KEY1 = 0) while(KEY1=0 ); /等待KEY1被释放return 1;if(KEY2 = 0)while(KEY2=0 );return 2;return 0;void display(INT8U date,INT8U bite,INT8U mode)bite=bite2;/左移两位BITE=BITE&0xE3;BITE=BITE|bite; /输出位选信号if(mode=0)DATE=tabledate; /输出字形if(mode=1)DATE=chdate;if(mode=2)DATE=table1date;/time.h#ifndef _time_h#define _time_h#include#includeMyTypeDef.hextern bit start;sbit pwm=P16;extern INT8U beat;void Time0_Init();#endif/time.c#includetime.hINT8U beat=0;bit start;/*定时器0初始化,方式1,延时2ms*/void Time0_Init()TMOD = 0x01;TH0 = 0xF8;TL0 = 0xCC;IE = 0x82;TR0 = 1;void Time0_handdle() interrupt 1TH0 = 0xF8;TL0 = 0xCC;beat+;if(beat%10=2) pwm=0; /输出低电平if(beat%10=0) pwm=1; /输出高电平if(beat=50) /开启转换开关 start=1;beat=0;/usart.h#ifndef _usart_h#define _usart_h#define COMINIT COM=0extern char COM; void send(char *p);void usartinit();void sendchar(char m);#endif/usart.c#includeusart.h#include char COM=0;/*串口初始化函数,晶振位11.0592M,波特率为9600*/void usartinit() TMOD = 0x20; PCON = 0x00; SCON = 0x50; TH1 = 0xFd; TL1 = 0xFd; TR1 = 1; ES=1;/*发送字符串函数*/void send(char *p)char buf;buf=*p;while(buf!=0)SBUF=buf;while(!TI); /等待发送完成TI=0;buf=*(+p);/*发送单个字符函数*/void sendchar(char m)SBUF=m;while(!TI);/等待发送完成TI=0;void usart_handdle() interrupt 4if(RI=1)RI=0;COM=SBUF;if(TI=1)/ad.h#ifndef _AD_H#define _AD_Hsbit CLK=P13;sbit DATA=P14;sbit RE
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 兴趣电商考试题及答案
- 2025年初二数学期中试卷及答案
- 井控坐岗考试试题及答案
- 2025年应急应按试题及答案
- TUV氢安全培训课件
- Travel课题课件教学课件
- 2025年新定义的题目及答案
- 【感恩教育】教师节主题班会《有一种炫耀是“我的老师很严格”》逐字稿
- qrqc安全培训记录课件
- 2025年长沙中考方言题目及答案
- 留学生中国文化课课件
- (完整版)抛丸机安全操作规程
- 电子工程师(PCB设计)笔试试题及答案
- 呼吸衰竭个案护理
- 2025年森林植被恢复费森林抚育项目方案投标文件(技术方案)
- 数字人民币推广专员考试试卷及答案
- 新车销售培训课件
- 中学群团工作管理制度
- Q-GDW10250-2025 输变电工程建设安全文明施工规程
- 物流车队轮胎管理制度
- 碳化硅项目可行性分析报告
评论
0/150
提交评论