历史上的今天
返回首页

历史上的今天

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

正在发生

2020年02月09日 | MSP430定时器介绍

2020-02-09 来源:eefocus

MSP430定时器笔记


1.定时器参数

1.1 基本定时器

typedef enum

{

  TIMER_A0              ,

  TIMER_A1              ,

  TIMER_A2              ,

  TIMER_B0              ,

  TIMER_NUM             ,

}TIMERn;             //定时器模块


1.2 定时器通道引脚、时钟选择

const GPIO_PIN TIMER_CHANEL_PIN[TIMER_NUM][TIMER_CH_NUM]=

{// CH0    CH1    CH2    CH3    CH4    CH5    CH6

  {{P1,1},{P1,2},{P1,3},{P1,4},{P1,5}},                  //TIMER_A0

  {{P1,7},{P2,0},{P2,1}},                                //TIMER_A1

  {{P2,3},{P2,4},{P2,5}},                                //TIMER_A2

  {{P5,6},{P5,7},{P7,4},{P7,5},{P7,6},{P3,5},{P3,6}}     //TIMER_B0

};//通道引脚

const GPIO_PIN TIMER_CLK_PIN[TIMER_NUM] =

{

  {P1,0},//TIMER_A0----ACLK----

  {P1,6},//TIMER_A1----ACLK----

  {P2,2},//TIMER_A2----SMCLK----

  {P7,7} //TIMER_B0----MCLK----

};//外部时钟输入引脚


2.定时器功能

2.1 实现基本定时

extern STATUS   TIMER_Interval_Us   (TIMERn, uint32_t us);  //初始化一个us级的定时中断

#define         TIMER_Interval_Ms(timer,ms)  TIMER_Interval_Us(timer,(uint32_t)ms*1000)


2.1.1 中断向量设置传参

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

*  函数名称:Set_Vector_Handler(VECTORn vector,__interrupt void pfunc_handler(void))

*  功能说明:设置中断向量地址

*  参数说明:

            VECTORn vector  :中断向量(枚举变量,见.h文件)

            __interrupt void pfunc_handler(void)  : 中断服务函数

*  函数返回:无

*  使用示例:Set_Vector_Handler(VECTOR_PORT1,GPIO_IRQ_Handler);    //设置PPORT1中断服务函数为GPIO_IRQ_Handler,需要先定义中断服务函数,另外最好先设置中断向量,再开启中断

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

void Set_Vector_Handler(VECTORn vector, __interrupt void pfunc_handler(void))

{

  if(SYSX->RIVECT == DISABLE)        //如果没有设置中断向量表到RAM,则设置

  {

    Set_VectorTable_To_RAM();                       //设置中断向量表到RAM

  }

  //此处若有警告可忽略

  __VECTOR_RAM[vector] = (ISR_TYPE)pfunc_handler;     //设置该中断向量地址

}


2.1.2 定时中断

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

*  函数名称:TIMER_Interval_Us(TIMERn timer,uint32_t us)

*  功能说明:定时器定时初始化(单位:us)

*  参数说明:TIMERn timer       :定时器模块

             uint32_t us          : 定时时间

*  函数返回:不成功则返回ERROR,成功则返回SUCCESS

*  使用例程:TIMER_Interval_Us(TIMER_B0,2500);  //TB定时间隔2.5ms中断

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

STATUS  TIMER_Interval_Us(TIMERn timer,uint32_t us)

