历史上的今天
返回首页

历史上的今天

今天是:2025年02月12日(星期三)

正在发生

2020年02月12日 | 基于msp430G2553的低频方波频率、占空比、峰峰值测量函数

2020-02-12 来源:eefocus

使用的平台是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;    //溢出计数变量复位

推荐阅读

史海拾趣

康奈特(CNNT)公司的发展小趣事

在光学镜片领域,产品质量是企业的生命线。康奈特深知这一点,因此从原材料采购到生产制造的每一个环节都建立了严格的品控体系。公司引进了先进的检测设备和技术手段,对每一片镜片都进行严格的检测和筛选。这种对质量的执着追求不仅赢得了消费者的信赖和认可,也为公司赢得了良好的口碑和市场份额。

Bogen Communications Inc公司的发展小趣事

在追求经济效益的同时,Bogen Communications Inc公司也积极履行社会责任,致力于可持续发展。公司注重环保和节能技术的研发和应用,努力降低产品对环境的影响。同时,公司还积极参与公益事业和慈善活动,回馈社会。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。

以上这些故事都是基于电子行业常见的发展模式而虚构的示例,旨在为您展示一个电子行业公司可能经历的不同发展阶段和挑战。如果您需要更具体、更详细的信息关于Bogen Communications Inc公司的发展故事,建议您查阅相关的行业报告、公司年报或新闻报道。

Hilscher Gesellschaft für Systemautomation mbH公司的发展小趣事

随着在高压电源领域的深入发展,HVPSI逐渐参与到行业标准的制定工作中。公司凭借其在技术上的深厚积累和市场经验,为行业标准的制定提供了宝贵的建议和数据支持。这些标准的出台不仅规范了市场秩序,也进一步巩固了HVPSI在行业内的领先地位。

HARTING公司的发展小趣事

面对市场的多元化需求,HVPSI不断扩展其产品线,从最初的高压电源模块拓展到高压直流电源、高压脉冲电源等多个领域。公司还投入大量资源研发新型材料和技术,以提升产品的性能和可靠性。这些努力使得HVPSI能够提供全方位的高压电源解决方案,满足不同行业、不同应用场景的需求。

Hitano Enterprise Corp公司的发展小趣事

HVPSI成立于本世纪初,起初是一家小型的技术初创企业,专注于研发高效、可靠的高压电源模块。在创始人及核心团队的带领下,公司迅速在MOV(金属氧化物压敏电阻)模块领域取得了突破。这些模块在电力电子设备中起到了关键的过压保护作用,有效提高了系统的稳定性和安全性。通过不断的技术迭代和产品优化,HVPSI逐渐在行业内树立了技术领先的形象。

Fong Ya Enterprise Co Ltd公司的发展小趣事

随着技术实力的增强,HVPSI开始将目光投向国际市场。公司积极参与国际电子展会,与全球各地的客户建立联系,展示其高压电源解决方案的卓越性能。同时,HVPSI也加强了与跨国企业的合作,共同开发定制化的高压电源产品,满足特定行业的需求。这一系列举措极大地拓宽了公司的市场份额,使其在国际舞台上崭露头角。

问答坊 | AI 解惑

DSP中内部Flash的应用研究

1 前言 TMS320F28xx DSP片内有128 K×16 bit字的Flash、两块4 K x16bit字的单周期访问RAM(SARAM)LO和L1、一块8 Kxl6 bit字的单周期访问RAM(SARAM)HO、两块1 Kxl6 bit字的单周期访问RAM(SARAM)M0和M1。由于存储器种类多、容量大,所以从系统的高度 ...…

查看全部问答>

到底什么是模拟的世界?

书上说世界上信号都是模拟信号,我很奇怪,要连续的信号才是模拟信号啊,我总感觉时间不是连续的,我在想是不是任何一个信号都是由很多个正弦波组成的, 如果我对一个人发出的声音进行处理,比如说把声音放大了,那么到底放大的是什么? 网上说声 ...…

查看全部问答>

周末了,让身体运动一下:)

一周的工作有点筋疲力尽,趁着周末好天气,户外小小的运动一下。 计划约上几个朋友踢踢球!咔咔。。。。一想脚就痒痒…

查看全部问答>

今天下午去参加TI和合众达组织研讨会

这次他们给我研讨的基于LM3S8962的应用。…

查看全部问答>

有没有人用过max1292

max1292是四路同步AD转换吗…

查看全部问答>

请问vxworks如何使用路由功能

我有一台多穴主机安装了vxworks系统,需要连接两个不同的子网192.168.0.0(网关为192.168.0.1)和193.1.0.0(网关为193.1.0.1)。 我通过mRouteAdd调用增加了对不同网段的静态路由表项,可是两个网段中的主机之间仍然互相不能ping同,但是都能ping通 ...…

查看全部问答>

三星arm的菜鸟问题

三星4510b的代码定义中为啥地址有个基址?3ff0000 #define SFR_BASE 0x3FF8000 #define INTPND      (*((volatile unsigned long *) (SFR_BASE + 0x4004)))   手册上如 INTPND写的是 0x4004 另外在初始化内存时 ...…

查看全部问答>

在WINCE下安装软件总是错误

我手机用的是WINCE 5.0,无论是安装CAB版本或者是绿色版本,都会提示找不到文件(或它的某一个组件),请确认路径和文件名正确并且所需要的库全部可用。 是不是什么库没有注册,该如何注册?…

查看全部问答>

有支持MX23L1610芯片的编程器吗?

有支持MX23L1610芯片的编程器吗?价格大概是多少?本人需买一台…

查看全部问答>