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

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

[复制链接]
STMCU小助手 发布时间:2021-11-9 17:00
前言
* S3 Q/ u+ }2 X# \在CubeMx中配置PWM,预分频系数和计数的值决定了波形的周期,pulse决定了占空比。
  h) K- O4 B4 X; F! m
$ c" S+ w: n, sPWM边沿对齐模式(向上计数)6 W2 ~% N( w! ?# J) Q4 A

( G  O3 H$ Y% j) ^* j( b在PWM模式1下,TIMx_CNT<TIMx_CCRx时,PWM参考信号OCxREF为高,否则为低。
( J# }* W# Z: W' c% h: M' [2 `# L6 a  V8 N$ u% u" G
20200510155916490.png
& d1 r& V( Q" R
  f# }! G0 }1 k( |' G
PWM边沿对齐模式(向下计数)
4 M; i& D6 u/ x" H8 v! \5 L% o' Z) r7 }+ N+ L
TIMx_CR1中的DIR为1时,执行向下计数。在PWM模式1时,TIMx_CNT>TIMx_CCRx时OCxREF为低,否则为高。- Z: h" \/ B% J% ]8 J$ D

! @* `' h  O  x8 t- B; uPWM模式1与PWM模式2区别- T. U6 V- }; K6 _/ Y
PWM模式1& i: x0 a9 a' y+ v7 }5 u
% n  f$ c+ M$ U0 F
在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平6 U1 J0 @7 ?$ H* R' b8 Y" g
* \5 w4 ^' g- F! V
在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效 电平(OC1REF=1)。
4 }& @& u! r3 S; k: z2 \+ _* E
9 k; k& M! l. s& ?PWM模式2
! N4 F' ^/ V& y/ t7 R* [# P7 c+ G0 A( A. g/ s
在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平
7 |" ^& _8 j& X1 t- j2 B3 c% G6 a0 T; M3 c( ~
在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。
/ z; V1 S9 A7 A
+ _3 j1 E2 q( ~3 V! R$ j. X1 q
有效电平和无效电平由CCER这个寄存器的CCxP来决定# o# S2 a; l+ a) h( k/ o
# C* s/ [8 c3 x% N" _7 s
CC1P:输入/捕获1输出极性(Capture/Compare 1 output polarity)  
0 N9 a- R' O6 A0 M+ I. a8 }, o' F# j6 _. h, V5 R
配置为输出:0:OCx高电平有效   1:OCx低电平有效 ' e' @2 U. G9 i, ^" o
# j! A% b8 K: x7 D3 a$ [, c
实验步骤
8 S, N# y& A9 h, _7 F" G8 U8 s生成一个10ms周期的PWM波形,占空比从10~100.。
1 n  I1 |% O* I$ {# y, q1 e+ d1 ~  e+ h2 M6 f) ^/ p, W
CubeMx生成芯片工程,配置SWD调试接口,HSE使用"Crystal/Ceramic Resonator", ]$ i- ~. P0 A5 G0 I7 T" H
PA0引脚配置为GPIO_EXTI0(配置EXTI中断)
7 i5 g! B, ^4 o  G/ j0 U- J: K
+ ?' [) ^# X. I& M; [6 R5 t
20200510162747723.png

, S2 }. Y. B7 N( l! ]4 N" a- M9 W5 |* q$ N; \$ i; f
20200510162930572.png
5 z& m9 S0 Q6 F  z- Z& H) a4 n

. z/ Q( X' z' f$ xPB1引脚配置为TIM3_CH4,在TIM3视图中Clock Source 选择"Internal Clock",Channel4选择"PWM Generation CH4"6 ]  w$ v. W# l) b' T
预分频系数填6400-1,计数值填100-1。(计算方法)
5 f- a, C' I& k+ e' j' c! \! l' U6 K: V+ C) y
20200510163616257.png

+ c, P% S, _1 |8 {' p" |
' ]" k1 O  Z! f2 L0 J0 D 在工程项目栏中填入项目名称、路径、版本- o* D& ^4 R% p8 U# @0 s9 a% Q
在代码生成中选择自己需要的选项,最后生成代码; T3 h* w3 ?' G2 P& j. _: _

/ v. V* o+ c; {5 R4 ]
20200510163959114.png

& t2 o1 m- t( j% O8 m$ X
2 M/ p6 V4 |# L. c4 ~在int main函数里面添加pwm初始化代码
. j7 _! L/ @- [/ R, v
  1.   /* USER CODE BEGIN 2 */- z& U. x- v, A* T) n
  2.         HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);# o; Z- X# |6 L2 @- F: A( g4 s! J
  3.   /* USER CODE END 2 */
复制代码
  t" w) Q. k8 Y- [7 E6 l7 E' S
  在int main() { }后面添加EXTI上升沿中断回调函数2 `: B. M/ w$ v, a. h
  1. /* USER CODE BEGIN 4 */2 R( d' n( X, b, m4 y
  2. void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)
    ' k4 ^$ F) ~; ]7 w  ?: a
  3. {, A8 x3 X* l" P3 p, p5 k
  4.   /* Prevent unused argument(s) compilation warning */* w# K6 j; J3 h
  5.   UNUSED(GPIO_Pin);
    7 }, ~4 F( }" c" I0 U3 u
  6.         HAL_Delay(20);7 h  b* v; g! U
  7.   if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_SET)  y9 `+ R; H' ^# J7 b
  8.   {
    . `+ G# H2 m, m, B
  9.     if(duty_cycle==0)% v- w/ i7 ?. J' w6 }
  10.       duty_cycle+=10;- e7 y: C2 U8 @% c0 H: B
  11.     if(duty_cycle==100), I" ?  ]7 T8 {$ M: j  M: k2 o# g' O2 |
  12.       duty_cycle=-10;
    # K+ s- @3 @; M1 ]0 E6 ?  Z7 \* w' J. g
  13.     Set_PWM_DUTYCYCLE(duty_cycle);
    % x# m7 O( P# m
  14.     duty_cycle+=duty_cycle;$ O$ _+ s* ]0 e& R& S3 @( ]
  15.   }
    * z* V7 }, X9 W3 g6 ?# p% j
  16. }
    % E: ^* m; u  f# v; ?
  17. /* USER CODE END 4 */
