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

【经验分享】STM32F0xx_TIM输出PWM配置详细过程

[复制链接]
STMCU小助手 发布时间:2021-11-21 21:00
前言
5 p/ e) y0 c4 u# V) n. X: X9 W3 k1 P  f( s) _4 X
前面我说过STM32的定时器功能很强大,今天就来总结一下它的另外一个“强大”功能:TIM的比较输出功能,输出可调PWM波形。直接调用函数接口“TIM2_CH1_PWM(uint32_t Freq, uint16_t Dutycycle)”传入频率和占空比就能输出指定的波形。
) F. j; _  _( E; p
1 S. ^3 N) g( b8 W' R- v2 e. G我提供的软件工程直接调用是比较简单就能实现想要的PWM波形。但是,如果你是学习者,建议还是进去函数把每一个细节了解清楚,里面的东西可能对你掌握TIM很有帮助。
9 }- \$ ^/ x1 v  Z9 E
" m' h" d. a. L6 F) e4 g, G下载
! ]/ B* F7 @1 S  s. `3 ?  x& y0 @, u9 s! c
文章提供的“软件工程”都是在硬件板子上进行多次测试、并保证没问题才上传至360云盘,请放心下载测试,如有问题请检查一下你的板子是否有问题。( D4 n! l) |0 t* r5 n1 E" e
0 n6 k' K8 V9 A; F: Y0 D" b
ST标准外设库和参考手册、数据手册等都可以在ST官网下载,你也可以到我的360云盘下载。关于F0系列芯片的参考手册有多个版本(针对F0不同芯片),但有一个通用版本,就是“STM32F0x128参考手册V8(英文)2015-07”建议参考该手册,以后如果你换用一种型号芯片也方便了解。
! A+ F  P! g" [9 \' V
7 X. }9 m  v* G9 h" c4 ?! s( q2 q+ l7 b1 p7 O
准备工作. Z0 Q2 K- O$ g: y7 O
. T: I' h8 B* m, K% T0 {1 Q
建议准备F0的参考手册和数据手册,方便查找相关知识,没有的请到ST官网或到我360云盘下载。
. Q* {7 I: Y+ \2 `- {5 E  b4 T6 m# K+ f( ~( R# M
今天总结的软件工程是基于“TIM基本延时配置详细过程”修改而来,因此需要将该软件工程下载准备好。今天学习的源代码主要添加在timer.c文件里面。
1 s. @2 v8 F1 x7 d/ ]% z- @9 C! v* V% s0 |. P, P" ~1 H$ ^
; r% S0 x* W$ f7 h

& ^; ^" w/ P5 R, R. i- h比较输出原理
# ]1 M- Q% U+ b0 S
# K  `. q! P: [& Z看下面框图,计数器的时钟从RCC处来,经过分频之后达到计数器,经过比较器进行比较,达到设定值,产生一个事件对应引脚翻转。主要就是这三个寄存器:重载值、计数值、比较值。说到这里若还不明白请仔细想一下。% o/ l( Z7 F+ H3 Z/ b" Q

6 |2 r" ^! L* [1 {, C3 J
20160603210159585.png

" M% F( q2 l) P
7 i. U: v6 s2 d$ T" |
  @3 N0 H: n! K$ L+ U- a配置过程详情2 G/ F- i* l& D( N/ K1 @* e

# ]5 z- `; k. `" @①RCC时钟
1 t/ g5 e, j3 u5 Q2 V0 T
# s  ]" @2 V& v% Q2 h$ j$ W3 Q$ r8 M
20160603210209554.png
; }" Y+ }9 o. K0 z; w
8 X) l5 Q+ h, r' M- A2 Q
该函数位于bsp.c文件下面;
) D% |+ u. S- q5 ~% F- t$ a% a9 ~2 D1 d# b
我个人习惯第一步配置时钟,ST官方提供的例程也是把配置时钟放在前面。关于RCC时钟的配置比较重要,有好几次我就是由于忘记配置相应RCC时钟,让我找了很久的问题,最后才发现是RCC时钟没有配置。/ x& @" F! a' c8 x
3 R0 p* H; q. a2 p
注意:
$ S; A- p/ d+ k! G) m
) S2 w& q3 g# F' A外设时钟不要随便添加,比如:RCC_APB1外设不要配置在RCC_APB2时钟里面【如:RCC_APB2PeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);这样能编译过,但是错误的】
* C1 \/ q2 ^( M, _9 [9 f4 f4 l+ a  P# v$ I6 C$ X5 I& q. B
我每次都提醒RCC时钟,是因为很多人就是因为时钟而导致软件运行有问题,所以,提醒更多人要注意配置RCC.. S" I3 r) n( _6 {. x+ R1 R

3 z/ J4 m) l. @" i3 q- l②输出引脚配置

! |8 r, x0 y. g  V7 P% u8 E& i) _
- d; \" A4 t  U! T
20160603210216632.png
6 k) |( L1 c7 Y% K
4 t' {' ~$ N) v* Y- y
该函数位于timer.c文件下面;
& V4 `" ~+ I+ J- J1 o; U4 I
1 [8 t) w1 j% ^, |" ]注意:
  D2 h& }) P- [+ _& s- X; U* ^; L9 n: g# }8 U/ K6 k# _
复用功能必须配置好,上面两处,有一处没配置好,对应引脚都不会输出PWM波形。% l# Y& I3 i1 m% A9 G' K) I% l

6 ]2 o% D; x( c0 w' F③TIM比较输出配置

. j% ^- i. z) [+ \: u4 t
4 ?9 F3 z( u) ]) h5 C& c5 S
20160603210226289.png

0 D5 r& V3 b! _/ C; f7 i% _8 G" V6 S+ u) i' v
该函数位于timer.c文件下面;- i0 K& o* X, s6 S8 ^7 p/ ?$ q
$ p* P  N4 E7 T* Q( E5 e+ \
注意:
, E8 ]7 `, X2 [9 [( |7 d; H/ t1 }! s) |2 @
决定输出频率和占空比主要由这三个参数(TIM2_PRESCALER_VALUE、tim2_period、tim2_pulse)决定的。0 W* E0 `8 {. d# T; G  W% i  O
$ M& Y2 ~3 m& Y( ~+ k/ G
以今天工程输出1KHz,20%来举例说明:5 w6 q. a! M' u7 v$ `! a
; O8 i0 l% y9 b' \. H/ I; k$ `( _
TIM2_PRESCALER_VALUE = 72M / 36M - 1 = 1# m: i1 F# f8 r! Q% l
1 [" a! l; d6 c8 n4 Y
tim2_period = 36000 - 1$ ?; Z  v8 a! H2 z' ^% k# Y

/ u6 \3 F% i- ]- C* m+ ]tim2_pulse = 72003 c( p- k. o* N: u* Q2 v
% Y  h+ b% l% X& }/ C. Y
这三个怎么得来的请看代码,今天工程输出的波形如下图:1 o# M3 q) {" ^

