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

【经验分享】STM32G4之方波和PWM波输出

[复制链接]
STMCU小助手 发布时间:2022-7-5 19:28
前言. \* K( d) d8 u& P5 m% O* Q
0 F# `6 Q( G' R. ], _
方波是指占空比一般为50%,PWM波是指可以调节占空比的
& Q3 q% q2 T1 u9 k( Y% h1 d3 G* e% @
! h# d$ D( l; b) |' h: r一、方波输出( Q# L9 j. L" {4 s( U% g( l: |8 t
1. 原理

- |5 e6 P8 x# z4 E# I* d" t利用引脚PA11和PA12对应的定时器4通道1/2输出波形
7 Z$ }4 E) l0 p) y/ @2 o. G( G  Q2 E$ k0 [3 L
_[789MH)FKQF5YNX}M{O0S7.png 2 L1 R9 W& g1 U$ \+ ^

' |2 M- }  S; ], P输出比较原理图
& t# b" f# D. L7 j# s VM~8AGY${9P~E{$RLB}Q0N0.png
2 T; c0 a# |1 C1 x  S* m% Q$ P
' F6 F: T( u0 |3 e7 V2 V输出通道有8中模式,这里采用的是比较输出模式(2),即电平翻转模式。当匹配时,引脚状态翻转。步进电机控制常用的模式5 q# J! G9 w8 v3 X

/ F. }7 B6 |+ @0 c& f" y7 c假设CCR寄存器里面的值设定为100,那么计数器从0开始计数,每隔100次,电平将会翻转一次,这样就通过设定CCR寄存器里面的值就可以输出不同频率的方波3 X$ M; `6 S3 x6 ?6 H

0 `7 F4 n+ S' O+ _& z- E假设1M作为计数时钟,计一个数需要t=1e-6s, 波的频率 1/[2*( 100*t)] =5khz2 a2 q/ }4 q; G& H6 j7 o( w

* I' \6 |; b$ I& l; w2.STM32CubeMX配置# M( o9 i6 u1 `
(1)配置定时器4的模式和通道1 J8 m1 D2 l( V* C9 x. p* c8 D4 |  P
6 r$ Y7 b& V+ i; N- e4 ]" b( m
C{[L4ULN64RY5RJ9[][99@N.png
/ L% ~1 G8 X. H' b- i* ?1 G5 V( p: O; X+ t1 z  U
(2)配置定时器4计数器的参数和输出比较通道参数,通道模式设置的是电平翻转,比较值设定的是100,每隔100计数,电平翻转一次
1 T5 o: y8 ~, \3 q. `! Q; b5 F: g$ ?5 h. J/ z  t$ _# [3 F4 x
W3N]1TOW15XK@8N0XWMAT~L.png 3 V3 V% o/ p4 ?8 `. `: g8 U$ D

: h3 ?) m5 `7 H( N! B1 c! E(3)配置定时器的输出引脚,输出速率设置为高
' h! q3 P$ L) X' O( {2 z
5 }1 ^6 I. o4 O CXVCM@)T[KYI[VG8RWCG_JD.png
: W0 ~8 A3 M/ U. a5 B$ Q4 l7 [
$ q2 ~. a3 m6 r# j3 c/ A% z(4)配置定时器的中断优先级
6 Y( i- y0 h6 E: x' U- h: N! u% a& Y
H%AQ%
XK4OHMRLYTY4RK3.png
6 s3 W; n. L) E& ~" S$ l5 Z. @% E% m$ S5 E
3.部分源码
& E+ c' Y6 ~3 c$ y7 ?
  1. //  方波输出中断3 a- g: J1 A! z' W+ J! `
  2. void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)% ?1 m: `1 B9 ^: o
  3. {. E6 k' h6 }  M( y6 b( d
  4.         if(htim->Instance == TIM4)   // 定时器判断
    ; N% b  u) W. N' X1 `4 \* Y0 ?
  5.         {7 G! U7 \! e3 e* @; l7 Z
  6.                 if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)  // 通道1
    , v, e; |* g: [, R6 T; c
  7.                 {
    8 I% ~! l9 n' z6 |1 P
  8.                         // 每次中断计数器的值加100! S6 M' v: n) }. o3 F; U) G
  9.                         __HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_1, (__HAL_TIM_GetCounter(htim)+100)); // 5khz9 |& t: B( t" w  b% b
  10.                         
    : }3 z' i) d, T2 Q9 k0 r
  11.                 }  @" M# z  t0 O
  12.                 else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)   // 通道2
    " f4 N; A+ E8 R: J4 g
  13.                 {
    9 C2 ?+ t$ p1 }$ X2 V
  14.                         // 每次中断计数器的值加5008 V3 Z# g5 X' W" r0 @7 l$ T# m. m
  15.                         __HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_2, (__HAL_TIM_GetCounter(htim)+500));
      N" K* U) c8 w
  16.                 }        ! n! y/ d) W: }% d( g  c' a
  17.         }
    ( P- \# |. Q( {  s7 [( y
  18. }
复制代码
3 Z1 z2 q% e- L2 T6 @# f
二、PWM波输出% e4 M0 J+ {& y; f- @7 B$ X) o
1.原理
" X$ ~  I% \9 }
生成PWM波采用的是定时器15的通道1和通道2对应引脚为PA2和PA3
4 P! T) N/ P) }: z3 y
# J, i, x  c9 h3 w8 T; u" L8 E) V QZYZC0@SOJ1%EIF4%C)$_$E.png . C8 a% {' j) b' d/ J
0 |$ Y7 R( v  ~! l' ]* l
输出比较模式选择PWM模式,PWM(脉冲宽度调制)模式可以产生一个由TIMx_ARR寄存器确定频率(周期)、由TIMx_CCRx寄存器确定占空比的PWM信号9 O+ c7 l3 h" l4 H2 W5 G! c# v8 p8 j
# ?/ T' `, |/ m" O7 h6 v
PWM模式分为PWM1互为PWM2: I0 o5 Z: x' x! F

1 z0 k$ S1 _9 g, W L7O1RT63Y7WC00`4UPDU{W2.png ! y/ R0 X0 w, W( i3 s7 X
) Q5 P+ m+ o& P
在递增计数模式下,计数器从 0 计数到自动重载值( TIMx_ARR 寄存器的内容),然后重新从 0 开始计数并生成计数器上溢事,在中, ARR=999, CCR=300, CNT 从 0 开始计数,当 CNT<CCR 的值 时 , OCxREF 为 有效的 电平 , 比 较中 断寄 存器 CCxIF 置 位 。 当CCR=<CNT<=ARR 时, OCxREF 为无效的电平。然后 CNT 又从 0 开始计数并生成计数器上溢事件,以此循环往复,生成PWM,设置不同的CCR可以调节不同的占空比,设置ARR值可调节周期
+ i- f9 d5 h+ }1 z( N& @7 y( ]+ {" n2 W$ {
若计数时钟为1M,则PWM的频率 = 1 / (1e-3) = 1000hz, 占空比为30%
$ f! _0 U6 P% i/ z) S
+ E/ `, q2 y! c) K% j8 P9 |2.STM32CubeMX配置* e/ H+ e7 \; [0 x8 a
(1)配置定时器15的模式和通道选择8 s; ^; Z0 f1 ^4 S) u

