ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:123.49KB ,
资源ID:5524438      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5524438.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(msp430g2553测频率以及测峰值.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

msp430g2553测频率以及测峰值.docx

1、msp430g2553测频率以及测峰值电子设计综合实验项目报告项目名称: MCU交流电压参数测量 小组成员 :林伊、武正浩学 号:20111112、20111201项目要求题目:交流电压参数的测量要求:用给定的MCU:msp430g2553,制作交流电压参数测试设备图表 1基本要求:一、 用给定运放LM324制作一放大器a) 增益大于:20dBb) 带宽大于:100KHz二、 用指定MCU和已制作的放大器制作频率计a) 测量范围:10Hz100KHzb) 显示:3位以上发挥部分:一、 用A/D测量已给电压的幅度,信号由已制作的放大器输入a) 测量范围:输入信号越小越好实现思路放大:首先分析题目

2、要求,要实现放大20dB,频率1100KHz的信号,通过公式20lg(Ad)得出Ad=10,即放大10倍必须使用运放lm324实现,则需要知道该芯片的器件参数,即增益带宽积。通过数据手册得知其增益带宽积为6.4MHz,除去放大倍数得知能够实现该信号的放大,通过设计放大电路并焊接即可,放大电路为反向比例放大电路,见Figure 1Figure 1频率:实现频率的测量,这一块需使用到MCU,测量频率的方法有很多种,通过捕捉上升沿下降沿产生中断,也可以不产生中断,还可通过时钟计数。其中通过捕捉上升沿下降沿的思路又分两种,1、检测上升沿后再检测下一个上升沿(检测下降沿后再检测下一个下降沿)2、检测上升

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

4、再用timer0选择使用外部时钟源计数,也就是需要被我们计数的信号输入,这样每一次上升沿,timer0计数器就会加一。这样每秒中断读取timer0中寄存器的值就可以得出精确度极高的频率,甚至都不需要换算。此种方案简便易于实现,故选用。流程图:Figure 2方案选择完毕,考虑如何把正弦信号转换成方波信号输入MCU,此部分在考虑信号发生器只输出正电的时候,即正弦信号在0电位之上,我们可以完全不用设计任何外部电路,因为MCU内部有施密特触发器,可以将正弦输入变成方波,但是如果有负电压输入则会损坏MCU。实际中由于LM324我们只允许单电源供电,且放大电路为反向比例放大电路,所以只放大了输入信号的负

5、半周,并且将其搬到正半轴,所以输入到单片机的是只有正的电压,如图:Figure 3所以不需要外部焊接电路实现波形转换,但是由于本课程是为北京电设做准备,本着此原则我组成员决定还是设计并焊接一个外部电路来实现波形转换。波形转换有两种方法:1、使用过零比较器2、使用施密特触发器。由于本题目对输入信号的频率有要求,过零比较器涉及到运放,所以在频率上有限制,为保证频率不影响实现,我们选用数字的电路即施密特触发器,数字电路一般频率可以达到几十兆,所以肯定能够符合要求,见下图:Figure 4A/D:本题发挥部分要求采集正弦信号的峰值,所以涉及A/D转换部分,由于输入信号频率在10Hz100KHz,由于采

6、样定理,采样频率必须为被采样信号的两倍,虽然实际中最好为十倍,我们最后还是采用了两倍。Msp430g2553此款芯片A/D采集过程若要稳定起码需要30个时钟,我的A/D模块选用时钟源smclk,其频率为8MHz,则8MHz除去30约为267KHz,其大于100KHz的两倍,基本满足要求,在之前采集频率的过程中我们有产生一个1s中断,A/D平常每采集一次便把采集的值与最大值比较,把最大值留下,1s选取一次最大值显示,并把之前最大值清除。显示:显示我们采用LCD1602,采用四条数据线,三条控制线,在保证MCU引脚够用的前提下进行显示。代码主程序:#include #include LCD1602

7、_Driver.h#include unsigned int FRE=0;unsigned char flag1=0;unsigned char flag2=0;unsigned int adc_sample=0;unsigned int adc_max=0;unsigned int temp=0;uchar LCDBuf16;/uchar LCDBuf25;uchar LCDBuf2=HZ;uchar LCDBuf3=MV;void main() WDTCTL = WDTPW + WDTHOLD; DCOCTL |= ( DCO0 + DCO1 ); DCOCTL |= ( MOD4 + M

