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波形输出
全部0条评论
快来发表一下你的评论吧 !