×
单片机 > 单片机程序设计 > 详情

基于msp430G2553的低频方波频率、占空比、峰峰值测量函数

发布时间:2020-08-31 发布时间:
|

使用的平台是TI公司的launch pad,频率和占空比已经实现,峰峰值还有有待改进


1、主函数部分:

/*********************************************

*                   _ooOoo_                   *

*                  o8888888o                  *

*                  88" . "88                  *

*                  (| -_- |)                  *

*                  O  =  /O                  *

*               ____/`---'____               *

*             .'  \|     |//  `.             *

*            /  \|||  :  |||//              *

*           /  _||||| -:- |||||-             *

*           |   | \  -  /// |   |           *

*           | _|  ''---/''  |   |           *

*             .-__  `-`  ___/-. /           *

*         ___`. .'  /--.--  `. . __          *

*      ."" '_/___.'  >'"".       *

*     | | :  `- `.;` _ /`;.`/ - ` : | |     *

*       `-.   _ __ /__ _/   .-` /  /     *

*======`-.____`-.________/___.-`____.-'======*

*                   `=---='                   *

*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*

*                No bug forever               *

*********************************************/



/*

 *  Author: 余裕鑫

 *  function:测量信号的频率和占空比,信号输入管脚为P2.1.串口打印输出信息。

 *          串口:9600,无校验位,8位数据位,1位停止位

 *  Created on: 2018年5月2日

 *注意:测频率和占空比采用分别是测量一个周期和高电平期间的时钟个数,故适合于低频部分的频率和占空比的测量

 *     当频率高于100Hz时,误差逐渐增大,

 *     100Hz时,误差约为1%,1Hz

 *     1000Hz时,误差约为1.5%,15Hz

 *     10000Hz时,误差约为0.37%,37Hz

 *     20000Hz时,误差约为2%,199Hz

 *     30000Hz时,误差约为6.5%,650Hz

 */

#include

#include "stdio.h"

#include "pwminput.h"

#include "uart.h"

#include "datatype.h"



extern volatile u16 Frequency;

extern volatile u8 Duty;

extern volatile u16 PeakValue;

float PeakValueF;

/**

 * main.c

 */

void main(void)

{

    unsigned char str[20];





    WDTCTL = WDTPW + WDTHOLD;   // stop watchdog timer

    // 将MCLK 和 SMCLK 设置为16MHZ,ACLK默认为32.768KHz

    DCOCTL = CALDCO_16MHZ;

    BCSCTL1 = CALBC1_16MHZ;  //使用高频时钟而减小误差

    _EINT();



    UART_Init();



    sprintf(str,"frequency and duty:n");

    UARTSendString(str);



    while(1)

    {

        Measure_Frequency_Duty();

        sprintf(str,"Frequency : %d n",Frequency);

        UARTSendString(str);

        sprintf(str,"Duty : %d n",Duty);

        UARTSendString(str);



//        Measure_Peak_Value();

//        PeakValueF = PeakValue*3.6/1024;

//        sprintf(str,"Peak Value : %0.2f n",PeakValueF);

//        UARTSendString(str);

        __delay_cycles(50000000);

    }

}

2、C文件部分:

/*

 * pwminput.c

 *

 *  Created on: 2018年4月23日

 *  Author: yyx

 */

#include "pwminput.h"

#include "adc.h"



#define T0C1A  P1DIR&=~BIT2;P1SEL|=BIT2;P1SEL2&=~BIT2

#define T1C0A  P2DIR&=~BIT0;P2SEL|=BIT0;P2SEL2&=~BIT0

#define T1C1A  P2DIR&=~BIT1;P2SEL|=BIT1;P2SEL2&=~BIT1

#define SAMPLETIMES  10  //测峰峰值中一个周期采样的次数

#define SAMPLEPERIODS 5   //测一次峰峰值中采样的周期个数



u8 FreqFlag = 0;

u16 PwmStart;//初始时间

u16 PwmHighEnd,PwmLowEnd;//高电平和低电平的结束时间

