本文笔者学习stm32过程中强化学习效果所写,同时希望对大家有所帮助,若有错误恳请指正,谢谢!!!!
stm32TIM简介(二)——输出比较和PWM-CSDN博客
IC(Input Capture)输入捕获
输入捕获模式下,当通道输入引脚出现指定电平跳变时,当前CNT的值将被锁存到CCR中,可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数.
频率测量方法
测频法
闸门时间T内,对上升沿计次,得到N,则频率𝑓𝑥=𝑁 / 𝑇
注意:该方法适用于测量的频率较高的信号
测周法
注意:该方法适用于测量的频率较低的信号
两个上升沿内,以标准频率fc计次,得到N ,则频率𝑓𝑥=𝑓𝑐 / 𝑁
中界频率:令测周法和测频法两个公式中的N相等,联立解得频率为
把这个频率称为中界频率。
输入捕获通道(以通用定时器的捕获比较通道的输入部分为例)
框图介绍
1.TI1是滤波器的输入引脚,f(DTS)是滤波器的采样时钟源,经过滤波器后产生滤波后的信号TI1F.
2.之后将滤波后的信号通过边沿检测器来捕获上升沿或下降沿,用CCER寄存器的CC1P位来选择极性,最终得到触发信号TI1FP1通过数据选择器进入后续的捕获电路。
3.此外TI1FP1还可以通向从模式电路,实现CNT的清零。
CCMR1寄存器中的CC1S位可以用来选择输入到后续电路的触发信号,ICPS位进行分频的选择,由CCER中的CC1E来控制输出的使能或失能。
CCMR1中的ICF可以控制滤波器的参数(如下图所示),滤波器的采样频率越低,采样次数越多得到的数据越准确;
主从触发模式
1.主模式可以将定时器内部的信号映射到TRGO引脚上,用于触发别的外设
2.从模式可以接收其他外设或者自身外设的信号,用于控制自身定时器的运行,也就是被别的信号控制
3.触发源选择用于选择从模式的信号源,选择一个指定的信号输出到TRGI上,由TRGI触发从模式。
主模式的选择见下图
从模式的选择
测量频率的工作方式(以上升沿检测为例)
测量一个周期内CNT的数值并将该值赋给CCR寄存器以后清零CNT寄存器,由𝑓𝑥=𝑓𝑐 / 𝑁公式即可得到测量信号的频率。
注意:CNT的最大值就是ARR寄存器的最大值,一般为65535
PWMI模式测量的工作原理
从上升沿开始计数到下一个上升沿时把CNT的值赋给CCR1寄存器,并清零CNT寄存器,
在第一个下降沿时把CNT的值赋给CCR2寄存器,不清零CNT的值。
由CCR2/CCR1即可得到占空比的值。
初始化代码示例(输入捕获基本模式)定时器3为例
将下图相关器件配置并连接即可
1.外设时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
2. 与该定时器相关的IC的GPIO口初始化
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
3.定时器选择内部时钟源
TIM_InternalClockConfig(TIM3);
4.时基单元的初始化
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Period=65536-1;//ARR
TIM_TimeBaseInitStruct.TIM_Prescaler=72-1;//PSC
TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
5.输入捕获单元初始化
TIM_ICInitTypeDef TIM_ICStructure;
TIM_ICStructure.TIM_Channel=TIM_Channel_1;
TIM_ICStructure.TIM_ICFilter=0XF;//滤波频率
TIM_ICStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
TIM_ICStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;
TIM_ICStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;
TIM_ICInit(TIM3,&TIM_ICStructure);
6.主从模式的配置
TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);
TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);
7.开启定时器
TIM_Cmd(TIM3,ENABLE);
完整代码如下
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
TIM_InternalClockConfig(TIM3);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Period=65536-1;//ARR
TIM_TimeBaseInitStruct.TIM_Prescaler=72-1;//PSC
TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
TIM_ICInitTypeDef TIM_ICStructure;
TIM_ICStructure.TIM_Channel=TIM_Channel_1;
TIM_ICStructure.TIM_ICFilter=0XF;//滤波频率
TIM_ICStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
TIM_ICStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;
TIM_ICStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;
TIM_ICInit(TIM3,&TIM_ICStructure);
TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);
TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);
TIM_Cmd(TIM3,ENABLE)
PWMI初始化代码示例
基本操作以上述初始化代码相似,只需要对IC初始化进行升级,代码如下
TIM_ICInitTypeDef TIM_ICStructure;
TIM_ICStructure.TIM_Channel=TIM_Channel_1;
TIM_ICStructure.TIM_ICFilter=0XF;//滤波频率
TIM_ICStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
TIM_ICStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;
TIM_ICStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;
TIM_PWMIConfig(TIM3,&TIM_ICStructure);
完整代码如下
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
TIM_InternalClockConfig(TIM3);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Period=65536-1;//ARR
TIM_TimeBaseInitStruct.TIM_Prescaler=72-1;//PSC
TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
TIM_ICInitTypeDef TIM_ICStructure;
TIM_ICStructure.TIM_Channel=TIM_Channel_1;
TIM_ICStructure.TIM_ICFilter=0XF;//滤波频率
TIM_ICStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
TIM_ICStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;
TIM_ICStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;
TIM_PWMIConfig(TIM3,&TIM_ICStructure);
TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);
TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);
TIM_Cmd(TIM3,ENABLE);