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

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

[复制链接]
STMCU小助手 发布时间:2021-11-9 17:00
前言( X1 w5 H, v( [
在CubeMx中配置PWM,预分频系数和计数的值决定了波形的周期,pulse决定了占空比。, E! U* W' M) G

0 p: r. |$ X$ h7 D0 YPWM边沿对齐模式(向上计数)
- v& P. l8 J% f( G5 _$ j: }6 Q. Y( W1 i, S2 e0 ]  t
在PWM模式1下,TIMx_CNT<TIMx_CCRx时,PWM参考信号OCxREF为高,否则为低。$ m$ ~+ v4 ?7 _: B/ H3 L+ v
! G& K+ [8 I. `. m7 G, |, X
20200510155916490.png

: v2 B! s( B- ~$ I# I7 |' @) u& _+ v0 ?% a
PWM边沿对齐模式(向下计数)
- x0 o0 }$ I3 e0 R
% j5 x, {# G2 |; e+ YTIMx_CR1中的DIR为1时,执行向下计数。在PWM模式1时,TIMx_CNT>TIMx_CCRx时OCxREF为低,否则为高。. _5 D8 R% Y3 `8 k7 ?+ K

4 _1 a% T/ f: d; aPWM模式1与PWM模式2区别, S5 Y# M" {6 `$ y: I
PWM模式1) G9 H( M8 ~* v* x: Q

4 S# s; a' {2 K在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平
2 F* f1 Y6 |. K0 h8 H' e! U# F: o5 H3 X, e3 }, g( `
在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效 电平(OC1REF=1)。
' ~! J, a+ A; n
  r0 B" x2 P" ?* H( T0 zPWM模式20 M4 B, `4 w; h( W% E3 [) q5 O

! u& c& u! b( @3 p8 M& V& s& \' q在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平
- a5 y; m9 ?6 {1 Y3 m' A2 ?( ^- O
在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。* X3 b: I: T7 j7 w. o2 F! I& Y

4 C9 t' ^( o& K/ l0 Y" G4 l& o- R/ S# h/ o* h0 x5 o- }" R* Z% Z1 ?
有效电平和无效电平由CCER这个寄存器的CCxP来决定7 n: l: K/ @- U) {: u5 T6 R4 L& ?

) x' u5 l2 ]: w' L3 N- sCC1P:输入/捕获1输出极性(Capture/Compare 1 output polarity)  
9 W: l. X" w: |3 q7 u6 w! S8 \% O* h$ r6 Q! Y& @/ H
配置为输出:0:OCx高电平有效   1:OCx低电平有效 1 r& U4 u4 n( }

1 o+ U% t. j- K2 B5 f实验步骤
( L6 Q7 f# [7 E' c' W1 S生成一个10ms周期的PWM波形,占空比从10~100.。. J6 A. L1 p  z* o0 I- k$ L) a% L
8 y# x  g6 X3 s0 N
CubeMx生成芯片工程,配置SWD调试接口,HSE使用"Crystal/Ceramic Resonator"
; T" A: G+ i6 ?PA0引脚配置为GPIO_EXTI0(配置EXTI中断)
0 m9 o  d( U: o- Y1 |4 v% J; A
0 @( d' n& ^) b4 h! y, y7 t
20200510162747723.png

1 T% P$ u5 _  U! G! N4 x! u5 H
8 z6 m+ a; \' p
20200510162930572.png

. {0 B% d, ]0 C% {! ~' U+ Q1 p* T- q0 a) O' b/ ]
PB1引脚配置为TIM3_CH4,在TIM3视图中Clock Source 选择"Internal Clock",Channel4选择"PWM Generation CH4"
; q7 V1 f! \2 H2 V, o. X 预分频系数填6400-1,计数值填100-1。(计算方法)7 |4 R8 ]" `2 M# r

( d5 m% u; t; f
20200510163616257.png

' X: y9 U; s5 i+ S
- A0 N9 [" P% z2 {* b% Y% V# R1 d 在工程项目栏中填入项目名称、路径、版本
' @. z, `# l# k9 ?9 {; a在代码生成中选择自己需要的选项,最后生成代码
7 a3 f2 b6 ?! z
$ H  Q* D8 C; |( F
20200510163959114.png

9 i+ T1 r6 @5 {& U/ w; d$ v
$ Z! [2 i$ e6 g  b' w# O! e! F在int main函数里面添加pwm初始化代码* b5 [  A: F6 l6 N5 M( G/ J5 f
  1.   /* USER CODE BEGIN 2 */2 |8 c- [; n: I. s( Y) k) R$ g
  2.         HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);
    3 U& s( I0 g' C* g0 O
  3.   /* USER CODE END 2 */
复制代码
2 s; e& x4 g$ L" K" Q0 p2 K
  在int main() { }后面添加EXTI上升沿中断回调函数4 y0 V, P4 `  N6 O% H" x
  1. /* USER CODE BEGIN 4 */
    " N- n% h1 s) N' |% f$ o
  2. void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)+ v, }0 o! Y3 s' s  [  R
  3. {
    7 H, u' U3 h+ v* Z
  4.   /* Prevent unused argument(s) compilation warning */
    * f2 m  X2 l4 O$ p
  5.   UNUSED(GPIO_Pin);
    4 a: ^: u6 t9 _0 }( Z
  6.         HAL_Delay(20);  h" r) K7 f; i; @* n
  7.   if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_SET)
    1 R! E' X+ i8 @9 B' S4 l8 M* n$ ?
  8.   {
    6 X1 W. O9 v1 U
  9.     if(duty_cycle==0)2 }" F: ?& K; E3 m0 Y" l
  10.       duty_cycle+=10;
    ) \# c1 p5 M6 c2 k$ U' M
  11.     if(duty_cycle==100)- z# R. y6 Y/ p6 G  J
  12.       duty_cycle=-10;4 H6 \9 t  D! k6 B
  13.     Set_PWM_DUTYCYCLE(duty_cycle);* L2 D' a. _0 [; l6 P( g1 G
  14.     duty_cycle+=duty_cycle;
    # s" y9 r- P! x, U- L. }3 Q# {
  15.   }2 S! X, f0 T: V/ Z6 ]
  16. }
    2 c$ L) g/ S) H$ I
  17. /* USER CODE END 4 */
复制代码
8 ?  ~8 M, U3 D8 \2 N
在int main() { }前面添加自定义改变PWM参数的函数
1 q% I" H# L  F# u
  1. /* USER CODE BEGIN PV */
    & d) _& N7 g/ ~
  2. uint8_t duty_cycle=0;1 b0 F0 t/ V% @! K$ g* B
  3. /* USER CODE END PV */
    + B0 ~. {2 u; K3 A- l3 [$ h
  4. ( i: |9 s$ L  V
  5. /* USER CODE BEGIN 0 */+ E* L6 I+ H$ S; _1 @6 i2 ?
  6. void Set_PWM_DUTYCYCLE(uint8_t duty_cycle)
    ! V4 {" U9 }% g/ q+ @# d: I
  7. {
    9 J3 [) ~( E1 r% a/ V. j
  8.         TIM_OC_InitTypeDef sConfigOC;
    , [: g0 S' }* }8 m
  9.   sConfigOC.OCMode = TIM_OCMODE_PWM1;/ A: H7 m. |& C1 y& T% C
  10.   sConfigOC.Pulse = duty_cycle;
    5 P; L% g- H' z0 ?0 @4 ?! t" i1 s
  11.   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;# i* x! j$ x8 c
  12.   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    ( i4 m3 l& v% S% b6 I$ F
  13.   if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
    * O# t* |( T2 a" q
  14.   {* r. I8 z, f* u7 d1 C7 {' u
  15.     Error_Handler();3 y+ A. r' m% P# f
  16.   }, d. c' s" r* k& p$ G
  17.   HAL_TIM_MspPostInit(&htim3);
    6 e9 Y8 @( C7 k" f
  18.         HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);
    % U$ g% p; X- X" t
  19. }
    1 F& z; h( Q% p/ M7 E
  20. /* USER CODE END 0 */
复制代码

8 Y9 L; O  |" C" h6 @5 l 在debug选项卡中勾上"Reset and Run",编译。烧录
" T9 S- C9 l2 K- p当你不停按下按钮时,就会看到LED等从暗到亮,从亮到暗变化。
! C& E9 X' m( T0 u" D9 P6 P$ j4 ]" E4 h
20210919215422857.png
6 N0 V, G" ^! }* ?# b" }) [
/ Y5 h" A) k3 K. \

3 d' A% B+ ]5 v/ v  M0 c
9 c" f, I' ^0 ~& i
收藏 评论0 发布时间:2021-11-9 17:00

举报

0个回答

所属标签

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