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)配置编码器接口模式文章来源:https://www.toymoban.com/news/detail-832754.html
TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIN_ICPolarity_Rising, TIN_ICPolarity_Rising);
(6)启动定时器文章来源地址https://www.toymoban.com/news/detail-832754.html
到了这里,关于STM32笔记----6、TIM定时器其他功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!