补充STM32 PWM占空比,频率的计算及输入捕获细节到STM32库函数的掌握方法

下面的这个是stm32的定时器逻辑图,上来有助于理解:

 

TIM3的ARR寄存器和PSC寄存器,

确定PWM频率。
这里配置的这两个定时器确定了PWM的频率,我的理解是:PWM的周期(频率)就是ARR寄存器值与PSC寄存器值相乘得来,但不是简单意义上的相乘,例如要设置PWM的频率参考上次通用定时器中设置溢出时间的算法,例如输出100HZ频率的PWM,首先,确定TIMx的时钟,除非APB1的时钟分频数设置为1,否则通用定时器TIMx的时钟是APB1时钟的2倍,这时的TIMx时钟为72MHz,用这个TIMx时钟72MHz除以(PSC+1),得到定时器每隔多少秒涨一次,这里给PSC赋7199,计算得定时器每隔0.0001秒涨一次,即此时频率为10KHz,再把这个值乘以(ARR+1)得出PWM频率,假如ARR值为0,即0.0001*(0+1),则输出PWM频率为10KHz,再假如输出频率为100Hz的PWM,则将ARR寄存器设置为99即可。如果想调整PWM占空比精度,则只需降低PSC寄存器的值即可。

注:这里以3.5库函数与之对应

ARR的周期值对应   TIM_TimeBaseStructure.TIM_Period  的设置值

PSC的分频值对应   TIM_TimeBaseStructure.TIM_Prescaler 的设置值

所以,分频值算出的是多长时间涨一次,那么ARR的值算出的是一个周期是多少次即 PSC*(ARR+1),这其实算出的时间,即一个周期所需要的时间,PWM频率就是这个值的倒数。如:设定频率为2K,分频设为8999。则72000K/(8999+1)=8K,算出时间为0.000125S涨一次,2K对应的周期是0.0005S。所以ARR的值应设为0.0005/0.000125=4。当然这里只是预算的值,这个值不能太小,太小了,就识别不出来了。实际的测试也是发现,值不对,什么输出都没有的情况。这里要特别的注意。

总结一下:PWM频率=(72000K/(PSC设置值+1))/(ARR设置值+1)

TIMx_CCRx寄存器,

确定PWM的占空比。
TIMx_CCR1—TIMx_CCR4确定定时器的CH1—CH4四路PWM的占空比。直接给该寄存器赋0—65535值即可确定占空比。占空比计算方法:TIMx_CCRx的值除以ARR寄存器的值即为占空比,因为占空比在0—100%之间,所以一般TIMx_CCRx寄存器值不能超过ARR寄存器的值,否则可能会引起PWM的频率或占空比的准确性。

//占空比其实更简单,即占周期的个数

TIMx_CCRx的值即为捕获到的值

总结一下公式为:占空比值/100=设置值/(ARR设置值+1)  设置值=(占空比值/100)*(ARR设置值+1)

注:ARP及PSC的设置值都是减1的,所以这里要再加上1,才能还原单片机内部的处理值。

其中,设置值对应库   TIM_OCInitStructure.TIM_Pulse  的值

 


处于输出比较模式时,CCR寄存器的值为比较值。当计数器计到这个值时会发生相应的动作

2020-6-18日上升到stm32l431RCT6,再次遇到需要PWM输入捕获时,再看此篇文章时,感到那时的总结的整体是没有什么大问题,但测试时的细节还是容易忽略。

1、当占空比设置值为0时,就没有输出

2、当占空比设置比周期要大时,就会一直有输出。

3、示波器测试波形时,要注意把波形展开来实测,这样才能得到正确的测量频率,刚开始一直看示波器自动跟踪的值总是与计算的不符,最后展开波形才得出正确的值,看来偷懒是不行的。

4、说一下捕获的流程:

原理是:图示是选择TI1FP1,当第一个上升沿到来时,IC1和IC2同时复位计数器,当捕获到第一个下降沿时,保留IC2捕获的值,当第二个上升沿到来时,保留IC1的捕获值,所以:

若选择TI1FP1,直连到TI1_1通道,非直连TI1_2通道,那么IC1捕获的就是周期,IC2捕获的是占空比。

