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

发布者:荒火最新更新时间:2020-02-12 来源: eefocus关键字:msp430G2553  低频方波频率  占空比  峰峰值  测量函数 手机看文章 扫描二维码
随时随地手机看文章

使用的平台是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;

           }

       }

    }

    _EINT();

}

#pragma vector = TIMER1_A1_VECTOR

__interrupt void TimerA1_Capture_ISR(void)

{

    _DINT(); //关闭中断,

    switch(TA1IV)//向量查询

    {

        case 2: //捕获中断,CCR1

            if(FreqFlag)

            {

                static u8 index;

                if((TA1CCTL1&CM0)&&(index==0)) //第一次上升沿

                {

                    TA1CCTL1|=CM_2;//更变为下降沿触发

                    PwmStart=TA1R;//记录初始时间

                    HighOverFlow = AllOverFlow = 0;    //溢出计数变量复位

[1] [2]
关键字:msp430G2553  低频方波频率  占空比  峰峰值  测量函数 引用地址:基于msp430G2553的低频方波频率、占空比、峰峰值测量函数

上一篇:MSP430G2253 产生占空比可调的PWM
下一篇:msp430f5529串口通信

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

利用STC15单片机产生一个占空比频率可调的PWM波
#include stc15f2k60s2.h #define uint unsigned int #define uchar unsigned char sbit P1_0=P1^0; void dutyANDf(float duty,float f) { int Xt1,Xt0; float t1,t0; uchar h1,l1,h0,l0; t1=duty/f; //高电平时长 t0=(1/f)-t1; //低电平时长 Xt1=65536-1000000*t1; //高电平的时长转换成的定时器16位数 Xt0
[单片机]
51单片机实验——输出占空比为1:3的矩形波
1.实验题目: 设单片机的时钟为12MHz,请利用定时器T2编出使P4.6引脚输出周期为3s的矩形波程序,要求占空比系数为1:3,观察灯LED10的变化。(在一个周期内,高电平所占的时间叫占空。) 2.KEIL代码 #include reg51.h sbit LED=P1^6; void main() { TMOD &=0X0F; TMOD |=0x01;//选择定时器T0的工作模式1 TH0 = (65536 - 50000)/256;//高四位初值 TL0 = (65536 - 50000)%256;//低四位初值,每隔50ms溢出 EA = 1; //开总中断 ET0 = 1; TR0
[单片机]
MSP430G2553 WDT的定时器模式例子
#include MSP430G2553.h int main( void ) { WDTCTL = WDT_ADLY_1000; //定时周期为1000ms IE1 |= WDTIE; //使能WDT中断 P1DIR |= 0x01; // P1.0输出 _EINT(); //等同_EINT(), 系统总中断允许 while(1) //循环等待定时器溢出中断 { LPM3; //进入 LPM3 _NOP(); } } //===========看门狗中断服务子程
[单片机]
带中断MSP430G2553控制程序和错误处理
MSP430G2553板LED在P1.0和P1.6,和P1.3连着一个按钮开关,可以对其进行中断编程。 #include MSP430G2553.h int ms,k,i; char jj ={ 0x01,0x00,0x40,0x00,0x01,0x00,0x40,0x00,0x40,0x00,0x01, 0x00,0x40,0x00,0x01,0x00,0x41,0x00,0x41,0x00,0x41,0x00 }; void delay(int ms) { while(ms--) { for(i=0;i 120;i++); } } int main( void ) { // S
[单片机]
远程修改STM32 TIMER占空比的方案
现在有人有这样一个需求,他使用STM32F429芯片做开发,其中用到32位的TIM2实现3路PWM输出。 另外有上位机跟STM32的UART接口相连,上位机可能不定期地需要通过UART接口给STM32发送新的占空比参数,而且每次都发送3个比较输出通道的参数【12个字节】。 如何快捷地实现这个功能呢?要求收到数据后尽快修改3个比较通道的参数。 前一篇重点介绍了利用DMAFIFO和UART接收事件触发DMA传输实现了3个CCR寄存器的批量修改。 我们不妨就该话题稍作拓展,不再局限于某个STM32系列,而是从整个STM32的资源上考虑当前需求。上次提到3种实现方案,我想借此机会再给大家介绍另外一种实现方案,以拓宽未来解决
[单片机]
远程修改STM32 TIMER<font color='red'>占空比</font>的方案
最近搞了一个OLED的字库程序
/******************************************************************** * OLED屏测试程序 * msp430g2553 * * 调用方法: * LCD_Init(); // OLED 初始化 * LCD_Fill(0x00); // 全屏填充 0x00 * LCD_GBK16(0, 2, 1.锄禾日当午,r2.汗滴禾下土。r3.谁知盘中餐, ); * LCD_P6x8Str (0,4, OLED ); // 显示6*8 字符串 * = HowMuchWidth(Num);// 获取某数
[单片机]
STM32+按键调控PWM输出+串口输出占空比
GPIO.c #include STM32Lib\stm32f10x.h #include hal.h /******************************************************************************* * Function Name : GPIO_Configuration * 设置PD3,PD4,PD5,PD6为键盘输入 * 设置PB0,5,8,9; PC5,7; PD7 ;PA8 为输出LED灯 *******************************************************************************/ v
[单片机]
51单片机测量占空比
在《 CAP功能测频率 》一文中,我们讲了利用STC12C5608AD的CAP功能测量频率,这一节,我们讲利用CAP功能测量频率的占空比,下面的程序,是我在做一个显示汽车发动机点火喷油脉宽项目时做的程序。现在分享给大家: /************************************************************************** 功能:测量频率的低电平保持时间,用来测量汽车喷油嘴喷油的时间,单位ms 硬件:STC12C5608AD+3位LED+TM1620+12M晶振+LM358+74HC14 ************************************************
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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