复制代码
1 ?6 g8 h7 L: H; i7 ?
在int main() { }前面添加自定义改变PWM参数的函数& b# R9 _1 \* X- W. m
  1. /* USER CODE BEGIN PV */" O- r. N2 z9 }8 E5 `4 s7 w
  2. uint8_t duty_cycle=0;
    1 }, v$ |# f7 C  n  K7 |6 s9 E
  3. /* USER CODE END PV */7 g$ Z9 R7 a( t
  4. : \" j8 K* L: U$ j1 [5 N
  5. /* USER CODE BEGIN 0 */
    5 D' D3 u3 g% X3 v" o( Y% O
  6. void Set_PWM_DUTYCYCLE(uint8_t duty_cycle)% Y# u! m, m. H. i+ Z/ w
  7. {
    6 e, \5 T; L/ f5 D& f% _$ v
  8.         TIM_OC_InitTypeDef sConfigOC;9 R4 t! e/ n  ]
  9.   sConfigOC.OCMode = TIM_OCMODE_PWM1;
    & C: |" f0 Q. C) V, V/ P( S. S" {
  10.   sConfigOC.Pulse = duty_cycle;& v# m. w( `; E( L
  11.   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;8 ^5 k3 M+ H) g- T) |2 Q
  12.   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;; N  Z3 z8 j. D0 G- w
  13.   if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
    ( j  K7 s/ Y- `. @
  14.   {- I3 h* k- \! y- e, j, R
  15.     Error_Handler();
    ( `3 T/ z7 [, a/ G" e  z! J
  16.   }' U: Z' W4 y) w% F" {. F' D) `
  17.   HAL_TIM_MspPostInit(&htim3);* s: m% P; B& \5 V& \
  18.         HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);* M  C2 {# M1 P" S7 d5 U
  19. }
    ; E6 Z" d  G: q5 p' w7 n
  20. /* USER CODE END 0 */
复制代码

' Z% D% ~0 [) B 在debug选项卡中勾上"Reset and Run",编译。烧录1 S3 X7 ^9 O& N- ~" S/ e1 Y
当你不停按下按钮时,就会看到LED等从暗到亮,从亮到暗变化。( P8 Z* P5 S( @5 H; I$ u  S

0 S/ [/ d7 [! `2 M6 z
20210919215422857.png
* O% g$ T- l, u- n; D0 j$ k8 |
+ \2 r1 e  f8 |! D# ^; F) t

7 ^6 |# D& ~. z0 ~
) a. c3 W2 K5 m( x3 V. z
赞 收藏 评论0 发布时间:2021-11-9 17:00

举报

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