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

STM32G431RBT6之pww

[复制链接]
STMCU小助手 发布时间:2023-3-2 13:33
一、pwm要求
9 [: e& u3 X/ ^% \4 b% D2 P' Y( \
, S  n5 {$ R; [# J! Q* v: ^  J
e2dd116319474188b665f2c6f333b4f2.png 7 l2 O+ ]' }/ o& u2 _/ s% a

7 V9 V% o2 J( [% o2 ?
f18673a37dd84f5f8ad1c50b95046af1.png
- g" d) P- Z$ j# A7 C9 I% V
6 R5 y$ p5 ^' T3 Z4 _ 73c1257118e44a4b9af35dbda27696b3.png
4 s( S% T9 B) S+ Y& p( W

% `5 |1 U9 P) e 331a6f81ba1c46948ba6154f9b9ddf8e.png
( G1 p( A$ F" U3 f% M) [5 x' ]8 Q) ?6 \: d! Z' F) z+ A& E5 y6 k+ m
6caa059d72594450b56c96726dca1924.png
% `" s7 D% c$ L4 x$ z
1 J1 z! t3 E4 @5 f/ u" ?& \0 f二、相关概念3 O8 e- c. e* p( L
2 y" \6 p/ g8 ~
2762dfdbd8194c1480d4861527fa1889.png ; ?5 h; X% n2 b% r- W. ]# Y" O
/ m, i5 ~* g# d, b' d& ]) _
pwm实际上是输出功能,输出功能还是通过引脚来实现,利用引脚的复用功能,实现引脚的配置,从而实现pwn输出功能# M3 u# a6 C( V! K1 }+ h: G
& I& }% Z9 N/ m$ v0 w& X
我们的台灯就是通过调节占空比实现暗-亮-较亮的调节
0 ?* |- D$ o2 o- n$ x& o
4 Z+ }( z: Y( |% q$ i
7 {/ S2 M1 M4 k! u: E
2.定时器timer有没有pwm输出功能,参考《参考手册》6 ?2 M9 p$ G: Z: s1 V. L

" t# s6 Y; T+ ^3 Y
a10ecf4a182b4c108466fce3f784b96a.png
# I3 _# b. Y* j/ v6 U) N' o
: d" i% d0 a5 y4 m如此查询可知28、29、30章的timer都支持pwm输出功能! B6 f+ H' U6 P: @

$ }' F( {" _( L% u+ p5 |0 W
' [/ Z" y2 \, J' c' Q
三、CubeMX配置
: i. T) ~- \; l5 r9 |6 S1.检查某个定时器是否支持pwm输出功能?
) s% ]; v  h2 p6 z
. |! ^/ a# H3 P+ D
c29fe38c95e04d66a6816eec4594f0cb.png 8 ?9 i" u9 B4 C& ?6 g- x* T

