MSP430G2553 频率、占空比、脉冲宽度测量

发布者:CyborgDreamer最新更新时间:2022-09-22 来源: csdn关键字:MSP430G2553  频率  占空比 手机看文章 扫描二维码
随时随地手机看文章

测量频率、占空比、脉冲宽度等信号数字量应该算是430中比较简单的一个实验,而且幸运的是TI官方的示例程序中有相关的内容。


传送门:


https://dev.ti.com/tirex/explore/node?devices=MSP430G2553&node=AFB5DJx-bgFTI4ERhplnuw__IOGqZri__LATEST

https://dev.ti.com/tirex/explore/node?devices=MSP430G2553&node=AFB5DJx-bgFTI4ERhplnuw__IOGqZri__LATEST


进行测量的重点是对信号上升沿和下降沿的捕获,这一点利用定时器的捕获功能就可以实现。


之后进行相关计算,计算也相对简单。

large f=frac{f_0}{N_3-N_1} quad D=frac{N_2-N_1}{N_3-N_1} quad t_{pulse}=t_0(N_2-N_1)

N1:捕获到第一个上升沿的数据;


N2:捕获到下降沿的数据;


N3:捕获到第二个上升沿的数据;


f0和t0根据自己的设置来决定。


本工程中设置P1.1引脚作为信号输入引脚,相关配置见MSP430的手册


参考代码:(仅供参考)


unsigned int Forward_Posedge_Flag = 1, Counting_Flag=0, Negedge_Flag=0;


unsigned long int Posedge1_data=0, Posedge2_data =0, Negedge_data=0;


double fre, duty_cycle, pulse_width;

int num=0; //测试用

int num1=0,num2=0;


void Calculate_Data();

void main(void)

{

    WDTCTL = WDTPW | WDTHOLD;    // stop watchdog timer

    

    P1SEL|=BIT1; //set input as TA0.CCI0A at P1.1


    DCOCTL = CALDCO_16MHZ; BCSCTL1 = CALBC1_16MHZ;


    TA0CTL = TASSEL_2 + TACLR + MC_2 + TAIE;


    TA0CCTL0  = CM_3 + CCIS_0 + SCS + CAP + CCIE ;


    while(1)

    {

        __bis_SR_register(LPM0_bits + GIE);   // Enter LPM0

        __no_operation();                     // For debugger

    }

}


void Calculate_Data()

{

    Posedge2_data =  Posedge2_data + 65536 * (num1+num2);

    Negedge_data = Negedge_data +  65536 * num1;


    fre = 16000000.0 / (Posedge2_data - Posedge1_data) ;


    duty_cycle = ((double)(Negedge_data - Posedge1_data)) / ((double)(Posedge2_data - Posedge1_data)) ;


    pulse_width = ( Negedge_data - Posedge1_data) / 16.0 ; //unit:us


}

#pragma vector = TIMER0_A0_VECTOR

__interrupt void Timer_A(void)

{

    if(TA0CCTL0 & CCI)

     {


        if(Forward_Posedge_Flag)  //First rising edge captured

            {

                Posedge1_data = TA0CCR0;

                Forward_Posedge_Flag = 0;

                Counting_Flag = 1;


            }

        else if(Counting_Flag = 1 && Negedge_Flag==1) //Second rising edge captured

            {

                TA0CTL &=TAIE;

                TA0CCTL0 &= ~(COV+CCIE);

                Posedge2_data =  TA0CCR0;


                Calculate_Data();


                Counting_Flag = 0;

                Posedge1_data = 0;

                Posedge2_data = 0;

                Negedge_data = 0;

                Forward_Posedge_Flag = 1;

                Negedge_Flag=0;


                num=0;

                num1=0;

                num2=0;


                TA0CTL= TASSEL_2 + TACLR + MC_2 + TAIE;

                TA0CCTL0 = CM_3 + CCIS_0 + SCS + CAP + CCIE ;


                __bic_SR_register_on_exit(LPM0_bits + GIE);  // Exit LPM0 on return to main


            }

    }

    else

    {

        // Falling Edge was captured

        if(Counting_Flag==1 && Negedge_Flag==0)

        {

            Negedge_data =  TA0CCR0;

            Negedge_Flag = 1;

        }

    }


}


#pragma vector = TIMER0_A1_VECTOR                //TAIFG中断