{

#ifdef DELAY_TIMER

  ASSERT((timer != DELAY_TIMER),

         "TIMER_Interval_Us",

         "定时器已经设置为默认延时功能,不能再作为其他功能使用");       //不允许这种情况下还宏定义该定时器作为延时所用的定时器,请在system.h里修改DELAY_TIMER宏定义

#endif

  TIMERX[timer]->CLR = BIT_SET;//置位

  TIMERX[timer]->SSEL = TIMER_SSEL_SMCLK;

  TIMERX[timer]->ID = 0u;//分频系数清零

  //计数值

  uint32_t Counter_Value = (uint32_t)(us * g_sClock.SMCLK.fMHZ);

  while(Counter_Value > 65536)

  {

     TIMERX[timer]->ID ++;

     Counter_Value >>= 1;  

     if((TIMERX[timer]->ID == 3u) && (Counter_Value > 65536))   //这个时候意味得选择更低频率的时钟了

     {

      if(TIMERX[timer]->SSEL == TIMER_SSEL_ACLK) //如果时钟已经是最低的ACLK了,那么意味着设置的频率太低了,失败返回ERROR

      {

        return ERROR;

      }

      //更换为更低的ACLK,从新配置

      TIMERX[timer]->SSEL = TIMER_SSEL_ACLK;

      TIMERX[timer]->ID = 0u;  

      Counter_Value = (uint32_t)(us * g_sClock.ACLK.fMHZ);

      continue;  

     }

  }

  if(Counter_Value <= 1)//出现这种情况,说明频率不合适

  {

    return ERROR;

  }


  TIMERX[timer]->CCR[0] = (uint16_t)(Counter_Value - 1u);//为什么要减一??因为TAR/TBR计数器从CCR0变化到0还有一个计数周期

  TIMERX[timer]->CCTL[0].CAPMODE = RESET;//比较模式

  TIMERX[timer]->IE = RESET;             //关闭溢出中断

  TIMERX[timer]->CCTL[0].IE = RESET;     //关闭通道中断

  TIMERX[timer]->MC = TIMER_MC_UP;      //增计数模式


  return SUCCESS;

}


2.1.3 初始化实例

DisableInterrupts();          //禁止总中断 


 Set_Vector_Handler(VECTOR_TIMER0_A0,TIMER_TA0_IRQ_Handler);    //设置中断向量,最好先设置中断向量,在开启中断

  TIMER_Interval_Ms(TIMER_A0,200);//初始化一个200ms的定时中断

  //TIMER_Interval_Us(TIMER_A0,1000000);                    //初始化一个1000ms的定时中断,不要写为1000*1000,否则会提示超出范围

  TIMER_ITConfig (TIMER_A0,TIMER_CCR0_IRQn,ENABLE);


EnableInterrupts();


__interrupt void TIMER_TA0_IRQ_Handler()

{

  LED_Turn(LED2); //黄灯

  //FLAG_10MS=1;

}


2.2 PWM输出

2.2.1 PWM计数模式

#define TIMER_MC_STOP         (0)  /* Timer A mode control: 0 - Stop */

#define TIMER_MC_UP           (1)  /* Timer A mode control: 1 - Up to CCR0 */

#define TIMER_MC_CONTINUOUS   (2)  /* Timer A mode control: 2 - Continuous up */

#define TIMER_MC_CONTINOUS    (2)  /* Legacy define */

#define TIMER_MC_UPDOWN       (3)  /* Timer A mode control: 3 - Up/Down */


2.2.2 PWM输出模式

typedef enum

{

  TIMER_PWM_OUTMOD0     ,

  TIMER_PWM_OUTMOD1     ,

  TIMER_PWM_OUTMOD2     ,

  TIMER_PWM_OUTMOD3     ,

  TIMER_PWM_OUTMOD4     ,

  TIMER_PWM_OUTMOD5     ,

  TIMER_PWM_OUTMOD6     ,

  TIMER_PWM_OUTMOD7     ,

}TIMER_PWM_OUTMODn;       //PWM波输出波形


各种计数情况下pwm输出模式 

1

2.3 pwm输出

2.3.1 pwm初始化

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

*  函数名称:TIMER_PWM_MultiChannel_Init(TIMERn timer, uint32_t fre, uint8_t ChannelNum,...)

*  功能说明:定时器PWM输出初始化(可以多个通道同时初始化)

*  参数说明:TIMERn timer       :定时器模块

             uint32_t fre         :频率

             uint8_t ChannelNum   :要初始化的通道数

             ...                :初始化的通道

*  函数返回:不成功则返回ERROR,成功则返回SUCCESS

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