4 _, p- n- j' `7 D7 w( c0 H! M! u @$VT1HK4(TBABFGQ6K5`F2L.png : r) U$ n4 r2 G

+ z5 x/ k( D$ ^- G8 n5 z(2)配置计数器,pwm生成通道1/2的参数
9 Z2 Z$ u' a4 _7 |4 {5 ^5 ?1 f) f* y- t! n& Q5 z6 C) @) P' c/ m* U
5N68B9CKO7)K]_1OUM0[8L9.png
; I; a& o( m4 ^5 r' o9 q" G; v& Z
$ `/ Q9 O9 C( D& V1 p* W(3)配置定时器15输出引脚,输出频率高即可" L! L3 i1 T  u* w  y8 i

6 u, v! q; x+ N; j& b 8ZB61CX28]FAH4Z@S@4Q{XK.png
' U; Q0 Z& p0 h: Q6 C0 j- W5 F0 o% M
注:PWM的输出不用中断,所以不用配置中断。
' a: @' Z6 d7 p1 R/ r+ e2 A5 W) |1 |" @# B
3.部分源码& I5 V9 M0 h9 _' C/ Z' G
  1. // 初始化定时器151 o( N& n$ ?4 j6 g2 v2 \4 E
  2.         TIM15_PWM_Init();
    + G5 d% Q8 l: c; t3 }( T
  3.         // 开启PWM通道
    ) L+ F8 s5 s$ Z" d, D! B- L
  4.         HAL_TIM_PWM_Start(&htim15,TIM_CHANNEL_1);! V2 N& D4 f5 b6 m
  5.         HAL_TIM_PWM_Start(&htim15,TIM_CHANNEL_2);
复制代码

8 c  w1 [0 N4 o8 i: g- j2 s在while循环前添加这几句即可生成PWM波
$ z6 C4 g8 q) T* B1 W5 E' a, [; |, A# }6 u$ ]  A
- i! \" t' S! j+ P1 j

/ |+ X* P4 c8 O  I) i5 c  H
赞 收藏 评论0 发布时间:2022-7-5 19:28

举报

0个回答

所属标签

相似技术帖

官网相关资源

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