第一范文网 - 专业文章范例文档资料分享平台

msp430g2553测频率以及测峰值

来源:用户分享 时间:2025/6/1 6:52:35 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

计数,也就是需要被我们计数的信号输入,这样每一次上升沿,timer0计数器就会加一。这样每秒中断读取timer0中寄存器的值就可以得出精确度极高的频率,甚至都不需要换算。此种方案简便易于实现,故选用。流程图:

开始 N 1秒到时? Y 读取timer0内寄存器的值保存 清除timer0内寄存器的值

Figure 2

方案选择完毕,考虑如何把正弦信号转换成方波信号输入MCU,此部分在考虑信号发生器只输出正电的时候,即正弦信号在0电位之上,我们可以完全不用设计任何外部电路,因为MCU内部有施密特触发器,可以将正弦输入变成方波,但是如果有负电压输入则会损坏MCU。

实际中由于LM324我们只允许单电源供电,且放大电路为反向比例放大电路,所以只放大了输入信号的负半周,并且将其搬到正半轴,所以输入到单片机的是只有正的电压,如图:

Figure 3

所以不需要外部焊接电路实现波形转换,但是由于本课程是为北京电设做准备,本着此

原则我组成员决定还是设计并焊接一个外部电路来实现波形转换。

波形转换有两种方法:1、使用过零比较器2、使用施密特触发器。由于本题目对输入信号的频率有要求,过零比较器涉及到运放,所以在频率上有限制,为保证频率不影响实现,我们选用数字的电路即施密特触发器,数字电路一般频率可以达到几十兆,所以肯定能够符合要求,见下图:

Figure 4

A/D:

本题发挥部分要求采集正弦信号的峰值,所以涉及A/D转换部分,由于输入信号频率在10Hz~100KHz,由于采样定理,采样频率必须为被采样信号的两倍,虽然实际中最好为十倍,我们最后还是采用了两倍。

Msp430g2553此款芯片A/D采集过程若要稳定起码需要30个时钟,我的A/D模块选用时钟源smclk,其频率为8MHz,则8MHz除去30约为267KHz,其大于100KHz的两倍,基本满足要求,在之前采集频率的过程中我们有产生一个1s中断,A/D平常每采集一次便把采集的值与最大值比较,把最大值留下,1s选取一次最大值显示,并把之前最大值清除。

显示:

显示我们采用LCD1602,采用四条数据线,三条控制线,在保证MCU引脚够用的前提下进行显示。

代码

主程序:

#include #include \#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 LCDBuf1[6]; //uchar LCDBuf2[5];

uchar LCDBuf2[]={%uchar LCDBuf3[]={\

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 |= 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; //显示频率

for(int i=0;i<5;i++) {

temp = FRE/(10000/(unsigned int)(pow(10,i))); LCDBuf1[i] = temp + '0';

FRE = FRE%(10000/(unsigned int)(pow(10,i))); }

LCDBuf1[5] = 0;

LCD_Disp_string(0,0,LCDBuf1); LCD_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位清零,每次都必须等待

//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;

搜索更多关于: msp430g2553测频率以及测峰值 的文档
msp430g2553测频率以及测峰值.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c4n7mh8nb4h47ty60k278_2.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top