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

【经验分享】STM32F103单片机输出相位可调PWM波

[复制链接]
STMCU小助手 发布时间:2022-3-22 13:00
    STM32定时器功能如下
( g9 k( e6 y- ?/ F/ b( }  @+ u- Z" e3 A: X! x$ j
52$J_79[6$$(RR7JO[WOOTL.png
# l5 \; d. g# V) y% c) \% [0 c# ^
通常使用的是PWM模式,可以通过PWM功能可以生成频率和占空比可调的方波信号,有时候需要生成初始相位可调的方波,PWM功能就就不能满足要求了。可以通过输出比较模式来实现。/ P, U. P7 C) L/ d: N6 V! `
5 s7 ?4 p. e  N
HN%AV0YN~2M)LNJIE)%O_(Q.png ! J; J2 w& o, \4 C$ T& a  f
5 ], t7 a$ a* r2 i! D9 C9 K
输出比较模式是将计数器CNT的值和捕获比较寄存器CCR的对比,当CNT值等于CCR的值时,翻转输出电平。5 B  r  ~1 v( A9 n* x' i* @$ i

" D' D, k* r2 d" C! v" J J](5%US0ANS_5{9_O%Y@X8V.png
; ^# ?9 G5 Z. D% q1 E7 q: V
  X$ ^0 f( r- m+ T2 x+ p/ V通过捕获比较寄存器CCMR模式设置位的描述可以看出,输出比较模式只有当 CCR = CNT时,输出电平才会翻转。而PWM模式下 CNT < CCR 时输出一个电平,CNT > CCR时输出相反的电平。2 W- t% S. h+ q6 [# ~$ P  ~4 @& j/ k

4 v2 D# n& S8 p/ C5 [! e, R. h: B通过一个示意图来看看PWM输出模式/ J$ x2 V( F8 p5 o7 k0 m# p' T( \

+ z* Y3 e' D& \8 b$ |, @; ^, j G%`VCHPTCNWR3V83]P}Q$]1.png % k+ V( C0 X. P3 Y7 X

. }# S9 `% F/ Y4 E3 S% T上图中是PWM输出的示意图,可以看出CNT的值从变化范围是 0---ARR,之间,CNT的值在CCR值左边时输出一个电平,CNT值在CCR右边时,输出相反电平。这样改变CCR值就可以改变输出PWM的占空比。
. k: m4 k2 ^7 L5 m2 j& x& s9 @
0 i. u4 `2 S5 k% Y下面在看看输出比较模式9 X: d+ F2 K% w/ Z$ m) U
* a! L0 ^6 ]! O9 h! f+ X
)TC`0`W7EKLQ]07WTXJN9EM.png
8 }% U" @+ b1 n1 ?8 d# b. `0 f+ H1 N
- [# L( \/ a# _* u; }% [输出比较模式下不关心CNT比 CCR值大还是小,只关心CNT和CCR值什么时候相等,两个值相等时,就翻转输出电平。在PWM模式下,CNT值从0增加到ARR一个周期内输出电平有两次变化,而在输出比较模式下时CNT值从0增加到ARR一个周期内输出电平只有一次变化。所以输出比较模式下,定时器输出方波的频率为PWM模式下定时器输出方波频率的一半。
2 \4 `" n. u: o( W( U
6 Z# l) Z: Q2 U' b下面就看看代码如何实现
- o3 W+ R. Q: K% \6 e: J) h  c6 G  H7 L9 r' D* W
  1. // arr 自动装载值  psc 分频系数4 Z, t  v+ P( Y/ q5 ~
  2. void TIM3_CMP_Init( u16 arr, u16 psc )
    9 }) O- _' U9 b
  3. {3 J. X; W! w2 |, ^9 [3 m
  4.     GPIO_InitTypeDef GPIO_InitStructure;
    5 h& n, P4 d2 E. y  p
  5.     TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    1 p" S2 ^1 r$ e  b
  6.     TIM_OCInitTypeDef TIM_OCInitStructure;
    ( R) V! _4 w( L+ ~/ M8 @( T& A
  7. ' v0 T) Y; q9 v8 J. w1 f6 Y5 B& Z
  8.     RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3, ENABLE );        //使能定时器3时钟  36M & G8 u. A' F$ d* u- s
  9.     RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB , ENABLE );        //使能GPIOC时钟' Q9 v& G- r* f+ s" P+ ?

  10. 6 `+ k' t; H) S3 V
  11.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
    1 s/ g. [5 ]) F- h
  12.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;( ^8 n; E* y9 p0 P4 ?$ m* j& j
  13.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    ' F$ L$ i# D8 f2 |3 d$ S9 L) T2 p4 ]
  14.     GPIO_Init(GPIOA, &GPIO_InitStructure);# r4 R, i( J  `! c  F
  15. * o; @( e  h( |7 t( f
  16.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
    2 _5 u& e! N- \- \1 ~) u# s& `
  17.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;4 _8 I0 H, @3 n' I9 A% @
  18.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;4 u" P4 o7 T* ]4 t
  19.     GPIO_Init(GPIOB, &GPIO_InitStructure);
    . q! D! j- B( m8 G" E
  20.     //初始化TIM3
    + n# x3 j, i* ~( v1 p
  21.     TIM_TimeBaseInitStructure.TIM_Period = arr;& d' c2 M# x+ A$ i- r
  22.     TIM_TimeBaseInitStructure.TIM_Prescaler = psc;3 d! O" H$ g- _
  23.     TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;& o! P3 M' l0 z0 R3 a4 }- g
  24.     TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;2 D, N- p+ x4 w& t: ^; p5 p" j' a0 P* h
  25.     TIM_TimeBaseInit( TIM3, &TIM_TimeBaseInitStructure );' O, X- _, m& T8 ~. H) ~- D& @
  26. 8 \3 N2 p0 P8 @$ I+ q7 \
  27.     //初始化TIM3 比较 模式  输出比较翻转触发模式(当计数值与比较/捕获寄存器值相同时,翻转输出引脚的电平)   
    6 e" u/ W# }. N/ ~. r+ j
  28.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;0 s0 V* t5 D( G2 w6 G' V
  29.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;) N- V1 p" e$ t; z8 V" G
  30.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    ) H0 Y- s: b8 n) @

  31. 2 r4 v' {: e! N* u
  32.     TIM_OC1Init( TIM3, &TIM_OCInitStructure );
    ( I0 n; i/ [- j1 T5 J0 H
  33.     TIM_OC2Init( TIM3, &TIM_OCInitStructure );4 s  q( E% x8 D% E3 c. Y
  34.     TIM_OC3Init( TIM3, &TIM_OCInitStructure );$ D- C5 x6 ]& h: W
  35.     TIM_OC4Init( TIM3, &TIM_OCInitStructure );
    $ S  m/ e4 W% h- V& D2 W  H

  36. 5 ^/ d' \& h  x
  37.     TIM_OC1PreloadConfig( TIM3, TIM_OCPreload_Enable );
    " ~! @& j# `. L6 C) w9 Z0 y
  38.     TIM_OC2PreloadConfig( TIM3, TIM_OCPreload_Enable );$ o: ?) Y; j3 p4 [
  39.     TIM_OC3PreloadConfig( TIM3, TIM_OCPreload_Enable );
      `7 ]# @# c" k& `+ y" K1 J
  40.     TIM_OC4PreloadConfig( TIM3, TIM_OCPreload_Enable );
    0 j  ]" Y3 d4 l* S
  41.   E+ B1 d- d' J
  42.     //使能TIM3
    1 ^. r; ?2 L: A5 y% ]: d2 c4 d! M( p
  43.     TIM_Cmd( TIM3, ENABLE );
    ( |) ~* S) B, X# W" c
  44. }
    6 y6 z4 a: i) l0 C$ c
复制代码

' Q* A$ d" G+ U0 U* u& O, g2 Y( M
, K' P. x( ~* c. a3 S4 Q这里用的是定时器3,定时器3的4个通道全部设置为输出比较模式。
8 V" U( k5 h7 _2 E$ [. L' _
8 t9 ^/ Y% a5 \5 P定时器初始化代码,输出比较模式设置方法和PWM模式设置方法只有模式设置这一行代码不同。
* o2 f" v9 V' [. A. V1 P- G; U" J; e1 w
  1. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
复制代码

1 X5 C  G0 w* G6 g& u% ]5 p将输出模式由TIM_OCMode_PWM1 改为  TIM_OCMode_Toggle 就可以了。: a" \5 ~5 J% v- c) J/ ~
0 _# S; D( `) y- |0 t0 T
下面看主函数代码+ S5 I# F' M8 t  _5 g3 `

