msp430g2553测频率以及测峰值_第1页
msp430g2553测频率以及测峰值_第2页
msp430g2553测频率以及测峰值_第3页
msp430g2553测频率以及测峰值_第4页
msp430g2553测频率以及测峰值_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

1、电子设计综合实验项目报告项目名称: MCU交流电压参数测量 小组成员 :林伊、武正浩学 号:20111112、20111201目录项目要求3题目3要求3基本要求3发挥部分3实现思路4放大4频率4A/D:6显示:6代码7主程序:7lcd头文件10项目要求题目:交流电压参数的测量要求:用给定的MCU:msp430g2553,制作交流电压参数测试设备信号发生器放大A/D比较器指定MCUMSP430G2553图表 1基本要求:一、 用给定运放LM324制作一放大器a) 增益大于:20dBb) 带宽大于:100KHz二、 用指定MCU和已制作的放大器制作频率计a) 测量范围:10Hz100KHzb) 显

2、示:3位以上发挥部分:一、 用A/D测量已给电压的幅度,信号由已制作的放大器输入a) 测量范围:输入信号越小越好实现思路放大:首先分析题目要求,要实现放大20dB,频率1100KHz的信号,通过公式20lg(Ad)得出Ad=10,即放大10倍必须使用运放lm324实现,则需要知道该芯片的器件参数,即增益带宽积。通过数据手册得知其增益带宽积为6.4MHz,除去放大倍数得知能够实现该信号的放大,通过设计放大电路并焊接即可,放大电路为反向比例放大电路,见Figure 1Figure 1频率:实现频率的测量,这一块需使用到MCU,测量频率的方法有很多种,通过捕捉上升沿下降沿产生中断,也可以不产生中断,

3、还可通过时钟计数。其中通过捕捉上升沿下降沿的思路又分两种,1、检测上升沿后再检测下一个上升沿(检测下降沿后再检测下一个下降沿)2、检测上升沿后再检测下降沿(检测下降沿后再检测上升沿)。这些思路对应不同的采集方法又可以细分,其中方案1对于测量高频信号有着较好的效果,方案2对于测低频的信号较好,前提是占空比为50%,若不为则变为测脉宽。这次的题目我采用的是用时钟计数的方式,msp430g2553中含有2个时钟,timer0和timer1,每个时钟都有如下功能,选择时钟来源:1、外部时钟(即外部输入的方波信号)2、ACLK 3、smclk等。其中ACLK为外部所焊晶振,频率为32768Hz。由上述条

4、件我使用timer0和timer1同时工作来进行频率的测量,首先外部晶振属于手表晶振,极易产生1s中断,我首先用timer1产生1s中断,再用timer0选择使用外部时钟源计数,也就是需要被我们计数的信号输入,这样每一次上升沿,timer0计数器就会加一。这样每秒中断读取timer0中寄存器的值就可以得出精确度极高的频率,甚至都不需要换算。此种方案简便易于实现,故选用。流程图:开始清除timer0内寄存器的值读取timer0内寄存器的值保存Y1秒到时?NFigure 2方案选择完毕,考虑如何把正弦信号转换成方波信号输入MCU,此部分在考虑信号发生器只输出正电的时候,即正弦信号在0电位之上,我们

5、可以完全不用设计任何外部电路,因为MCU内部有施密特触发器,可以将正弦输入变成方波,但是如果有负电压输入则会损坏MCU。实际中由于LM324我们只允许单电源供电,且放大电路为反向比例放大电路,所以只放大了输入信号的负半周,并且将其搬到正半轴,所以输入到单片机的是只有正的电压,如图:Figure 3所以不需要外部焊接电路实现波形转换,但是由于本课程是为北京电设做准备,本着此原则我组成员决定还是设计并焊接一个外部电路来实现波形转换。波形转换有两种方法:1、使用过零比较器2、使用施密特触发器。由于本题目对输入信号的频率有要求,过零比较器涉及到运放,所以在频率上有限制,为保证频率不影响实现,我们选用数

6、字的电路即施密特触发器,数字电路一般频率可以达到几十兆,所以肯定能够符合要求,见下图:Figure 4A/D:本题发挥部分要求采集正弦信号的峰值,所以涉及A/D转换部分,由于输入信号频率在10Hz100KHz,由于采样定理,采样频率必须为被采样信号的两倍,虽然实际中最好为十倍,我们最后还是采用了两倍。Msp430g2553此款芯片A/D采集过程若要稳定起码需要30个时钟,我的A/D模块选用时钟源smclk,其频率为8MHz,则8MHz除去30约为267KHz,其大于100KHz的两倍,基本满足要求,在之前采集频率的过程中我们有产生一个1s中断,A/D平常每采集一次便把采集的值与最大值比较,把最

