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

STM32G431RBT6之pww

[复制链接]
STMCU小助手 发布时间:2023-3-2 13:33
一、pwm要求5 m2 ]% A% }3 i. g& F/ D! N( M1 i# H" W

& ]: A/ |2 N0 I: e5 Q  r
e2dd116319474188b665f2c6f333b4f2.png 3 J: O" F( ^: n& ]" ~  A

( W9 p% A/ i% @, f% B( C+ y
f18673a37dd84f5f8ad1c50b95046af1.png ( l, j8 v( g( y+ d) i- ]$ E9 L/ }
/ s5 e. ]* `  a+ b0 z- f' l& n
73c1257118e44a4b9af35dbda27696b3.png % c* _( G! j4 o( ~: E. f3 I

' T# I& ?" V7 q2 D: C 331a6f81ba1c46948ba6154f9b9ddf8e.png 5 y- j. X' I  j
- I6 @6 ~" l; j/ g
6caa059d72594450b56c96726dca1924.png 9 z- z6 P: l+ x
/ K# Y  ]8 t* g* Z& K6 H( o
二、相关概念& d9 U. j: Q: o5 W% ]9 }0 U4 {

. `7 y- F& g; {6 _/ e- _
2762dfdbd8194c1480d4861527fa1889.png
6 V6 M# t8 `' Q4 M
) z0 k! d0 Z, I" b pwm实际上是输出功能,输出功能还是通过引脚来实现,利用引脚的复用功能,实现引脚的配置,从而实现pwn输出功能2 b/ s' L& R/ _" T

: a3 m1 W3 s- @; J+ G/ d$ U我们的台灯就是通过调节占空比实现暗-亮-较亮的调节% A# g( \! U% D1 B4 T

% U; A8 f8 s" d* T" ^

: E0 g9 U: ^# w4 [2.定时器timer有没有pwm输出功能,参考《参考手册》
1 E8 ^% w* c& ^- V
+ i, ~( G# n3 E2 {
a10ecf4a182b4c108466fce3f784b96a.png
$ B) x% ]  E0 T' U& Q3 U
$ t$ E, n9 O/ ^如此查询可知28、29、30章的timer都支持pwm输出功能
7 {$ Z% {$ Y) C6 |9 B3 ~  d- [6 n' N% J* K' H! w
$ l" h$ J: d: |, k/ k2 Z
三、CubeMX配置
6 |& P* ^  z! `/ T# j- P, w1.检查某个定时器是否支持pwm输出功能?
+ s; P! M: s- Z: X; t
+ x* X  I$ |# E9 P" H$ U
c29fe38c95e04d66a6816eec4594f0cb.png
& F2 G, u% V" h& P+ r  b! y

4 o  z; `1 w8 w: @7 O% d1 k9 {如果有channel的话表示支持PWM输出功能
5 Y, W, P% w2 e& F7 Z
' t, }$ j8 a5 v: N5 Q2.对引脚PA7进行配置(题目要求)
$ h* f" t8 X9 g( M6 p9 _9 Q) P. ^/ E$ }: J, b9 C
db21cb88be004445962e74c6c69620b6.png + c. `2 N( I5 [5 Y% {% ^: c' j  B
# R" p2 f. E: [( w% U; Q
一个timer可能有很多通道支持pwm输出,可以根据自己平时练习选一个通道(我选的是timer3的通道2)+ e, p/ }' l# |) H4 F+ T
; s7 M; ^. @' D3 e3 h- z: E- x
3.配置所选定时器的时钟和对应通道的功能
6 ]+ P2 i/ [0 @+ n& x5 H. Q
6 _& W9 ?/ x- [; G2 p) C% H
64dd76679e9841c5a7b66c42d37826f2.png 4 R) b+ e$ ~! `
! A/ D0 e; L; X. ^- s/ \
4.分频
1 f+ x8 H! W, z  ^7 B5 Q; O% S# K6 J( x5 X& E7 P6 Q; Y) o8 i5 w! p0 v
9048c7aa049045049cc4369d0eb14097.png & w- e. E3 a9 [

0 f- ?1 L0 S/ L" s# d6 @: k
a7b12f8d00e8417d8f47154b6eafcb22.png ( M3 q$ M! S% r7 P% A

" Y7 v+ v! i. @1 k& E& s 5.配置占空比9 E2 X9 H6 K5 p/ t
在分频的时候counter period是一个周期计数500$ `: j9 r% V% k1 Y1 y, K

9 o: K0 Z$ z7 d; s# m1 @' w4 s
e7f61c51500643d8aae78ad31ecfc426.png
9 k; ?: g4 S( q6 @. S9 z+ F3 b; V

9 N" a. D# f1 `7 V% _9 O2 g7 ` 6.相关参数解释4 I! l1 I) D7 r- V0 S% H( ~8 i
1.
9 g( o/ K. Z, M/ N& S4 Z* f/ e+ M: N2 v6 }, D: E( d0 P7 O
753396f808914e568a2323f30386d9b0.png
4 b1 K4 y8 [/ K  o9 P! e' ~4 {
. `& p; {( K; w# \% M4 n9 L' c" k2、, X1 V& U3 ?% g; V& r

6 z7 k" d9 y& y; ~5 |' n
a45cc5de7953456ea921d0220d9ecf0f.png
, Y2 T% @: t: D3 s
1 J) v2 m: C& q0 x
3、
! z+ B4 E& E/ D+ `2 t2 q* P- U
; t% ?, S$ r5 X
b64a2939f35044b08767b73d003e754d.png 9 N: W+ `* i$ u3 R' L- t5 ~
& G/ r# h; e& q5 Q2 o
pwm1和pwm2的区别:; o5 Y! t- f* a+ n2 P& `% }8 |
在进行PWM信号输出时,有两种PWM模式:PWM1模式和PWM2模式。6 g5 V- T# _5 T3 |. y
这两种PWM模式和输出有效电平的极性共同决定了PWM信号的波形。
$ @5 V( @4 M6 _PWM1模式3 e0 e* B- E/ Y7 ~3 K
递增计数时,当TIMx_CNT(计数值)< TIMx_CCR(捕获/比较值)时,输出为有效电平,否则为无效电平。递减计数模式则刚好相反。2 }: y0 h$ P  q4 ~! ^
PWM2模式
+ u" o+ G2 m% w! u2 U$ M. @- l递增计数时,当TIMx_CNT(计数值)< TIMx_CCR(捕获/比较值)时,输出为无效电平,否则为有效电平。递减计数模式则刚好相反。/ r( a) J3 |% I" D, O7 S/ t

* g$ Y, d) F* ?
e65a51e70df049198baee4778d2a24e7.png , F$ d" p. k' u3 J3 C' M

. U" R! V) N; y1 H, r; H1 W4、& E1 X8 L, R8 H7 _. K. S

" v- d/ u. S  z: `
5941ff4d81b3415eadc31cfa2d8eb2ce.png + ?+ a8 n  f+ T" g. }- z, I. ~6 ~

+ g$ R# ^, \+ i$ C5、占空比就相当于平均输出高电平20%,实验结果如下(平均输出专业术语就是pwm输出)
5 o9 i: ]- a/ S8 ~5 E' v6 x; {% v+ o7 N1 o. |7 p$ x3 U8 r
0687b01602984d89bbf504f22b3dcb7b.png / @* _' o9 Q0 V
- |* S$ }, h+ y1 [  r2 R
' m- G+ Z! `2 D9 _2 G7 b+ V
四、代码
- l' E8 g; ]; r
1、CubeMX自动生成的代码5 N/ g; n! U, j

: z2 e/ F* X& F, Z+ ]$ Q9 F
128d09e1753b4a2f90a42d4509924e6a.png
" V- T3 S5 i. o7 }
7 ]$ N; [9 s' v6 `% O" [. Y0 f2、设置变量$ G& [8 l+ q9 ?

* r( F& M" [, T: ~
bff131a3108245e7b431b8930830eb72.png ! @' {! T2 l* r# B& [

2 {3 L2 T7 c$ U3 O2 T, V& Q 3、根据题目要求B4按键的共能,更新按键函数
- @' `$ M1 D/ f% q+ z$ b
' J, O' D* Y4 {9 E# `. l
e34b932f82cd4de080f00871bc1e6daf.png
! [2 Z7 d+ r% K/ \4 ?$ K% ^/ ]9 Q! Y9 v- v, t- L2 J2 T1 @
  1. //Key processing function/ m: a# B. o& @8 H! L
  2. void Key_Proc(void)! a) e2 I' _7 B
  3. {: i, l" f* {9 i2 K( Y
  4.         uint8_t cur_key = 0;- `5 h/ _+ N% `& o& S
  5.        
    % ^; d8 r3 b/ c" y# Y2 Q' q& f3 l
  6.         cur_key = Key_Scan();6 T1 N4 R5 r: e1 u  Z% H, k0 _
  7.        
    7 V7 w1 Q5 U9 h& w2 Y$ ]
  8.         switch(cur_key)1 z+ W% G! t/ M& W  m
  9.         {- e3 F" p" Q1 p  e- }/ {# ?: q
  10.                 case 1:
    - @% n) s  `! \6 @8 [5 j) H
  11.                         Show_Flag++;
    ' o' d- K! F6 G- D$ r
  12.                         if(Show_Flag == 3)
    6 h4 T  B# y6 K: K5 @
  13.                                 Show_Flag = 1;# c8 ~# n6 e+ T  }! Z, b6 w: e
  14.                         Update_Flag = 1;. _8 H5 K/ u9 d; M  K$ P
  15.                         break;
    % _$ q  C6 I5 u# d& n3 d9 z7 n+ n
  16.                 case 2:9 a9 E: {4 y: G  {/ w! i
  17.                         if(Show_Flag == 2)+ V7 p! m% V( w6 o* U0 p
  18.                         {0 E2 V" |, P. z2 ~" ]% N
  19.                                 CNBR_Price += 0.5f;
    ! {* T2 h( \: N( r" t1 \' g4 o/ G
  20.                                 VNBR_Price += 0.5f;  H5 U# b5 f1 ]7 s$ a
  21.                                 Update_Flag = 1;                               
    0 o' V# p+ x1 l: ]% _
  22.                         }. Y  D8 C$ J2 P6 u9 \* h7 L( b8 L
  23.                         break;
    1 B% {  n8 J, i, Z
  24.                 case 3:
    1 p1 z2 @5 ~5 B. Q' v
  25.                         if(Show_Flag == 2)" W& Z, }/ \0 [$ E
  26.                         {
    ; E4 \) j( L+ x: \
  27.                                 CNBR_Price -= 0.5f;
    ! e7 U8 f1 P3 u: H& ^+ H
  28.                                 VNBR_Price -= 0.5f;- Y4 O1 C; M" ?
  29.                                 if(CNBR_Price < 0)
    ) l# M8 ]+ K; l9 H4 E+ a
  30.                                         CNBR_Price = 0.0f;
    ' t- `" r6 @* j8 k% u- G+ y
  31.                                 if(VNBR_Price < 0). b/ B2 V5 [  H
  32.                                         VNBR_Price = 0.0f;                       
    * \: a% L' x1 {, J* n
  33.                                 Update_Flag = 1;
    4 o! E9 Z7 a2 q$ H1 J/ ~) c5 W$ W% u
  34.                         }
    0 x  y7 E. S( C) U1 ~/ p
  35.                         break;8 E. ]% j9 W( U9 t0 g* O0 G
  36.                 case 4:+ w- F! b: T; r# k! m+ c
  37.                         PWM_Flag ^=1;//yihuo 0/1& }2 m) |8 W- r" M
  38.                         break;                0 c' r+ A0 A/ z8 B( E6 X. f( Z5 r& B
  39.                 default:
    . j# V1 W" m3 `7 O2 Z7 U
  40.                         ;
    . D! Q! c7 n) z- S6 e
  41.         }. y  D! R) |8 c
  42. }
复制代码

# s& t: ?, s- j. ]7 M2 | 4、LED函数$ h1 ]- Y* q% \1 O& \
& _1 ?. ~- }3 }" O
21aabb2fd0d848efbd16952833d9e4dc.png $ ]' \  q$ D4 W6 v* R! ^
! d7 C  e" C- j" c, N! m
  1. void Led_Proc(void)
    1 j5 V/ i2 Q& j0 [& y
  2. {& R3 E, W9 O1 y' t2 a) {& h
  3.         if(IDEL_Size > 0)
    ) s9 g& n, L1 j
  4.                 LED_Ctrl(LED1, ON);  z7 o7 w! b' t; F7 c
  5.         else
    3 ]* O/ F; j  H/ W  i/ f/ {
  6.                 LED_Ctrl(LED1, OFF);
    " B9 h3 \% R- x9 g. D) x/ \8 q7 n6 |
  7.         0 q7 J/ S( R* ?  w5 M1 S( B
  8.         if(PWM_Flag==1): [# d& v' f6 `$ T$ m
  9.                 LED_Ctrl(LED2,ON);
    , ~8 U/ V6 a7 S6 Y- @$ _
  10.         else
    2 u$ z  i- f% u$ d
  11.                 LED_Ctrl(LED2,OFF);/ `/ ?1 ?6 o. S" i) I( f
  12. }
复制代码
" Z  N) z8 @* V. o+ w4 b5 o
5.1、PWM函数: a8 l' ^8 S0 L) v: @1 F
5 {% A, W3 v3 `$ X
6387fa2f8b2947b5ab6ecb55b7a610f6.png
( f7 X% v  m5 A, O& n4 t( W* g8 y( E! i: q0 d8 [, W4 l
  1. void PWM_Proc(void )
    ( X' e" p  ]- ~: q8 i. [; k
  2. {
      A- w6 g$ |/ M  B/ k9 A& b% I
  3.         if(PWM_Flag==0)
    ! X: }$ Y9 U+ J0 h. ^7 s
  4.         {
    # n# N3 R1 C& r* O
  5.                 HAL_TIM_PWM_Stop(&htim3 ,TIM_CHANNEL_2 );% O7 q) \8 t& L
  6.                 HAL_Delay(5);
    $ Q; n: Q9 N& L8 q' f3 r
  7.         }
    " u3 v: J4 @$ d* z& f( X5 L0 b! a
  8.         else 4 s0 }' T- G3 j# P1 S5 [. o4 ~5 A
  9.         {! L, l, s0 z: h0 |
  10.                 HAL_TIM_PWM_Start(&htim3 ,TIM_CHANNEL_2 );
    5 i; P' S2 g! R4 y$ F  m
  11.                 HAL_Delay(5);7 t; |: i) k7 c: J$ Z& k
  12.         }
    - p; Q6 @) `% ]6 E$ C2 n7 O
  13. }
复制代码

5 k) M- Z/ W, O5 f4 e9 H0 E+ @" w 5.2、timer定时器通道相关函数学习) C+ F5 i& u8 u# B9 x# r
HAL_TIM_PWM_Start(&htim3 ,TIM_CHANNEL_2 );; R% n3 F* g' {: g( |! X
当有按键按下的时候,开启timer3的2通道的PWM输出
6 }: y2 D$ y% S5 p0 l4 |$ jHAL_TIM_PWM_Stop(&htim3 ,TIM_CHANNEL_2 );; y2 x6 }# N4 C4 n8 D5 a1 K
当有按键按下的时候,关闭timer3的2通道的PWM输出
8 {9 `7 U1 a7 Z注:__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_2,250) 是专门用来设置占空比的函数,这样就是占空比为250/500=50%
7 _/ T" t8 o5 a" [) d5 G' U9 s5 N; C  |8 `% Z
6、主函数和函数声明
6 o0 W6 [: r* T9 s: o9 J+ D7 {
% r0 ~+ f) F) n/ @' @
99f74a259e5e4d47b57fb0962d0217ec.png 1 p& i7 P! ]0 c2 n- _
7 [% F) o# |) J; o' D0 w; w  s
80e2410b3c694721a6bdc2187618b432.png
' X' T" ^" `' p" y5 m7 a
- Y3 |0 j3 o0 \' Z6 V& T8 ~4 L
五、实验结果
  G$ ]8 K' o. N( c, H; q( ~通过控制B4能够实现LED2的亮灭  z1 d) J" D8 j% c! r  B- t3 h
串口部分的结果问题:: ?- n; Z1 Y" [# B+ X' J' A
) T( ^  r9 R& q  N: K1 v' `- n
43c97cc65c594a85b90f316b0d93f8b9.png
& p) Y2 x1 |5 v
; E3 g3 X7 Y6 |) r2 N9 W- g
————————————————
! Q  G! ^. H3 a# j0 J版权声明:想要优秀点儿. p$ d1 v6 P/ m7 i

& h5 V3 B$ i( \/ d1 k/ p2 Y/ c9 Q1 ^9 D' P( O# E
收藏 评论0 发布时间:2023-3-2 13:33

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版