" }- a% ]4 I' i: T% s
  1. #include "sys.h"
    - A6 n( B0 i) i: a: m
  2. #include "delay.h": [3 |- j% A/ i7 [: q3 U
  3. #include "usart.h"4 G/ x. f# T( s+ p2 G
  4. #include "led.h"
    % C' w" i' {5 ~8 j' S( i! j. H5 J
  5. #include "pwm.h"
    8 s3 w4 @( S$ y- d2 ^
  6. // LED0  PA8  LED1 PD2
    9 J% ?# Q6 Q$ X" x
  7. int main( void ); L+ J' {2 ~$ [. E  h$ X
  8. {9 m* q6 Y4 _) M# `  l+ o/ |, ]* P
  9.     u16 led_pwm_val = 0;
      D* G; E% ?6 v6 F* s
  10.     u8 dir = 1;
    ( m# d9 v1 i: _
  11.     delay_init();       //延时函数初始化
    . J- I" y$ W0 Y# Z
  12.     NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2 );
    & O# M$ e8 I" L# B- q  n
  13.     LED_Init();
    . A6 {2 P7 A, I" ^6 Y5 V, F
  14. 4 v) ?9 {: ~7 h  q  w( Y: ^) a
  15.     LED0 = 1;- Y; s9 u# s, D1 K: R. w
  16.     LED1 = 1;2 |7 e; a$ H* U3 v& I( v. p
  17.     delay_ms( 500 );) d0 r- \% w% Z& X4 [
  18.     LED0 = 0;
    : ~4 }2 _* l! H1 l; |
  19.     LED1 = 0;* }% }! i, Q* y6 f
  20.     //比较输出模式下:  ARR 决定输出频率  CCRx 决定每个通道的初始相位6 `- C% ]7 u: o! @$ v
  21.     //PWM模式:                   ARR 决定输出频率  CCRx 决定输出 的高电平时长( {( D+ S+ k9 {# G  Q/ J
  22. 7 {3 f# E5 Y& r0 s  v, Q
  23.     //比较翻转模式,一个周期只翻转一次,所以频率为 1/2+ j( M4 S% o. R  k$ [, \
  24.     TIM3_CMP_Init( 1000 - 1, 36 - 1 );                        //1K
    1 D3 w2 P7 _. A7 j: |9 [
  25.     TIM_SetCompare1( TIM3, 0 );* S: J3 M7 w7 H/ G% }" a) y: `' J
  26.     TIM_SetCompare2( TIM3, 200 );+ i# r3 D4 y( t$ s0 P
  27.     TIM_SetCompare3( TIM3, 400 );
    . h  |* _1 Y6 H0 Q7 W& C& F" p% ]7 ^
  28.     TIM_SetCompare4( TIM3, 600 );
    ' P" \: H7 H# m5 ]( E# e1 ?
  29.     while( 1 )
    0 z+ ^# X) d& x) K% t
  30.     {
    & e: S: U, x  q# G" ^4 ?: E
  31.         delay_ms( 200 );
    " o0 l" x# |' S+ R/ ?$ F
  32.         LED0 = !LED0;
    5 h! t* L- f* R) d1 s. O" q/ l
  33.     }: ]9 f% n1 R1 L
  34. }
