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

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

[复制链接]
STMCU小助手 发布时间:2021-11-9 17:00
前言4 Y  M3 a% g+ c$ c7 C1 F+ P
在CubeMx中配置PWM,预分频系数和计数的值决定了波形的周期,pulse决定了占空比。
& B) b8 _+ p# W" E2 x7 ^
* ^9 `/ N: J/ a4 TPWM边沿对齐模式(向上计数)
  S; }. j- g4 m' S: M! W& f1 z9 B! X" y& E- Z6 A: }
在PWM模式1下,TIMx_CNT<TIMx_CCRx时,PWM参考信号OCxREF为高,否则为低。
; i9 i! m+ Q/ b6 j) Y  u7 [- ]0 F
. C! j, ?( v. ]! w1 |( V1 P& l! {
20200510155916490.png

6 j. h4 n; W4 F+ m* x! t) b3 O- g( I, O. e" n- V
PWM边沿对齐模式(向下计数)
- p( o6 \8 G4 q) T" v* l4 ~4 Q- _7 N  @5 N8 i
TIMx_CR1中的DIR为1时,执行向下计数。在PWM模式1时,TIMx_CNT>TIMx_CCRx时OCxREF为低,否则为高。* z- n" z, }$ T* v, I

% x  ]  q- n; ^* a! L$ ?PWM模式1与PWM模式2区别; n$ ~8 c) N8 O+ f- [5 Q4 ?% ?+ R
PWM模式1
5 f/ K. R! d9 T2 m( K' I. T% A$ q/ C$ n" J1 @- L! z: _
在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平% ?, D" Z0 ?  H- P& u6 A9 n

+ u9 Q: ~, N# E. E* \在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效 电平(OC1REF=1)。0 R2 _3 N1 K7 B7 `- b% q+ h
9 h$ F# p. c, w
PWM模式26 H: d' F% S: f9 m. v# r! D

9 ?/ W  v. X( e  W4 y0 D在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平
; L  Y/ _# ^2 y" [7 v" T
( g7 M$ q7 |$ C2 o# w% ?在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。
# {. d! y" x, W% w3 `
3 Y# N2 n/ G. `3 N6 x0 r8 B& P+ V3 J* L4 Y+ ^  ~& R4 R4 `
有效电平和无效电平由CCER这个寄存器的CCxP来决定6 A" a* F( b/ ?

; a) k: e( R! R& P" yCC1P:输入/捕获1输出极性(Capture/Compare 1 output polarity)  
& b7 q7 c7 }3 o1 [4 [( L8 P# m5 T- k
配置为输出:0:OCx高电平有效   1:OCx低电平有效 ( Z2 s8 c9 r; g" T& a2 f

2 P- \- V. N# l/ o5 B$ V实验步骤
  |& w( D0 i; V- L) q" x生成一个10ms周期的PWM波形,占空比从10~100.。* q3 [. [% W, ?1 P% |$ S3 V
; ?" g" O9 X; O
CubeMx生成芯片工程,配置SWD调试接口,HSE使用"Crystal/Ceramic Resonator"& E5 w6 D$ R0 R
PA0引脚配置为GPIO_EXTI0(配置EXTI中断)9 g' C  \* M# @7 c

& L+ ~/ |* s" N* ?
20200510162747723.png

, q, q! o5 M6 e3 m& U! L* f7 R2 s5 `$ E, b" x
20200510162930572.png
& R9 {  `: Q$ }9 Y5 ~2 {% U

; D! r) {3 H' H. w# _1 J* d0 mPB1引脚配置为TIM3_CH4,在TIM3视图中Clock Source 选择"Internal Clock",Channel4选择"PWM Generation CH4"  \- I+ r( j: [! G. M  f8 i% R
预分频系数填6400-1,计数值填100-1。(计算方法)7 w( Z1 a* Z% ?9 W3 q# H

- r; p2 U7 Q4 I* K7 A; }4 q
20200510163616257.png
- p3 e- Q* C1 ?' w$ p
- L0 S% u5 d' V7 P5 x! {
在工程项目栏中填入项目名称、路径、版本
( \& z% k+ d9 m8 G+ w( U' F$ R在代码生成中选择自己需要的选项,最后生成代码  t' a) f% b6 U* d: ~) Y5 x* E+ @

/ M( U: ^' k; e5 Q( O, ?2 d
20200510163959114.png

% Q, X% y& E5 j: G- K. L4 l
& o* ^5 I9 ?2 {在int main函数里面添加pwm初始化代码
0 B7 Z+ ^) P. \8 U5 m  u5 ^
  1.   /* USER CODE BEGIN 2 */
    9 K  m9 m6 w6 y9 E0 Z5 x7 o- u
  2.         HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);+ k  Z0 ]" N) }3 `  K; m( _: q
  3.   /* USER CODE END 2 */
复制代码

8 m3 k0 Y. ?5 r/ T: N6 O' c2 C  在int main() { }后面添加EXTI上升沿中断回调函数- Z& ^1 e5 h7 W9 |0 z- Q
  1. /* USER CODE BEGIN 4 */
    # R: V( j% F. p, G% c7 W
  2. void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)
    9 o+ |, V& R. h7 O# l4 D) |
  3. {  p. [" }6 t# ]8 g$ f! S
  4.   /* Prevent unused argument(s) compilation warning */& E1 d# q$ R( r) ?6 t4 W, \8 a
  5.   UNUSED(GPIO_Pin);9 K7 M' c% B. j/ m/ h% q% s
  6.         HAL_Delay(20);. O1 W4 k! _* O+ W! ^* h6 o) w
  7.   if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_SET)
    ( [% u* E- q' z0 B$ M! y7 U6 k
  8.   {8 e, ?  Q. t: B5 ^6 k
  9.     if(duty_cycle==0); l; O# E6 i5 S  L/ \6 R% E
  10.       duty_cycle+=10;5 F  e; q& D2 o" y& q) ^; N
  11.     if(duty_cycle==100)
    1 }) }5 H% s% ~/ D7 t* @0 r3 V9 t
  12.       duty_cycle=-10;
    . z0 g/ s6 t. S4 R
  13.     Set_PWM_DUTYCYCLE(duty_cycle);
    9 k* v$ T! Y0 g  U* Q3 T% y
  14.     duty_cycle+=duty_cycle;
      R0 Z' `$ F4 E7 T
  15.   }$ r# A1 `$ {/ I7 A- V% }: S, A
  16. }
    + W  c) ^! }; j" O6 n
  17. /* USER CODE END 4 */