/ W: I8 @1 {, v1 c' ?如果有channel的话表示支持PWM输出功能
0 D4 _# J+ d( W' e' y  T# u. j% v/ q' l
2.对引脚PA7进行配置(题目要求)
; W/ I. }: ^- [; p0 d' n8 F' S. I) S- U% d
db21cb88be004445962e74c6c69620b6.png
" W( O$ }* [. X9 x, U- z3 q6 X* h2 n
一个timer可能有很多通道支持pwm输出,可以根据自己平时练习选一个通道(我选的是timer3的通道2)2 E5 M; Q& Q3 C3 @8 ?6 x( B

; b3 R) P/ [* h+ b" B5 t  H% f) c3.配置所选定时器的时钟和对应通道的功能2 A; ]1 Y& B  o& y
/ a) o4 \6 ^- g9 h
64dd76679e9841c5a7b66c42d37826f2.png
( C# H8 X- B* u& X. x* P, _. H  B  Y* D5 p
4.分频5 b1 O- t( C  W1 K
! ?& l  S5 t$ e1 p( t! ~7 S
9048c7aa049045049cc4369d0eb14097.png $ ^; C8 h( q+ I( u* y" ?% C& F0 g

7 @# w% b1 ]$ W4 s
a7b12f8d00e8417d8f47154b6eafcb22.png
9 U3 e% E) d* g9 M+ T' I) u5 G: E4 I- k( l0 ?
5.配置占空比
/ P2 g8 S$ C2 I; N% C! p& {在分频的时候counter period是一个周期计数500
4 I2 |4 M* h' l$ q) E
5 X/ t' R7 y3 D5 }" M& w/ H9 U
e7f61c51500643d8aae78ad31ecfc426.png
2 i% Y, t# J% W- a/ j9 V7 Q
0 m. p: x6 L  d* J& F. ~- ^3 r
6.相关参数解释% O, ?. a6 X+ R& g2 f
1.$ k6 g2 x" h2 V; `) k
1 h7 R4 r& }/ h) g; l
753396f808914e568a2323f30386d9b0.png 4 R% m: E) |+ c. }2 |# }
1 e! _5 `3 v  y
2、6 X- X$ T: K4 A+ G

1 W  E5 Q, b; ?! U2 D* M) ^
a45cc5de7953456ea921d0220d9ecf0f.png 4 e' P9 o% f& I, q9 a2 i5 s

( G/ ?) {  L, _' N3、! g- `8 w% D! a9 \3 J' N) [- K; W
$ O4 [+ }( r* G" _/ I
b64a2939f35044b08767b73d003e754d.png
% o6 B8 i( l  c( B& a5 D: b! d; c+ ?" N1 K$ l- R
pwm1和pwm2的区别:
" i- ]0 z" u, G; Q) r在进行PWM信号输出时,有两种PWM模式:PWM1模式和PWM2模式。
, @+ F8 h' l: H( w这两种PWM模式和输出有效电平的极性共同决定了PWM信号的波形。1 z' M7 z% B; l3 N/ y
PWM1模式
& n; y! A  C+ l/ Q6 E) B0 B递增计数时,当TIMx_CNT(计数值)< TIMx_CCR(捕获/比较值)时,输出为有效电平,否则为无效电平。递减计数模式则刚好相反。
  ^1 M- F9 ?6 y7 o  hPWM2模式
5 r+ z- ~' s4 C+ g3 T/ s" X递增计数时,当TIMx_CNT(计数值)< TIMx_CCR(捕获/比较值)时,输出为无效电平,否则为有效电平。递减计数模式则刚好相反。
% B" r& ]% ~0 x' \. n, m. v7 j
% L; a' p& E; ?4 H* ?
e65a51e70df049198baee4778d2a24e7.png 4 Y1 O4 t" K% t$ c, o' p8 k! R, N7 H

# g% j8 U- H7 E$ b4、# D- ^% {! n& e) V: y
! Q# i) J9 W7 o0 z
5941ff4d81b3415eadc31cfa2d8eb2ce.png + \) j7 p4 S$ P! ^- ^$ P6 i

/ d3 k2 Z9 O0 O5、占空比就相当于平均输出高电平20%,实验结果如下(平均输出专业术语就是pwm输出)
# [$ w) X9 k5 ]) H2 F8 C% C! L7 [1 |
0687b01602984d89bbf504f22b3dcb7b.png ( F. o2 \3 s. a+ A9 L# C/ e
) Z- z- @7 R, Z! n

1 M; ~" K3 m: H' r* D 四、代码

6 s4 W& u, Z& p* e  I. W! g1、CubeMX自动生成的代码
) ^. \7 x8 [& G1 E4 a, }2 s5 U% s7 a) C& {
128d09e1753b4a2f90a42d4509924e6a.png " e/ l% s/ x8 v4 u
& C( G$ ?1 |- K$ t6 E
2、设置变量
) P7 `* K/ P: ]( Q5 D7 Q" u: H- z" B* m$ Y" e. `' x& R
bff131a3108245e7b431b8930830eb72.png ! D% g6 f( K7 u5 {( S+ k

# ^6 u$ B( Y  @9 L 3、根据题目要求B4按键的共能,更新按键函数
7 |/ X  L" h+ O- n0 E' |6 ~5 A: J8 O, o" G$ k# e) c
e34b932f82cd4de080f00871bc1e6daf.png + b' _2 y$ X& m0 g- I, p. S, k

- C1 G5 y* H1 K& N) M/ y2 |6 r* d
  1. //Key processing function
    6 m  D) u2 T5 u; m2 }6 a
  2. void Key_Proc(void)
    # a1 {7 \4 Y: Y+ [/ p
  3. {0 I  K+ t' u3 T" ?1 F9 w
  4.         uint8_t cur_key = 0;
    7 a0 S* I: R4 H+ Q5 U& P. @
  5.        
    ) F7 U8 O# k! @
  6.         cur_key = Key_Scan();
    6 k! b( a1 ~+ ^4 v6 w5 A
  7.        
    * H" F3 e# O9 }4 W0 ~. P
  8.         switch(cur_key)
    . l$ Y7 ~$ E( r: a% r) ?
  9.         {
    1 o. l+ A6 h1 n( P# p
  10.                 case 1:# m7 n/ Q. T, j- V/ k% x
  11.                         Show_Flag++;2 w# {9 K+ T1 H/ h' ]4 @
  12.                         if(Show_Flag == 3)* h2 {1 C' z0 a" n, y7 J# Z  X5 h
  13.                                 Show_Flag = 1;
    8 J5 O4 Q: v9 S) R# t
  14.                         Update_Flag = 1;
    7 r6 m1 d2 z2 ^8 m- x
  15.                         break;
    # d. H) |! W0 q- P( Q! K
  16.                 case 2:: W5 l& ?. s' z3 G5 q" r& d
  17.                         if(Show_Flag == 2)
    # Z" ^% A* A  P. ^: x$ Q( e% G
  18.                         {9 p7 n5 Y" b9 Y0 p. R
  19.                                 CNBR_Price += 0.5f;* j- ?' o7 j2 Q& A' c' K- h
  20.                                 VNBR_Price += 0.5f;5 |5 ~/ l' K2 F# j0 s
  21.                                 Update_Flag = 1;                               
      C6 R: ?; y; o; o
  22.                         }
    4 O8 Q1 G8 }' i. V( _; c. I
  23.                         break;
    ' [; E, D1 B, {/ j7 L) {5 Q0 @4 @2 C
  24.                 case 3:
    5 ?  l# O0 ^8 y* |8 K
  25.                         if(Show_Flag == 2)& e' ^' B% L' U( G  `& D' j
  26.                         {/ o+ X: F& f* W  M# J5 P: e& h* n
  27.                                 CNBR_Price -= 0.5f;* Q! x- W1 n' g: \
  28.                                 VNBR_Price -= 0.5f;* \: W; y* b, r! x( z9 D0 V& F
  29.                                 if(CNBR_Price < 0)
    # P" u$ Q" E' G$ a4 q
  30.                                         CNBR_Price = 0.0f;
    / [: i" c! }( L2 D8 J
  31.                                 if(VNBR_Price < 0)' A( A3 N" I" g" ]1 g
  32.                                         VNBR_Price = 0.0f;                       
    , r; g/ T/ p) M+ n* w6 U6 e
  33.                                 Update_Flag = 1;! }+ ^* ~! R5 \% m5 V* ]
  34.                         }2 r1 q/ q9 X" g  b
  35.                         break;
    % a- w0 ~7 a( N3 D& n; |% p4 `# ^
  36.                 case 4:) j8 I  L" Y) ?% L
  37.                         PWM_Flag ^=1;//yihuo 0/1- g( z& z  }4 Q4 }+ I
  38.                         break;                7 H5 J9 [' s8 ^
  39.                 default:
      L$ J( i: Q3 m7 U5 e1 F0 X7 c, C
  40.                         ;
    : @: @6 J" s# d# o$ L0 ?" S
  41.         }9 X& i" ]3 _0 j" Z
  42. }
复制代码

7 O9 }9 G9 [2 E* P4 P1 E 4、LED函数, C, H0 {/ _8 @4 [  E
4 a& s  ]% {# D# g# `
21aabb2fd0d848efbd16952833d9e4dc.png
/ J' g& m9 k$ T+ b
7 i9 _" _  r* ]9 C6 ]* s
  1. void Led_Proc(void)) ^2 Y9 ], l9 n6 G& [# |0 j1 ]$ C
  2. {
    % W# x' s8 s; Y- z2 k6 X
  3.         if(IDEL_Size > 0)
    & d5 @5 e, V* k' ?
  4.                 LED_Ctrl(LED1, ON);* _0 `3 D- ?4 J
  5.         else
    % g' q6 o, R4 t8 `) z, T1 p7 T" G& y
  6.                 LED_Ctrl(LED1, OFF);+ f& |' P7 J+ S, A* P' C, f: I, d
  7.        
    ) ^3 C, T# w4 B: ]2 j
  8.         if(PWM_Flag==1)
    & j6 {) a, X, S& G/ a/ ?: j9 V0 K
  9.                 LED_Ctrl(LED2,ON);
    & q& S% `8 G, X) S* k9 V
  10.         else
    0 g/ s* b6 W0 n
  11.                 LED_Ctrl(LED2,OFF);6 e* P5 k1 _" b" h. n4 @$ H
  12. }
复制代码

7 o: N, z- s' I+ m 5.1、PWM函数) }+ Q, `0 [8 O: }" e
, B- l- Q2 A7 x( k; h6 r7 m
6387fa2f8b2947b5ab6ecb55b7a610f6.png
. X% P0 W5 {4 W
; j, i* N9 i6 h  a$ e; I! Z
  1. void PWM_Proc(void )
    + r( b4 r0 }9 s! H& [5 a& x0 g0 U6 l5 y
  2. {  v; Z- `0 |+ \
  3.         if(PWM_Flag==0)
    % v7 G$ z5 q" @) Z! E
  4.         {0 q0 ]$ L7 P6 I& `4 e; ^( L
  5.                 HAL_TIM_PWM_Stop(&htim3 ,TIM_CHANNEL_2 );
      ?5 Q8 G( K7 s' M& O5 @
  6.                 HAL_Delay(5);8 w( Z' J, ~/ B7 a  A+ R. t* [
  7.         }
    + I! l' i/ l$ x' n2 f$ K1 [
  8.         else , q; L+ F" [0 s- K  t0 i$ B+ f
  9.         {5 i4 {! G1 O. t
  10.                 HAL_TIM_PWM_Start(&htim3 ,TIM_CHANNEL_2 );8 t6 j+ Z7 @/ i3 X4 [
  11.                 HAL_Delay(5);% F" }$ I5 n$ I7 J
  12.         }( x3 ?" l/ Y" t* k% S. K# d9 H1 q7 ?
  13. }
复制代码
6 [( @. Y: S, }$ F
5.2、timer定时器通道相关函数学习7 b# @1 r: X' W; X  {1 c8 p7 Z
HAL_TIM_PWM_Start(&htim3 ,TIM_CHANNEL_2 );
( e: h4 Q1 C8 s- [! F# s当有按键按下的时候,开启timer3的2通道的PWM输出# s2 `3 P* V. s$ I  o
HAL_TIM_PWM_Stop(&htim3 ,TIM_CHANNEL_2 );1 A+ T  z) k) j* H. w5 g7 s* ^
当有按键按下的时候,关闭timer3的2通道的PWM输出
; @, @3 d1 q5 }) C7 X9 _注:__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_2,250) 是专门用来设置占空比的函数,这样就是占空比为250/500=50%0 M6 H% Q, t1 @9 w

: ^4 S" {) Y- T# C 6、主函数和函数声明
' y( `; S* y* m  X9 q  z
$ d* X1 }- z! \; s1 O# m0 |
99f74a259e5e4d47b57fb0962d0217ec.png ; ^. {# V/ }% }; Q* i) ]. L
# l" Y. O" j5 x
80e2410b3c694721a6bdc2187618b432.png
# x. F' s: I0 Q
: X( h. M3 f. E# v8 M; `4 f# ?
五、实验结果, D0 V# b0 T7 `, Z
通过控制B4能够实现LED2的亮灭5 D: a5 w6 Y8 \/ T- H3 Z" k
串口部分的结果问题:( ?, W% b- }& I- g
4 u  u9 h8 E3 n9 ^$ [# o# S9 @2 n
43c97cc65c594a85b90f316b0d93f8b9.png , {5 w1 T! B3 H" w1 j
, i9 G6 B) Z  q8 e. @% h, a
————————————————& o5 A0 f' E, b
版权声明:想要优秀点儿
. y: s$ o8 |, s; B$ i
0 `/ C7 u3 c. d2 k. w( S
+ f" k) w. S* ~. I5 Z: M
赞 收藏 评论0 发布时间:2023-3-2 13:33

举报

0个回答

所属标签

相似技术帖

官网相关资源

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