复制代码

/ Z) i# o3 {! w) y# [        定时器3时钟为72MHz,36分频后为2MHz,自动装载值为1000-1,输出频率为 2M / 1000 = 2KHz。输出比较模式的频率要在减一半,所以输出方波信号频率为 2K / 2 = 1KHz.& |5 J6 Z) o( H  L
) @' X7 `5 w5 A6 r& _: y) }8 ^6 f
        下来分别设置4个通道输出的初始相位,通道1相位设置为0,通道2延迟1/5周期,通道3延迟2/5周期,通道4延迟3/5周期。
7 l* Q, V! B- x+ O
9 Y0 F& v8 g* {" d0 U ~1[C$UHUQX2O7{UTXTO`L.png . R- w7 t* i4 y; a' S; m

/ v& `1 n) p% r4个通道的输出频率都是1KHz,周期为1000us。
" [! A) a5 Z% b2 |7 @0 L2 |- S, `) D2 P  h. \
1O%K1PF0]E5FV1ZXHI8)0I7.png
5 ?4 l' `* c; A: w9 j$ S9 }* B$ U
3 W7 z. T4 h8 t- g  d' E" Q6 t: d通过输出波形可以看出来,起始相位依次滞后,通道1为0起点的话,通道2滞后100us,通道3滞后200us,通道4滞后300us。
" k, T& C" ^# K( b
4 Z0 d9 {3 R: T上面计算的通道2滞后1/5周期,周期为1000us,1/5周期应该为200us,实际测出来为100us,说明相位计算的理论值也要减半。
" }8 O) [4 ]0 E9 m" g$ N  H' d6 b" G% V$ A5 H' z
这样利用定时器输出比较模式,通过设置改变定时器CCR寄存器的值,就可以控制输出方波的起始相位了。
8 N1 \& D9 K) o% r4 V1 ~1 Z4 M% \) A$ B' T3 @

. }# R0 M$ N+ ~* L
收藏 评论0 发布时间:2022-3-22 13:00

举报

0个回答

所属标签

相似分享

官网相关资源

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