STM32定时器输入捕获

STM32定时器输入捕获

用STM32F429做定时器捕获PWM波形,测出波形的周期、频率以及占空比、正向脉宽。

基本原理

定时器的输入捕获主要是为了测量输入信号的频率,脉宽,占空比等信息。

需要理解stm32定时器的基本结构

image-20220305195539774

主要理解这些框起来的是重点,都是本人自己的理解,才疏学浅,万一有理解错的还望指正。

至于上半部分的时钟没有太难理解的。下面的通道理解上才比较复杂。

首先一个通用定时器有4个输入通道4个通道,这些通道可以空着也可以复用到对应的GPIO上去,

/*
 	可以输出到GPIO的TIM通道:

	TIM1_CH1, PA8,	PE9,
	TIM1_CH2, PA9,	PE11
	TIM1_CH3, PA10,	PE13
	TIM1_CH4, PA11,	PE14

	TIM2_CH1, PA15 (仅限429,439) 407没有此脚
	TIM2_CH2, PA1,	PB3
	TIM2_CH3, PA2,	PB10
	TIM2_CH4, PA3,	PB11

	TIM3_CH1, PA6,  PB4, PC6
	TIM3_CH2, PA7,	PB5, PC7
	TIM3_CH3, PB0,	PC8
	TIM3_CH4, PB1,	PC9

	TIM4_CH1, PB6,  PD12
	TIM4_CH2, PB7,	PD13
	TIM4_CH3, PB8,	PD14
	TIM4_CH4, PB9,	PD15

	TIM5_CH1, PA0,  PH10
	TIM5_CH2, PA1,	PH11
	TIM5_CH3, PA2,	PH12
	TIM5_CH4, PA3,	PI10

	TIM8_CH1, PC6,  PI5
	TIM8_CH2, PC7,	PI6
	TIM8_CH3, PC8,	PI7
	TIM8_CH4, PC9,	PI2

	TIM9_CH1, PA2,  PE5
	TIM9_CH2, PA3,	PE6

	TIM10_CH1, PB8,  PF6

	TIM11_CH1, PB9,  PF7

	TIM12_CH1, PB14,  PH6
	TIM12_CH2, PB15,  PH9

	TIM13_CH1, PA6,  PF8
	TIM14_CH1, PA7,  PF9

但是一个通道只能配置成一种模式,比如配置成输出模式,就不能配置成输入模式,虽然一个通道有好几个GPIO可以设置,但是设置完一个其他就不能在设置在这个通道了。

因为要捕获输入的信号,所以设置为输入模式,关键看上图左侧的通道关系

TI1到TI4表示4个输入通道,但是输入通道并不是和定时器的通道直接连起来的,经过了输入滤波器和边沿检测器之后,一个输入通道就分成了两个,可以分别送到两个定时器通道去,比如TI1FP1,TI1FP2,这都是第一个输入通道分出来的,可以分别送给IC1和IC2,IC的意思就是输入通道,这样在后边定时器的捕获通道就可以一个捕获上升沿,一个捕获下降沿,这样就可以把一路PWM的频率和占空比都测出来了。

再接下来还有重要的问题是每个定时器的时钟速度。

image-20220305201447912

可以在时钟树上看到APB1和APB2上的定时器的时钟速度是不一样的。

	APB1 定时器有 TIM2, TIM3 ,TIM4, TIM5, TIM6, TIM7, TIM12, TIM13, TIM14 
	APB2 定时器有 TIM1, TIM8 ,TIM9, TIM10, TIM11
	

	APB1 定时器的输入时钟 TIMxCLK = SystemCoreClock / 2; 90M
	APB2 定时器的输入时钟 TIMxCLK = SystemCoreClock; 180M

因此在配置定时器的分频系数,和最后计算信号频率时要注意使用到的定时器的频率。

输入捕获计算信号的频率和占空比的原理是:

假设计数器的计数方向是向上,定时器会按照分频之后的速度,一直向上累加,当遇到设置好的边沿时,就会把当前计数的值存下来,通过读取这个值就可以知道在什么时刻检测到了边沿,通过不同边沿时刻的差值,就可以计算出频率等信息。

代码

使用Cubemx生成代码

image-20220305202250623

这个定时器配置来检测PWM信号。

前两个选项slave mode用来配置TI1FP1触发,而且触发之后的结果是reset,为什么要这么设置,关键是后边代码实现的原理,这么设置的意思是,当TI1FP1触发之后,整个计数器重置,从0开始数,如果前边不设置这么滤波器、分频器的话,TI1FP1就是第一路的输入信号,比如设置为搞电平触发之后,一旦来了高电平,之前全部复位开始计时,这就好比是PWM信号的高电平来了,全部重置,然后第1个定时器通道开始计时,直到遇到下一个上升沿的时候才会记录下数值,而第二路定时器通道也同时开始计时,直到遇到下降沿才记录数值。不难发现,第一路记录的数值就是整个周期的数值,而第二个通道记录的数值是上升沿到下降沿之间的数值,就是PWM正向脉宽的数值,这样就得出了想要的结果,所以要设置成这种模式。

下面两个选项是定时器的两个通道的选择,回到结构框图去看,通道一的输入可以有两个选择,TI1FP1和TI2FP1,那选择第一个就是直连,选择第二个就是非直连,第二路的选择也是同样的道理。硬件配置为通道1的GPIO,所以直接选择通道1直连,通道2非直连。

接下来的配置都比较明白,在下方的参数选择中,一个上升沿触发,一个下降沿触发。

下面主要涉及到3个函数:

TIM_HandleTypeDef htim3;
__IO uint16_t IC2Value = 0;
__IO uint16_t IC1Value = 0;
__IO float DutyCycle = 0;
__IO float Frequency = 0;



void bsp_SetPWMCapture()
{
   
	  /* USER CODE BEGIN TIM3_Init 0 */

  /* USER CODE END TIM3_Init 0 */

  TIM_ClockConfigTypeDef sClockSourceConfig = {
   0};
  TIM_SlaveConfigTypeDef sSlaveConfig = {
   0};
  TIM_MasterConfigTypeDef sMasterConfig = 
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值