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

【经验分享】STM32G0学习手册——使用HAL库进行PWM实验

[复制链接]
STMCU小助手 发布时间:2021-11-9 17:00
前言
0 }5 W2 u& e; P9 G" W% ?3 v# C在CubeMx中配置PWM,预分频系数和计数的值决定了波形的周期,pulse决定了占空比。6 E/ \" v: B4 X
3 |# L# Q$ h1 \: d
PWM边沿对齐模式(向上计数), c9 T  R6 g1 y. W

  Y, a2 h* _! ~9 p$ O在PWM模式1下,TIMx_CNT<TIMx_CCRx时,PWM参考信号OCxREF为高,否则为低。
. k7 @0 r/ ]3 v3 l* Q: s
8 j; `0 E3 L2 V
20200510155916490.png
: q( K  T+ V  Z9 E; [
, }5 ?/ C% O/ g$ f
PWM边沿对齐模式(向下计数)
6 \: q' O5 `: G9 \7 Z" q& c6 p$ b8 t: N' {1 T
TIMx_CR1中的DIR为1时,执行向下计数。在PWM模式1时,TIMx_CNT>TIMx_CCRx时OCxREF为低,否则为高。# r3 f3 E3 E4 j8 q1 M! a8 l

: o8 C6 |  H" @1 t$ |% b* xPWM模式1与PWM模式2区别
: f0 P0 d) Q* FPWM模式1
8 j' C; V" Q$ ]
) _+ Z; O- w8 R. l# I% C; @在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平2 d4 @+ G& g8 g# W7 u) v( p6 u& w