若选择TI2FP2,直连到TI2_2通道,非直连TI2_1通道那么IC2捕获的就是周期,IC1捕获的就是占空比。

TIxFPx都是成对出现的,主要看触发管脚直连到哪个上。如图:

也可以从CubeMX配置时,得出结果:如下图:

关于几个触发源的说明:

什么时候需要配置触发源即Trigger Source呢?

先看看高级定时器系统框图:部分

 高级定时器的时钟源有以下四个:

重点说下外部时钟模式1(PWM输入检测用到的也是这种模式),其实就是检测timer的管脚上电平来触发定时器工作。

 以PWM输入捕获为例:设定好定时器的分频及周期,其实是为了捕获到上升沿后开始的计时操作,下面的外部时钟输入模式1,就是检测管脚上的设定电平计时的的模式。 翻看编程手册就可以知道关于外部时钟输入模式1的描述,基于寄存器的

 要是基于寄存器的方式,那么这就是答案了,但是基于HAL库来编写程序还有CubeMX来配置的话,还是隔了一层窗户纸。

 步骤很明显了,如何对应到库函数呢?

这其实就是学习的一个过程,急是急不来的,和L4比较接近的是F4的HAL手册而且还是英文版的。这样可以了解下HAL库的函数说明!稍后传到CSDN上。

说下从模式的设定?为什么会有从模式??

STM32的每个定时器也可以通过外部信号触发而启动,这种通过一个定时器触发另一个定时器的工作方式称为定时器的同步,发出触发信号的定时器工作于主模式,接受触发信号而启动的定时器工作于从模式。

很明显这里的PWM输入捕获,是由外部触发,所以定时器工作于从模式。

这里三种基本的,复位模式:外部信号发生变化时,计数器与预分频器可重新初始化。

门控模式:按选中的输入端电平使能计数器。

触发模式:选择的事件使能计数器。

外部时钟模式2+触发模式:外部时钟2+另一种从模式一起使用。

具体参见《参考手册》从模式控制寄存器 (TIMx_SMCR)里的SMS设置以及定时器的内部触发表:

高级定时器1和8

通用定时器2与5的:

 并且,编程手册还给出了,定时器同步时的步骤:

总结一下:

通过对自己不熟悉的STM32定时器捕获功能,可以看到STM编程时主要就是看参考手册,另外还要学会从寄存器对应到HAL函数,这是一个漫长的过程。尤其是对自己没用的功能来说。

另外,如果别人已经写过类似的程序,如原子等,就可以参考他们的程序,这样可以省不少时间。毕竟看手册调程序是需要大量时间的。

  • 24
    点赞
  • 153
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
STM32的TIM定时器模块可以用来生成脉冲输出,并且可以通过PWM模式调节脉冲的占空比。这里将分别介绍使用操作寄存器和库函数方法来实现pwm脉冲输出。 1. 使用操作寄存器: 首先,需要对TIM定时器的相关寄存器进行配置。具体步骤如下: a) 配置GPIO引脚作为TIM通道的输出引脚。 b) 使能TIM定时器和相关外设时钟。 c) 配置TIM定时器的基本参数,如计数器的预分频值和自动重装载值。 d) 配置TIM定时器的PWM模式。选择PWM模式并设置相应的输出模式和极性。 e) 配置占空比。设置只要在捕获/比较寄存器中设置适当的值即可。 2. 使用库函数: 在使用库函数方法中,需要先初始化相关的定时器和引脚,然后进行配置。以下是具体步骤: a) 初始化TIM定时器。通过使用库函数进行初始化,可以供选择不同的模式,例如PWM模式等。 b) 配置输出通道相关参数,如输出模式、引脚和极性等。 c) 配置占空比。通过库函数提供的接口,设置不同的占空比值。 无论是使用操作寄存器还是库函数,最后需要启动定时器以开始产生脉冲输出。可以使用库函数提供的启动定时器的接口,也可以通过设置定时器的控制寄存器来实现。 总结而言,实现STM32的TIM定时器PWM脉冲输出可以通过配置寄存器或使用库函数来完成。具体步骤包括配置定时器和引脚,设置PWM模式和占空比,并启动定时器以产生脉冲输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

guangod

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值