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

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

[复制链接]
STMCU小助手 发布时间:2021-11-9 17:00
前言2 r  R. d0 v5 U1 D" _% K1 h% Z$ p
在CubeMx中配置PWM,预分频系数和计数的值决定了波形的周期,pulse决定了占空比。
! S# ^: B' j' M8 G* W. b0 {* W' W: i; x
PWM边沿对齐模式(向上计数)6 W. k  H: S- Y+ Y* c0 N4 n
1 o$ d& h* `3 ]! [* h
在PWM模式1下,TIMx_CNT<TIMx_CCRx时,PWM参考信号OCxREF为高,否则为低。* `( j' g1 V& t4 a8 \/ e

. a3 g1 G! u/ v8 X. B8 y$ ~
20200510155916490.png

5 g" A6 _' b) L* G& C, S4 c; u# n% q/ i
PWM边沿对齐模式(向下计数)
* o- D, j( k6 q! G1 ?! e( @
/ i! w& l0 p3 h$ ^. S+ M& }TIMx_CR1中的DIR为1时,执行向下计数。在PWM模式1时,TIMx_CNT>TIMx_CCRx时OCxREF为低,否则为高。
0 u% |5 O1 E( y8 S/ ]$ W" ?
# t* r& o  f3 I" K5 _PWM模式1与PWM模式2区别! C" K+ ~  j: `
PWM模式1/ d7 b# E' Y2 @5 v
; a' B" E9 Z2 a
在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平: Q4 \: k/ o+ s" q

2 c. n, C6 _8 [9 I# O4 G在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效 电平(OC1REF=1)。
! Z9 b, U9 Q$ u
- A* o1 J9 a: m: F+ I! g' jPWM模式2" e. u/ d3 d$ S9 t* u

& r4 |- x6 f6 k/ @5 Z% i. Q/ l在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平3 ~: s1 l% F0 `. |% e

0 Y) \' |1 n; U: h' T1 w在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。/ s+ U9 ~5 d& }: x. ]

3 E$ Y! W; t6 z1 i+ o& \
# R6 T4 G+ O! Q: Y5 _$ s9 E有效电平和无效电平由CCER这个寄存器的CCxP来决定4 r; X8 M. T: f. ?+ W: C; C

# `! Y% j. J2 u. yCC1P:输入/捕获1输出极性(Capture/Compare 1 output polarity)  
. D+ V9 K$ d" s7 q( O8 |
3 U4 t# s  W5 W( l9 H配置为输出:0:OCx高电平有效   1:OCx低电平有效
9 l! L. I  D7 M: G. E0 p' o: }  [" ?
实验步骤
  s, |  X+ n$ D0 S% y: l5 }$ D生成一个10ms周期的PWM波形,占空比从10~100.。
; J; `' R4 O9 w6 h( Z. D4 Y6 l7 G" I% g+ J1 x; Q7 N( W; s
CubeMx生成芯片工程,配置SWD调试接口,HSE使用"Crystal/Ceramic Resonator"1 \" e0 @& l9 t& x1 P  }& a% B% d
PA0引脚配置为GPIO_EXTI0(配置EXTI中断)& g/ b/ P9 g4 ~
7 L2 [" C1 P! G/ Q
20200510162747723.png

- g- j& [# K" V# `
, n; _4 [1 q% j/ x. _
20200510162930572.png

2 N( P, [  _' c8 X! y% @
# f& M4 F8 ]) s. H9 d% ePB1引脚配置为TIM3_CH4,在TIM3视图中Clock Source 选择"Internal Clock",Channel4选择"PWM Generation CH4"
' l7 s4 J; ^& s" Z 预分频系数填6400-1,计数值填100-1。(计算方法)
6 G: }' P. d7 ?: N6 E8 P* s; d  k5 R
20200510163616257.png
2 c- m6 t3 P2 ?8 b+ A( e3 h5 s# T8 f
2 L4 _' d4 f* @) M7 l3 X
在工程项目栏中填入项目名称、路径、版本
! Y1 ~5 g4 d* t" u在代码生成中选择自己需要的选项,最后生成代码( O3 d& X: j' U8 m, W- o

6 N! f# b. w% }4 t' o
20200510163959114.png

+ t% w! p9 f2 D2 x+ S
& A- F) S. I  e' _! }- v) C! V在int main函数里面添加pwm初始化代码  V; _3 k( }0 X2 B4 o
  1.   /* USER CODE BEGIN 2 */
    , z& g* ]$ ?( Q' Q
  2.         HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);
    + r# O/ S( |0 Q6 N, b: |+ x, K/ r
  3.   /* USER CODE END 2 */
复制代码

/ p$ D5 c- ?+ \+ K9 C7 r  在int main() { }后面添加EXTI上升沿中断回调函数, F5 u- M$ Y* e7 H: ~9 Z
  1. /* USER CODE BEGIN 4 */
      _9 S: i7 _1 m
  2. void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)
    : F0 q9 k% V. U1 [1 ?
  3. {) C5 t% k: ~: [  p* d  j4 f
  4.   /* Prevent unused argument(s) compilation warning */
    - ^; N$ c* d& `# V0 I
  5.   UNUSED(GPIO_Pin);
    ' o. q% @3 H, P0 V
  6.         HAL_Delay(20);
    7 Z' N4 F$ Y; V$ R
  7.   if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_SET)
    - d, Z* j. p( R: I7 h% ]
  8.   {
    $ K) H2 [" r" ~" M; T
  9.     if(duty_cycle==0)
    % ]& V4 I5 f% R6 d
  10.       duty_cycle+=10;0 C( P0 \. d. {
  11.     if(duty_cycle==100)
    2 \1 j) B" |; u" Q2 y. h/ n
  12.       duty_cycle=-10;
    8 O' r# j; U" }& f2 r9 U
  13.     Set_PWM_DUTYCYCLE(duty_cycle);
    ) g9 ]7 w6 G3 a' |: Z
  14.     duty_cycle+=duty_cycle;
    # S$ W( L+ r8 _& H3 E
  15.   }
    . m4 d, c; t6 A5 `: K$ X" d
  16. }
    - r/ y+ w# A/ y6 r
  17. /* USER CODE END 4 */
复制代码
; R# C& e+ E/ x# {; E6 t/ {: K
在int main() { }前面添加自定义改变PWM参数的函数
$ w, p% `* m" }! Y! y
  1. /* USER CODE BEGIN PV */- a% |- X" b' q. e3 s+ y
  2. uint8_t duty_cycle=0;1 j- B( c' \" w+ m
  3. /* USER CODE END PV */# \$ \5 c) A7 u* Q/ m( f) a# S
  4. ) V! ~! z0 b' O2 a% q& i
  5. /* USER CODE BEGIN 0 */
    ! B: I5 w. x8 X. T# T& J
  6. void Set_PWM_DUTYCYCLE(uint8_t duty_cycle)' s+ ^9 g9 C* ?) d
  7. {
    , \5 J) e! o) ?' C9 B
  8.         TIM_OC_InitTypeDef sConfigOC;) G$ D6 ~( i% K1 v- x
  9.   sConfigOC.OCMode = TIM_OCMODE_PWM1;, P( c8 v5 E+ M% P; f
  10.   sConfigOC.Pulse = duty_cycle;
    ( W0 n) w2 x& G+ K3 C  L; _" h
  11.   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    : C) C, ~# H% ^( x: o" f/ ^
  12.   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;6 q& A, g8 f6 f. [
  13.   if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
    : X- Y) O6 \% W" t
  14.   {; k- K4 x+ i$ Z3 L
  15.     Error_Handler();1 Z, i3 [! R0 U0 w& x# x  Q
  16.   }, |4 W" j' L7 ^3 ^5 C9 W, p
  17.   HAL_TIM_MspPostInit(&htim3);' [: \5 `$ Y, a: d- e2 E
  18.         HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);
    5 i5 C$ c8 G, ^0 Z
  19. }
    , A7 X: [2 v" c
  20. /* USER CODE END 0 */
复制代码
+ A) S9 t' \& p9 n
在debug选项卡中勾上"Reset and Run",编译。烧录* G$ ]  r$ _. i9 M( ^! q& D
当你不停按下按钮时,就会看到LED等从暗到亮,从亮到暗变化。
& ?' R( b+ l5 m$ |% h4 x+ j$ H* j' P! h$ b: n7 p
20210919215422857.png

& ~7 U- d6 [$ o1 g
* O. t9 I, v0 b$ W% l
" f. X+ v$ W- n/ J
/ S8 L. ]6 N9 r$ o4 e4 K
赞 收藏 评论0 发布时间:2021-11-9 17:00

举报

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