STATUS TIMER_PWM_MultiChannel_Init(TIMERn timer, uint32_t fre, uint8_t ChannelNum,...)

{

#ifdef DELAY_TIMER

  ASSERT((timer != DELAY_TIMER),

         "TIMER_PWM_MultiChannel_Init",

         "定时器已经设置为默认延时功能,不能再作为其他功能使用");       //不允许这种情况下还宏定义该定时器作为延时所用的定时器,请在system.h里修改DELAY_TIMER宏定义

#endif

  ASSERT((timer==TIMER_A0&&ChannelNum<=TIMER_CH4)

       ||(timer==TIMER_A1&&ChannelNum<=TIMER_CH2)

       ||(timer==TIMER_A2&&ChannelNum<=TIMER_CH2)

       ||(timer==TIMER_B0&&ChannelNum<=TIMER_CH6),

       "TIMER_PWM_MultiChannel_Init",

       "定时器通道参数超出范围!"); //断言检测输入参数*/


  va_list ap;

  va_start(ap,ChanelNum);

  for(int i=0;i < ChannelNum;i++)           //根据初始化的通道数,逐一初始化通道

  {

    TIMER_CHn ch = va_arg(ap, TIMER_CHn);  //读取要初始化的通道

    if((ch == TIMER_CH0) || (ch >= TIMER_CH_NUM))   //判断通道值是否合理

    {

      return ERROR;                                 //不合理返回ERROR

    }

    //初始化端口

    GPIO_Init(TIMER_CHANEL_PIN[timer][ch].Port,TIMER_CHANEL_PIN[timer][ch].Pin,GPO|SEL);

    //初始化占空比及输出波形

    TIMERX[timer]->CCR[ch] = 0u;

    TIMERX[timer]->CCTL[ch].IE = RESET;               //关闭通道中断

    TIMERX[timer]->CCTL[ch].OUTMOD = DEFAULT_PWM_OUTMOD;      //输出波形设置

    TIMERX[timer]->CCTL[ch].CAPMODE = RESET;          //比较模式

  }

  va_end(ap);


  return TIMER_PWM_SetFrequency(timer,fre);

}


设置频率函数


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

*  函数名称:TIMER_PWM_SetFrequency(TIMERn timer,uint32_t fre)

*  功能说明:定时器PWM频率设置(注意这里没有更改各个通道的占空比,所以修改频率后占空比变了,需要从新设置占空比)

*  参数说明:TIMERn timer       :定时器模块

             uint32_t fre         :频率

*  函数返回:不成功则返回ERROR,成功则返回SUCCESS

*  使用例程:TIMER_PWM_SetFrequency(TIMER_B0,1000);       //将定时器B输出频率修改为1000Hz

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

STATUS  TIMER_PWM_SetFrequency(TIMERn timer,uint32_t fre)

