详解CKS32F107xx系列的定时器同步功能

描述

MCU微课堂

CKS32F107xx TIM(四)

第四十八期 2024.11.22

定时器同步

CKS32F107xx系列部分定时器在内部是相连的,可用于定时器同步或链接,方便用户配置不同的同步模式,以便在电机控制、数据采集和PWM信号生成等应用中,实现复杂的时间序列和多通道的同步操作。本节课我们将围绕定时器同步功能概述展开,并以其中一种功能为例——将定时器2给定时器3当预分频器,最终级联同步PWM输出。

依据《CKS32F107xx参考手册》的从模式控制寄存器相关章节得知,并非任意两个定时器都能任意级联,硬件方面是固定的,若某个产品中没有相应的定时器,则对应的触发信号ITRx也不存在。如下表1所示。

表1 普通输入捕获概览图

电机控制

如下图1所示,TIM2更新事件的输出信号TRGO1可以连接到TIM3的内部触发信号线ITR1(可由表1查阅得知),作为TIM3 的时钟输入。

电机控制

图1 主从定时器示例

要使TIM2和TIM3级联同步输出PWM波形,我们还会用到控制寄存器2(TIMx_CR2)和从模式控制寄存器(TIMx_SMCR)。接下来我们简单介绍下这两个寄存器。

首先是控制寄存器2(TIMx_CR2),该寄存器的各位描述如下图所示:

电机控制

电机控制

图2 TIMx_CR2

关于该寄存器的详细说明,请参照《CKS32F107xx参考手册》。这里我们用到的是主模式选择位域MMS,此部分由3位组成。共有8种模式可供选择,因为我们使用的是更新模式,所以必须设置为010。

接下来我们介绍从模式控制寄存器(TIMx_SMCR),该寄存器的各位描述如下图所示:

电机控制

电机控制

图3 TIMx_SMCR

在该寄存器中,我们用到了SMS和TS位域,均由3位组成,各有8种不同模式组合。其中SMS控制从模式选择,这里我们配置成100,选择门控模式,确保从定时器的开始和结束都是由主定时器的输出信号控制。TS控制触发选择,根据表1描述得知,我们必须配置成001。

定时器级联同步输出PWM配置操作

通过上述对定时器功能的描述,下面我们要实现TIM2发生事件更新时发送触发信号驱动TIM3计数,并使能两个定时器在PWM1模式下由定时器通道1输出PWM波形。编程的要点如下所示。

1、配置PA0和PA6引脚为复用输出功能

我们调用如下函数实现:

void TIM_GPIO_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_6;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

}

2、TIM2配置为主定时器

TIM2配置为PWM1模式输出,使能主从模式,并选择更新事件作为触发输出,主要代码如下:

void TIM2_Master_Mode_Configuration(void)

{

TIM_TimeBaseInitTypeDef      TIM2_TimeBaseStructure;

TIM_OCInitTypeDef           TIM2_OCInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

/* Time Base Configuration */

TIM2_TimeBaseStructure.TIM_Prescaler = 8;

TIM2_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM2_TimeBaseStructure.TIM_Period = 79;

TIM2_TimeBaseStructure.TIM_ClockDivision = 0;

TIM_TimeBaseInit(TIM2, &TIM2_TimeBaseStructure);

/* TIM2 Channel 1 Configuration in PWM1 mode */

TIM2_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

TIM2_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

TIM2_OCInitStructure.TIM_Pulse = 40 ;

TIM2_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

TIM_OC1Init(TIM2, &TIM2_OCInitStructure);

TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);

/* Master Mode selection */

TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);

}

从上述代码可得知,TIM2CLK固定为72MHz,TIM2预分频为8,因此主定时器TIM2计数器时钟频率为8MHz频率,则TIM2频率=TIM2计数器时钟/(TIM2_Period + 1)=100KHz,占空比为TIM2_CCR1/(TIM2_ARR + 1) = 50%。

3、TIM3配置为从定时器

TIM3配置为门控模式,并选择ITR1作为输入,主要代码如下:

void TIM3_Slave_Mode_Configuration(void)

{

TIM_TimeBaseInitTypeDef  TIM3_TimeBaseStructure;

TIM_OCInitTypeDef      TIM3_OCInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

/* Time Base Configuration */

TIM3_TimeBaseStructure.TIM_Prescaler = 0;

TIM3_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM3_TimeBaseStructure.TIM_Period = 4;

TIM3_TimeBaseStructure.TIM_ClockDivision = 0;

TIM_TimeBaseInit(TIM3, &TIM3_TimeBaseStructure);

/* TIM3 Channel 1 Configuration in PWM1 mode */

TIM3_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

TIM3_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

TIM3_OCInitStructure.TIM_Pulse = 2;

TIM3_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

TIM_OC1Init(TIM3, &TIM3_OCInitStructure);

/* Slave Mode selection: TIM3 */

TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Gated);

TIM_SelectInputTrigger(TIM3, TIM_TS_ITR1);

}

从上述代码可得知,从定时器TIM3频率为(TIM2 frequency)/ (TIM3 period + 1)=20kHz,占空比为TIM3_CCR1/(TIM3_ARR + 1) = 40%。

4、主函数

初始化主从定时器,最终实现级联同步PWM输出,主要代码如下:

int main(void)

{

TIM_GPIO_Configuration();

TIM3_Slave_Mode_Configuration();

TIM2_Master_Mode_Configuration();

TIM_Cmd(TIM2, ENABLE); /* Enable TIM2 Counter */

TIM_Cmd(TIM3, ENABLE);  /* Enable TIM3 Counter */

while(1)

{

}

}

至此,用示波器测量PA0和PA6引脚的波形(注意共地);下载程序,调节示波器,可在示波器看到有PWM波形输出,如下图4所示:

电机控制

图4 PWM波形输出

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分