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

【经验分享】STM32G4之测量两路PWM频率和占空比

[复制链接]
STMCU小助手 发布时间:2022-7-5 19:35
前言7 q( }9 o* _! L' Y: ]( C

6 f% D' y, _2 G/ H  r. |一、测量PWM频率和占空比原理
' P7 w, Y- C7 @$ E; u
STM32G4上有两个信号发生器,接入引脚PA15和PB4用于生成PWM波
( q2 [6 x9 M8 m1 |( o2 Y1 W( e
; k6 b* u: c- Q& p YYP$HL)W@C[{G(N%L`2WCLB.png / R* a9 f6 s! J$ |8 T5 E

- ]1 s, F1 n( t5 @! s0 W3 b使用的是定时器2的通道1和定时器3的通道11 k& N! z- {$ h7 {* S! @* @
1 K' I  o/ V+ f+ L7 J- k
4e4ff4929a424bea978471a19cc4b147.png . [6 c( M/ W" e

) G7 @( j% q9 O4 `* R测量占空比和频率使用 PWM 输入模式,该模式是输入捕获的特例,使用通道 1 和通道 2。== PWM 输入模式需要占用两个捕获寄存器==: s7 N1 u1 M8 U, t' i
6(X_Y`0ICN{A1)[AY5TWWHV.png 0 g7 I8 A" }8 B2 m' T! {

# k1 O+ Z! `2 V7 c6 h当使用 PWM 输入模式的时候,因为一个输入通道(TIx)会占用两个捕获通道(ICx),所以一个定时器在使用 PWM 输入的时候最多只能使用两个输入通道(TIx),PWM 信号由输入通道 TI1 进入,因为是 PWM 输入模式的缘故,信号会被分为两路,一路是 TI1FP1,另外一路是 TI2FP2,一路是周期,另一路是占空比
5 K# F' I) Q2 f  I/ G. X, M$ ~# _! |" h( z# u6 {) ~
4HX4P13D(ICDX0[~P{Y~6LH.png
7 R1 ^5 m! t2 K6 F" E. _4 b8 F$ l0 |5 }6 }& M' P) Y8 }/ u  I
定时器从模式选择复位Reset模式: 使用内部时钟作为时钟源,TI1/2外部有效信号复位计数器。CH1触发输入上升沿有效时,先将计算器的值,移动到CCR比较寄存器中,然后计数器复位到默认值0(注意事件发生的顺序)
: o+ X1 L4 D/ H* K6 }! t" c. e6 a$ T+ H7 \/ D
V1ZJ%HKF}{N~URU]Y2R3SZ7.png 9 U+ E5 o  r, T# ^' [% M. u5 D
) S) Y9 o( g- e% Z5 p
所以,当PWM信号由TI1进入**,配置TI1FP1为触发信号,上升沿捕获**,当上升沿的时候IC1,先将计算器的值移动到CCR中,然后计数器CNT清零,到了下降沿的时候,IC2捕获,此时计数器CNT的值被锁存到捕获寄存器CCR2中;到了下一个上升沿的时候,IC1捕获,计数器CNT的值被锁存到捕获寄存器CCR1中,然后又恢复到0, 其中CCR2测量的是脉宽,CCR1测量的是周期所以,占空比 = CCR2 / CCR1
- W5 `. }) Y- }  x9 p" Y! x! H  z1 s9 {2 t" i
详细原理:输入捕获原理# j9 a0 v( |% h

5 A, [9 J( t* {# l3 h所以,通道1设置为上升沿捕获,通道2设置为下降沿捕获
1 V+ b* @3 M& J& d( e7 @* Z# O; x: m(其实通道2也可以设置为上升沿捕获,见参考文章)
4 C! b2 L2 k5 }3 Z: v, s! D
5 r) n; p! I; P. g1Mhz计数cnt到65535需要的时间为0.065536s,因为两个上升沿之间的时间间隔最大为0.0014s(fmax=22.4khz),在这个时间段内,Cnt不能溢出,所以,直接记录捕获比较寄存器的数值即可计算频率,无需考虑溢出问题,也不用自动重装载
9 [# x! w3 j. W8 j/ s
4 a  e$ s2 N, }9 a0 i1 l二、STM32CubeMX配置8 s+ q8 \! k( O! S# Q2 ^
(1)配置定时器2 / 3的模式,时钟来源,触发源,使能通道1/2
6 N' w, s$ H# _! G' ]! q! f$ L0 S2 C& e
UJ4}N]1JKU[2}5A(M6490I0.png
6 k; t. i% V6 b. \: e; e8 H4 H3 g2 P
7 v% ^( ?( B6 k, F/ M! w4 f(2)配置计数器,通道1/2的基本参数
& O9 H2 H& [0 n( @
& Q( {4 A/ P  |6 O `PZ~7D2%WH_%C]QV%(TT_5A.png & z% ?  j  ]3 b  P' k* l+ u# i
% ^4 w1 P" i  H' t4 x
(3)定时器引脚配置
& X1 _" B( z9 J6 h* h. W% x  U+ J( k  G4 l1 x
4a411c27fef7444dac5087888deb2cda.png
: }: {& f' H3 \* P* r
; |$ Z3 l& O. e+ T9 A3 X" @& F(4)定时器中断优先级配置* `! L' y$ y1 K9 Z

% L# n0 y, d9 E4 t# B, ~% ~ ]Y}]RVI8(A@VI@TDTI`E(O1.png
5 D# {" U: d  F4 n2 K8 g& j3 n: J. m( [
三、部分源码1 {; p" O+ Q9 s
  1. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)# J4 q+ q# b' c* v8 V% b4 W; S
  2. {; N7 Z) k) \; B+ f; X
  3.         if(htim->Instance == TIM3)   // 定时器判断
    , e" v8 k/ U; G! |4 r
  4.         {( ~+ O0 h, X" n; D
  5.                 if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)  // 通道1
    7 F9 ^2 U+ b! e! V  F: x! ]7 }: ~
  6.                 {
    - K$ x6 A! v( G4 ?8 f& L* Q% @
  7.                         PWM1_T_Count = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1)+1;  // f = 1e6/PWM1_T_Count
    ( s9 l" N/ A' I$ b2 |
  8.                         PWM1_Duty = (float)PWM1_D_Count / PWM1_T_Count;  // 占空比& X* Z# E! o) ~$ e" v' e
  9.                 }
    ! w; ^- U2 w4 v8 b/ y4 ^& }
  10.                 else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)   // 通道2
    . x' e6 }! P# X
  11.                 {
    - `( |' Z; F, [8 U# n! M/ V
  12.                         PWM1_D_Count = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2)+1;' l  n$ V8 X; |# Z2 t: @
  13.                 }        ) p" _: j( s: ]' R
  14.         }% j: }) }! J3 L" m* N8 s" \
  15.         / G  e8 b! Q- O
  16.         & k$ S( h8 @0 O% [$ ]
  17.         if(htim->Instance == TIM2)8 x$ P4 B+ {+ w0 c2 `, a
  18.         {
    ) Q0 F8 ^0 H' ]# b  T
  19.                 if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
    3 f' E1 K; B+ i' i
  20.                 {
    / S( \, C5 a% R
  21.                         PWM2_T_Count = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1)+1;; y$ a- F4 ~1 o9 c
  22.                         PWM2_Duty = (float)PWM2_D_Count / PWM1_T_Count ;   // 占空比
    , J% y1 C& Q+ A/ N5 Y
  23.                 }, T, ]( j9 @& y
  24.                 else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)   // 通道2
    8 @# h  I" ~# x) h' u
  25.                 {
    ) R5 ^; k' L* w
  26.                         PWM2_D_Count = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2)+1;. M0 l8 D3 J0 L. }, C0 a
  27.                 }        ( `+ ?& W( i' w3 P9 H) C
  28.         }! q% [, p+ w1 Q5 u
  29. }
    6 N* j0 R, w: E* E- h
复制代码
  ]( L, S7 {; C# y+ b# q
测得结果:" j3 @9 O1 y6 i3 t- R9 H5 _& x

& t4 a2 I* H8 ZPWM1 output = 710hz-22.4khz PB44 T; A8 w5 K% Q/ O2 }. c
PWM2 output = 630hz-22.0khz PA15
" `# C$ r6 C) {9 {Tmax = 0.001410437235543s 最长周期
  ?% Q$ K2 ?8 D7 q$ G/ w. s% Q3 ~: l$ L
6 S7 [" l; m* Y  _7 ^  m3 w5 P
: @) s7 H# E+ v4 K
赞 收藏 评论0 发布时间:2022-7-5 19:35

举报

0个回答

所属标签

相似技术帖

官网相关资源

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