340|3

36

帖子

2

TA的资源

一粒金砂(中级)

楼主
 

【极海APM32M3514电机通用评估板】高级定时器TMR1的中断与刹车中断测试 [复制链接]

 

APM32M3514高级定时器

一.APM32M3514高级定时器(TMR1)简介

高级定时器 TMR1 以时基单元为核心,拥有输入捕获、输出比较和刹车输入等功 能,含有一个 16 位的自动装载计数器。高级定时器含有互补输出、重复计数以 及可编程的死区插入等功能,更加适合用于电机的控制。

1.TMR1的功能框图

 

2.主要特征和功能

①.时基单元,采用16位计数器,可以向上、向下和中央对齐计数,带16位预分频和16位的重复计数器,并带自动重装功能。

②.拥有丰富的时钟源选择,有内部时钟、外部输入、外部触发、内部触发。

③.输入捕获功能,可以实现计数,PWM输入(脉冲宽度、频率和占空比测量)和编码器接口输入

④.输出比较功能,PWM输出模式、强制输出模式、单脉冲模式和互补输出与死区插入。

⑤、定时功能

⑥、刹车功能

⑦、定时器的主/从模式控制,支持定时器之间可以同步和级联,支持多种从模式和同步信号

⑧、中断输出和DMA请求事件,更新事件、触发事件、捕获/比较事件、刹车信号输入事件。

3.寄存器地址映射

 

 

 

二、TMR1软件开发与讲解

1.TMR1初始化

1.1.初始化函数

Drv_TMR1_Init(PWM_PERIOD,DEAD_TIME);//调用TMR1初始化函数

初始化函数的实现如下:

/*初始化TMR1的外围时钟*/

RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SYSCFG  | RCM_APB2_PERIPH_TMR1 );

 TIM_TimeBaseInitStructure.period            = (SYSTEM_FREQUENCY/2/2000);设置定时器周期

    TIM_TimeBaseInitStructure.div               = 0;//设置定时器分频

    TIM_TimeBaseInitStructure.counterMode       = TMR_COUNTER_MODE_CENTERALIGNED2;//设置定时器计数模式为中间对齐。

    TIM_TimeBaseInitStructure.clockDivision     = TMR_CKD_DIV1;//设置时钟分频

    TIM_TimeBaseInitStructure.repetitionCounter = 1;//配置重复计数器值

TMR_ConfigTimeBase(TMR1, &TIM_TimeBaseInitStructure);//初始化定时器

    TIM_BDTRInitStructure.RMOS_State       = TMR_RMOS_STATE_ENABLE;//设置运行模式下的状态

    TIM_BDTRInitStructure.IMOS_State       = TMR_IMOS_STATE_ENABLE;//设置空闲模式下的状态

    TIM_BDTRInitStructure.lockLevel        = TMR_LOCK_LEVEL_OFF;//00:锁定关闭,寄存器无写保护;01:锁定级别1,不能写入TIMx_BDTR寄存器的DTG、BKE、BKP、AOE位和TIMx_CR2寄存器的OISx/OISxN位;

    TIM_BDTRInitStructure.deadTime         = u16_DeadTime;//死区时间

    TIM_BDTRInitStructure.breakState       = TMR_BREAK_STATE_ENABLE; //设置刹车状态

    TIM_BDTRInitStructure.breakPolarity    = TMR_BREAK_POLARITY_HIGH;//设置刹车信号极性

    TIM_BDTRInitStructure.automaticOutput  = TMR_AUTOMATIC_OUTPUT_DISABLE;//关闭自动输出状态

    TMR_ConfigBDT(TMR1, &TIM_BDTRInitStructure);//设计 刹车寄存器

    TIM_OCInitStructure.OC_Mode         = TMR_OC_MODE_PWM2;//选择定时器模式为PWM2

    TIM_OCInitStructure.OC_OutputState  = TMR_OUTPUT_STATE_ENABLE; //配置定时器输出状态

    TIM_OCInitStructure.OC_OutputNState = TMR_OUTPUT_NSTATE_ENABLE; //配置补偿端的状态

    TIM_OCInitStructure.Pulse           = u16_Period;//配置定时器周期

    TIM_OCInitStructure.OC_Polarity     = TMR_OC_POLARITY_HIGH;//配置信号极性

    TIM_OCInitStructure.OC_NPolarity    = TMR_OC_NPOLARITY_HIGH; //互补输出极性-------

    TIM_OCInitStructure.OC_Idlestate    = TMR_OCIDLESTATE_RESET;  // 空闲状态

    TIM_OCInitStructure.OC_NIdlestate   = TMR_OCNIDLESTATE_RESET; // 补偿端的空闲状态

