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

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

[复制链接]
STMCU小助手 发布时间:2022-7-5 19:28
前言% e. @! A# Q) m& ]" [. J

9 @5 k9 D: H: g+ r8 j: G% E, e) v方波是指占空比一般为50%,PWM波是指可以调节占空比的$ n3 }' a1 s$ k8 P9 }7 p
) I* f: l0 Z* z' B$ Y
一、方波输出  B5 u/ w$ O* g6 e4 Y$ V
1. 原理

5 l% ^3 w6 x' n8 S3 d利用引脚PA11和PA12对应的定时器4通道1/2输出波形5 f8 H* S# r5 Q4 L
! o  {. Y. Y- Y. {$ o
_[789MH)FKQF5YNX}M{O0S7.png
& Y+ A* q8 w2 B. W0 W, A7 J! ^
" h. i& r2 N3 P& \输出比较原理图
. r# l8 d) Y, N. p VM~8AGY${9P~E{$RLB}Q0N0.png ) }( P( O9 i1 l$ l  z/ q# S$ \
( L  U9 \: l: S" T7 F0 n6 N
输出通道有8中模式,这里采用的是比较输出模式(2),即电平翻转模式。当匹配时,引脚状态翻转。步进电机控制常用的模式
) j" d2 H! ?$ b: s% N* [2 ^& }+ n0 p) Z  P# E+ n& _
假设CCR寄存器里面的值设定为100,那么计数器从0开始计数,每隔100次,电平将会翻转一次,这样就通过设定CCR寄存器里面的值就可以输出不同频率的方波
' I: \! T3 _4 A$ f" \( R: n* Z
: N7 a! Q$ k: B0 R: f假设1M作为计数时钟,计一个数需要t=1e-6s, 波的频率 1/[2*( 100*t)] =5khz
3 e/ e# i  k* j: A. \4 Q' d& ]. n& T0 x* m* v
2.STM32CubeMX配置0 S. u# O5 M# e; }, T
(1)配置定时器4的模式和通道
4 v0 O3 f  ]/ n* o3 g* s" I
$ Z- {' L  ^2 c  Z& R0 K" k C{[L4ULN64RY5RJ9[][99@N.png % S) J: `/ k' e* S+ _& |
" s2 L3 K- A# R  f, T: N
(2)配置定时器4计数器的参数和输出比较通道参数,通道模式设置的是电平翻转,比较值设定的是100,每隔100计数,电平翻转一次
0 ?& v5 H; D( m
% p. i$ M' \+ [& w6 A& |9 W W3N]1TOW15XK@8N0XWMAT~L.png
# B# d% N/ L1 k  {1 M5 R$ p/ J
* b* Y8 E& E- v* A(3)配置定时器的输出引脚,输出速率设置为高7 y6 c& \6 g: }

7 m" }! `& b# Y  f CXVCM@)T[KYI[VG8RWCG_JD.png
# F# {; }7 r( C& k' U! B' ?& J! u
+ S% A3 j3 r) U0 o3 o' K(4)配置定时器的中断优先级: K7 I0 v7 f0 I, E9 |" q$ W7 @
, s+ v9 U8 e2 k: W7 A$ I+ G
H%AQ%
XK4OHMRLYTY4RK3.png 0 H  ]5 F5 y6 `+ ]) o

- F8 E/ O3 n! f: H# Q0 [0 B3.部分源码
* b8 }7 H$ L: @
  1. //  方波输出中断: _6 I% m$ a$ K: O, x. o- i
  2. void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)( y# \- ^: [/ h" L# V! e
  3. {
    + d% }5 L% r) }6 D# t+ u  Z
  4.         if(htim->Instance == TIM4)   // 定时器判断4 h% I1 f1 a% M$ H
  5.         {& w: w6 j- ~3 E% j1 E+ U
  6.                 if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)  // 通道1
    ; w) @/ j- m8 p5 U0 c
  7.                 {
    ) Y$ V5 u" `! z- x- {8 ?. a
  8.                         // 每次中断计数器的值加100
      V1 |, ]# t' |
  9.                         __HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_1, (__HAL_TIM_GetCounter(htim)+100)); // 5khz
    0 R; h# B1 k( I3 Y  C8 e* [7 H
  10.                         % ?5 w' m; T( b1 J3 V* \
  11.                 }  T0 i2 f( C' [4 r. R! i4 U( i' g0 _
  12.                 else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)   // 通道21 f; D; p2 C$ {9 J2 f% z! U
  13.                 {
    7 v$ i2 W0 P* W# \% Y/ W' u
  14.                         // 每次中断计数器的值加500& ~9 |( i. x5 [" M; H8 D$ K
  15.                         __HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_2, (__HAL_TIM_GetCounter(htim)+500));/ l% A# F1 [' F( J- p" I# v, f
  16.                 }        
    4 q4 A5 Q" \. _, q! Q7 q  F$ w6 l
  17.         }
    $ M) Y/ n' C* u% S! O
  18. }
