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

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

[复制链接]
STMCU小助手 发布时间:2022-7-5 19:28
前言
6 l& D" t  l* S; Z# H( k
- \* R/ v" O0 S! [0 w+ k3 H7 c5 a方波是指占空比一般为50%,PWM波是指可以调节占空比的
) d1 C/ p' l) ^2 j, M3 [
( ~4 A# J' m: h; n一、方波输出, o& p1 I, u) ?1 c) K
1. 原理

4 C& W, i0 f# _1 K/ y" ?. _利用引脚PA11和PA12对应的定时器4通道1/2输出波形4 n* J& d  r/ a8 A* n+ j# I$ Y

$ J& x& b$ N0 d _[789MH)FKQF5YNX}M{O0S7.png " Y6 d. J; f$ V# G
5 J0 r3 k2 c4 \3 k& c
输出比较原理图1 W# H/ A& y+ M( k# z5 t
VM~8AGY${9P~E{$RLB}Q0N0.png - \' `- x  o* d9 @& P; C- w
3 v9 _- D! W. N6 a2 c
输出通道有8中模式,这里采用的是比较输出模式(2),即电平翻转模式。当匹配时,引脚状态翻转。步进电机控制常用的模式- b, R1 _  a7 W* g: o+ v* o' X

, l1 ^& D3 f, T% q4 y5 C# d假设CCR寄存器里面的值设定为100,那么计数器从0开始计数,每隔100次,电平将会翻转一次,这样就通过设定CCR寄存器里面的值就可以输出不同频率的方波- n* j8 A" Z0 A& E
) P7 i  M4 }3 \3 @% ^
假设1M作为计数时钟,计一个数需要t=1e-6s, 波的频率 1/[2*( 100*t)] =5khz
$ O8 Z# a- Z8 G
: Y) c" n/ x. P9 l2.STM32CubeMX配置+ K5 e" G  F9 \
(1)配置定时器4的模式和通道! @0 p2 v. k, C. V
, s8 R* N: O0 N! q8 M" s
C{[L4ULN64RY5RJ9[][99@N.png   S! H5 D$ L5 Z: v; t( g

. u* x, k6 n- _" h2 o(2)配置定时器4计数器的参数和输出比较通道参数,通道模式设置的是电平翻转,比较值设定的是100,每隔100计数,电平翻转一次' U" v. L: ]. _% H) t
+ t" ?) Z; @; `# W: J" P  G# Q( U" `9 B; p
W3N]1TOW15XK@8N0XWMAT~L.png * a  W) z( D7 c( D( ^

$ |% }" i+ w( h, `6 k( q+ |6 L4 l, J(3)配置定时器的输出引脚,输出速率设置为高6 W* A' b: e: |+ _, |% W1 s; B
6 {4 ~: |8 U& H+ ^
CXVCM@)T[KYI[VG8RWCG_JD.png
* }$ k% `* h' @# E  K% h
) @+ K8 @* X7 Y, b' B/ |# @0 G' Z(4)配置定时器的中断优先级8 _) l( e' R+ ^5 d0 V6 k& R8 Y* T
9 n, t# [# P. c7 E
H%AQ%
XK4OHMRLYTY4RK3.png
  T$ H. ]" w4 S6 ~, W. Y* P) ]
- l& M3 y% ]6 g. N: }8 d& o% \3.部分源码
& Z7 A- \( a' u
  1. //  方波输出中断
    - H, s' ^' g0 f- n! B' ^: i
  2. void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)/ R- G8 `; p! B% F2 x
  3. {# |* H' h+ i% @. i) |* \
  4.         if(htim->Instance == TIM4)   // 定时器判断& |: ]$ p$ b) Y+ d
  5.         {$ L' B% @: r) J$ C+ x3 x
  6.                 if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)  // 通道1" ^+ R' C1 [) Q0 D
  7.                 {
    2 ^6 d/ k8 q! N% }0 J& K# B
  8.                         // 每次中断计数器的值加100
    ; `! r. P7 Y9 x) p8 P- Y  D
  9.                         __HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_1, (__HAL_TIM_GetCounter(htim)+100)); // 5khz
      l: e; ]! l2 N: q
  10.                         " n% |& Z* F6 H; E) {. ~
  11.                 }5 x' F5 W) r. J6 x
  12.                 else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)   // 通道2
    ' E& ]6 E( t0 p; A4 A( e! V$ q
  13.                 {- `( {! T& t, L" b- U
  14.                         // 每次中断计数器的值加500! w4 x& v0 i: I
  15.                         __HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_2, (__HAL_TIM_GetCounter(htim)+500));
    ; V4 l  L0 B/ K" e# x- z) x
  16.                 }        
    - m1 n/ w1 w0 S# z
  17.         }
    ' o3 \( ~) B) W
  18. }
复制代码
/ k5 Y0 R9 m. N
二、PWM波输出9 Z$ R  L, `- I+ a+ O
1.原理
' c7 ]8 `9 d1 J+ D3 k: w0 [3 F; C
生成PWM波采用的是定时器15的通道1和通道2对应引脚为PA2和PA3; u; X3 T: x/ t8 r  \( V/ }

- ^4 G+ _. A: [ QZYZC0@SOJ1%EIF4%C)$_$E.png
2 u) R. K- n- J) q9 i% M% c' k  W. B5 p
输出比较模式选择PWM模式,PWM(脉冲宽度调制)模式可以产生一个由TIMx_ARR寄存器确定频率(周期)、由TIMx_CCRx寄存器确定占空比的PWM信号
1 d# f1 B0 V6 s; B' E  c( G. L" g0 f; T, g! ~; S
PWM模式分为PWM1互为PWM2
- v2 J* B) l5 J: A
$ @* Y( ?6 S' s; m3 N1 D( n2 \" u L7O1RT63Y7WC00`4UPDU{W2.png
- g( u# V6 Z$ T& ^/ A/ G! Q. D. V' W9 S) U* _8 u6 L
在递增计数模式下,计数器从 0 计数到自动重载值( TIMx_ARR 寄存器的内容),然后重新从 0 开始计数并生成计数器上溢事,在中, ARR=999, CCR=300, CNT 从 0 开始计数,当 CNT<CCR 的值 时 , OCxREF 为 有效的 电平 , 比 较中 断寄 存器 CCxIF 置 位 。 当CCR=<CNT<=ARR 时, OCxREF 为无效的电平。然后 CNT 又从 0 开始计数并生成计数器上溢事件,以此循环往复,生成PWM,设置不同的CCR可以调节不同的占空比,设置ARR值可调节周期3 @  j, @) v' M1 \: p2 p

6 `2 @6 ~; U. v, E若计数时钟为1M,则PWM的频率 = 1 / (1e-3) = 1000hz, 占空比为30%' Y- q0 |; F2 m7 d

) s. ?% ?/ G" c+ D) Z3 ]2 A1 A2.STM32CubeMX配置
0 L8 U* R" L4 e+ y(1)配置定时器15的模式和通道选择
* g! O$ l. Y1 _( m* f
7 D/ b: @6 V7 K2 o( k2 p% _ @$VT1HK4(TBABFGQ6K5`F2L.png 7 L* k9 k" s% F: N- I2 T
9 P4 P# y- }  i( A! D( a" }( g
(2)配置计数器,pwm生成通道1/2的参数
+ M' o: D" z4 Y  w8 V8 r5 O; b; W  I7 n( w0 |3 `; F2 n3 }2 V- N
5N68B9CKO7)K]_1OUM0[8L9.png ) \) A- }: m# V8 n. m( o
  K$ W4 P7 h5 Z9 _" ?% _