TMR_OC1Config(TMR1, &TIM_OCInitStructure);初始化TMR1定时器和补偿端

……

    TMR_OC4Config(TMR1, &TIM_OCInitStructure);//OC4

    //enable interrupt

    TMR_EnableInterrupt(TMR1, TMR_INT_BRK);//开启中断

TMR_EnableInterrupt(TMR1, TMR_INT_CH4); //开启通道4的中断  

TMR_EnableAUTOReload(TMR1);//TIMx_ARR寄存器被装入缓冲器

    TMR_OC1PreloadConfig(TMR1,TMR_OC_PRELOAD_ENABLE);//允许比较1预装值

    TMR_OC2PreloadConfig(TMR1,TMR_OC_PRELOAD_ENABLE);// 允许比较2值预装载使能

    TMR_OC3PreloadConfig(TMR1,TMR_OC_PRELOAD_ENABLE); /允许比较3值预装载使能

    TMR_OC4PreloadConfig(TMR1,TMR_OC_PRELOAD_ENABLE); 允许比较3值预装载使能,第4通道用作定时器中断,用于采集霍尔传感器状态读取和使用六步换相法时,进行换相操作。

    TMR_EnableAUTOReload(TMR1);//允许TMR1自动重装

    TMR_Enable(TMR1);//开启TMR1

    TMR1->REPCNT = 1;//允许重装次数

    TMR_EnablePWMOutputs(TMR1); 允许tmr1的PWM输出

/*下例为初始化PWM的输出引脚*/

    GPIO_InitStructure.pin      =   GPIO_PIN_PWM_UH_Mobile;

    GPIO_InitStructure.speed    =   GPIO_SPEED_50MHz;

    GPIO_InitStructure.mode     =   GPIO_MODE_AF;

    GPIO_InitStructure.pupd     =   GPIO_PUPD_PD;

    GPIO_Config(GPIO_PWM_UH_Mobile, &GPIO_InitStructure);

……

/*设置复用引脚的模式为PWM输出,设置完三路输出和三路互补输出*/

GPIO_ConfigPinAF(GPIO_PWM_UH_Mobile,GPIO_PIN_SOURCE_PWM_UH_Mobile,GPIO_AF_PIN2);

……

GPIO_ConfigPinAF(GPIO_PWM_Break_Mobile,GPIO_PIN_SOURCE_PWM_Break_Mobile,GPIO_AF_PIN3);

设置刹车信号引脚

1.2.比较器值的设置