__interrupt void Timer_A_IV(void)

{

    if(TA0IV==0X0A)

    {

        num= num+1;

        if(Counting_Flag == 1 && Negedge_Flag==0)

        {

            num1++;

        }

        else if(Counting_Flag == 1 && Negedge_Flag==1)

        {

            num2++;

        }

    }

}


下面重点提一些内容:


1. 相对于给出的参考例程,代码中新增了TAIFG中断代码以正确地获得N1,N2,N3的值。在输入信号频率较低时存在TA0R计数溢出。(参考下图)


 2. 比较坑的一点:原本在新增中断中进行实时更新,也就是测量过程中对N2,N3直接加65536,但是最后在测试的时候数据乱飞,偶尔几次得到正确的结果,搞得头痛。。一开始实在没想到这样有什么问题。。最后决定在中断中仅仅进行比较简单的num++等操作累计溢出次数,最后算的时候再加和。


3. 捕获到第二个上升沿后进行计算,本人习惯性的disable掉了中断使能,算完之后再重新使能中断。曾经因为这一点也是让程序运行结果百思不得其解,有点无语之感。这里不这样写也许能用。


4.SMCLK设置为16MHz,如果设置的频率低了一点,能测量的高频信号的范围就更窄了。现在硬木口袋能提供的方波最高频率是50kHz,测试结果应该还可以。再高的频率以后找时间测试。。该死的疫情,我真的谢。。


5.紫色那一句表示判断捕捉到的是上升沿还是下降沿,这一点我也是从例程中才知道的。


6.一些符号说明:Counting_Flag表示捕捉到了第一个上升沿,Negedge_Flag表示捕捉到了下降沿。


附上一些测试结果:


1Hz 占空比50%

2Hz 占空比20%

 50Hz 占空比80%

 1000Hz 占空比50%

5000Hz 占空比40%

10kHz 占空比60%

 50kHz 占空比50%

总结:测量很不精确,有点赔钱之感。。 。


此外附上之前做的等精度测频法的结果,稍作对比。。


下面分别是1Hz,2Hz,10Hz,50Hz,1kHz,5kHz,10kHz,50kHz的结果


 


 

感觉效果也没有好到哪里去,用之前FPGA做的等精度测频效果更好。


FPGA等精度测频传送门:


Verilog设计练习 基于FPGA的等精度频率计_Krism0912的博客-CSDN博客


复制代码请复制代码段:


#include  

 

 

/**

 * main.c  2022/3/16 -- 3/17 Krism

 */

 

unsigned int Forward_Posedge_Flag = 1, Counting_Flag=0, Negedge_Flag=0;

 

unsigned long int Posedge1_data=0, Posedge2_data =0, Negedge_data=0;

 

double fre, duty_cycle, pulse_width;

int num=0; //测试用

int num1=0,num2=0;

 

void Calculate_Data();

void main(void)

{

    WDTCTL = WDTPW | WDTHOLD;    // stop watchdog timer

 

    P1SEL|=BIT1; //set input as TA0.CCI0A at P1.1

 

    DCOCTL = CALDCO_16MHZ; BCSCTL1 = CALBC1_16MHZ;

 

    TA0CTL = TASSEL_2 + TACLR + MC_2 + TAIE;

 

    TA0CCTL0  = CM_3 + CCIS_0 + SCS + CAP + CCIE ;

 

    while(1)

    {

        __bis_SR_register(LPM0_bits + GIE);   // Enter LPM0

        __no_operation();                     // For debugger

    }

}

 

void Calculate_Data()

{

    Posedge2_data =  Posedge2_data + 65536 * (num1+num2);

    Negedge_data = Negedge_data +  65536 * num1;

 

    fre = 16000000.0 / (Posedge2_data - Posedge1_data) ;

 

    duty_cycle = ((double)(Negedge_data - Posedge1_data)) / ((double)(Posedge2_data - Posedge1_data)) ;

 

    pulse_width = ( Negedge_data - Posedge1_data) / 16.0 ; //unit:us

 

}

#pragma vector = TIMER0_A0_VECTOR

__interrupt void Timer_A(void)

