你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32对HAL库的PWM控制

[复制链接]
STMCU小助手 发布时间:2022-2-9 21:30
要实现的是用PWM实现呼吸灯的效果。
先简单说一下原理,比如对一个电灯来说,你在1秒内,打开开关0.5秒,再关闭0.5秒,如此反复,那么电灯就会闪烁,但是如果是1毫秒内,0.5毫秒打开,0.5毫秒关闭,由于视觉暂留作用,也可能由于灯光的亮灭速度赶不上开关速度(还没全亮就又没电了),于是人眼不感觉电灯在闪烁,而是感觉灯的亮度少了一半。同理,如果是0.1毫秒开,0.9毫秒灭,感觉灯的亮度就只有1/10了。
然后我们在cubemx中进行设置,STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出,这样, STM32 最多可以同时产生 30 路 PWM 输出。

3 \' F. q+ z! C6 B4 X, @- J1 d
设置一个led二极管的定时器及通道, 1292842-20191116141149909-1358633723.png

) e3 h7 }8 F/ L2 [) G" [
在定时器设置中设置通道1为PWM,

6 ]& z$ R. D. `& D3 N! u 1292842-20191116141241167-803532773.png
3 O3 f8 C5 G4 z% `. J" G& t
+ K1 o: G: A) X+ ~9 b8 H+ m
设置分频和计数

8 O% i: J" T% U9 @8 C) p) M( h 1292842-20191116141343325-1039840382.png
9 |# ?8 h8 i1 p9 o( _8 k( K2 [+ Y# `  e  o, W7 |& \% F4 Q
以及通道有效的高低电平,我这是低电平二极管点亮,所以设为low,这个不能错,不然不亮。
+ h4 {' E0 F8 a. V5 h0 Y
1292842-20191116141514462-1578195769.png
2 J+ Q" f2 B! r7 y, [3 f3 m3 \7 ] 1292842-20200522105821088-2104337741.png 2 K5 F9 b: Z8 \0 g( ?2 a1 I
1 U: o) w7 V" M" k0 s
1、Mode(PWM的模式)
该选项中有PWM Mode 1和PWM Mode 2两个选项' \: L( j5 I" Y
PWM Mode 1 :正常理解的PWM波
结果为:5 I& T1 e4 j' e% K. L. F
PWM Mode 2 :与PWM1模式互补的波(PWM模式1为高电平时PWM2为低电平,反之亦然)
结果为:

; }. r' M  o  R) D' d
2、Pulse(脉冲宽度)
Pulse16位二进制数,可以输入范围为0-2^16等于 0-65535的10进制数
改变Pulse就是改变PWM的初始脉冲宽度。

( W& E' k- e* c6 [2 L
3、FastMode(快速模式【ENABLE/DISABLE】)
不用理。
4、CH Polarity(频道有效电平【High/Low】)
顾名思义,这个参数就是控制有效电平的,因为有一些芯片的处理需要的是高电平有效,一些是需要低电平有效,为了在提高STM32适应性的同时不把我们程序猿的脑子搞乱,就有了这个设置,以下是实验效果
当CH Polarity为High时,结果为:
$ x( d0 _/ }% N# F: w& Z7 L
! B) i( T# g5 s2 K
当CH Polarity为Low时,结果为:

: {, |  \2 e* f3 n  h, P5 \' l4 j# `4 j. c0 r5 o( u! k
+ I1 _$ n- K+ g& D. ^4 {8 ?
5、CH Idle State(空闲状态【Set/Reset】)
同样顾名思义,CH Idle State为该频道PWM不输出时的状态

+ V$ s( j) C. O7 k0 F3 K; Y
这里比较重要的是分频和计数,上一节定时器中断的参数设定也可以知道,t为两者相乘除以对应的时钟频率。 频率是t的倒数。由时钟树可以得知时钟频率是72Mhz。
这里涉及到一个点,呼吸灯,当 PWM 周期太慢(低于 50Hz)的时候,我们就会明显感觉到闪烁了。因此, PWM 周期在这里不宜设置的太小。
频率f即PWM周期,即f = 72M /72 * 1000, 至于分频和计数具体是多少,个人认为是多少都行,只要他们的乘积符合条件。 一般来说,我会把分频设置为时钟频率的因子,便于计算。 然后计数的大小,大的话,可调节的PWM占空比就更加精细,越小就比较粗糙,一般设1000吧。

; j; d0 |# V- u5 D0 b6 Z
初始化完程序后,需要在程序中打开PWM的功能。即
1292842-20191118164747540-1471120253.png
7 x  C$ }( h' [  G6 q
. f4 {' j8 q  f
还需要用到一个设置占空比的函数

/ l9 V7 G# s) o/ P" Q  _! o6 F! N) o 1292842-20191118164920137-1842912555.png
) X0 `5 s/ }9 t& m. |
2 q# L6 X. M7 e: E& F
改变第三个参数的值,可以设置对应的占空比。

4 P9 H. e5 P' @0 \. T( V3 a" }
占空比 = Pulse / Period,这里Period设的1000,Pulse 可以通过上面函数设置,也可以在PWM初始化函数设置。
% {& Q  ]! L) r0 K3 X! `7 w1 H
呼吸灯的话可以写成如下算法:
  
1292842-20191118165011179-634266151.png
2 D' z8 G/ m/ q' m" h
即完成PWM在HAL库中的应用。
9 N9 R: G/ C! O( w

5 b* Q- |" E* [3 w4 F% H8 _- F1 B7 I
赞 收藏 评论0 发布时间:2022-2-9 21:30

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版