MCU微课堂|CKS32F107xx TIM(四)

cathy的头像
cathy 发布于:周五, 11/22/2024 - 16:21 ,关键词:

定时器同步

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

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

1.png

表1 普通输入捕获概览图

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

2.png

图1 主从定时器示例

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

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

3.png

4.png

图2 TIMx_CR2

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

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

5.png

6.png

 图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所示:

7.png


图4 PWM波形输出

相关阅读:

MCU微课堂|CKS32F107xx TIM(一)

MCU微课堂 | CKS32F107xx TIM(二)

MCU微课堂 | CKS32F107xx TIM(三)

来源:中科芯MCU

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 6