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.运行效果