7、大值留下,1s选取一次最大值显示,并把之前最大值清除。显示:显示我们采用LCD1602,采用四条数据线,三条控制线,在保证MCU引脚够用的前提下进行显示。代码主程序:#include <msp430g2553.h>#include "LCD1602_Driver.h"#include <math.h>unsigned int FRE=0;unsigned char flag1=0;unsigned char flag2=0;unsigned int adc_sample=0;unsigned int adc_max=0;unsigned int te

8、mp=0;uchar LCDBuf16;/uchar LCDBuf25;uchar LCDBuf2="HZ"uchar LCDBuf3="MV"void main() WDTCTL = WDTPW + WDTHOLD; DCOCTL |= ( DCO0 + DCO1 ); DCOCTL |= ( MOD4 + MOD3 + MOD2 + MOD1 + MOD0);/微调DCOCLK BCSCTL1 |= ( RSEL0 + RSEL2 + RSEL3);/14.8M SMCLK IO_Init(); LCD_Init(); /测频初始 TA0CTL |=

9、 TASSEL_0 + MC_1; TA0CCR0 = 0xffff; TA1CTL |= TASSEL_1 + MC_1 + TAIE; TA1CCR0 = 32767; TA1CCTL0 |= CCIE; P1DIR &= BIT0; P1SEL |= BIT0; _bis_SR_register(GIE); while(1) if(0=flag1) ; else flag1=0; TA0CTL |= TACLR; TA0CTL = TASSEL_0 + MC_1; TA1CTL = TASSEL_1 + MC_1 + TAIE; while(0=flag1); flag1=0;