/*调用比较器值函数如下**

Drv_TMR1_CompareConfig(PWM_PERIOD, PWM_PERIOD, PWM_PERIOD, PWM_PERIOD, PWM_PERIOD, PWM_PERIOD);

实现内容如下:

void Drv_TMR1_CompareConfig(uint16_t usCmpA,uint16_t usCmpB,uint16_t usCmpC,uint16_t usCmpnA,uint16_t usCmpnB,uint16_t usCmpnC)

{

  PWM_CMPR1 = usCmpA;//设置A相比较值点

  PWM_CMPR2 = usCmpB;// 设置B相比较值点

  PWM_CMPR3 = usCmpC;// 设置C相比较值点

 

  PWM_CMPR1_CC1C = usCmpnA;// 设置A相互补端比较值点

  PWM_CMPR2_CC2C = usCmpnB;// 设置B相互补端比较值点

  PWM_CMPR3_CC3C = usCmpnC;// 设置C相互补端比较值点

}

1.3.TMR1中断初始化

#define TIM_FLAG_Break                     ((uint16_t)0x0080)

#define TIM_FLAG_CC4                       ((uint16_t)0x0010)

__enable_irq();                             //Enable all interrupts开启所有中断

void Interrupt_Init(void)

{

    /* Configure one bit for preemption priority配置一位的抢占优先级 */

    SCB->AIRCR = (uint32_t)0x05FA0500;

   NVIC_EnableIRQ(TMR1_CC_IRQn);//开启TMR1的中断请求

   NVIC_SetPriority(TMR1_CC_IRQn,0);//开启TMR的刹车中断请求优先级

    NVIC_EnableIRQ(TMR1_BRK_UP_TRG_COM_IRQn);//开启TMR的刹车中断请求

    NVIC_SetPriority(TMR1_BRK_UP_TRG_COM_IRQn,0); //开启TMR的刹车中断请求优先级

    TMR1->STS &= (uint16_t)0xFFFE;//实始化TMR1的状态寄存器

    TMR1->STS &= (uint16_t)0xFF6F;

}

1.4.开启定时器

调用定时器开启函数,打开定时器

void TMR_EnablePWMOutputs(TMR_T* TMRx)

{

    TMRx->BDT_B.MOEN = ENABLE;//开启tmr1的PWM输出

}

2.TMR1定时器中断函数实现

2.1.TMR1刹车中断

void TMR1_BRK_UP_TRG_COM_IRQHandler(void)

{

    if ((TMR1->STS&TIM_FLAG_Break)==TIM_FLAG_Break)//判断TMR1的中断状态位,是否产生刹车中断

    {

        /*Hardware overcurrent protection*/

        TMR1->STS &= (uint16_t)0xFF7F;//清除状态寄存器

        Motor_type.User.stc_fault.u16_FaultFlg = OVER_CUR_HARD;//设置硬件过流

        TIM1_PWMOutput(DISABLE);//关闭PWM输出

        TMR1->BDT_B.MOEN = ENABLE;//寄存器模式配置,开启是运行模式,关闭是空闲模式

    }

    else if((TMR1->STS&TIM_FLAG_Update)==TIM_FLAG_Update)//是否是更新中断

    {  

        TMR_ClearIntFlag(TMR1,TMR_INT_FLAG_UPDATE);//请除状态标志位

         /* Counter overflow down*/

    }

}

2.2. TMR1中断函数入口TMR1_CC_IRQHandler

void TMR1_CC_IRQHandler(void)

{

  if ((TMR1->STS&TIM_FLAG_CC4)==TIM_FLAG_CC4)//判断是否时TMR1的四通道产生中断

  {

    TMR_ClearIntFlag(TMR1,TMR_INT_FLAG_CH4); //清除标志位

  }

}

 

3.运行效果

 

最新回复

nmg
涉及到代码的地方,使用编辑器的 代码嵌入功能吧,平铺看起来会乱一些   详情 回复 发表于 2024-12-31 17:36
点赞 关注
 
 

回复
举报

5260

帖子

239

TA的资源

管理员

沙发
 

涉及到代码的地方,使用编辑器的 代码嵌入功能吧,平铺看起来会乱一些

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身

点评

OK  详情 回复 发表于 2025-1-4 21:52
好的,下次注意  详情 回复 发表于 2025-1-4 19:25
 
 
 

回复

36

帖子

2

TA的资源

一粒金砂(中级)

板凳
 
nmg 发表于 2024-12-31 17:36 涉及到代码的地方,使用编辑器的 代码嵌入功能吧,平铺看起来会乱一些

好的,下次注意

 
 
 

回复

36

帖子

2

TA的资源

一粒金砂(中级)

4
 
nmg 发表于 2024-12-31 17:36 涉及到代码的地方,使用编辑器的 代码嵌入功能吧,平铺看起来会乱一些

OK

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

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