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

STM32使用PWM控制LED灯的亮灭程度

[复制链接]
STMCU小助手 发布时间:2022-11-30 15:00
引言- E, n4 [! I+ r9 Q3 z
只要你是做单片机、嵌入式相关的从业者,我相信就不可能不知道PWM。我们在开发中,除了对电路进行简单的数字量控制(打开/关闭),也就是“状态”的控制。还会进行一些模拟电路控制,也就是“程度”的控制,这样说或许有点抽象,举个例子,比如我们现在控制一个灯,简单的开灯,关灯就数字量的控制。控制灯的亮灭程度就是模拟量的控制。而PWM就是用来做程度控制的一种技术。9 \) H3 W% I% ]# i" Q% r
4 b4 N% E( c8 |/ j" i
介绍$ i# |6 C( v- s* t" L4 C( H/ L" Y
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。原理可以如图所示,1 l8 c0 I4 ]3 y! W
- F9 ~/ Z  t1 m8 v# U9 D
640 (5).png
+ L8 X8 e, _( H/ p9 I; L( |) t
: X# _' `0 W  ?, l. ~9 v图中,我们假定定时器工作在向上计数 PWM模式,且当 CNT<CCRx 时,输出 0,当 CNT>=CCRx 时输出 1。那么就可以得到如上的 PWM示意图:当 CNT 值小于 CCRx 的时候,IO 输出低电平(0),当 CNT 值大于等于 CCRx 的时候,IO 输出高电平(1),当 CNT 达到 ARR 值的时候,重新归零,然后重新向上计数,依次循环。改变 CCRx 的值,就可以改变 PWM 输出的占空比,改变 ARR 的值,就可以改变 PWM 输出的频率,这就是 PWM 输出的原理。  O8 @# z4 ^% Z! p
" A/ I. h0 T8 J6 O/ C" R1 i7 b- i/ P7 m
软件设计1 }' R3 I2 R# j" r
1.STM32CubeMX配置+ x! W2 B2 Y! [4 x

9 j" L0 l; E( ]$ r6 f: N如果你是使用的HAL库,建议还是学会使用STM32Cubemx的配置,可以简化很多开发工作。. q- E6 Y& Q$ I
$ e" a, t' F1 Z! r9 S
640 (4).png
# ~- [% w: Y' y# Y5 m6 ] 640 (3).png   T% @9 R) }/ ~

3 X( B! v. R8 y$ b* ?这里我们选择TIM3,使用其中的CH4通道,也就是PB1引脚。然后生成程序(如果STM32Cubemx完全不会,可以参考我以前的文章)。8 w1 X; ^( Z4 ~1 g& C  {
* a! w# G; p3 ]* o
2.控制LED灯亮灭9 {3 w2 f- t; Q: e
4 c! _1 o3 ^+ ~7 V, F1 r
打开上面一步生成的工程,我们发现,里面已经生成了PWM的配置,我们只需要具体的进行功能的开发就够了。使能TIM3,使能 CH4输出.
9 X+ C4 h- p7 E6 e4 \; l/ c9 _" b- R7 P1 s4 T! _% H
  1. <font color="#000000" face="Tahoma" size="3">  HAL_TIM_Base_Start_IT(&htim3);</font>
    + w* A, @0 `$ b
  2. <font color="#000000" face="Tahoma" size="3">  HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);</font>
复制代码

/ ^7 @& J# J- Y4 J2 c我们设置2个变量,用1个变量来存放占空比,另一个变量存放挡位,方便我们串口查看。
0 V. K7 J/ w- r! p$ k$ b, s  ?. H9 \
  1. <font color="#000000" face="Tahoma" size="3">int ledtesk=0;//占空比</font>
    3 B$ s# c% G0 |8 _* ^
  2. <font color="#000000" face="Tahoma" size="3">int LEDtime=0;//增加次数</font>
复制代码
( q1 C1 E7 b. o$ D
在主循环中,设置占空比高于0XFFFF的时候,占空比和挡位进行清零,否则每次占空比加500,并设置挡位+1。
0 ?8 [& p) G. `! U0 A7 ]% R! E, u3 L) D1 }5 a1 Q" [' w
  1. <font color="#000000" face="Tahoma" size="3">  while(1) </font># D1 r3 C# W/ C6 Q, i; R. U
  2. <font color="#000000" face="Tahoma" size="3">  {</font>4 r4 a3 T& L) y! t; D" P4 y" O
  3. <font color="#000000" face="Tahoma" size="3">    usart_send[0]=LEDtime;   </font>
    & D1 V* c) Z% ]- V5 Z
  4. <font color="#000000" face="Tahoma" size="3">    if(ledtesk<0xFFFF)</font>2 {, M- ~$ H- O
  5. <font color="#000000" face="Tahoma" size="3">    {</font>
    8 l4 U( P" j! d# B
  6. <font color="#000000" face="Tahoma" size="3">      ledtesk=ledtesk+500;</font>9 _4 G0 U  W! Q2 j; t& ]' Q
  7. <font color="#000000" face="Tahoma" size="3">      LEDtime++;</font>1 Q6 C/ z+ g, h$ l$ p5 f
  8. <font color="#000000" face="Tahoma" size="3">    }</font>
    2 a0 t5 ^7 R1 U5 t% h
  9. <font color="#000000" face="Tahoma" size="3">    else</font>+ L7 i5 R# o$ z; n7 f0 R
  10. <font color="#000000" face="Tahoma" size="3">    {</font>& q% m7 D5 ^4 u0 }
  11. <font color="#000000" face="Tahoma" size="3">      LEDtime=0;</font>
    ; @( [5 ^! j- r: ^5 b( v
  12. <font color="#000000" face="Tahoma" size="3">      ledtesk=0;</font>
    % [5 L3 h( S- T) c3 {: W
  13. <font color="#000000" face="Tahoma" size="3">    }</font>
    + V) r4 i. f( n9 J, g) I
  14. <font color="#000000" face="Tahoma" size="3">      __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_4, ledtesk); //ledtesk占空比</font>& e4 O' P( I0 L7 |
  15. <font color="#000000" face="Tahoma" size="3">     HAL_UART_Transmit(&huart3,usart_send,1,portMAX_DELAY);  </font>
      X+ j# t' `' ?9 @- L8 }3 C
  16. <font color="#000000" face="Tahoma" size="3">        HAL_Delay(100);</font>( c  R- x0 C' m' r- }  d
  17. <font color="#000000" face="Tahoma" size="3">  }</font>
复制代码
% m0 E! w9 f2 _
3.此时我们会看到LED灯逐渐的变亮,当到达最值后,LED灯灭。并且串口会进行显示上乘的次数,也可以理解为挡位。3 G5 U6 v  b. U8 k

1 T' Z( I+ e+ d) Q  h 640 (2).png
7 e7 b( J6 h% x$ i' m. K' n7 b) I$ ]( b1 G/ t2 ?) i% R
挡位为5的时候,灯的状态。2 s: c$ L+ s7 h8 J7 u9 w& F  k
$ M( o0 P/ n7 I7 j* l! \+ N
640 (1).png
6 |0 _% f1 z. C. U! A/ ]" Y) t' p7 ~
' P( q4 q6 }- k+ m: F挡位在10的时候,灯的状态。+ [. w; A$ n* N2 P' B: R
. I, C% _" V5 p& U2 g: ]
640.png
. s% o2 _; M" }1 |  Z$ `. }/ s. e; b

% L( |$ t% p% Q, h转载自: 跋扈洋/ u, I. X  e& ^! y
1 s: E5 G6 u5 x/ \
收藏 评论0 发布时间:2022-11-30 15:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版