(3)配置定时器15输出引脚,输出频率高即可
/ g3 E8 J- J, \; J/ B# {, f1 n. u3 u2 Z& w6 K' I
8ZB61CX28]FAH4Z@S@4Q{XK.png
3 e0 Y- u2 `" s- \. p# ]  X
# |4 K5 q  j# O2 N注:PWM的输出不用中断,所以不用配置中断。
8 @) x8 \5 B$ `$ ~& ~5 A( \( z0 U$ E$ b7 B0 D& G0 Y: @
3.部分源码
2 O4 j9 }( j5 H! k! Z, D9 g% l
  1. // 初始化定时器155 }6 h, v8 `3 K# S$ `: n6 W
  2.         TIM15_PWM_Init();! b$ M2 G4 b- {7 ^' c
  3.         // 开启PWM通道
    2 i( n' {, Y; t
  4.         HAL_TIM_PWM_Start(&htim15,TIM_CHANNEL_1);. e% j" {; S4 h- N
  5.         HAL_TIM_PWM_Start(&htim15,TIM_CHANNEL_2);
复制代码

! h* L2 g, q  w' k& U在while循环前添加这几句即可生成PWM波4 V6 h9 l, l/ c% l

, a/ w" V9 l: r2 A2 |! E3 n& h6 u" C
/ }% a9 T/ \5 j1 y- k1 ^" c+ o" ?( }# X' ^" ^
赞 收藏 评论0 发布时间:2022-7-5 19:28

举报

0个回答

所属标签

相似技术帖

官网相关资源

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