历史上的今天
返回首页

历史上的今天

今天是:2025年02月27日(星期四)

正在发生

2020年02月27日 | MSP432--TimerA (主要说明如何实现可调PWM)

2020-02-27 来源:eefocus

16位定时器 Timer_A 输出精密PWM


1.模式操作


Timer_A 支持     :多路捕获/比较 、PWM输出 、 定时

        同时支持 :中断


Timer_A 特点: 异步16位具有四种模式的定时器/计数器

               可选择、可配置的时钟资源

               多达7个可配置的 捕获/比较 寄存器

               具有配置PWM的功能

               异步输入和输出自锁

               中断向量寄存器快速解码定时器中断

2.基本操作模式

三种模式: 连续计数模式

           增计数模式

           增减计数模式

TimerA_initCompare() 初始化比较模式  /*需要必要的参数*/

TimerA_generatePWM() 生成PWM         /*需要必要的参数*/


/*配置TimerA PWM参数*/

Timer_A_PWMConfig pwmConfig =

{

 TIMER_A_CLOCKSOURCE_SMCLK,

 TIMER_A_CLOCKSOURCE_DIVDER_1,

 32000,

  TIMER_A_CAPTURECOMPARE_REGISTER_0,

 TIMER_A_OUTPUTMODE_TOGGLE,

 3200

};


参数详情:

typedef struct _Timer_A_PWMConfig

{

    uint_fast16_t clockSource;   //时钟资源,选取哪个时钟做定时器的来源,同430中的TASSELx

    uint_fast16_t clockSourceDivider;//分频率

    uint_fast16_t timerPeriod;//周期

    uint_fast16_t compareRegister;//选取比较寄存器

    uint_fast16_t compareOutputMode;//比较模块的输出模式

    uint_fast16_t dutyCycle;//高电平 占

} Timer_A_PWMConfig;


/*配置TimerA PWM参数*/


/*程序实例*/



/* 配置 MCLK to REFO at 128Khz for LF mode 

* 配置 SMCLK 为 64Khz */ 

MAP_CS_setReferenceOscillatorFrequency(CS_REFO_128KHZ);

MAP_CS_initClockSignal(CS_MCLK, CS_REFOCLK_SELECT, CS_CLOCK_DIVIDER_1); 

MAP_CS_initClockSignal(CS_SMCLK, CS_REFOCLK_SELECT, CS_CLOCK_DIVIDER_2); 

MAP_PCM_setPowerState(PCM_AM_LF_VCORE0);

/* 将GPIO7.3设置为PWM输出引脚,P1.1位按键

* 中断 */ 

MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P7, GPIO_PIN3, GPIO_PRIMARY_MODULE_FUNCTION); 

MAP_GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN1); 

MAP_GPIO_clearInterruptFlag(GPIO_PORT_P1, GPIO_PIN1); 

MAP_GPIO_enableInterrupt(GPIO_PORT_P1, GPIO_PIN1);

/* 配置定时器A为周期为500ms,初始占空比为10% (3200 ticks)*/

MAP_Timer_A_generatePWM(TIMER_A0_MODULE, &pwmConfig);


 


/*程序实例*/


3.相关库函数的说明

 (1)void Timer_A_clearCapureCompareInterrupt( uint32_t timer,

              uint_fast16_t captureCompareRegister) //L1047  允许定时中断

    timer:TIMER_A0_MODULE

         TIMER_A1_MODULE

          TIMER_A2_MODULE

   TIMER_A3_MODULE

    CaptureCompareRegister:TIMER_A_CAPTURECOMPARE_REGISTER_n (n=0,1,2,3,4,5,6)

    Returns None

 (2)void Timer_A_clearInterruptFlag(uint32_t timer) //清除定时器TAIFG中断标志位 

    timer:略

    Returns None

 (3)void Timer_A_clearTimer(uint32_t timer)//重启/清除 定时器的分频,计数方向等

    timer:略

    Returns None

 (4)void Timer_A_configureContinuousMode(uint32_t timer,

               const Timer_A_ContinuousModeConfig *config)//配置定时器A为连续模式

    timer:略

    Returns None

    config: 数据结构如下

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

    typedef struct _Timer_A_ContinuousModeConfig

   {

     uint_fast16_t clockSource;//时钟资源,选取哪个时钟做定时器的来源,同430中的TASSELx

     uint_fast16_t clockSourceDivider;//分频

     uint_fast16_t timerInterruptEnable_TAIE;//定时器中断允许位 0禁1允

     uint_fast16_t timerClear;//清除位

    }Timer_A_ContinuousModeConfig;

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

 (5)void Timer_A_configureUpDownConfig(uint32_t timer, 

                           const Timer_A_UpModeConfig *config)//增减计数模式的配置

    timer:略

    Returns None

    config:数据结构如下

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

   typedef struct _Timer_A_UpDownModeConfig

  {

     uint_fast16_t clockSource;//同上

    uint_fast16_t clockSourceDivider;

    uint_fast16_t timerPeriod;

        uint_fast16_t timerInterruptEnable_TAIE;

    uint_fast16_t captureCompareInterruptEnable_CCR0_CCIE;

     uint_fast16_t timerClear;

   }Timer_A_UpDownModeConfig;

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

 (6)void Timer_A_configureUpMode(uint32_t timer,

     const Timer_A_UpModeConfig *config)//增计数模式的配置

    timer:略

    Returns None

    config:数据结构如下

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

    typedef struct _Timer_A_UpModeConfig

   {

    uint_fast16_t clockSource;//同上

     uint_fast16_t clockSourceDivider;

     uint_fast16_t timerPeriod;

     uint_fast16_t timerInterruptEnable_TAIE;

     uint_fast16_t captureCompareInterruptEnable_CCR0_CCIE;

     uint_fast16_t timerClear;

   }Timer_A_UpModeConfig;

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

 (7)void Timer_A_disableCaptureCompareInterrupt(uint32_t timer,

          uint_fast16_t captureCompareRegister)//


 函数部分未完待续---


 


下面是对官方例程的一个修改,主要产生周期为5ms,P2.4输出的可调PWM。


例程中有注释错误,具体在应用中也需要注意到很多问题。


例如中断函数 port1_isr()


官方例程中没有声明外部文件使用,而中断正常工作,需要将中断函数的接口


引入到msp432_startup_ewarm.c文件中的 __root const uVectorEntry __vector_table[] @ ".intvec" ={};


中。因此在实际应用时会出现一些问题,可私信共同探讨。


#include "driverlib.h"

#include "delay.h"

#include

#include


int32_t test=0;

Timer_A_PWMConfig pwmConfig =

{

        TIMER_A_CLOCKSOURCE_SMCLK,

        TIMER_A_CLOCKSOURCE_DIVIDER_1,

        320,

        TIMER_A_CAPTURECOMPARE_REGISTER_1,

        TIMER_A_OUTPUTMODE_RESET_SET,

        288

}; //配置PWM输出参数


int main(void)

{

    MAP_WDT_A_holdTimer();

    MAP_CS_setReferenceOscillatorFrequency(CS_REFO_128KHZ);

    MAP_CS_initClockSignal(CS_MCLK, CS_REFOCLK_SELECT, CS_CLOCK_DIVIDER_1);

    MAP_CS_initClockSignal(CS_SMCLK, CS_REFOCLK_SELECT, CS_CLOCK_DIVIDER_2);

    MAP_PCM_setPowerState(PCM_AM_LF_VCORE0);

    MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2, GPIO_PIN4,

            GPIO_PRIMARY_MODULE_FUNCTION);//配置P2.4为输出PWM

    MAP_GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN1);//P1.1为按键

    MAP_GPIO_clearInterruptFlag(GPIO_PORT_P1, GPIO_PIN1);

    MAP_GPIO_enableInterrupt(GPIO_PORT_P1, GPIO_PIN1);

    

    

    MAP_Interrupt_enableInterrupt(INT_PORT1);

    MAP_Interrupt_enableSleepOnIsrExit();

    MAP_Interrupt_enableMaster();

    

    while (1)

    {

        MAP_PCM_gotoLPM0();

    }

}



extern void port1_isr(void)//中断函数

{

    uint32_t status = MAP_GPIO_getEnabledInterruptStatus(GPIO_PORT_P1);

    MAP_GPIO_clearInterruptFlag(GPIO_PORT_P1, status);

    if(status & GPIO_PIN1)

    {

       MAP_Timer_A_generatePWM(TIMER_A0_MODULE, &pwmConfig);

    if(pwmConfig.dutyCycle == 288)

            pwmConfig.dutyCycle = 32;

    else

            pwmConfig.dutyCycle += 32;

    test=pwmConfig.dutyCycle;

    }   

}


推荐阅读

史海拾趣

Cybernetic Micro Systems公司的发展小趣事

随着业务的不断发展,CMS开始将目光投向国际市场。他们通过设立海外研发中心和生产基地,积极拓展海外市场。同时,CMS还加强了与国际知名企业的合作与交流,共同推动电子行业的发展。如今,CMS的产品已经遍布全球多个国家和地区,成为电子行业中不可忽视的一股力量。

Cembre SPA公司的发展小趣事

Cembre SPA的创始人,以其对电子行业的深刻理解和远见,于XXXX年创立了这家公司。在初创期,他看到了电气连接和固定技术在工业领域中的巨大潜力,并决定专注于此。公司最初的产品线集中在电缆接头和固定设备上,这些产品以其高质量和易用性迅速获得了市场的认可。

ANOVA公司的发展小趣事

ANOVA公司的成功并非偶然,它始终站在技术创新的前沿。公司积极推动新通信技术、电池寿命和移动应用等方面的创新,不断推动电子行业的发展。ANOVA的研发团队不断探索新技术,致力于为客户提供最先进的解决方案,帮助客户在激烈的市场竞争中保持领先地位。

GD Rectifiers Ltd公司的发展小趣事

为了进一步扩大市场份额,GD Rectifiers Ltd实施了积极的国际化战略。公司首先在欧洲市场设立了销售分支机构,凭借其优质的产品和服务迅速赢得了当地客户的认可。随后,公司又陆续在北美、亚洲等地区建立了分销网络,逐步构建起覆盖全球的营销体系。在国际化进程中,GD Rectifiers Ltd注重与当地企业的合作与交流,共同推动行业标准的制定和技术进步。通过不断的努力,公司成功地将品牌和产品推向了全球市场,实现了业务规模的快速增长。

General Semiconductor ( Vishay )公司的发展小趣事

面对电子行业的高度周期性和市场波动,Vishay凭借其强大的技术实力、丰富的产品线和灵活的市场策略,始终保持在行业内的领先地位。公司通过持续的技术创新、成本优化和“一站式”服务,赢得了广大客户的信赖和支持。即使在行业低迷时期,Vishay也能保持稳定的增长和发展。如今,Vishay已成为全球最大的分立半导体和被动元件制造商之一,其产品和服务广泛应用于工业、计算机、汽车、消费品、电信、军事、航空和医药等多个领域。

AUK Contractors Co Ltd公司的发展小趣事

在追求经济效益的同时,AUK Contractors Co Ltd也积极履行企业社会责任。公司不仅严格遵守环保法规,还积极参与公益事业,为社会做出贡献。此外,公司还注重可持续发展,通过节能减排、循环利用等方式降低对环境的影响,实现了经济效益与社会效益的双赢。

这些故事虽然基于虚构,但反映了电子行业公司可能经历的典型情境和挑战。希望这些故事能够为您提供一些启发和参考。

问答坊 | AI 解惑

免费样片申请全集(全网最全最有效)<兼谈申请心得>

看了的兄弟帮忙回个帖,可以让更多的人看到. 1、推荐铁电存储器(未见量的限制,据说最多有人申请了100片,不知真假.) 介绍:铁电存储器(FRAM)产品将ROM的非易失性数据存储特性和RAM的无限次读写、高速读写以及低功耗等优势结合在一起。FRAM ...…

查看全部问答>

减少被动红外探测器误报漏报原理

我们来分析一下红外探测报警器主要有那些原因会造成误报、漏报。目前报警系统出现误报、漏报主要有以下几个方面原因。 无线探测器抗干扰能力羞表现为同频干扰容易造成误报、漏报; 红外探测器对入侵行为判断力不够准确造成误报、漏报; 红外探测 ...…

查看全部问答>

NEC单片机之——CC78K0R语言篇

本帖最后由 paulhyde 于 2014-9-15 08:58 编辑  …

查看全部问答>

烧写vivi不成功原因?

我设计的是s3c2410的板,通过jtag可以检测到CPU和NAND FLASH,通过NAND FLASH烧写vivi,可以正常烧进去;但是问题是重启时在DNW没有任何显示,好像进不去vivi…

查看全部问答>

寻找一颗芯片,一个USB转成4个RS-232的芯片,FT4232还没量产,其他还有什么类型的芯片啊!

寻找一颗芯片,一个USB转成4个RS-232的芯片,FT4232还没量产,其他还有什么类型的芯片啊!急!11111111111…

查看全部问答>

请问10 pin miniUSB接口常用于音频的引脚是怎么定义的?

10 pin miniUSB接口比较多,它有上下两排线,其中一排用于USB传输,另一排5根线常用来作为耳麦。 我想问一下: 10 pin miniUSB里用于耳麦的引脚是哪些?怎么定义的? …

查看全部问答>

特斯拉线圈的什么原理可以使全世界无线输电

特斯拉线圈的什么原理可以使全世界无线输电,有电路图没?请教下,查资料时没有看懂,呵。。。谢谢!不怕到时,周围全是人造闪电吗 [ 本帖最后由 secondlife110 于 2013-3-8 18:28 编辑 ]…

查看全部问答>

谁有基于ad9851的信号发生器设计,谢谢

本帖最后由 paulhyde 于 2014-9-15 03:09 编辑 我们用ad9851模块,按原带电路连接,用它原带程序,但是没有波形,不知道怎么回事,求知道的人帮帮忙说下原理。谢谢    …

查看全部问答>

LDC1000这个电感传感器有哪些优势呢?

本帖最后由 dontium 于 2015-1-23 11:35 编辑 根据宣传是业界第一个感性(电感)传感器,但是不是很明白有哪些优势,大家可以讨论讨论,发表下自己的看法。 ti./ww/en/analog/dataconverters/inductance-to-digital-converter/technical-document ...…

查看全部问答>