复制代码
' x; z7 ]# L* L  g' E( G9 P; \
二、PWM波输出
3 D* h* D& Z" @& s) a* v( N1.原理

9 Z6 w6 K8 B  Q$ [$ i生成PWM波采用的是定时器15的通道1和通道2对应引脚为PA2和PA3
- A/ ^' }; E! k+ F: @+ n
# Q% i* r. F+ W; k' [ QZYZC0@SOJ1%EIF4%C)$_$E.png * Y& q! D- i5 l& W3 n9 d7 K

  a8 L/ Y# U, e9 d0 R输出比较模式选择PWM模式,PWM(脉冲宽度调制)模式可以产生一个由TIMx_ARR寄存器确定频率(周期)、由TIMx_CCRx寄存器确定占空比的PWM信号- w, y0 d  E' }7 p' S4 k, y8 f; R

$ b% s: A2 v% h8 \9 a3 qPWM模式分为PWM1互为PWM27 [1 j: P; [: F6 O/ z, v
, c9 ~4 s4 G  F1 \; t
L7O1RT63Y7WC00`4UPDU{W2.png
5 d9 S, c/ a0 P9 u! g9 q3 _9 ]4 b# ?1 ]; r/ F8 C
在递增计数模式下,计数器从 0 计数到自动重载值( TIMx_ARR 寄存器的内容),然后重新从 0 开始计数并生成计数器上溢事,在中, ARR=999, CCR=300, CNT 从 0 开始计数,当 CNT<CCR 的值 时 , OCxREF 为 有效的 电平 , 比 较中 断寄 存器 CCxIF 置 位 。 当CCR=<CNT<=ARR 时, OCxREF 为无效的电平。然后 CNT 又从 0 开始计数并生成计数器上溢事件,以此循环往复,生成PWM,设置不同的CCR可以调节不同的占空比,设置ARR值可调节周期, n4 X: r( w! }; X

$ y4 e1 r9 y. _0 J: d* n) s5 E若计数时钟为1M,则PWM的频率 = 1 / (1e-3) = 1000hz, 占空比为30%
/ K+ F, B, y9 l- ?' N* ~# Y) ]0 n9 R1 `
2.STM32CubeMX配置
6 b1 r2 D  j$ H$ o  J- b(1)配置定时器15的模式和通道选择
! A$ U( M& F) Z& g: D  @; V7 t* c) g( L7 u. h
@$VT1HK4(TBABFGQ6K5`F2L.png % X/ m& `4 C5 n& b
- K5 T) D& R) Q9 b2 v
(2)配置计数器,pwm生成通道1/2的参数* c4 x( m! A$ v/ @/ ?

! r3 j- u9 S$ c( K9 o9 ^ 5N68B9CKO7)K]_1OUM0[8L9.png
3 }3 z7 ?  Z2 j2 Q2 `% S( R0 r( I/ ]5 g1 x( c5 y4 ?) v
(3)配置定时器15输出引脚,输出频率高即可
2 i. ?# m" P7 O" L& Q
& s  w7 c; O' m6 t$ j( A 8ZB61CX28]FAH4Z@S@4Q{XK.png
1 Z# n4 O8 U* T8 |- ^7 {! I: N9 c% M" x; E7 i. I, k
注:PWM的输出不用中断,所以不用配置中断。
+ c! l2 k' A/ [) N
* @+ l, }! F% v8 Y3.部分源码& g! f, t% }5 ?! ?  |5 K3 i
  1. // 初始化定时器154 T* i3 k' q" @8 X- v
  2.         TIM15_PWM_Init();
    3 }% Q- p- [/ j, y, w
  3.         // 开启PWM通道
    4 N- A# p8 ^4 k! g, e' c
  4.         HAL_TIM_PWM_Start(&htim15,TIM_CHANNEL_1);. m  L6 H2 _8 }8 V1 d
  5.         HAL_TIM_PWM_Start(&htim15,TIM_CHANNEL_2);
复制代码

# L# ~# I! Y9 ?5 Z在while循环前添加这几句即可生成PWM波% V! A9 j+ y7 Z

5 }5 S1 m5 x$ a' s* }0 }9 `. D3 C  R0 a+ x. e+ c7 e
4 V+ H& f6 F& q7 f) t
收藏 评论0 发布时间:2022-7-5 19:28

举报

0个回答

所属标签

相似分享

官网相关资源

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