{

    if(TA0CCTL0 & CCI)

     {

 

        if(Forward_Posedge_Flag)  //First rising edge captured

            {

                Posedge1_data = TA0CCR0;

                Forward_Posedge_Flag = 0;

                Counting_Flag = 1;

 

            }

        else if(Counting_Flag = 1 && Negedge_Flag==1) //Second rising edge captured

            {

                TA0CTL &=TAIE;

                TA0CCTL0 &= ~(COV+CCIE);

                Posedge2_data =  TA0CCR0;

 

                Calculate_Data();

 

                Counting_Flag = 0;

                Posedge1_data = 0;

                Posedge2_data = 0;

                Negedge_data = 0;

                Forward_Posedge_Flag = 1;

                Negedge_Flag=0;

 

                num=0;

                num1=0;

                num2=0;

 

                TA0CTL= TASSEL_2 + TACLR + MC_2 + TAIE;

                TA0CCTL0 = CM_3 + CCIS_0 + SCS + CAP + CCIE ;

 

                __bic_SR_register_on_exit(LPM0_bits + GIE);  // Exit LPM0 on return to main

 

            }

    }

    else

    {

        // Falling Edge was captured

        if(Counting_Flag==1 && Negedge_Flag==0)

        {

            Negedge_data =  TA0CCR0;

            Negedge_Flag = 1;

        }

    }

 

}

 

#pragma vector = TIMER0_A1_VECTOR                //TAIFG中断

__interrupt void Timer_A_IV(void)

