STMCU小助手
发布时间:2021-11-21 21:00
|
前言 . S" H( D- Y- e+ F% ?2 ] 前面我说过STM32的定时器功能很强大,今天就来总结一下它的另外一个“强大”功能:TIM的比较输出功能,输出可调PWM波形。直接调用函数接口“TIM2_CH1_PWM(uint32_t Freq, uint16_t Dutycycle)”传入频率和占空比就能输出指定的波形。 我提供的软件工程直接调用是比较简单就能实现想要的PWM波形。但是,如果你是学习者,建议还是进去函数把每一个细节了解清楚,里面的东西可能对你掌握TIM很有帮助。 6 m8 ^& A/ \# c9 x7 Z S9 U 下载- [; S. I, Q1 I6 K! E9 H, } 文章提供的“软件工程”都是在硬件板子上进行多次测试、并保证没问题才上传至360云盘,请放心下载测试,如有问题请检查一下你的板子是否有问题。 # `9 x. m6 L9 G; y9 |3 M ST标准外设库和参考手册、数据手册等都可以在ST官网下载,你也可以到我的360云盘下载。关于F0系列芯片的参考手册有多个版本(针对F0不同芯片),但有一个通用版本,就是“STM32F0x128参考手册V8(英文)2015-07”建议参考该手册,以后如果你换用一种型号芯片也方便了解。 准备工作* n* ~4 P. a5 e' n& Q / ^1 Q) D4 o; W6 R {! R3 c 建议准备F0的参考手册和数据手册,方便查找相关知识,没有的请到ST官网或到我360云盘下载。 今天总结的软件工程是基于“TIM基本延时配置详细过程”修改而来,因此需要将该软件工程下载准备好。今天学习的源代码主要添加在timer.c文件里面。: t0 [) Q# N# `' V- j. N/ [! | 2 t! E( U5 b3 N 比较输出原理3 v) i0 u8 c; {% s( D0 | 7 h& q* o0 |+ o- H( b+ Z 看下面框图,计数器的时钟从RCC处来,经过分频之后达到计数器,经过比较器进行比较,达到设定值,产生一个事件对应引脚翻转。主要就是这三个寄存器:重载值、计数值、比较值。说到这里若还不明白请仔细想一下。
9 W! N- w! f+ J/ @2 Y8 H 配置过程详情 % L9 W2 ]- u" F% E1 w ①RCC时钟 / B: l0 a) d0 o( H
该函数位于bsp.c文件下面;6 K! }3 l% d( x& e m 3 ~% Q3 T" O2 t; L+ U/ Q, @ 我个人习惯第一步配置时钟,ST官方提供的例程也是把配置时钟放在前面。关于RCC时钟的配置比较重要,有好几次我就是由于忘记配置相应RCC时钟,让我找了很久的问题,最后才发现是RCC时钟没有配置。 注意: 外设时钟不要随便添加,比如:RCC_APB1外设不要配置在RCC_APB2时钟里面【如:RCC_APB2PeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);这样能编译过,但是错误的】, C/ ^ f: w( U2 I; ^( t/ }$ p ) v% F; h3 B7 m 我每次都提醒RCC时钟,是因为很多人就是因为时钟而导致软件运行有问题,所以,提醒更多人要注意配置RCC. ' F8 p; ?# P8 \ b3 m8 A0 a/ Y ②输出引脚配置
该函数位于timer.c文件下面; - u+ _- d! P% P% h, ]" M 注意: 复用功能必须配置好,上面两处,有一处没配置好,对应引脚都不会输出PWM波形。 ③TIM比较输出配置 - T" {3 `% c# K. S. t
1 ~$ F8 C1 I% z: X5 S5 X6 T 该函数位于timer.c文件下面;& V/ O5 y$ `. W+ j/ l 注意:6 m% _, I! [- c3 y/ f0 b. s 决定输出频率和占空比主要由这三个参数(TIM2_PRESCALER_VALUE、tim2_period、tim2_pulse)决定的。8 h0 q: ^% M9 X( t! c% m 以今天工程输出1KHz,20%来举例说明: 0 N# p! H+ h3 Y1 b TIM2_PRESCALER_VALUE = 72M / 36M - 1 = 1 # \* ?' H# y M ^) f d tim2_period = 36000 - 1 ; m% d8 Y: { q, b6 f4 a tim2_pulse = 72000 p* `# B1 |! E7 j+ @ 这三个怎么得来的请看代码,今天工程输出的波形如下图:7 H/ Q2 ]2 t$ O, a( m! M1 g 5 \4 ^: e, s7 O( }
④重点 ( R5 s' x; P, Y1 L A.细心研究过代码的人会发现TIM_OCMode_PWM1,还有一个TIM_OCMode_PWM2,这两个的区别是什么呢? 答案是:输出的极性(也就是方向)不一样。 这时候又有人问:那下面的输出极性TIM_OCPolarity_High与上面的关系是什么呢?答案是:这两个参数配合一起输出决定PWM波形的极性。 & Y4 E) G) F' n 也就是说不同参数可以达到一样的效果,下图参数的配置同样可以输出一样的波形。 + V) C: H- q% d8 s, }7 Z/ j 7 m) j- U% Z, }, t( d# I( o 感兴趣的朋友可以试着修改测试一下效果。# \5 h3 J( S# T: E B.今天的工程可以设置周期性中断(也就是1ms中断一次),感兴趣的朋友可以试着写一下。使用串口打印测试的话,尽量频率低一点,不然串口响应不过来。 6 O% P# y; p9 x6 Y8 i 8 D4 v' c' X1 d+ U 说明 , B, N3 o( W- a$ ]( l1 Y! K6 S 或许你硬件芯片不是提供工程里面的芯片,但是STM32F0的芯片软件兼容性很好,可以适用于F0其他很多型号的芯片,甚至是F2、F4等芯片上(具体请看手册、或者亲自测试)。 2 q8 X$ m, O* V 本文章提供的软件工程是基于ST标准外设库为基础建立而成,而非使用STM32CubeMX建立工程。个人觉得使用ST的标准外设库适合与学习者,STM32CubeMX建立工程结构复杂,对于学习者,特别是初学者估计会头疼。. z# g% H$ Z& s! M+ q, v 今天的工程是基于工程“STM32F0xx_TIM基本延时配置详细过程”修改而来,以上实例总结仅供参考,若有不对之处,敬请谅解。 最后 6 w6 M1 a' w5 f8 { 如果你喜欢我分享的内容,你又想了解更多相关内容,请关注文章开头的微信公众号,新内容持续更新中,后期将会有更多精彩内容出现。 1 ^* W9 a4 j6 X# K' {. R |
微信公众号
手机版