组简易示波器_第1页
组简易示波器_第2页
组简易示波器_第3页
组简易示波器_第4页
组简易示波器_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

1、设计报告课 题: 简易示波器设计者: 何金平、赵颖、庄伟彬指导老师:白炳良、王灵芝、陈育群日 期: 2013-8-13摘要:本系统以单片机MPS430为控制核心的简易示波器设计。由NE5532构成的电影跟随器经CD4051进行程控放大,再进NE5532构成的偏置电路得到输出波形。关键字:电压跟随器;程控放大;反相比例放大电路;偏置电路。 III目 录1系统设计1.1设计要求1.2方案论证及选择1.2.1AD转换1.2.2采集数据的存储1.3系统框图2设计单元2.1程控放大电路2.2偏置电路2.3工作原理3测量数据3.1三角波的测量3.2正弦波的测量3.3方波的测量4程序设计5参考文献6附录6.

2、1PCB图1系统设计1.1设计要求基本要求:1、液晶显示屏显示输入的波形(频率200-10KHZ,Vpp=2V的正弦波、三角波、方波)。2、显示输入波的峰峰值、频率。3、显示可用TFT彩屏或12864。发挥部分:1、能显示的频率>1KHZ;2、显示时基可调;3、Y轴灵敏度可调;4、触发方式可调; 1.2方案论证及选择1.2.1AD转换 方案一:信号数据采集器件采用的是A/D转换器ADC0832。ADC0832 为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在05V之间。芯片转换时间仅为32S,据有双

3、数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。通过DI 数据输入端,可以轻易的实现通道功能的选择。 本设计中的显示部分是由单片机控制的LCD显示的,采用LCD12864作为显示器件。1.2.2采集数据的存储 方案二:使用MPS430内部AD和 DMA(直接存储器存取),无CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。通过DMA方式在内存中开僻一段存储空间存储AD采样数值。故选择方案二比较好。 1.3系统框图 根据题目要求,为CD4051提供5V,-5V的直流双电源,作为程控放大电路的工作

4、电源。当CD4051的6脚为数字低电平时,单片机MPS430把所预置的数值送到CD4051进行程控放大。 2单元电路设计2.1 程控放大电路 图1 2.2偏置电路 图22.3工作原理主电路的工作原理图如图1所示,包括电压跟随器电路、程控放大电路和反相比例放大电路。输入波形经NE5532电压跟随到CD4051的3脚,由单片机MSP430控制CD4051的9,10,11进行选择放大。偏置电路如图2所示,由直流双电源提供+5V,-5V的直流电,再经电容的滤波形成纹波较小的直流电,从而抬高NE5532的2脚电压,再经过反相比例放大电路将波形进行放大,最后得到所要的输出波形。 3测量数据3.1三角波的测

5、量F=200HZF测量值(hz)200200199200VPP设定值 (mv)840148018802280VPP测量值 (mv)834146918672275F=500HZF测量值(hz)500499500499VPP设定值 (mv)840148018802280VPP测量值 (mv)844127118682233F=1KHZF测量值(hz)9999991000999VPP设定值 (mv)840148018802280VPP测量值 (mv)850129018602267F=5KHZF测量值(hz)5000500149995003VPP设定值 (mv)840148018802280VPP测量值

6、 (mv)834147418672275F=10KHZF测量值(hz)100009999100019999VPP设定值 (mv)840148018802280VPP测量值 (mv)8601480187922793.2正弦波的测量F=200HZF测量值(hz)200200199200VPP设定值 (mv)840148018802280VPP测量值 (mv)834146918672275F=500HZF测量值(hz)500499500499VPP设定值 (mv)840148018802280VPP测量值 (mv)844127118682233F=1KHZF测量值(hz)9999991000999V

7、PP设定值 (mv)840148018802280VPP测量值 (mv)850129018602267F=5KHZF测量值(hz)5000500149995003VPP设定值 (mv)840148018802280VPP测量值 (mv)834147418672275F=10KHZF测量值(hz)100009999100019999VPP设定值 (mv)840148018802280VPP测量值 (mv)8601480187922793.3方波的测量F=200HZF测量值(hz)200200199200VPP设定值 (mv)840148018802280VPP测量值 (mv)8341469186

