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

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

[复制链接]
STMCU小助手 发布时间:2021-11-9 17:00
前言9 L" C; d' l! w$ j3 J
在CubeMx中配置PWM,预分频系数和计数的值决定了波形的周期,pulse决定了占空比。; R1 ?; Y0 a4 O. s/ H! ~7 r2 k
! E- ^( F+ }2 O, L: T! p
PWM边沿对齐模式(向上计数)
& E$ x' S2 i" [7 ?
! c0 L5 r8 V0 x' ^+ ~在PWM模式1下,TIMx_CNT<TIMx_CCRx时,PWM参考信号OCxREF为高,否则为低。
5 Q; _6 K8 j  n. x% u  r' r. d, h/ U2 `) `6 y
20200510155916490.png

" v& a8 \4 f% K6 Z( M/ F; i# ]6 o/ y3 Y& W) X9 ~
PWM边沿对齐模式(向下计数) % }5 f$ E* t6 ]* e
. I9 [' d0 ~; S, s6 c7 X
TIMx_CR1中的DIR为1时,执行向下计数。在PWM模式1时,TIMx_CNT>TIMx_CCRx时OCxREF为低,否则为高。+ ?9 q5 b; T2 K% _2 c: M

' [4 D2 }! h+ b7 ~. {$ ?/ [4 p3 EPWM模式1与PWM模式2区别
3 E: J  D8 ?" D& }. W9 JPWM模式1
- }. e) q8 ]: k' s) r" v: P8 |6 J
% \( A5 U+ N& I* B在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平
% J* B, l- l4 u* p% K5 l* R. V' ?/ _" {$ }
在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效 电平(OC1REF=1)。  V6 }4 Y% l- C. q( r( ]7 j: \
7 |0 ~$ u# g* b  l
PWM模式2
- `% a$ e9 j' s3 _, R( f, A) y  e; t5 u) w& ~1 Q" ~
在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平
4 H* i' m/ {9 q3 C( Q% [% E0 S- `3 e! I) V: }
在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。2 ], {6 n' i1 M

; e7 M2 g2 o! a5 t' J5 V4 @! S
7 n9 i; }% v) X; `, G有效电平和无效电平由CCER这个寄存器的CCxP来决定
6 ]* ~5 l9 d& o$ a$ ^
- y% X8 {# g' P3 U7 VCC1P:输入/捕获1输出极性(Capture/Compare 1 output polarity)  / Z3 l( J' O6 F8 s

2 ?5 ^% X9 v2 M配置为输出:0:OCx高电平有效   1:OCx低电平有效
1 X; b6 ?  q4 b9 F3 Y8 _
; z* n) l" Q: x! B# @实验步骤- a$ C( |  \: i+ W! W
生成一个10ms周期的PWM波形,占空比从10~100.。
/ Q6 c$ x! L& c; O, }# A! s3 }2 U
3 e: _0 ]4 h. a# \& iCubeMx生成芯片工程,配置SWD调试接口,HSE使用"Crystal/Ceramic Resonator"
% p) S5 }  g# w$ GPA0引脚配置为GPIO_EXTI0(配置EXTI中断)( z' ?7 I# B4 h" y
" w8 F6 [5 k$ p' x; k2 r; s
20200510162747723.png

: O4 U4 ?8 t. H% R4 h' N, E+ {7 S4 r/ R( J$ d2 b2 U" X
20200510162930572.png
9 s$ k* i, a* H4 r4 t1 H$ T2 K

/ Y6 n( J# q, DPB1引脚配置为TIM3_CH4,在TIM3视图中Clock Source 选择"Internal Clock",Channel4选择"PWM Generation CH4"
# J* D6 F7 i3 K; D7 o; C 预分频系数填6400-1,计数值填100-1。(计算方法)
# @/ k% D. l  |' v, ?8 I- K/ U. o# U- O# {2 p3 s
20200510163616257.png
7 H* g" i" h- {* W# S
- Y% h" ]  ?( G2 G% I9 s
在工程项目栏中填入项目名称、路径、版本
- m7 ~9 l( W8 H在代码生成中选择自己需要的选项,最后生成代码
2 a! @! v- U" u3 d4 O7 L. F* w/ a1 }. L" t) I/ S( o) F6 K" a
20200510163959114.png

. q  m, ?9 B; w( Z2 ~- }' M2 E: H2 m1 Q8 p5 K$ T& Y- x* K7 S
在int main函数里面添加pwm初始化代码7 w9 R; `4 T# J% D; ~" ~& a6 @! V/ s
  1.   /* USER CODE BEGIN 2 */  ^5 U/ V3 _( W! b. L: k5 F
  2.         HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);
    3 Q: X5 _, Y7 c% F* m. @# c
  3.   /* USER CODE END 2 */