10、/显示频率 for(int i=0;i<5;i+) temp = FRE/(10000/(unsigned int)(pow(10,i); LCDBuf1i = temp + '0' FRE = FRE%(10000/(unsigned int)(pow(10,i); LCDBuf15 = 0; LCD_Disp_string(0,0,LCDBuf1); LCD_Disp_string(5,0,LCDBuf2); /测幅初始 flag2=1; TA1CTL = TASSEL_1 + MC_1 + TAIE; TA1CCR0 = 32767;/打开时钟 /ADC10CTL0

11、 = SREF_0 + ADC10SHT_2 + MSC + ADC10ON + ADC10IE; /ADC10CTL1 = INCH_1 + ADC10SSEL_3 + CONSEQ_2; /ADC10AE0 = 0x02; /ADC10DTC0 = ADC10B1; /ADC10DTC1 = 0xC8; /ADC10CTL0 &= ENC; / 先关闭adc,待到BUSY位清零,每次都必须等待 /while (ADC10CTL1 & BUSY); / Wait if ADC10 core is active /ADC10SA = (unsigned int)adc_samp

12、le; / Data buffer start /ADC10CTL0 |= ENC + ADC10SC; ADC10CTL0 = SREF_0 + ADC10SHT_2 + MSC + ADC10ON; ADC10CTL1 = INCH_1 + ADC10SSEL_3 + CONSEQ_0; ADC10AE0 = 0x02; ADC10CTL0 |= ADC10ON; do ADC10CTL0 |= ENC+ADC10SC; while(ADC10CTL0 &ADC10IFG)=0); adc_sample = ADC10MEM; if(adc_max<adc_sample) a

13、dc_max = adc_sample; while(0=flag1); adc_max = adc_max*(3300/1023); /while(0=flag1); flag2=0; /* /筛选 for(int i=0;i<200;i+) if(adc_samplei>adc_max) adc_max=adc_samplei; */ /显示幅值 for(int i=0;i<5;i+) temp = adc_max/(10000/(unsigned int)(pow(10,i); LCDBuf1i = temp + '0' adc_max = adc_ma

14、x%(10000/(unsigned int)(pow(10,i); LCDBuf15 = 0; LCD_Disp_string(0,1,LCDBuf1); LCD_Disp_string(5,1,LCDBuf3); adc_max = 0; / Timer A1 interrupt service routine#pragma vector=TIMER1_A0_VECTOR_interrupt void Timer1_A (void) if(0=flag2) TA0CTL = 0; TA1CTL = 0; TA1CTL |= TACLR; FRE=TA0R; flag1=1; TA0CTL

15、= TASSEL_0 + MC_0; TA1CTL = TASSEL_1 + MC_0; /TA0CTL |= TACLR; /TA0CTL = TASSEL_0 + MC_1; /TA1CTL = TASSEL_1 + MC_1 + TAIE; /测了一次还没开 else TA1CTL = TASSEL_1 + MC_0; flag1=1; / ADC10 interrupt service routine#pragma vector=ADC10_VECTOR_interrupt void ADC10_ISR (void) flag1=1; ADC10CTL0 &= ENC;lcd头

16、文件/#include "msp430g2553.h"#define SET_LCD_1602_E P2OUT |= 0x04 /P2.2#define CLR_LCD_1602_E P2OUT &= 0x04#define SET_LCD_1602_RS P2OUT |= 0x01 /P2.0#define CLR_LCD_1602_RS P2OUT &= 0x01#define SET_LCD_1602_RW P2OUT |= 0x02 /P2.1#define CLR_LCD_1602_RW P2OUT &= 0x02#define LCD_I

17、O_OUT P1OUT#define LCD_IO_DIR P1DIR#define LCD_IO_IN P1IN#define LCD_IO_SEL P1SEL#define uchar unsigned char#define uint unsigned intvoid IO_Init(void);void LCD_Init(void);void LCD_Check_busy(void); /检测LCD是否在忙,即能否接收数据和指令void LCD_Write_Command(uchar command);void LCD_Write_Data(uchar dat);void LCD_Se

18、t_xy( uchar x, uchar y );uchar LCD_Read_Sta(void);uchar LCD_Read_Data(uchar x,uchar y);void User_def_char(uchar n,uchar *s); /输入用户自定义字符(5*8点阵字符),07共8个字符void LCD_Disp_char(uchar x,uchar y,uchar dat);void LCD_Disp_string(uchar x,uchar y,uchar *s);uchar large=0; /当large为1时,为5*8点阵;为0时,为5*10点阵void IO_Ini

19、t(void)LCD_IO_SEL &= 0xF0;/LCD_IO_DIR |= 0x07 ; P2DIR |= 0x07; P2SEL &= 0x07;void LCD_Init(void)LCD_Write_Command(0x28);LCD_Write_Command(0x0F);LCD_Write_Command(0x06);LCD_Write_Command(0x01);void LCD_Check_busy(void)uchar flag=0x80;flag &= LCD_Read_Sta();while(flag = 0x80)_delay_cycles(

20、100);flag &= LCD_Read_Sta();void LCD_Write_Command(uchar command)LCD_Check_busy();CLR_LCD_1602_RS;CLR_LCD_1602_RW;CLR_LCD_1602_E;uchar temp;temp = command & (0x3C);if(temp=(0x26)|(temp=(0x2C)|(temp=(0x36)|(temp=(0x3C)large = 0; /为5*10点阵elselarge = 1;LCD_IO_DIR |= 0xF0;LCD_IO_OUT = (command&a

21、mp;(0XF0)+(LCD_IO_OUT&(0x0F);SET_LCD_1602_E;CLR_LCD_1602_E;command <<= 4;LCD_IO_OUT = (command&(0XF0)+(LCD_IO_OUT&(0x0F);SET_LCD_1602_E;CLR_LCD_1602_E;void LCD_Write_Data(uchar dat)LCD_Check_busy();SET_LCD_1602_RS;CLR_LCD_1602_RW;CLR_LCD_1602_E;LCD_IO_DIR |= 0xF0;LCD_IO_OUT = (dat&

22、amp;(0XF0)+(LCD_IO_OUT&(0x0F);SET_LCD_1602_E;CLR_LCD_1602_E;dat <<= 4;LCD_IO_OUT = (dat&(0XF0)+(LCD_IO_OUT&(0x0F);SET_LCD_1602_E;CLR_LCD_1602_E;void LCD_Set_xy(uchar x,uchar y) uchar address; if (y = 0) address = 0x80 + x; else address = 0xC0 + x; LCD_Write_Command(address);uchar LCD_Read_Sta(void)uchar sta;CLR_LCD_1602_RS; /读入状态信息高四位数据SET_LCD_1602_RW;CLR_LCD_1602_E;LCD_IO_DIR &= 0xF0;SET_LCD_1602_E;_delay_cycles(10);sta = LCD_IO_IN;CLR_LCD_1602_E;SET_LCD_1602_E; /读入状态信息低四位数据_delay_cycles(10);uchar temp;temp = LCD_IO_IN;CLR_LCD_1602_E;sta &= 0xF0;temp >>=

温馨提示

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

评论

0/150

提交评论