{

    if(TA0IV==0X0A)

    {

        num= num+1;

        if(Counting_Flag == 1 && Negedge_Flag==0)

        {

            num1++;

        }

        else if(Counting_Flag == 1 && Negedge_Flag==1)

        {

            num2++;

        }

[1] [2]
关键字:MSP430G2553  频率  占空比 引用地址:MSP430G2553 频率、占空比、脉冲宽度测量

上一篇:FPGA与MSP430通信 UART串口操作
下一篇:MSP430 & 4x4 矩阵键盘测试

推荐阅读最新更新时间:2024-11-05 19:31

电液伺服阀频率测试_电液伺服阀结构图
  电液伺服阀频率测试   电液流量伺服阀频率特性定义为:控制电流在某个频率范围内做正弦变化时,阀的空载控制流量对控制电流的复数比。因伺服阀内部含有多种非线性环节,伺服阀的性能又受外界环境条件影响,因此规定伺服阀的频率特性应在标准试验条件及控制电流峰间值为50%额定输入信号下测定。   设伺服阀的传递函数为G(s),伺服阀的频率特性为G(jω)=G(s)|s=jω,G|(jω)|表示频率特性的幅值,∠G(jω)表示频率特性的相角。当对阈值恒定的、频率在某一范围内变化的正弦信号,便可以得到G|(jω)|和∠G(jω)变化情况,分别称为伺服阀的幅频特性和相频特性。也可以对伺服阀输入某一幅值的阶跃信号,相应地测取伺服阀输出的阶跃响应
[嵌入式]
电液伺服阀<font color='red'>频率</font>测试_电液伺服阀结构图
FPGA在频率综合器中的应用设计与电路
概述   近年来,集成电路的蓬勃发展使数字电路的研究及应用出现了非常大的发展空间,FPGA功耗低、可靠性高、体积小、重量轻、价格低,具有用户可重复定义的逻辑功能即具有可重复编程的特点,因此,FPGA可使数字电路系统的设计非常灵活,并且大大缩短了系统研制的周期,缩小了数字电路系统的体积并减少了使用芯片的品种。FPGA已经普遍用于通信、雷达、导航、广播、电视、仪器、自动控制和计算机等领域。 FPGA设计流程和设计环境   图1表示FPGA的整个设计流程,从设计输入到器件编程这四个阶段可在MAX+PLUS II提供的环境完成。与图1对应,图2是MAX+PLUS II所提供的设计流程。      设计输入   MAX+PL
[安防电子]
FPGA在<font color='red'>频率</font>综合器中的应用设计与电路
ADRF6850集成宽带正交解调器、频率合成器和可变增
ADRF6850是一款高度集成的宽带正交 解调器 、频率合成器和可变增益放大器(VGA)。该器件工作在100 MHz至1000 MHz的频率范围,适用于窄带和宽带通信应用,能够执行从中频(IF)直接到基带频率的正交解调。   ADRF6850解调器包括一个集成VCO的高模数小数N分频频率合成器,其频率分辨率优于1 Hz,前端VGA提供60 dB的增益控制范围。   所有片内寄存器均通过用户可选的SPI或 I2C 接口进行控制。该器件采用3.15 V至3.45 V的单电源供电。   ADRF6850功能框图      特性   ●IQ 正交解调器   ●集成小数N分频PLL和VCO   ●增
[模拟电子]
新日本无线推出适合声音通信的宽带FM IF检波器IC NJW2311
新日本无线推出的宽带FM IF检波器IC NJW2311完全不需要使用外接移相器,适合各种有线无线声音通信。NJW2311可以将1.5MHz到15MHz的IF信号自动FM调制解调,并且可以在4.5V以上电压下工作。NJW2311检波器内置有IF放大器、FM调制解调器以及低噪声运算放大器,实现了优质的S/N信噪比和THD谐波失真特性,无论是无线通信还是有线通信,对于各种声音通信都可以得到很好的方案优化。 【产品特点】 1. 不再需要外接移相器,可以自动 IF检测从 IF=1.5MHz到15MHz的频率信号 FM IF检波器IC通常使用由LC(电感线圈、电容器)和一些专用元件构成的外接移相器。如果移相器的L或C的数值有很大的不均
[网络通信]
新日本无线推出适合声音通信的宽带FM IF检波器IC NJW2311
一种独特的脑电信号放大检测电路设计
  1 引言   脑电信号(EEG]是由脑神经活动产生并且始终存在于中枢神经系统的自发性电位活动,含有丰富的大脑活动信息,是大脑研究、生理研究、临床脑疾病诊断的重要手段。通过对脑电信号进行记录,以提供临床数据和诊断的依据。因此脑电信号的提取具有非常重要的临床意义。   2 设计时常遇到的技术困难   (1)脑电信号十分微弱,一般只有50μV左右,幅值范围为5μV~100 μV。因此它要求放大增益比一般仪器要高得多;   (2)脑电信号频率低,其范围一般在0.5 Hz~35Hz,这使得放大器的低频截止的选择非常困难,当受到尖峰脉冲干扰或导联切换的时候,放大器容易出现堵塞现象;   (3)存在工频50 Hz和极化电压等强大的
[医疗电子]
一种独特的脑电信号放大检测电路设计
基于DSP与AD9852的任意信号发生器
  直接数字式频率合成( DDS ) 技术是继直接频率合成和间接频率合成之后,随着数字集成电路和微电子技术的发展而迅速发展起来的第三代频率合成技术。DDS技术具有相对带宽宽、频率转换 时间短、频率分辨率高等优点,输出相位连续,频率、相位和幅度均可实现程控,常用于高精度频率合成和任意信号发生。本文在发动机电控单元( ECU )硬件在 环仿真系统的设计中,使用TMS320 LF2407A控制2片AD9852产生2路同步的任意信号,仿真发动机工作时的真实信号。   1 AD9852和TMS320LF2407A简介   AD9852是美国Analog Devices公司生产的新型直接数字频率合成器,具有频率转化速度快、频谱纯度高、工作温
[测试测量]
MSP实时输出占空比可调的pwm波形
// 占空比可调的PWM, 我没试过, 手里没单片机, 只是记下. #include msp430x14x.h void main(void) { volatile unsigned int i; WDTCTL = WDTPW + WDTHOLD; // Stop WDT BCSCTL1 |= XTS; // ACLK= LFXT1 = HF XTAL do { IFG1 &= ~OFIFG; // Clear OSCFault flag for (i = 0xFF; i
[单片机]
具杂散抑制通道的直接数字频率合成器
  ——新的低功耗直接数字频率合成器(DDS)内核允许多个杂散抑制通道,能够改进宽带无杂散动态范围(SFDR),输出信号高达400 MHz,功耗不超过1000 mW   关于AD9912   美国模拟器件公司(ADI公司)AD9912直接数字频率合成器(DDS)是为测量与测试设备、无线基站以及安全通信设备而设计的,它能提供前所未有的无杂散动态范围(SFDR)性能:信号输出高达400 MHz,功耗不超过1000 mW。这种新的性能的实现是因为采用美国模拟器件公司具有自主知识产权的“杂波抑制”通道,使两个最大的谐波杂散降低高达10 dB。这简化了设计更,使设计人员在频率分配方面花费更少的时间,尤其是在军用接收机等应用中,最后的每
[嵌入式]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved