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

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

[复制链接]
STMCU小助手 发布时间:2021-11-21 21:00
前言
+ }, b. X% I# A* u& X7 x* O2 b8 N- O. S" H( D- Y- e+ F% ?2 ]
前面我说过STM32的定时器功能很强大,今天就来总结一下它的另外一个“强大”功能:TIM的比较输出功能,输出可调PWM波形。直接调用函数接口“TIM2_CH1_PWM(uint32_t Freq, uint16_t Dutycycle)”传入频率和占空比就能输出指定的波形。
6 g1 ]5 u9 y  ^$ }; ]! W. k
1 w& l# d5 a9 x& b1 c我提供的软件工程直接调用是比较简单就能实现想要的PWM波形。但是,如果你是学习者,建议还是进去函数把每一个细节了解清楚,里面的东西可能对你掌握TIM很有帮助。
, I2 T/ v6 C4 p) q& U6 m8 ^& A/ \# c9 x7 Z  S9 U
下载- [; S. I, Q1 I6 K! E9 H, }

  _+ @  v3 f8 J' Y, R. f文章提供的“软件工程”都是在硬件板子上进行多次测试、并保证没问题才上传至360云盘,请放心下载测试,如有问题请检查一下你的板子是否有问题。
% Q. F: i9 r" G( T) A+ q5 z# `9 x. m6 L9 G; y9 |3 M
ST标准外设库和参考手册、数据手册等都可以在ST官网下载,你也可以到我的360云盘下载。关于F0系列芯片的参考手册有多个版本(针对F0不同芯片),但有一个通用版本,就是“STM32F0x128参考手册V8(英文)2015-07”建议参考该手册,以后如果你换用一种型号芯片也方便了解。
! c, q/ r9 v: ~- y5 ^- o% j
, u1 u4 @5 X" I% @# p: f
- ?9 w* w6 p" B. U& z准备工作* n* ~4 P. a5 e' n& Q
/ ^1 Q) D4 o; W6 R  {! R3 c
建议准备F0的参考手册和数据手册,方便查找相关知识,没有的请到ST官网或到我360云盘下载。
% t8 I* t" L- B) a* X
3 k6 d- O4 }& [* i6 n! P% P今天总结的软件工程是基于“TIM基本延时配置详细过程”修改而来,因此需要将该软件工程下载准备好。今天学习的源代码主要添加在timer.c文件里面。: t0 [) Q# N# `' V- j. N/ [! |
2 t! E( U5 b3 N

& B2 K5 f2 W/ m; n) B3 x
) c- [4 u9 L5 {9 _1 o9 k/ y9 A比较输出原理3 v) i0 u8 c; {% s( D0 |
7 h& q* o0 |+ o- H( b+ Z
看下面框图,计数器的时钟从RCC处来,经过分频之后达到计数器,经过比较器进行比较,达到设定值,产生一个事件对应引脚翻转。主要就是这三个寄存器:重载值、计数值、比较值。说到这里若还不明白请仔细想一下。
- L) W/ l; v% W- g0 f/ S2 ]
$ W. D6 d7 J; y* M3 r
20160603210159585.png

3 L* X9 b8 \3 V( B, ^$ {
. p7 \6 B; R8 h: n9 W! N- w! f+ J/ @2 Y8 H
配置过程详情
- f" Y% j/ Z. B; z% L9 W2 ]- u" F% E1 w
①RCC时钟
. ^# a( w& T( I. z6 p* G* b* G8 r$ A/ B: l0 a) d0 o( H
20160603210209554.png

- o' G7 r. h7 {! X8 K) }
8 g; e7 M+ P# w: X- v9 G该函数位于bsp.c文件下面;6 K! }3 l% d( x& e  m
3 ~% Q3 T" O2 t; L+ U/ Q, @
我个人习惯第一步配置时钟,ST官方提供的例程也是把配置时钟放在前面。关于RCC时钟的配置比较重要,有好几次我就是由于忘记配置相应RCC时钟,让我找了很久的问题,最后才发现是RCC时钟没有配置。
6 C6 t+ B8 q1 ]& ?7 R# V$ h/ G: ]1 N
. k% L& v" ^' S2 \; s注意:
. s* ~- j+ v- K4 W' ^1 u
$ Z2 o- q; I; p8 k* ]( m. H, U外设时钟不要随便添加,比如:RCC_APB1外设不要配置在RCC_APB2时钟里面【如:RCC_APB2PeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);这样能编译过,但是错误的】, C/ ^  f: w( U2 I; ^( t/ }$ p
) v% F; h3 B7 m
我每次都提醒RCC时钟,是因为很多人就是因为时钟而导致软件运行有问题,所以,提醒更多人要注意配置RCC.
; D' \, K0 e& ~7 M$ N' F8 p; ?# P8 \  b3 m8 A0 a/ Y
②输出引脚配置

( G, f% n5 x2 z& U1 u
  M- d' V: U& v5 S* \
20160603210216632.png
. d0 q$ j; f" W' Q" W7 {6 X

0 S" W& G" w$ o* q该函数位于timer.c文件下面;
' \" q1 H4 Y6 B3 S0 ^: V7 U* d- u+ _- d! P% P% h, ]" M
注意:
% v" e/ w1 [" a+ l6 I6 q# {
/ z* U% k% P# C复用功能必须配置好,上面两处,有一处没配置好,对应引脚都不会输出PWM波形。
; w( X9 z" J% D2 H
0 {* {4 q8 F. D' v0 l③TIM比较输出配置

! ~' m% T8 w2 \) i2 F- T" {3 `% c# K. S. t
20160603210226289.png

' W4 g+ }: d0 t7 `4 p1 B1 ~$ F8 C1 I% z: X5 S5 X6 T
该函数位于timer.c文件下面;& V/ O5 y$ `. W+ j/ l

9 T: \. l$ i/ I; u. m% ~注意:6 m% _, I! [- c3 y/ f0 b. s

3 n; I' P# r* ?/ w  o+ F决定输出频率和占空比主要由这三个参数(TIM2_PRESCALER_VALUE、tim2_period、tim2_pulse)决定的。8 h0 q: ^% M9 X( t! c% m

; d* @0 l2 H7 N以今天工程输出1KHz,20%来举例说明:
6 j4 K' C( c: K+ d) d0 h% G0 N# p! H+ h3 Y1 b
TIM2_PRESCALER_VALUE = 72M / 36M - 1 = 1
1 k7 B9 W0 Y* @5 n4 t% s# \* ?' H# y  M  ^) f  d
tim2_period = 36000 - 1
4 Y# Q% J) L, y/ i; m% d8 Y: {  q, b6 f4 a
tim2_pulse = 72000 p* `# B1 |! E7 j+ @

: l. X) w& e2 a4 N5 ~* \: [这三个怎么得来的请看代码,今天工程输出的波形如下图:7 H/ Q2 ]2 t$ O, a( m! M1 g
5 \4 ^: e, s7 O( }
20160603210236711.png

4 q: H( T. V! b; e. j* J
8 s) ]4 r, P1 q3 h
$ `5 `5 f" o. D" _3 J! f# e④重点
5 Z8 G8 u3 m7 E/ W( R5 s' x; P, Y1 L
A.细心研究过代码的人会发现TIM_OCMode_PWM1,还有一个TIM_OCMode_PWM2,这两个的区别是什么呢? 答案是:输出的极性(也就是方向)不一样。
" I8 v+ A- {% T9 J/ J) A
7 ^- l3 u1 Z% `4 u; P+ ~这时候又有人问:那下面的输出极性TIM_OCPolarity_High与上面的关系是什么呢?答案是:这两个参数配合一起输出决定PWM波形的极性。
) T8 w6 J6 p( N# B: L& Y4 E) G) F' n
也就是说不同参数可以达到一样的效果,下图参数的配置同样可以输出一样的波形。
/ }2 z0 o7 a, k! g+ G+ V) C: H- q% d8 s, }7 Z/ j
7 m) j- U% Z, }, t( d# I( o
感兴趣的朋友可以试着修改测试一下效果。# \5 h3 J( S# T: E

& O2 ?- c" f. rB.今天的工程可以设置周期性中断(也就是1ms中断一次),感兴趣的朋友可以试着写一下。使用串口打印测试的话,尽量频率低一点,不然串口响应不过来。
  Q* r' e2 z( b9 s( e4 T8 M6 c6 O% P# y; p9 x6 Y8 i
8 D4 v' c' X1 d+ U
说明
$ E4 l! V. j4 I9 {$ Q! ^( }& p' l, K, B, N3 o( W- a$ ]( l1 Y! K6 S
或许你硬件芯片不是提供工程里面的芯片,但是STM32F0的芯片软件兼容性很好,可以适用于F0其他很多型号的芯片,甚至是F2、F4等芯片上(具体请看手册、或者亲自测试)。
1 T8 f/ B$ t- ~$ F) i4 V, L2 q8 X$ m, O* V
本文章提供的软件工程是基于ST标准外设库为基础建立而成,而非使用STM32CubeMX建立工程。个人觉得使用ST的标准外设库适合与学习者,STM32CubeMX建立工程结构复杂,对于学习者,特别是初学者估计会头疼。. z# g% H$ Z& s! M+ q, v

; d1 @# w7 @2 {8 t- d9 I' ~, e今天的工程是基于工程“STM32F0xx_TIM基本延时配置详细过程”修改而来,以上实例总结仅供参考,若有不对之处,敬请谅解。
8 k% v4 c% S, w$ h- p: ]& ~
) l$ r5 k& Y  A1 L+ e- v! w  P
  j- z& s1 J& v: F! W最后
+ {4 X6 e+ {8 K, z6 w6 M1 a' w5 f8 {
如果你喜欢我分享的内容,你又想了解更多相关内容,请关注文章开头的微信公众号,新内容持续更新中,后期将会有更多精彩内容出现。
$ }  w4 J6 b" c1 D  d: t1 ^* W9 a4 j6 X# K' {. R

. U2 d7 ^0 D! {8 ~0 V' r4 N' n
6 H$ U+ C" v" K
5 v( u5 {# C4 W* T/ E4 k% c# I
收藏 评论0 发布时间:2021-11-21 21:00

举报

0个回答

所属标签

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