u16 HighOverFlow,AllOverFlow; //高电平和一个周期的翻转个数

u32 HighClockSteps,AllClockSteps;

u16 PeakIntervalSteps;



volatile u16 Frequency;

volatile u8 Duty;

volatile u16 PeakValue;

extern volatile u16 ADC10_Result;

u8 SampleStatus;



//频率占空比测量函数

void Measure_Frequency_Duty(void)

{

    T1C1A;       //管脚配置p2.1

    FreqFlag=1;  //频率测量中断标志



    TA1CCTL1 = CAP+CM_1+CCIS_0+SCS+CCIE;              // 输入捕捉,上升沿触发(upCM_1,downCM_2,updownCM_3),同步捕捉,CCI0A 中断使能

    TA1CTL = TASSEL_2 + MC_2 + TAIE + TACLR;          // 选择SMCLK为时钟,连续计数模式 ,溢出中断使能

    while(FreqFlag);

    if(PwmHighEnd>PwmStart)

    {

        HighClockSteps=(HighOverFlow-1)*65536+PwmHighEnd-PwmStart;

    }else

    {

        HighClockSteps=(HighOverFlow-1)*65536+PwmHighEnd+65536-PwmStart;

    }

    if(PwmLowEnd>PwmStart)

    {

        AllClockSteps=(AllOverFlow-1)*65536+PwmLowEnd-PwmStart;

    }else

    {

        AllClockSteps=(AllOverFlow-1)*65536+PwmLowEnd+65536-PwmStart;

    }

    if(AllClockSteps)

    {

        PeakIntervalSteps = (u16)AllClockSteps/SAMPLETIMES; //测峰峰值中以10倍频率进行采样

    }

    Frequency = 16000000/AllClockSteps;

    Duty = HighClockSteps*100.0/AllClockSteps;

}

/*

 * 功能:测P1.3管脚信号的峰峰值

 * */

void Measure_Peak_Value(void)

{

   if(PeakIntervalSteps) //如果采样间隔不为0

   {

       //使用TimerA1的计数模式,

       TA1CTL |= TACLR;  //定时器清零

       TA1CTL |= TASSEL_2+ MC_1+ID_0;  //SMCLK(16MHz),1分频,上数模式

       //定时器开始计数从0到CCR0

       TA1CCR0 = PeakIntervalSteps;     //十分之一个周期中断一次

       TA1CCTL0=CCIE;    //使能中断

       ADC10_Init(3);    // 初始化ADC

       SampleStatus = SAMPLEPERIODS;

       while(SampleStatus);



   }

}

#pragma vector = TIMER1_A0_VECTOR

__interrupt void TimerA1_ISR(void)

{

    _DINT();

    static u16 PeriodValue[2*SAMPLETIMES],MaxValue[SAMPLEPERIODS+1],MinValue[SAMPLEPERIODS+1];

    u32 MaxSum,MinSum;

    static u8 i;

    u8 j;

    if(SampleStatus)

    {

        if(i<2*SAMPLETIMES)

       {

           ADC10_Start_Convey();

           PeriodValue[i++] = ADC10_Result;

       }

       if(i==2*SAMPLETIMES)

       {

           i=0;

           MaxValue[SampleStatus]=MinValue[SampleStatus]=PeriodValue[0];//初始化最值

           for(j=0;j<2*SAMPLETIMES;j++)

           {

               if(PeriodValue[j]>MaxValue[SampleStatus])MaxValue[SampleStatus]=PeriodValue[j];

               if(PeriodValue[j]

           }

           SampleStatus--;  //测量的周期次数减1

           if(SampleStatus==0)//如果采样完成

           {

               for(j=1;j<=SAMPLEPERIODS;j++)

               {

                   MaxSum+=MaxValue[j];

                   MinSum+=MinValue[j];

               }

               PeakValue=(u16)(MaxSum-MinSum)/SAMPLEPERIODS;

               MaxSum=MinSum=0;

}


关键字:msp430G2553  低频方波频率  占空比  峰峰值  测量函数 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
8051单片机的函数发生器的设计