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

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

[复制链接]
STMCU小助手 发布时间:2021-11-9 17:00
前言
; I: L; ^! G6 Q& V0 f1 k) M在CubeMx中配置PWM,预分频系数和计数的值决定了波形的周期,pulse决定了占空比。
1 m2 R  g% u5 ?; f# u0 b
) P% J# S% C" \) e6 B% V1 VPWM边沿对齐模式(向上计数)
/ Y! U9 n$ Z3 d: j: z' L7 c% [# \& v6 t  z& G6 P
在PWM模式1下,TIMx_CNT<TIMx_CCRx时,PWM参考信号OCxREF为高,否则为低。) ^6 ^& o6 |$ K& O2 w
8 W4 T" F; t6 l% W: h
20200510155916490.png
# ^7 E' e( d9 s0 q5 I9 s

( g# H" W0 p3 b" g3 H4 v. |PWM边沿对齐模式(向下计数)
/ ^3 @; q% X! r! G* g: Z! w7 b# z
8 h# S7 H/ B6 R' ]' n# hTIMx_CR1中的DIR为1时,执行向下计数。在PWM模式1时,TIMx_CNT>TIMx_CCRx时OCxREF为低,否则为高。+ r' t% B: y6 X: K4 A7 J) ]+ u

$ ]# I0 {4 K; ]+ cPWM模式1与PWM模式2区别1 p0 _: z) A2 o0 H$ @
PWM模式1  |5 ]: z0 X7 r  J1 U( P2 c% v

/ O( s- U  A7 p; `1 Y; N在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平
* H$ f$ P( [2 |8 M
# r, [% w5 F+ \" k1 b在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效 电平(OC1REF=1)。/ R! ]' |* G; S. q0 u. C

& d5 K5 \1 D# cPWM模式29 U# G8 m9 y5 Y/ _! i0 R$ L

- i" q$ T: E. E, K在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平
/ d# L: F' g7 o+ T3 x8 l" ]3 p  P$ p
在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。
! J1 M5 J* m" X! x9 N( J- P! C" p$ j/ X" f  N+ X
8 h" }% _4 `- L3 m2 f
有效电平和无效电平由CCER这个寄存器的CCxP来决定$ H; R' N0 t" i/ y8 {8 M. w" B& m3 T

' \0 C6 }% s9 O/ M0 yCC1P:输入/捕获1输出极性(Capture/Compare 1 output polarity)  ( i/ d. U5 \- `& \9 ~3 y; ^, C. i  k

6 o8 b9 u" T. Q" x$ l% b! O; ~( f配置为输出:0:OCx高电平有效   1:OCx低电平有效 6 Z4 }( M1 l- g8 }5 E
8 E" l% y4 z4 l  k
实验步骤' L1 Z7 F5 `) X/ ^: Y+ s0 s/ f% F9 d
生成一个10ms周期的PWM波形,占空比从10~100.。( J, |5 J- A4 \9 |. F! K; [/ V

; t8 G! |6 ^, L4 ?CubeMx生成芯片工程,配置SWD调试接口,HSE使用"Crystal/Ceramic Resonator"; u' e5 f) S7 }( y- Y" v" R
PA0引脚配置为GPIO_EXTI0(配置EXTI中断)1 M( H/ e: \* [2 e' X# X7 R
- F: u/ X6 V( `; R, [+ M. K8 f/ p
20200510162747723.png
$ D7 T- U2 v. ^6 {+ a2 S% W
/ k7 X/ Y5 ]1 z
20200510162930572.png
3 h& G/ X$ @( v, n, ]7 t/ w/ `
9 W, b! ?! N8 e3 o7 x' S* [
PB1引脚配置为TIM3_CH4,在TIM3视图中Clock Source 选择"Internal Clock",Channel4选择"PWM Generation CH4"
! {3 [( f% d; a; W 预分频系数填6400-1,计数值填100-1。(计算方法)
6 b, d( n4 n8 [; i+ \1 c6 |$ r4 e6 t
20200510163616257.png

% U. Z7 Z1 t* Q' X3 a0 W: d
9 M, S) Z/ J1 P3 ?) U$ c 在工程项目栏中填入项目名称、路径、版本
6 C5 k8 l( N9 V; J0 T在代码生成中选择自己需要的选项,最后生成代码
. r8 v' T9 H5 S- L4 b6 X& K. _; G: j' q
20200510163959114.png
8 S  m- ]& J( g7 s% a2 X

2 v2 Y7 i7 K6 U0 S* l在int main函数里面添加pwm初始化代码
" B2 |! w5 ^8 [' O* ~- V. r0 {/ O
  1.   /* USER CODE BEGIN 2 */# p' {' L2 ]0 P' G8 v! O
  2.         HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);
    : }, k( ^8 n' p$ b( j3 G4 \% a
  3.   /* USER CODE END 2 */
复制代码
& W+ P, ^8 l# v; u% h% a( x
  在int main() { }后面添加EXTI上升沿中断回调函数
$ b5 n( o& l5 z2 e# S: w! t* G
  1. /* USER CODE BEGIN 4 */
    ! y4 O( o/ V$ H4 t# g
  2. void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)
    $ h) u- M9 u4 K3 X4 `9 }4 {
  3. {7 T" l9 w- {, T
  4.   /* Prevent unused argument(s) compilation warning */( w4 [! p/ j+ R! A2 m0 X
  5.   UNUSED(GPIO_Pin);
    ' s  n! @( D/ f( ]
  6.         HAL_Delay(20);- V. J" b0 d& h
  7.   if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_SET)
    7 x0 W/ J4 p6 B9 P& e# n
  8.   {2 {& R! f/ H$ ]+ U4 w9 ?
  9.     if(duty_cycle==0)
    " C+ A/ ?# q: |
  10.       duty_cycle+=10;; R2 N  p$ }* q9 Y" d9 C, Q. r3 w
  11.     if(duty_cycle==100)
    3 r" s6 m( O/ s- o
  12.       duty_cycle=-10;0 w  Z6 v$ ^3 y4 i# E7 h
  13.     Set_PWM_DUTYCYCLE(duty_cycle);7 i- x: g! K+ i" K4 s
  14.     duty_cycle+=duty_cycle;5 ]) K7 Q2 o) s+ d
  15.   }
    9 ?; H1 X; S2 d6 b; X8 n
  16. }7 l& L$ Z: g4 i/ r: k" O" T) z
  17. /* USER CODE END 4 */
复制代码

4 [* q' u2 H& z) I( {9 C在int main() { }前面添加自定义改变PWM参数的函数
0 P& j1 w3 w4 f/ T
  1. /* USER CODE BEGIN PV */- P# J1 |8 T8 l5 @1 K- S: i
  2. uint8_t duty_cycle=0;
    , C4 V1 L; e; z/ [2 M
  3. /* USER CODE END PV */
    0 x, m* Y' W9 S9 i% D! W
  4. % [- Q) d+ F; J4 o% a, K* `
  5. /* USER CODE BEGIN 0 */7 s# r/ [- J" h& N% A3 f
  6. void Set_PWM_DUTYCYCLE(uint8_t duty_cycle)- Z1 K) |2 D. N6 d! d
  7. {6 D* J  \: f0 c- D* b( |5 d
  8.         TIM_OC_InitTypeDef sConfigOC;
    % Q4 E$ V+ [' ?$ c9 p! ~! o. u
  9.   sConfigOC.OCMode = TIM_OCMODE_PWM1;+ Z1 H( b, a( n
  10.   sConfigOC.Pulse = duty_cycle;
    ' C7 c% V' _3 x. R4 A4 }
  11.   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;) a, Q4 Q7 G2 P+ }0 U# M
  12.   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    ; ]& Q, L+ p$ A5 I3 Z1 Z
  13.   if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
    6 V  {; V* m, y  Z7 e$ C' Q
  14.   {
    # T+ e4 e; n' ]2 h% E6 G7 Q9 A
  15.     Error_Handler();
    ) x& ]6 O0 @* w! C$ ~( P3 p
  16.   }
    / t6 _/ B- q! \$ D3 H
  17.   HAL_TIM_MspPostInit(&htim3);
    " R6 P: a2 k0 n5 s4 h3 K
  18.         HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);
    / C3 O+ f+ u3 e( |6 H
  19. }  T- K! t4 U! x9 t; I- R
  20. /* USER CODE END 0 */
复制代码

# ?1 Q% O, `, b* U2 ^ 在debug选项卡中勾上"Reset and Run",编译。烧录
2 n/ n2 a+ a& b. K; {8 k1 Y当你不停按下按钮时,就会看到LED等从暗到亮,从亮到暗变化。
4 }! K" r6 x1 |( a, [0 U* m+ E% r/ ]' y' @# x" y$ u  t
20210919215422857.png

$ @! }9 o! q3 R( k4 z+ c7 ~& X/ }
2 f" F/ D1 h, v( Y
  i7 v- Y- Y8 ~3 ?2 H/ [, P
赞 收藏 评论0 发布时间:2021-11-9 17:00

举报

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