8 Y7 T* p/ c6 ?: @
20160603210236711.png

5 J4 t+ J: a5 X& {: z* `" Y5 v5 O/ C8 h8 e( p5 \$ [  T4 v  L5 U

4 ~3 s& B# [% _; b! m" E9 P, h④重点
6 @9 U' b7 z0 X9 O/ F: E
0 u! w9 b8 v9 `; P& L6 U/ xA.细心研究过代码的人会发现TIM_OCMode_PWM1,还有一个TIM_OCMode_PWM2,这两个的区别是什么呢? 答案是:输出的极性(也就是方向)不一样。, u' s' i: e1 f
% U, k0 ?; t* A4 S9 O
这时候又有人问:那下面的输出极性TIM_OCPolarity_High与上面的关系是什么呢?答案是:这两个参数配合一起输出决定PWM波形的极性。- f, A% ]: G9 N% O8 m* o  V  G; b
+ L  |% a) f* y7 r) \2 F  q9 }2 C1 [
也就是说不同参数可以达到一样的效果,下图参数的配置同样可以输出一样的波形。2 d$ F% r0 Y; N7 U% ?" j

  ^- j( N! D# E7 T- K8 E! s" Z: x! G0 H3 W/ C0 t2 n* x
感兴趣的朋友可以试着修改测试一下效果。
, X# P1 X0 I( M
6 q# r% ^! X# |& o0 U! Y/ kB.今天的工程可以设置周期性中断(也就是1ms中断一次),感兴趣的朋友可以试着写一下。使用串口打印测试的话,尽量频率低一点,不然串口响应不过来。
  z# P+ @# v' ^: G" m0 \% Y6 \  h- q; }

- I) H" Y$ |+ S4 x- e说明
2 Z4 F) ^7 a6 T: v* a
1 |. j! C; a0 U/ u或许你硬件芯片不是提供工程里面的芯片,但是STM32F0的芯片软件兼容性很好,可以适用于F0其他很多型号的芯片,甚至是F2、F4等芯片上(具体请看手册、或者亲自测试)。3 [. R0 s( z  `# d
+ ~! q1 s/ {5 H) p+ r: s0 Z; Q& U
本文章提供的软件工程是基于ST标准外设库为基础建立而成,而非使用STM32CubeMX建立工程。个人觉得使用ST的标准外设库适合与学习者,STM32CubeMX建立工程结构复杂,对于学习者,特别是初学者估计会头疼。! @; w) e0 @, L

5 u. s; w$ B, P! r今天的工程是基于工程“STM32F0xx_TIM基本延时配置详细过程”修改而来,以上实例总结仅供参考,若有不对之处,敬请谅解。
: ]3 I8 ?( q- M# G; o
, Z* J, }7 N8 P# n8 y
: y* B. Y$ x5 l: V) p' s9 k" w% l最后# ?8 }" e; P7 {  `

2 X/ H- x% G5 h, y! r# r如果你喜欢我分享的内容,你又想了解更多相关内容,请关注文章开头的微信公众号,新内容持续更新中,后期将会有更多精彩内容出现。* p1 H  D$ P- c+ T; {: {
! N* H/ d5 w6 Q: Y; M

8 N( Z7 D7 c' \$ K' c4 u: k: M7 h( g

' {. E' |7 F/ a! r& s7 l
收藏 评论0 发布时间:2021-11-21 21:00

举报

0个回答

所属标签

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