STM32笔记:TIM定时器其他功能详解

1、TIM输出比较

1.1 输出比较简介

CCR(Capture Compare Register):输出捕获寄存器

1.2 PWM简介

使用PWM波形,可以在数字系统等效输出模拟量。

1.3 输出比较通道

上图输出比较通道(通用)相当于下图的红框那部分电路:

输出模式控制器见下表:

1.4 PWM基本结构

蓝色线:CNT值

黄色线:ARR值

红色线:CCR值

PWM频率等于计数器CNT更新频率

1.5 初始化代码

(1)开启外部时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

(2)选择时基单元的时钟

TIM_InternalClockConfig(TIM2);

(3)配置时基单元

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;  //ARR
TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1;  //PSC
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);

(4)配置输出比较单元

TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 50;     //CCR
TIM_OC1Init(TIM2, &TIM_OCInitStructure);

先给结构体变量赋初始值,以防下次使用高级定时器时,其他结构体变量未赋值带来的问题。

(5)配置GPIO

GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

(6)配置运行控制

TIM_Cmd(TIM2, ENABLE);

2、 TIM输入捕获

2.1 输入捕获简介

2.2 频率测量

测频法适合测量高频信号,更新慢(正常1s)

测周法适合测量低频信号,更新快(待测信号几百几千Hz)

2.3 输入捕获通道

TI1:就是CH1引脚

TI1F:滤波后的信号

fDTS:滤波器的采样时钟来源

CC1P:极性选择

CC1S:对数据选择器进行选择

ICPS:进行分频选择

从模式控制器:里面有完成CNT清零的电路

2.4 主从触发模式

主模式:可以将定时器内部的信号,映射到TRGO脚,用于触发别的外设。

从模式:接收其他外设或者自身外设的一些信号,用于控制自身定时器的运行,即被别的信号控制。

触发源选择:选择从模式的触发信号源。

举例:上述让TI1FP1信号自动触发CNT清0,那触发源选择TI1FP1,从模式执行Reset的操作。

2.5 输入捕获基本结构

左上角:上升沿时,CCR1=CNT,CNT转运到CCR里,这是输入捕获自动执行的。

CNT = 0,CNT清零,这是从模式自动执行的。

测周法:CNT在标准时钟的驱动下,不断自增,由于之前清0过,CNT从上升沿开始,一直++,直到下个上升沿来临。CCR1始终保持最新一个周期的计数值,即N。 

注意:

需要先转运CNT的值到CCR里去,再触发从模式给CNT清零。或者非阻塞的同时转移:CNT的值转移到CCR,同时0转移到CNT里去。CNT最大一般为65535,频率过低可能导致溢出。

2.6 PWMI基本结构

可以同时测量周期和占空比。

左上角:在下降沿触发CCR2捕获CNT的值,但不触发CNT清零。

2.7 初始化代码

(1)开启外部时钟

(2)配置GPIO

(3)选择时基单元时钟

(4)配置时基单元

(5)初始化输入捕获单元

TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInitStructure.TIM_ICFilter = TIM_ICFilter_0xF;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPrescaler_DIV1;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInit(TIM3, &TIM_ICInitStructure);  //输入捕获模式使用
TIM_PWMIConfig(TIM3, ICInitStructure);   //PWMI模式使用

(6)配置TRGI的触发源为TI1FP1

TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);

(7)配置从模式为reset

TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);

(8)配置运行控制

3、TIM编码器接口

3.1 编码器接口简介

工作流程:编码器有两个输出:A相和B相。接入到STM32定时器的编码器接口,编码器接口自动控制定时器时基单元中的CNT计数器,进行自增或自减。即:编码器右转,CNT++,右转产生一个脉冲,CNT就+1。

编码器测速实际上就是测频法测正交脉冲的频率。

3.2 正交编码器

使用正交信号,相比单独定义一个方向引脚,有什么好处?

答:(1)正交信号精度更高,因为A,B相都可以计次,相当于计次频率提高了一倍。

        (2)正交信号可以抗噪声,因为正交信号两个信号是交替跳变的。

编码器的设计逻辑:首先把A相和B相的所有边沿作为计数器的计数时钟,出现边沿信号时,就计数自增或自减,计数的方向由另一相的状态来确定。正反转由上表确定。

3.3 编码器接口基本结构

工作流程:输入捕获的前两个通道,通过GPIO口接入编码器的A、B相,通过滤波器,边沿检测,极性选择,产生TI1FP1和TI2FP2,通向编码器接口。编码器接口通过预分频器控制CNT计数器的时钟,同时,编码器接口还根据编码器的旋转方向,控制CNT的计数方向,编码器正转时,CNT自增;编码器反转时,CNT自减。一般会设置ARR为65535,最大量程。

3.4 工作模式

TI1FP1信号和TI2FP2信号接的是编码器的A、B相。

3.5 初始化代码

(1)开启RCC外部时钟,开启GPIO 和定时器时钟

(2)配置GPIO,将GPIO配置成输入模式

(3)配置时基单元

(4)配置输入捕获单元

(5)配置编码器接口模式

TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIN_ICPolarity_Rising, TIN_ICPolarity_Rising);

(6)启动定时器

物联沃分享整理
物联沃-IOTWORD物联网 » STM32笔记:TIM定时器其他功能详解

发表评论