8、OD3 + MOD2 + MOD1 + MOD0);/微调DCOCLK BCSCTL1 |= ( RSEL0 + RSEL2 + RSEL3);/14.8M SMCLK IO_Init(); LCD_Init(); /测频初始 TA0CTL |= 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

9、) ; else flag1=0; TA0CTL |= TACLR; TA0CTL = TASSEL_0 + MC_1; TA1CTL = TASSEL_1 + MC_1 + TAIE; while(0=flag1); flag1=0; /显示频率 for(int i=0;i5;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_

10、Disp_string(5,0,LCDBuf2); /测幅初始 flag2=1; TA1CTL = TASSEL_1 + MC_1 + TAIE; TA1CCR0 = 32767;/打开时钟 /ADC10CTL0 = SREF_0 + ADC10SHT_2 + MSC + ADC10ON + ADC10IE; /ADC10CTL1 = INCH_1 + ADC10SSEL_3 + CONSEQ_2; /ADC10AE0 = 0x02; /ADC10DTC0 = ADC10B1; /ADC10DTC1 = 0xC8; /ADC10CTL0 &= ENC; / 先关闭adc,待到BUSY位清零,每

11、次都必须等待 /while (ADC10CTL1 & BUSY); / Wait if ADC10 core is active /ADC10SA = (unsigned int)adc_sample; / 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 |=

12、ENC+ADC10SC; while(ADC10CTL0 &ADC10IFG)=0); adc_sample = ADC10MEM; if(adc_maxadc_sample) adc_max = adc_sample; while(0=flag1); adc_max = adc_max*(3300/1023); /while(0=flag1); flag2=0; /* /筛选 for(int i=0;iadc_max) adc_max=adc_samplei; */ /显示幅值 for(int i=0;i5;i+) temp = adc_max/(10000/(unsigned int)(p

13、ow(10,i); LCDBuf1i = temp + 0; adc_max = adc_max%(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 =

14、 0; TA1CTL |= TACLR; FRE=TA0R; flag1=1; TA0CTL = 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 ADC1

15、0_ISR (void) flag1=1; ADC10CTL0 &= ENC;lcd头文件/#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 &

16、= 0x02#define LCD_IO_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(uch

17、ar dat);void LCD_Set_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时

18、,为5*10点阵void IO_Init(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 = 0x8

19、0) _delay_cycles(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点阵 else large = 1; LCD_IO_DIR |= 0xF0;

20、LCD_IO_OUT = (command&(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_

21、OUT = (dat&(0XF0)+(LCD_IO_OUT&(0x0F); SET_LCD_1602_E; CLR_LCD_1602_E; dat = 4; temp &= 0x0F; sta = sta + temp; return(sta);uchar LCD_Read_Data(uchar x,uchar y) uchar dat; LCD_Set_xy(x,y); /确定读取数据坐标 SET_LCD_1602_RS; /读取数据高四位 SET_LCD_1602_RW; CLR_LCD_1602_E; LCD_IO_DIR &= 0xF0; SET_LCD_1602_E; _delay_

22、cycles(10); dat = LCD_IO_IN; CLR_LCD_1602_E; SET_LCD_1602_E; /读取数据低四位 _delay_cycles(10); uchar temp; temp = LCD_IO_IN; CLR_LCD_1602_E; dat &= 0xF0; temp = 4; temp &= 0x0F; dat = dat + temp; return(dat);void User_def_char(uchar n,uchar *s) int i; char addr = 0x40; n = 3; addr += n; for(i=0;i8;i+,addr+) LCD_Write_Command(addr); LCD_Write_Data( *s ); s+; void LCD_Disp_char(uchar x,uchar y,uchar dat) LCD_Set_xy(x,y); LCD_Write_Data(dat);void LCD_Disp_string(uchar x,uchar y,uchar *s) LCD_Set_xy(x,y); while (*s) LCD_Write_Data( *s ); s+; 欢迎您的下载,资料仅供参考!致力为企业和个人提供合同协议,策划案计划书,学习资料等等打造全网一站式需求

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1