复制代码

# z( E; ~$ K$ J( c2 S- q  在int main() { }后面添加EXTI上升沿中断回调函数2 `& n7 X5 P& i" B2 P* Q: }+ o8 `
  1. /* USER CODE BEGIN 4 */  A1 z; W, O  X
  2. void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)
    2 F: X: k& W: c9 C, @
  3. {
    * z2 p9 b* i8 y, [& C$ _) ~
  4.   /* Prevent unused argument(s) compilation warning */+ i9 _/ j: Q& X/ ^+ T
  5.   UNUSED(GPIO_Pin);
    / O* Y& B6 ]+ I) k2 j, U% {
  6.         HAL_Delay(20);# i$ C/ L- E" L: b, @. }
  7.   if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_SET), R$ a. R% _" d% t3 }
  8.   {
    7 \+ M& N0 s+ a/ ]
  9.     if(duty_cycle==0)
    ! n9 R3 _# a8 h1 X
  10.       duty_cycle+=10;0 e7 I0 l4 I- {9 R* `
  11.     if(duty_cycle==100)
    8 D3 x0 w0 ^" I3 D
  12.       duty_cycle=-10;  N8 g3 @9 Z* W+ d& V& ~
  13.     Set_PWM_DUTYCYCLE(duty_cycle);8 f; g3 f3 }3 z
  14.     duty_cycle+=duty_cycle;
    2 L$ q0 y" ^6 J
  15.   }1 v- [( Y" {  j  ?; k, |
  16. }7 t1 w. j5 t6 l/ |) z+ d
  17. /* USER CODE END 4 */
复制代码

5 j/ _/ ~1 ?' T+ y在int main() { }前面添加自定义改变PWM参数的函数
9 W  d3 r: @+ a% C2 E
  1. /* USER CODE BEGIN PV */
    ' d$ a3 A, e$ W
  2. uint8_t duty_cycle=0;
    * |# K7 r7 f3 j" l- f1 C
  3. /* USER CODE END PV */
    4 _0 ^, A9 M1 c% B% A$ O+ ~

  4. % f- t5 i4 j" f* I* s' Q3 Z- J
  5. /* USER CODE BEGIN 0 */( V( Y. @0 P1 O- W0 D9 P+ v
  6. void Set_PWM_DUTYCYCLE(uint8_t duty_cycle)
    8 Z5 l8 h3 R3 l/ z* _) a. W) `5 r
  7. {
    5 h/ u$ K% ~% g% I4 l% h* e7 O3 v- |
  8.         TIM_OC_InitTypeDef sConfigOC;% x  B% E" M- d) Z# [/ C
  9.   sConfigOC.OCMode = TIM_OCMODE_PWM1;6 _3 z. L' D( O& d+ m5 Q1 {3 N
  10.   sConfigOC.Pulse = duty_cycle;/ A- \, y$ z7 j* K  n  \
  11.   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;9 ]  p  X2 g: \
  12.   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;  H/ d" C# d& Z
  13.   if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
    / t  {$ r8 B( A9 B
  14.   {" Z3 w% S6 D! ^/ {+ Q8 ^
  15.     Error_Handler();9 \4 T  ^! S3 V! J% w, p
  16.   }
    & z! E8 K$ I0 i( K+ T; L( f
  17.   HAL_TIM_MspPostInit(&htim3);8 S+ Z+ c3 F' I
  18.         HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);
    - ~' z, ]3 k8 a8 t4 A
  19. }
    / {1 o" l) V' `4 E; Z/ |( z
  20. /* USER CODE END 0 */
复制代码

" G' {# s8 F% F( W6 z 在debug选项卡中勾上"Reset and Run",编译。烧录
5 y! ~& ~' p5 k3 E; z当你不停按下按钮时,就会看到LED等从暗到亮,从亮到暗变化。
3 a: D# ]& D  _4 P, b6 W9 ?$ f5 [/ ]/ V
20210919215422857.png

) ~/ R$ G) J( E8 ]& a. I* f
$ j3 s' M8 ~5 \* F" U" c4 W& s# E% z. ?/ Y! p4 ?

0 f# T- h8 k5 `- M
收藏 评论0 发布时间:2021-11-9 17:00

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版