8、72275F=500HZF测量值(hz)500499500499VPP设定值 (mv)840148018802280VPP测量值 (mv)844127118682233F=1KHZF测量值(hz)9999991000999VPP设定值 (mv)840148018802280VPP测量值 (mv)850129018602267F=5KHZF测量值(hz)5000500149995003VPP设定值 (mv)840148018802280VPP测量值 (mv)834147418672275F=10KHZF测量值(hz)100009999100019999VPP设定值 (mv)84014801880

9、2280VPP测量值 (mv)860148018792279 4程序设计#include "msp430f149.h"#include "msp430_clk.h"#include "dingyi.h"#include "12864.h"#include "key.h"#include "adc.h"#include "boxing.h"#include "CEF.h"/#include "MUL.h"#includ

10、e "PWM.h"void main() / Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; Clock_Init(); TB0CCR0=40000;/设置计时器A的初始值 40000/8M=5ms TB0CTL=0x0214;/TACTL=TASSEL2+ID0+MC1+TACLR; CEF(); P2DIR=0XFF; P2OUT=0X00; ADC12_INIT(); io_init_12864(); ms(100); normalModeInit(); ms(100);

11、DrawMode_init(); ms(100); display_draw(); msta = 2; while(1) while(!(TB0CCTL0&BIT0); TB0CCTL0&=BIT0; skey(); s_freq(); for(i=0;i<128;i+) adc_datai=adc_data64i/64; switch(msta) case 0:work0(); break; case 1:work1(); break; case 2:work2(); break; case 3:work3(); break; case 4:work4(); break

12、; case 5:work5(); break; default: break; void work0() if(CEF_T=0)CEF_F=0; else CEF_F=1*8000000/CEF_T; adcnt2+;cnt_1s+; CEF_32F+=CEF_F; if(adcnt2>=32) adcnt2=0; CEF_32F+=16;CEF_32F>>=5; CEF_F=CEF_32F; CEF_32F=0; if(cnt_1s=200) cnt_1s=0; LCD_SetPos(3,2); drawDec(CEF_F); void work1() adc_add =

13、 0; cnt_1s+; if(cnt_1s > 200) draw_clear(); us(); for(i=0;i<128/n;i+) while(i>0)&(adc_datai-1<adc_datai) adc_datai-1+=1; drawPix(i*n,adc_datai-1,1); us(); while(i>0)&(adc_datai-1>adc_datai) adc_datai-1-=1; drawPix(i*n,adc_datai-1,1); us(); drawPix(i*n,adc_datai,1); display_

14、draw(); cnt_1s = 0; ADC12IE = 0x01; adcnt+;/ if(adcnt=5)/ / adcnt=0;/ msta=2; / if(esw0) msta=2; void work2() draw_clear(); us(); normalModeInit(); ms(100); LCD_SetPos(0,1); drawArray(table1,16); LCD_SetPos(0,2); drawArray(table2,16); LCD_SetPos(0,3); drawArray(table3,16); msta=3;void work3() adc_ad

15、d = 0; AD_max=AD_min=adc_data640; for(i=0;i<128;i+) if(AD_max<adc_data64i) AD_max=adc_data64i; if(AD_min>adc_data64i) AD_min=adc_data64i; /AD_U=(int)(AD_max-AD_min)*0.875);/峰峰值处理 AD_U=(int)(AD_max-AD_min)*0.6154+185.41); boxing(); if(CEF_T=0)CEF_F=0; else CEF_F=1*8000000/CEF_T; adcnt2+; CEF

16、_32F+=CEF_F; if(adcnt2>=32) adcnt2=0; CEF_32F+=16;CEF_32F>>=5; CEF_F=CEF_32F; CEF_32F=0; /频率处理 cnt_1s+; if(cnt_1s=200) cnt_1s=0; LCD_SetPos(3,1); drawDec(b); LCD_SetPos(3,2); drawDec(AD_U); LCD_SetPos(3,3); drawDec(CEF_F); AD_U=0; ADC12IE = 0x01; adcnt+;/ if(adcnt=5)/ / adcnt=0;/ msta=4; /

17、if(AD_U>1000&AD_U<1500) P2OUT=BIT0; if(AD_U>500&AD_U<1000) P2OUT=BIT1; if(AD_U>1500) P2OUT=0X00; if(esw0) msta=4; void work4() draw_clear(); us(); normalModeInit(); ms(100); DrawMode_init(); ms(100); display_draw(); msta=1;void work5() ;#ifndef _ADC_H_#define _ADC_H_/*void ADC

18、12_INIT(void) / ADC12 控制寄存器设置 / 内核开启, 启动内部基准, 选择 2.5V 基准, 设置采样保持时间 ADC12CTL0 = ADC12ON + REFON + REF2_5V + SHT0_2; / 时钟源为内部震荡器, 出发信号来自采样定时器, 转换地址为 ADC12MCTL4 ADC12CTL1 = ADC12SSEL_0 + SHP + CSTARTADD_4; / 转换通道设置 ADC12MCTL4 = SREF_1 + INCH_1; / 参考电压:V+=Vref+,V-=AVss ADC 通道:A0unsigned int ADC12() unsi

19、gned int adc12_data; / 启动转换 ADC12CTL0 |= ENC + ADC12SC; / 转换使能开始转换 while(ADC12IFG & 0x0010) = 0); / 软件查询中断标志, 等待转换结束 adc12_data = ADC12MEM4; / 处理 return adc12_data;*/unsigned int adc_data200;void ADC12_INIT(void)/单通道多次转换 / ADC12控制寄存器设置 / 对于多次转换需要设置MSC P6SEL |= 0x01; ADC12CTL0 = ADC12ON + REFON +

20、 REF2_5V + SHT0_0 + MSC; / CONSEQ_2表示当前模式为单通道多次转换, 转换地址为ADC12MCTL0 ADC12CTL1 = ADC12SSEL_0 + SHP + CONSEQ_2 + CSTARTADD_0; / 转换通道设置 ADC12MCTL0 = SREF_1 + INCH_0 + EOS; / 参考电压:V+=Vref+,V-=AVss ADC通道:A4 / 中断允许 ADC12IE = 0x01; _EINT(); / 启动转换 ADC12CTL0 |= ENC + ADC12SC; / 转换使能开始转换 / ADC12中断向量 int adc_a

21、dd;#pragma vector = ADC_VECTOR _interrupt void ADC12_IRQ(void) adc_data64adc_add = ADC12MEM0; / 处理 adc_add+; if(adc_add>=128) ADC12IE = 0x00; #endif#ifndef _boxing_h_#define _boxing_h_void boxing() AD128_temp=0; vpp=AD_max-AD_min;/ aver=(AD_max+AD_min)/2; for(i=0;i<128;i+) aver+=adc_data64i; a

22、ver=aver/128; for(i=0;i<128;i+) if(adc_data64i>aver) temp=(adc_data64i-aver); else temp=(aver-adc_data64i); AD128_temp = AD128_temp+temp*temp; AD128_temp=AD128_temp/128; temp=(vpp*vpp)/4; if(AD128_temp>7*temp/10) b=1; else if(AD128_temp<2*temp/5) b=3; else b=2;#ifndef _CEF_H_#define _CEF

23、_H_void CEF() P1DIR &= BIT2; P1SEL |= BIT2; TACCTL1 = CM_1 + CCIS_0 + SCS + CAP + CCIE; /选择捕获上升沿方式,CCI1A(P4.1)输入,中断开启 CEF_T = 0; CEF_lastCCR1 = 0; TACTL = TASSEL_2 + MC_2 + TACLR; /选择SMCLK时钟,连续方式 _EINT();#pragma vector=TIMERA1_VECTOR_interrupt void Timer_A(void) if( TAIV = 2) CEF_T = CCR1 - CEF_

24、lastCCR1; CEF_lastCCR1 = CCR1; / CEF_T=500; TACCTL1 &= TAIV_TACCR1;#endif#ifndef _dingyi_H_#define _dingyi_H_#define uchar unsigned char#define uint unsigned int#define schar signed char#define sint signed int#define ulong unsigned longvoid work0();void work1();void work2();void work3();void wor

25、k4();void work5();unsigned int adc_data64200;uchar msta,adcnt,adcnt2,n;uint i,b,cnt_1s,AD_min,AD_max,AD_U=0;ulong AD_32temp,CEF_32F;uint CEF_lastCCR1,CEF_T,CEF_F; ulong AD128_temp,aver,temp,vpp;#endif#ifndef _key_H#define _key_H#include <msp430g2553.h>#define uint unsigned int#define uchar uns

26、igned char#define ulong unsigned long#define KEY_OUT P1OUT#define KEY_IN P1IN#define KEY_DIR P1DIR/* 函数声明 */void skey();/* 变量定义 */uchar key; / 键值寄存器uchar ekey; / 键沿寄存器uchar lastkey; / 键状态寄存器uchar cnt_20ms;/* 按键标志位声明 */#define sw0 (key & 0x01) / 独立按键键值标志#define esw0 (ekey & 0x01) /独立按键键沿标志#de

27、fine sw1 (key & 0x02)#define esw1 (ekey & 0x02)#define sw2 (key & 0x04)#define esw2 (ekey & 0x04)#define sw3 (key & 0x08)#define esw3 (ekey & 0x08)void skey() /单按键 uchar kbuf; /定义读键缓存器 KEY_DIR &= 0XFe;/ 设置为输入口 kbuf = KEY_IN; / 读键状态 kbuf = (kbuf&0x01)0x01; /转正逻辑 lastke

28、y = kbuf; /存当前键状态 if (lastkey!=key) /键是否有变化 cnt_20ms+; if (cnt_20ms!=1) / 去抖延时 lastkey=key; /放弃不稳定的键值 else cnt_20ms=0; / 重赋去抖初值 ekey=(keylastkey)&lastkey; /键前沿提取 key=lastkey;#endif#ifndef _MSP430_CLK_H_#define _MSP430_CLK_H_unsigned int Clock_Init() unsigned char i; BCSCTL1&=XT2OFF; /打开XT振荡器

29、 BCSCTL2|=SELM1+SELS; /MCLK为8MHZ,SMCLK为8MHZ do IFG1&=OFIFG; /清除震荡标志 for(i=0;i<100;i+) _NOP(); /延时等待 while(IFG1&OFIFG)!=0); /如果标志为1,则继续循环等待 IFG1&=OFIFG; return 0;#endif#ifndef _PWM_H_#define _PWM_H_#include "dingyi.h"void ad_max();void s_freq();void cd4051();/*void cd4051() c

30、d4051_DIR |= BIT5 + BIT6+ BIT7; if(ad_temp >=2500) cd4051A_0; cd4051B_0; cd4051C_0; else if(ad_temp >= 500) cd4051A_0; cd4051B_0; cd4051C_1; else if(ad_temp >= 400) cd4051A_0; cd4051B_1; cd4051C_0; else cd4051A_0; cd4051B_1; cd4051C_1; */void s_freq() ADC12CTL0 &= 0X00; if(CEF_F>=200

31、&&CEF_F<=400) ADC12CTL0 = ADC12ON + REFON + REF2_5V + SHT0_4 + MSC; ADC12CTL1 = ADC12SSEL_0 + SHP + CONSEQ_2 + CSTARTADD_0 + ADC12DIV_6; n = 1; else if(CEF_F>400&&CEF_F<600) ADC12CTL0 = ADC12ON + REFON + REF2_5V + SHT0_3 + MSC; ADC12CTL1 = ADC12SSEL_0 + SHP + CONSEQ_2 + CSTARTADD_0 + ADC12DIV_6; n = 1; else if(CEF_F>=600&&CEF_F<800) ADC12CTL0 = ADC12ON + REFON + REF2_5V + SHT0_2 + MSC; ADC12CTL1 = ADC12SSEL_0 + SHP + CONSEQ_2 + CSTARTADD_0 + ADC12DIV_4; n = 1; else if(CEF_F>=800&&CEF_F&

温馨提示

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

评论

0/150

提交评论