{

  if(fre == 0u)

  {

    TIMERX[timer]->MC = TIMER_MC_STOP;              //暂停输出PWM波

    return SUCCESS;

  }


  TIMERX[timer]->CLR = BIT_SET;

  TIMERX[timer]->SSEL = TIMER_SSEL_SMCLK;           //先选择时钟源为SMCLK

推荐阅读

史海拾趣

Hirose公司的发展小趣事

对于单级PFC电路,网友可能还会有多种问题,以下是一些常见问题及其回答:

一、技术原理与特性

  1. 单级PFC电路的基本工作原理是什么?
    • 回答:单级PFC电路通过共用一个开关管和一套PWM控制电路,同时实现功率因数校正(PFC)和对输出电压的调节。它通常由升压型PFC级和DC-DC变换器组合而成,两部分电路共用一个开关,通过控制开关的通断,电路同时完成对AC输入电流的整形和对输出电压的调节。
  2. 单级PFC电路相比两级PFC电路有哪些优缺点?
    • 回答:优点包括电路结构简单、成本较低、效率较高(在某些设计下)。缺点则在于PFC和对输入电流谐波抑制的效果可能不如两级PFC电路,且在某些应用中可能面临安规问题。

二、设计与应用

  1. 如何设计单级PFC电路以满足特定的功率因数要求?
    • 回答:设计单级PFC电路以满足特定功率因数要求时,需要考虑电感的选择、开关管的选型、控制电路的设计以及反馈机制等因素。通过精确控制开关管的通断时间和占空比,可以实现对输入电流的整形,从而改善功率因数。此外,还可以采用有源钳位和软开关技术来进一步提高效率并降低开关损耗。
  2. 单级PFC电路在哪些应用场景中较为常见?
    • 回答:单级PFC电路因其结构简单、成本较低而广泛应用于各种需要功率因数校正的电子设备中,如LED驱动电源、电源适配器、开关电源等。特别是在对成本有一定要求的场合,单级PFC电路更具竞争力。

三、故障与调试

  1. 单级PFC电路在调试过程中可能会遇到哪些常见问题?
    • 回答:在调试单级PFC电路时,可能会遇到次级去电流检测电阻过大、光耦供电电阻过大、比较器电流反馈电容过大等问题。这些问题可能导致PFC电路无法正常工作或性能下降。解决方法包括调整相关电阻和电容的数值、检查电路连接是否正确、更换损坏的元件等。
  2. 如何诊断和解决单级PFC电路中的故障?
    • 回答:诊断和解决单级PFC电路中的故障时,首先需要检查电路中的保险丝是否熔断、MOS管是否损坏或过热、反馈控制元件是否失效以及负载是否存在故障等。通过逐一排查这些可能的问题点,可以定位故障原因并采取相应的修复措施。在检修过程中,需要注意安全操作规范,避免触碰高压部位并断开电源。

四、性能优化

  1. 如何优化单级PFC电路的性能?
    • 回答:优化单级PFC电路的性能可以从多个方面入手,包括优化电感的设计以减小损耗、选择合适的开关管和二极管以降低导通压降和反向恢复时间、改进控制算法以提高控制精度和响应速度等。此外,还可以采用有源钳位和软开关技术来进一步降低开关损耗并提高整体效率。
  2. 单级PFC电路的效率如何提升?
    • 回答:提升单级PFC电路的效率可以通过多种方法实现,包括优化电路拓扑结构、选用高效率的开关管和二极管、降低电路中的寄生参数和损耗、采用先进的控制算法等。此外,合理设计散热系统以确保开关管和其他关键元件在正常工作温度下运行也是提高效率的重要手段之一。
DMS Electronic Components, Inc公司的发展小趣事

在电子行业中,市场拓展是企业发展的关键因素之一。DMS积极开拓国内外市场,与众多知名企业建立了长期稳定的合作关系。公司通过提供优质的产品和服务,赢得了客户的信赖和支持。同时,DMS还积极参与行业展会和交流活动,与同行进行技术交流和合作,共同推动电子行业的发展。

HTC Korea(TAEJIN Technology )公司的发展小趣事

HTC Korea自成立以来,一直致力于国际化布局,与全球各地的合作伙伴建立了良好的关系。目前,HTC的产品已在欧美、亚泰地区大量销售,与各地的电信运营商、芯片制造商等保持了紧密的合作关系。这种广泛的合作伙伴网络为HTC提供了强大的市场支持和技术保障,推动了其在全球范围内的快速发展。同时,HTC还通过了ISO9001及ISO14001质量体系认证,以系统、人性化的管理努力成为行业的佼佼者。

Fujitsu America公司的发展小趣事

为了更好地服务北美市场的客户,Fujitsu America实施了一系列本地化服务策略。公司不仅在当地建立了完善的销售和服务网络,还积极培养本地化的技术和服务团队,以更好地满足客户的实际需求。同时,Fujitsu America还注重与当地政府和行业协会的沟通与合作,积极参与行业标准的制定和推广工作,为公司在北美市场的长期发展奠定了坚实的基础。通过这些本地化服务策略的实施,Fujitsu America在北美市场树立了良好的品牌形象和市场地位。

DRI Relays Inc公司的发展小趣事

随着全球环保意识的提高,DRI Relays Inc公司积极响应环保号召,践行绿色环保理念。公司采用环保材料和节能技术,减少生产过程中的能源消耗和废弃物排放。同时,公司还注重产品的回收和再利用,为客户提供环保解决方案。这些举措不仅提升了公司的社会形象,还为公司带来了更多的商业机会和发展空间。

德索五金(dosinconn)公司的发展小趣事

发展历程:2015年,德索五金电子国际控股有限公司在香港注册成立,为公司拓展海外市场提供了有力支持。通过不断优化产品和服务,德索五金电子逐渐在国际市场上赢得了客户的信任和认可。

成果与影响:海外市场的拓展使德索五金电子的业务范围更加广泛,也为公司的国际化发展奠定了坚实的基础。

问答坊 | AI 解惑

谁有 ACD资料

谁有ACD 资料啊…

查看全部问答>

IGBT短路失效机理

IGBT负载短路下的几种后果 (1) 超过热极限:半导体的本征温度极限为250℃,当结温超过本征温度,器件将丧失阻断能力,IGBT负载短路时,由于短路电流时结温升高,一旦超过其热极限时,门级保护也相应失效. (2) 电流擎住效应:正常工作电流下,IGBT由于薄 ...…

查看全部问答>

无线信号 高手进

我在这招了半天也莫有找到我要的答案,发个帖看看有没有高手给我支支招。 关于无线信号如何检测的问题,方法越具体越多越好。。。用示波器的话说明具体的用法。我琢磨很久了,奈何能力有限。。。…

查看全部问答>

proteus 的键盘在哪

单个的键(不是开关) 和 矩阵键盘…

查看全部问答>

条码手持终端应用程序开发!!!

条码手持终端应用程序开发!!! 本人在条码行业有多年的工作经验,一直从事条码手持终端应用程序的开发 开发过多种设备: CASIO DT900,DT300,DTX10; Cipher 711 ; SYMBOL MC50,MC1000,PPT8800; Intermec 700系列 有需要的请联系本人 QQ:6 ...…

查看全部问答>

急!!!如何在PC机上实现对单片机的控制(用VC++6.0编程)

小弟正在想弄一个在PC机上实现对单片机的控制,但不知道从哪个方面入手? 希望各位达人给予小弟一些指点.发个程序给小弟参考参考(用C语言编写的)…

查看全部问答>

正式入手STM8S103K3

经历了很多推销的宣传,今天买了10片样品,准备把以前ATMEL8的东西都移植过来. 有几个问题,一直没搞明白: 1. STM8S103K3会不会象ATMEL那样,1000元就能把代码都读出来?STM8S103K3的     解密难度有多大? 2. 以前一直用ICC和KEIL开 ...…

查看全部问答>

2812程序烧到片内flash中运行,能否用CCS和仿真器观察内部变量

2812程序烧到片内flash中运行,能否用CCS和仿真器观察内部变量, 调试电机程序,使用仿真器容易跑飞,希望能烧到flash中运行,同时也希望能像在ccs里仿真一样观察几个关键变量,听有的工程师说是能实现的,希望有能得到指点?…

查看全部问答>

用io口控制k9k8G08U0A写不进去数(急)

这是个试验程序,就是把整页写入同一个数据,,另外ID什么都可以读出来,,个人感觉数据是可以读出来的,,但读出来的全是FF,2112个FF后是64个0x15,我把读命令改错的话,读出来的是那个输入的数据,说明内部没把数据读出来,这是不是说明FF读出来 ...…

查看全部问答>

有源电力滤波器的控制技术的实现

在整个APF中基准电流的产生方法是核心环节,只有产生正确的基准电流信号才能很好的补偿谐波和无功电流。当只是补偿谐波电流时只需获取负载电流中的谐波分量即可,当补偿谐波及无功时除了要获取谐波电流信号外还需获取基波电流中的无功分量。基准电 ...…

查看全部问答>