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

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

[复制链接]
STMCU小助手 发布时间:2021-11-21 21:00
前言9 {. e% z8 I; H0 h4 G& P

: k9 }, ?0 G5 V* m前面我说过STM32的定时器功能很强大,今天就来总结一下它的另外一个“强大”功能:TIM的比较输出功能,输出可调PWM波形。直接调用函数接口“TIM2_CH1_PWM(uint32_t Freq, uint16_t Dutycycle)”传入频率和占空比就能输出指定的波形。
5 c  `7 {$ \1 j+ z
* O' ?4 }  @9 K/ S我提供的软件工程直接调用是比较简单就能实现想要的PWM波形。但是,如果你是学习者,建议还是进去函数把每一个细节了解清楚,里面的东西可能对你掌握TIM很有帮助。! R4 X, ], a) Y8 u

2 U, C0 X4 P0 y( \4 y/ b" c/ O6 S) ~' Z下载9 Y$ r" p" z5 G' K! I+ c0 d% W
+ F/ r+ ]( k; j
文章提供的“软件工程”都是在硬件板子上进行多次测试、并保证没问题才上传至360云盘,请放心下载测试,如有问题请检查一下你的板子是否有问题。
% O( M1 u- M# u" c9 i/ Z8 `9 o$ p8 G7 y# J% e. P1 |1 c4 N
ST标准外设库和参考手册、数据手册等都可以在ST官网下载,你也可以到我的360云盘下载。关于F0系列芯片的参考手册有多个版本(针对F0不同芯片),但有一个通用版本,就是“STM32F0x128参考手册V8(英文)2015-07”建议参考该手册,以后如果你换用一种型号芯片也方便了解。4 M( K  z  P2 t" Z* C- K
- ~0 y! c8 w' M3 y

" w( _$ k0 x2 d8 x/ a准备工作6 j) @- p0 `- Q* y
3 _0 N- S5 H( ~# m
建议准备F0的参考手册和数据手册,方便查找相关知识,没有的请到ST官网或到我360云盘下载。* ~* j! L( \1 Q3 ~$ [

3 O8 y: |3 z, }5 X今天总结的软件工程是基于“TIM基本延时配置详细过程”修改而来,因此需要将该软件工程下载准备好。今天学习的源代码主要添加在timer.c文件里面。
% t( J* `9 P+ n! }
% g+ g5 Q7 k: z7 }3 L4 _& Y' L" k3 U6 R" S+ Y# M

4 x& B: f2 U6 m5 Q比较输出原理: g* ^# Q6 [! w) N% w1 [1 M

$ y( g- \# J; v$ ^0 B* A8 T) v( k看下面框图,计数器的时钟从RCC处来,经过分频之后达到计数器,经过比较器进行比较,达到设定值,产生一个事件对应引脚翻转。主要就是这三个寄存器:重载值、计数值、比较值。说到这里若还不明白请仔细想一下。  a" B& V) ^- \
3 A) W9 B5 \5 d/ V. J
20160603210159585.png
# g3 F8 x8 y4 k( B, i

% t" V) G' g" V7 F
! u- T$ g0 }6 I/ Y6 Z, K8 i- g配置过程详情
1 b. ^# J% a7 G' M. K% Q. {% d0 z. z$ x5 i
①RCC时钟
( G- C9 E2 a1 k2 G5 ^$ k5 Z
  M6 w" N! r3 _5 a8 M
20160603210209554.png
5 S6 ^% J$ S3 M+ |# E

" k: ^0 b/ i# i2 p- K该函数位于bsp.c文件下面;
) p/ z' c* {, p; s% O% O8 g) t8 z/ x7 w
我个人习惯第一步配置时钟,ST官方提供的例程也是把配置时钟放在前面。关于RCC时钟的配置比较重要,有好几次我就是由于忘记配置相应RCC时钟,让我找了很久的问题,最后才发现是RCC时钟没有配置。
, v2 o3 H& i) M$ I6 Q2 B' Z
. e3 o( ^, }! w0 f1 U注意:
: G# n) k. B# `6 i9 D$ Z2 \0 s/ i9 [0 r6 O- j+ N& Z. T% w" z' U5 L
外设时钟不要随便添加,比如:RCC_APB1外设不要配置在RCC_APB2时钟里面【如:RCC_APB2PeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);这样能编译过,但是错误的】" c6 g2 X: E+ r1 D9 j7 i* W

0 w2 P  L& n# W# J( O. X我每次都提醒RCC时钟,是因为很多人就是因为时钟而导致软件运行有问题,所以,提醒更多人要注意配置RCC.
+ F. t& J& Q+ \9 z; Q6 _; C$ z5 W2 {% P# H/ a* K+ ^
②输出引脚配置
" @1 a4 K& n" y

0 C7 E; z8 m$ `. Q
20160603210216632.png

& Q" }1 Y, S* H) D& l5 H/ a+ ]+ i5 t- d/ i$ E
该函数位于timer.c文件下面;
! u4 F. z: r' b; ]' p
/ i6 o( _" K& G, y# B- f; I注意:- I0 \& N% Q9 x  k

8 W& L2 c( i' {& I6 }复用功能必须配置好,上面两处,有一处没配置好,对应引脚都不会输出PWM波形。
0 {' o. a# ]2 u+ y
6 ?7 V* e: X9 x+ s③TIM比较输出配置

" f1 l* H3 u% l4 A: X0 k2 _$ u" Q+ G' }; E" b* n
20160603210226289.png

. S0 U$ Q8 u1 L! A6 u$ n4 D" K: @
该函数位于timer.c文件下面;
' f' t9 \) ]" Z5 P
8 y! G/ y" \  t注意:
# @' A9 i" d2 q( q1 u* m/ b$ j
! N* P1 ~/ L" q* F  H! y" ~& l决定输出频率和占空比主要由这三个参数(TIM2_PRESCALER_VALUE、tim2_period、tim2_pulse)决定的。% g8 A) k! X; D/ C
. N' V/ h" \( x# E. r
以今天工程输出1KHz,20%来举例说明:. h: o  N$ l; f+ v
: o. x9 \9 q' m% t) |9 C5 o
TIM2_PRESCALER_VALUE = 72M / 36M - 1 = 1
6 g  {" {5 T" U
" d' p+ c+ W5 H/ U* gtim2_period = 36000 - 1
2 k2 m$ @0 p; |+ u1 K* @2 m% ]; p9 @" g
tim2_pulse = 7200
" y+ p2 |% |* G' S" M0 t0 t, G
2 x& u) {/ L1 m! o  r& w. }9 I这三个怎么得来的请看代码,今天工程输出的波形如下图:) _/ s( n* b7 M- M$ Z' N

$ t2 T& L" q8 @3 u
20160603210236711.png
, ^! C9 {( ^$ Y1 t5 D( M3 x3 j' p$ S
- N; ^( s+ K! I% |" y- U: b
1 s* V1 J7 [" ]# F2 b2 T0 l8 ^
④重点
" A" B* Q) h5 T9 \4 [: `
% K0 Y3 k: d- P8 V- j" S) TA.细心研究过代码的人会发现TIM_OCMode_PWM1,还有一个TIM_OCMode_PWM2,这两个的区别是什么呢? 答案是:输出的极性(也就是方向)不一样。6 k! ^5 o# T( |4 y% u
5 o3 J9 |! A- i/ ?2 i
这时候又有人问:那下面的输出极性TIM_OCPolarity_High与上面的关系是什么呢?答案是:这两个参数配合一起输出决定PWM波形的极性。
! l; {1 {# }/ i9 m" b
& H! S7 ?- [$ y6 c9 q* t/ h- I2 q/ H也就是说不同参数可以达到一样的效果,下图参数的配置同样可以输出一样的波形。
! n) Q+ q5 g+ K$ E) u( m, K
5 `5 k. z& F4 a% \/ I8 K! j# [+ W( J
感兴趣的朋友可以试着修改测试一下效果。/ M' Y5 I7 ^& Y' s. _

9 w% P: o0 ]( b0 OB.今天的工程可以设置周期性中断(也就是1ms中断一次),感兴趣的朋友可以试着写一下。使用串口打印测试的话,尽量频率低一点,不然串口响应不过来。
" X( ~6 x0 |! }% v9 A$ I" ?. E. e- j; ]: v: u/ U" i
5 i0 [3 J1 y- f" A, F9 g
说明; B$ p' O2 ^% q4 S6 M8 F) [5 a

% q9 ^/ f$ r# ?3 o  F( I或许你硬件芯片不是提供工程里面的芯片,但是STM32F0的芯片软件兼容性很好,可以适用于F0其他很多型号的芯片,甚至是F2、F4等芯片上(具体请看手册、或者亲自测试)。
9 c. {' \: y3 b6 `$ Z9 P
$ ^% M. s5 ^8 f4 S4 c0 ]本文章提供的软件工程是基于ST标准外设库为基础建立而成,而非使用STM32CubeMX建立工程。个人觉得使用ST的标准外设库适合与学习者,STM32CubeMX建立工程结构复杂,对于学习者,特别是初学者估计会头疼。! E" d- v) W5 x4 t& O- i) I
, \7 R5 U+ L+ \# L& u
今天的工程是基于工程“STM32F0xx_TIM基本延时配置详细过程”修改而来,以上实例总结仅供参考,若有不对之处,敬请谅解。# O8 c3 j0 l$ Y# I$ d
0 r5 s3 h; l8 r7 k
% w, a: s0 f7 }9 g
最后) o& D, s. v" L8 J
0 R: x2 u6 \: X) b( J# d8 m, N
如果你喜欢我分享的内容,你又想了解更多相关内容,请关注文章开头的微信公众号,新内容持续更新中,后期将会有更多精彩内容出现。
9 H1 G' w3 _, l4 x1 k5 O
# i7 t0 l. \% `* c1 ?& r2 \3 j) c  B" _( J7 A( j5 X
" d. V5 \# V) X% H1 V8 _( R

8 E, Q& Y2 _$ w0 d# u$ L0 |6 x
收藏 评论0 发布时间:2021-11-21 21:00

举报

0个回答

所属标签

相似分享

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