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

STM32G0学习手册——使用HAL库进行PWM实验

[复制链接]
STMCU小助手 发布时间:2022-10-31 10:20
前言2 w( B) F1 t- i/ Y5 n
在CubeMx中配置PWM,预分频系数和计数的值决定了波形的周期,pulse决定了占空比。+ a) t! E! y! p1 H
- Y8 j; V. ~. ~% C/ b9 ]
PWM边沿对齐模式(向上计数)
3 L  T; o. ~' `8 L, X. J. ?5 D: X0 y- x& ^5 n3 @( ~, _
在PWM模式1下,TIMx_CNT<TIMx_CCRx时,PWM参考信号OCxREF为高,否则为低。
3 U4 R2 k7 S1 L. ?" K6 U; U4 w: G. D
20200510155916490.png 0 L: V3 o8 c0 u/ O* F* O( ~# Q
) t) `5 R6 w2 ]- v" ~2 x
PWM边沿对齐模式(向下计数) 4 ?! X# [4 A9 w( [& j* n
& o. I, A5 |2 j/ L/ X' Q6 s
TIMx_CR1中的DIR为1时,执行向下计数。在PWM模式1时,TIMx_CNT>TIMx_CCRx时OCxREF为低,否则为高。
' f6 a" \5 H" Z) Z& i& L+ _' Q9 Y! w( i( v
PWM模式1与PWM模式2区别
/ g  |5 M/ F% ], H1 c+ o, S0 }PWM模式1
& K9 {$ D7 L1 ^1 Y* m
7 d' M7 f4 j' ?% c* t  V6 }; s在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平7 G) X/ F  e4 E" z0 L" v, a. M

; M8 B7 j$ Z( X* I* ^# f在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效 电平(OC1REF=1)。
, X' [. [/ P  b0 `! H! \( U: |/ ?- M3 r$ `% |
PWM模式21 Y( `; G; {5 w* v5 ?3 V, u

! B8 n, m/ Z: t4 w在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平
9 T( s8 L6 E% \* E
6 |: J2 Q2 _: Z5 g# O& n: _在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。
  r2 D7 z! O* n* H& r/ Y- r. O5 N6 J# |/ W/ q5 R. V
有效电平和无效电平由CCER这个寄存器的CCxP来决定
, m4 {/ f2 J4 ?4 f1 d4 ?) c
! p4 z( b- H( l! qCC1P:输入/捕获1输出极性(Capture/Compare 1 output polarity)  1 D" [( A+ t" s
6 \7 m8 A( ]& G
配置为输出:0:OCx高电平有效   1:OCx低电平有效   f% o+ @( d2 g) ?5 w* M: V0 L. H

7 S7 z3 I4 d$ i% G/ `
1 a9 N" _7 i0 d* X3 U/ R2 l! @实验步骤8 @! y1 l5 W! V2 A2 S
生成一个10ms周期的PWM波形,占空比从10~100.。
, c! U) f1 s8 l, a) g, E+ ^5 bCubeMx生成芯片工程,配置SWD调试接口,HSE使用"Crystal/Ceramic Resonator"
9 U1 m# k8 `/ {) BPA0引脚配置为GPIO_EXTI0(配置EXTI中断)
- S5 @$ @# x6 t* L+ k) _4 K9 k! p7 p( f, Y' i6 P+ `
20200510162747723.png
" S  i8 d  L- ~* ~% y  D' A5 @- P
8 j# K1 l+ L" j3 ~ 20200510162930572.png ) z3 H: y: z: B! _: s/ r) q

" S( H) ~- G2 s6 `6 _) A/ ?$ |: MPB1引脚配置为TIM3_CH4,在TIM3视图中Clock Source 选择"Internal Clock",Channel4选择"PWM Generation CH4"9 d( ]% }7 U8 @2 j; }" J; D
预分频系数填6400-1,计数值填100-1。(计算方法)$ j/ k* K+ p! t5 C$ T; Y+ o

: L2 Q7 O* E  t4 ^, w& E, h( ~( N 20200510163616257.png
2 B0 C  C4 Q% x; A' v4 W7 B0 [; G5 T
* L# m1 g0 o; x2 S/ r; a% k 在工程项目栏中填入项目名称、路径、版本
$ z; }; l3 c1 ]+ j在代码生成中选择自己需要的选项,最后生成代码3 ~! K: i: v% @1 g+ d

6 \$ v( t$ {2 x$ a9 ?, N1 J 20200510163959114.png
6 G/ f7 P! w/ j! R# M+ U2 z* m% U: e
在int main函数里面添加pwm初始化代码
, `- A9 {: ?3 o1 |/ }
  1.   /* USER CODE BEGIN 2 */7 y  E9 n8 x5 I! O! g+ u
  2.         HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);2 `( o3 Y5 ]5 J' P8 l' n8 ], h! ^
  3.   /* USER CODE END 2 */
复制代码

+ \9 d1 }! e; l3 T  在int main() { }后面添加EXTI上升沿中断回调函数8 J1 I5 ^* Q5 S2 @" c
  1. /* USER CODE BEGIN 4 */
    ( X" C( G8 a8 P2 ]0 N8 D; ?, @1 V
  2. void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)% n4 `- a+ \/ W( [2 o
  3. {3 W, Q! }0 B! V7 G' D& Z" `
  4.   /* Prevent unused argument(s) compilation warning */. I1 B8 _: F' z( ^$ Q
  5.   UNUSED(GPIO_Pin);% B0 i7 D) S' Q& ^+ @  J. Z
  6.         HAL_Delay(20);
    ( Z4 e# K* h8 V/ Y) t- [/ q# X
  7.   if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_SET)
    4 I% Z! O( s/ Y
  8.   {" t) \- O4 k& y: r3 ?# e0 j
  9.     if(duty_cycle==0)
    1 y5 G/ H1 E2 l& D( Z
  10.       duty_cycle+=10;& I0 I9 V/ f( j% F: @% W; d( L4 D
  11.     if(duty_cycle==100)9 J6 E( F3 t8 o. \7 Y
  12.       duty_cycle=-10;
    . ^4 z2 V* J9 i) t# D; v
  13.     Set_PWM_DUTYCYCLE(duty_cycle);: E$ `2 C& w) a/ k5 @
  14.     duty_cycle+=duty_cycle;
    , q/ ^8 D+ V3 E0 h
  15.   }+ _4 U3 k" t% N% [0 L# T0 F
  16. }, i7 s7 f6 N, r, o
  17. /* USER CODE END 4 */
    + X5 `& M4 ~6 v9 P
复制代码

5 y9 @+ S% {9 p! O0 e在int main() { }前面添加自定义改变PWM参数的函数. w1 V" }& L% H, J6 F
  1. /* USER CODE BEGIN PV */
    ! P0 s5 O4 L5 U0 A( u2 d
  2. uint8_t duty_cycle=0;" m" G" l+ @$ G
  3. /* USER CODE END PV */% _! r) u& w0 M+ P3 O* _2 T
  4. 8 R) J$ I$ r5 a0 ~  S3 ^: G3 w3 d
  5. /* USER CODE BEGIN 0 */
    , y5 G$ P% e  T/ w; x7 w% ^# `( @
  6. void Set_PWM_DUTYCYCLE(uint8_t duty_cycle)- u: u- b; X, x- `' |4 Q
  7. {
    + i$ q  ^# X/ ]- @
  8.         TIM_OC_InitTypeDef sConfigOC;8 ]2 z0 I# [+ H  @, W  w* o6 q+ P
  9.   sConfigOC.OCMode = TIM_OCMODE_PWM1;6 J" d5 A% s' W! `8 E" _  A2 j/ R
  10.   sConfigOC.Pulse = duty_cycle;9 {# ?; d1 }. H. d1 H  f3 ^2 Q
  11.   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    " k2 K1 S6 ?! w/ Z  k% n- p# L6 L# Q
  12.   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    ! y# C- r  j( g: F( ?( k. i, Q
  13.   if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)2 }; c0 K6 \7 a( a; ^% {! q
  14.   {& {! u8 X4 ]5 o9 X
  15.     Error_Handler();: K, X% Q3 [5 ?: d) O
  16.   }; N" d0 ~& J9 V" o4 m8 q5 h8 M
  17.   HAL_TIM_MspPostInit(&htim3);! |' E# Q6 f" X- o' Z; A- s
  18.         HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);+ Y) u& h# ]' J' s1 Y% s& h
  19. }" F' j# y0 y1 ]' z9 L
  20. /* USER CODE END 0 */
复制代码

1 x" R: }. i- D6 X  _. C 在debug选项卡中勾上"Reset and Run",编译。烧录
: v) j1 g% o5 b1 J当你不停按下按钮时,就会看到LED等从暗到亮,从亮到暗变化。
. `( j- z' F% p* t- T* w. c, T2 Z/ j8 D# f; V% k
20210919215422857.png ) n- [7 r& D- `7 G0 m9 }

7 e. X! ?" X9 d3 h/ h- I$ K————————————————
- h) F; P5 x. q3 f版权声明:SCCELE4 q/ L( y& f$ L7 w* b9 M
5 [- Y7 m2 R7 }7 }
: m! n  I: b) b
赞 收藏 评论0 发布时间:2022-10-31 10:20

举报

0个回答

所属标签

相似技术帖

官网相关资源

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