复制代码
% q6 z5 r) r9 g+ F5 R
在int main() { }前面添加自定义改变PWM参数的函数
- \  ?3 {% N/ Q8 r3 i
  1. /* USER CODE BEGIN PV */
    0 D+ k1 x- q- }
  2. uint8_t duty_cycle=0;
    6 I2 `# S1 z$ j. u6 @/ E# z* e% G3 U
  3. /* USER CODE END PV */
    % r! _8 B* v9 Y' t) x

  4. ) U! h% E! M7 W. t. a8 |
  5. /* USER CODE BEGIN 0 */& ]2 y  V! F: T" D7 |2 w
  6. void Set_PWM_DUTYCYCLE(uint8_t duty_cycle)1 R$ N! U, L" D6 t- u' y- O
  7. {+ ~& W" ^  r( G# h. X
  8.         TIM_OC_InitTypeDef sConfigOC;
      C. b' S, k* M/ b9 H. ~
  9.   sConfigOC.OCMode = TIM_OCMODE_PWM1;& r- X. _0 U: ^4 J2 h  z+ Z; |+ N
  10.   sConfigOC.Pulse = duty_cycle;$ C; F# S% Y: B0 i* t& T. ?. O
  11.   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;% {0 {+ ^. X" u# L; S9 h; s
  12.   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;+ X' Q* }; O: F
  13.   if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
    1 \6 {1 r& m; P& g& c; R
  14.   {
    6 V4 F7 L* Q& ?0 K) Q- T, o9 |
  15.     Error_Handler();
    , h1 `$ d# a6 B& d
  16.   }
    ' F/ q" y& F. [. C$ B
  17.   HAL_TIM_MspPostInit(&htim3);1 y/ Z/ F$ V8 V0 \9 M
  18.         HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);8 T+ ]) Q( D. ?% D' Q) X% d8 Z" D* Y6 d
  19. }5 ~/ |1 t$ H$ j2 n
  20. /* USER CODE END 0 */
复制代码
$ L0 G' e6 L" E: e. R
在debug选项卡中勾上"Reset and Run",编译。烧录4 a  h2 g6 M/ r' X1 X$ Z* S! Y
当你不停按下按钮时,就会看到LED等从暗到亮,从亮到暗变化。
3 k3 a; ]4 N5 h6 m) L8 b
; e, _6 g$ }2 s4 B1 ]% m! J, a
20210919215422857.png
6 _2 |5 R( _% J* F" `

6 a' B" W& v0 X2 ~8 _. r0 F3 O; M3 m! R: N

: ?1 C3 C6 K5 @/ l3 x) E) ^) k" P
收藏 评论0 发布时间:2021-11-9 17:00

举报

0个回答

所属标签

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