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

详解STM32的PWM输出及频率和脉宽(占空比)的计算

[复制链接]
eefishing 发布时间:2017-6-20 10:17

STM32电机培训online,大佬带你玩电机

$ \; B7 J3 q) }( X1 F& [

6 `9 s6 @+ W$ C9 S! a

一、stm32的pwm输出引脚是使用的IO口的复用功能。

二、T2~T5这4个通用定时器均可输出4路PWM——CH1~CH4。

三、我们以tim3的CH1路pwm输出为例来进行图文讲解(其它类似),并在最后给出tim3的ch1和ch2两路pwm输出的c代码(已在STM32F103RBT6上测试成功,大家放心使用!)。

四、给出了PWM频率和占空比的计算公式。

步骤如下:

1、使能TIM3时钟

11.png


" x: l& ?1 C: X6 A

RCC->APB1ENR |= 1 << 1;

2、配置对应引脚(PA6)的复用输出功能

12.png

GPIOA->CRL &= 0XF0FFFFFF;//PA6清0
6 g, d9 I( Z2 F' VGPIOA->CRL |= 0X0B000000;//复用功能输出(推挽50MHz输出)
2 G  X: S  w4 f! K  K2 C, `1 j  u; ]GPIOA->ODR |= 1 << 6;//PA6上拉

3、设定计数器自动重装值及是否分频

TIM3->ARR = arr;//设定计数器自动重装值(决定PWM的频率)
& U7 ]0 [' t2 m1 o TIM3->PSC = psc;//预分频器,0为不分频

4、设置PWM的模式(有1和2两种模式,区别在于输出电平极性相反),根据需求选一种即可

13.png

注:TIMX_CCMR1决定CH1~CH2路,TIMX_CCMR2决定CH3~CH4路。

14.png

//TIM3->CCMR1 |= 6 << 4;//CH1 PWM1模式

TIM3->CCMR1 |= 7 << 4;//CH1 PWM2模式
) Y+ m1 y- e- z. x, M+ F$ x$ ` TIM3->CCMR1 |= 1 << 3;//CH1预装载使能

5、输出使能设置

15.png

TIM3->CCER  |= 1 << 0;//输入/捕获1输出使能

6、自动重装载预装载允许位(ARPE) 及 定时器 使能

16.png

TIM3->CR1 = 0X0080;//ARPE使能(此句不配置也行)
* a+ J9 T, h9 Q9 x5 ?# P% N& gTIM3->CR1 |= 0X01;//使能定时器3

下面给出TIM3_CH1及TIM3_CH2的PWM输出代码:

  1. void PWM_Init_TIM3_CH1(u16 arr, u16 psc), {! j+ Z" _3 X0 }+ u8 b+ F
  2. {& g) E. w- d% d8 \
  3.     //1、使能TIM3时钟   4 z1 g- ]2 F, u
  4.     RCC->APB1ENR |= 1 << 1;//使能TIM3时钟. [4 @% _: n4 p0 I( a# l8 |
  5.     //2、配置对应引脚(PA6)的复用输出功能
    - U8 U: ]9 B) J7 |. t+ T$ M) F2 j
  6.     GPIOA->CRL &= 0XF0FFFFFF;//PA6清0) v8 p, w) j* d0 w2 {" ~
  7.     GPIOA->CRL |= 0X0B000000;//复用功能输出(推挽50MHz输出)3 B) w9 s/ t# j
  8.     GPIOA->ODR |= 1 << 6;//PA6上拉   
    & n) A$ z# f; U# F: {
  9.     //3、设定计数器自动重装值及是否分频: n- T7 ?9 ~" o  y, a* a) J
  10.     TIM3->ARR = arr;//设定计数器自动重装值(决定PWM的频率)
    7 \) t% g: x$ }
  11.     TIM3->PSC = psc;//预分频器 0为不分频
    . P2 F/ v+ ]2 C
  12.     //4、设置PWM的模式
    3 {  A9 w, S* ?! Z* V7 z6 F: H
  13.     TIM3->CCMR1 |= 7 << 4;//CH1 PWM2模式
    . M8 D( a: O5 r' W; D. y2 @
  14.     TIM3->CCMR1 |= 1 << 3;//CH1预装载使能   
    1 S& {' A( l  u$ L+ [. v  k
  15.     //5、输出使能设置
      A: M/ ]6 O# ~5 n, Q7 n5 h
  16.     TIM3->CCER  |= 1 << 0;//输入/捕获1输出使能% `+ K/ Q+ u! d
  17.     //6、自动重装载预装载允许位(ARPE) 及 定时器 使能8 t5 q+ T0 n6 o- X) u7 r
  18.     TIM3->CR1 = 0X0080;//ARPE使能
    + _* S0 s" [3 r
  19.     TIM3->CR1 |= 0X01;//使能定时器3
    , \5 V# Q. ^2 l5 p+ v
  20. }0 v6 C! l: I/ S+ i1 y) N/ w. d' X
  21. void PWM_Init_TIM3_CH2(u16 arr, u16 psc)
      y% E4 v; N4 P# K. M2 _
  22. {1 M* Q6 x6 l) p+ K
  23.     RCC->APB1ENR |= 1 << 1;//使能TIM3时钟
    / m8 J. Q+ ]* n
  24.     / O/ k6 o1 A% m$ R) {1 \+ T4 ]
  25.     GPIOA->CRL &= 0X0FFFFFFF;//PA7清0
    $ s  W( m4 [' k
  26.     GPIOA->CRL |= 0XB0000000;//复用功能输出(推挽50MHz输出)
    : D0 x9 i( g0 K7 A" B+ C: |
  27.     GPIOA->ODR |= 1 << 7;//PA7上拉
    ! y1 @# `3 @( A; v7 F
  28.     TIM3->ARR = arr;//设定计数器自动重装值(决定PWM的频率)* B1 o7 R1 i9 Z8 O% O7 M" i/ a
  29.     TIM3->PSC = psc;//预分频器 不分频
      o* G9 c( Z9 o
  30.     TIM3->CCMR1 |= 7 << 12;//CH2 PWM2模式+ y" J8 W, a% z+ K# a. d% F* @) |
  31.     TIM3->CCMR1 |= 1 << 11;//CH2预装载使能
    / g( _) M$ n- y8 B
  32.     TIM3->CCER  |= 1 << 4;//输入/捕获2输出使能
    % }- [. {# A' l* o, c
  33.     TIM3->CR1 = 0X0080;//ARPE使能( f) z* ^& N* F
  34.     TIM3->CR1 |= 0X01;//使能定时器36 l: E. z# Q6 t9 U* f$ E7 Q
  35. }
复制代码
1 I! h' V' t4 ~) E9 x& {

频率:

//Fpwm = 72M / ((arr+1)*(psc+1))(单位:Hz)9 g1 x% D9 k3 n2 w6 @/ n0 I5 a
占空比:

//duty circle = TIM3->CCR1 / arr(单位:%)

注:本文方法的一个定时器4个通道的pwm输出的频率是相同的,但占空比可以不同!

9 k( \7 r( s# L1 G8 d. v) K

评分

参与人数 1 ST金币 +10 收起 理由
MrJiu + 10 神马都是浮云

查看全部评分

收藏 3 评论5 发布时间:2017-6-20 10:17

举报

5个回答
MrJiu 回答时间:2017-6-21 09:37:50
支持基础理论讲解!!!!!!!!
xmshao 回答时间:2017-6-21 15:06:19
谢谢!7 O2 \) H: G3 i
epochal 回答时间:2017-6-21 21:50:48
谢谢分享!
anny 回答时间:2017-6-21 23:54:39
不错的帖子,谢谢楼主的分享
sasikawyh 回答时间:2018-10-24 11:28:13
谢谢分享- }* H  p& C* h

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版