3 `( K, m1 K# b& O$ m在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效 电平(OC1REF=1)。! M" m: |( f4 f1 I2 S" Y

4 m; e9 L, [" u( j4 ^PWM模式2) {6 T3 T; r1 m, |2 l$ x
: ?/ ]# o* X/ y) E( m
在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平
9 H5 s* e" H1 ]# c2 o
8 F% t4 I1 C! X% y, g( N在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。
/ s; W% a1 p) \7 L: B" i# A3 ^/ c! K! c

7 e2 B8 ?# L' O, e有效电平和无效电平由CCER这个寄存器的CCxP来决定5 ^  Z& M( H& @& Z4 ?

/ ^8 \* F& ~- [CC1P:输入/捕获1输出极性(Capture/Compare 1 output polarity)  
1 T( y( s0 \1 I
7 c% e6 R+ _3 ~6 }: J. R/ d4 @配置为输出:0:OCx高电平有效   1:OCx低电平有效
. V2 D  V- g* v9 V
2 _$ d- F* M* ]& e! h8 @% h实验步骤
5 m5 b1 c$ s- u4 t; M8 [) D2 o6 f7 B生成一个10ms周期的PWM波形,占空比从10~100.。
$ L3 f+ [& h6 m; ?. w4 _. `2 ?$ P0 T3 w0 F
CubeMx生成芯片工程,配置SWD调试接口,HSE使用"Crystal/Ceramic Resonator"
. }8 f6 W" _% H4 f% |PA0引脚配置为GPIO_EXTI0(配置EXTI中断)  d- F* F4 ~8 O% ~' d* J/ X, [
1 l+ c' X' X: k1 h$ j( C
20200510162747723.png

, q# _) o* e4 l9 G( R4 }& S& @
* e5 N+ @. f# \" p; T& A3 L) M* x* k5 q
20200510162930572.png

; d4 @. s9 C, l! K+ M- _  h
$ E+ H# [& I3 ?8 C* nPB1引脚配置为TIM3_CH4,在TIM3视图中Clock Source 选择"Internal Clock",Channel4选择"PWM Generation CH4"8 u- S. M; M8 ^5 h
预分频系数填6400-1,计数值填100-1。(计算方法)
  Q  n0 X3 p, g* W8 l( \
" l+ p5 k0 O% R
20200510163616257.png

) m. _  w: ~& ^" q+ _$ M
: Q2 _. O+ O& @ 在工程项目栏中填入项目名称、路径、版本
& l+ w/ z" M9 w. P在代码生成中选择自己需要的选项,最后生成代码
) o& d5 ]% J, x( L; ], B6 V& N/ K& R  T5 X( [4 v
20200510163959114.png

) K; l+ P" U9 z# \
; p1 @. q3 y/ X  O& W1 |在int main函数里面添加pwm初始化代码
6 Q$ k- z; m0 K$ w* n4 {
  1.   /* USER CODE BEGIN 2 */. K7 _+ X$ u" L/ A8 w, W
  2.         HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);8 L- `# f$ w4 Z9 G* @
  3.   /* USER CODE END 2 */
复制代码

% W, ~2 g  A8 Z: D* x1 D  在int main() { }后面添加EXTI上升沿中断回调函数
& t. w/ t7 y2 L6 B/ h
  1. /* USER CODE BEGIN 4 */) S! U5 M# l& `/ A, \
  2. void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)
    1 N. C% u/ k, T4 S; X$ q
  3. {  a& x# p8 p7 s2 M0 [
  4.   /* Prevent unused argument(s) compilation warning */7 y) p4 g% Y4 S0 H) D
  5.   UNUSED(GPIO_Pin);
    3 o/ F- X7 I8 F5 q
  6.         HAL_Delay(20);; F) H7 f, Z8 }( {' k+ H
  7.   if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_SET)
    1 b! q: h% H  X, i6 o; K8 r
  8.   {1 w$ L. U  y$ c; P( J% ]
  9.     if(duty_cycle==0)
    , k7 v) t+ B6 J/ [' g
  10.       duty_cycle+=10;; X8 F$ }7 ~) M
  11.     if(duty_cycle==100)" L* q" v) \+ D8 \/ b
  12.       duty_cycle=-10;, ~- f0 q+ n2 `. e
  13.     Set_PWM_DUTYCYCLE(duty_cycle);
    " j0 \: d! i# t5 r, h
  14.     duty_cycle+=duty_cycle;
    5 b; t" p9 v( k$ r" m' F0 j5 A: F
  15.   }
    - a+ y3 _. X" `3 f: F* ?8 L
  16. }0 ?  {  L/ j, a, @9 b/ v
  17. /* USER CODE END 4 */
复制代码

& G# f8 U7 x7 h! ]' Y1 L2 V在int main() { }前面添加自定义改变PWM参数的函数
! Z' @  C& L3 b3 t! ]; F/ [
  1. /* USER CODE BEGIN PV */6 O1 x+ M* ^: r2 [3 [
  2. uint8_t duty_cycle=0;
    / _( R0 i3 Q, I$ N& d" j
  3. /* USER CODE END PV */. _; R; a2 O' {2 a5 M( T5 A

  4. * S! q! u, D9 I2 c  I& D
  5. /* USER CODE BEGIN 0 */
    ) ?" E) B; r% ^/ R
  6. void Set_PWM_DUTYCYCLE(uint8_t duty_cycle)% q5 t% p+ R/ X
  7. {
    ( e' ?2 {; n- [, v9 ]
  8.         TIM_OC_InitTypeDef sConfigOC;( R: `: @- \4 |4 f- q! H$ i- b5 N" R
  9.   sConfigOC.OCMode = TIM_OCMODE_PWM1;! _" H4 |1 k8 W; Z
  10.   sConfigOC.Pulse = duty_cycle;
    ' Y+ f) |: j2 f/ T
  11.   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    / h( @/ ?$ q  ^  W! d
  12.   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    0 Q$ [; V) c2 d6 O
  13.   if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)- C+ C, g6 e% ~. }8 Y* s* X
  14.   {3 A( g% Q+ W/ P+ E
  15.     Error_Handler();9 M6 u( T- @7 w: I1 O2 `1 g
  16.   }
    ! v" D+ K+ E1 M1 x$ O' z  Z5 m9 c
  17.   HAL_TIM_MspPostInit(&htim3);, R6 I  P- W7 M- w* p
  18.         HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);
    $ a9 v. Y0 A! Y8 D0 }" t9 C! o
  19. }
    ! \! }/ [. v) ?" r) C
  20. /* USER CODE END 0 */
复制代码
. c% v5 N6 F  o4 T) p' t
在debug选项卡中勾上"Reset and Run",编译。烧录2 w. |+ b( s+ x- `
当你不停按下按钮时,就会看到LED等从暗到亮,从亮到暗变化。
: b/ ]& R, K6 u1 I, _! ]& M; b. s) v$ K. p. _
20210919215422857.png

2 @) X* I, o5 k9 m, \5 {5 E& N
  Z: y6 T. Q2 T5 L! |& a4 w0 \- Q* u- C. A

. [9 J$ b9 Y0 V& y# q1 T
收藏 评论0 发布时间:2021-11-9 17:00

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版