打印
[STM32F1]

STM32F103C8T6定时器&PWM应用编程

[复制链接]
1956|51
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
前言
1 深入了解STM32定时器的工作原理,掌握脉宽调制(PWM)的生成方法。
2 掌握使用STM32F103的Tim2~Tim5中的一个定时器的某一个通道与LED相连,并利用定时器计数方式控制LED周期性地亮-灭。
3 学习如何在STM32F103上使用定时器的PWM模式,以呼吸灯的方式使LED渐亮渐灭,并通过Keil虚拟示波器观察PWM输出波形。
4 利用另一个定时器通道编程采集上述PWM输出信号,并获取其周期和脉宽,并将数据通过串口输出显示。
5 学习HC-SR04超声波测距模块的工作原理,并使用STM32F103完成一个超声波测距方案。

一、TIM定时器
1.简介
(1)TIM(Timer)定时器

(2)定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断

定时器就是一个计数器,当这个计数器的输入是一个准确可靠的基准时钟的时候,那在对这个基准时钟进行计数的过程,实际上就是计时的过程。

比如在STM32中,定时器的基准时钟一般都是主频72MHz,比如我对72MHz计72个数,所记时间就是72*1/72000000=1us;如果计72000个数,那就是72000*1/72000000=1ms。
(3)16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时

计数器就是用来执行技术定时的一个寄存器,每来一个时钟,计数器加1。
预分频器可以对计数器的时钟进行分频,让计数更加灵活。
自动重装寄存器就是计数的目标值,就是想要计多少个时钟申请中断。
计数器、预分频器、自动重装寄存器构成了定时器最核心的部分,我们把这一块电路称为时基单元,均为16位寄存器,2^16=65536,如果预分频器设置最大,自动重装也设置最大,那定时器的最大的定时时间就1/720000006553565535=59.65s,接近一分钟。


如果想这里的最大定时时间仍满足不了需求,STM32的定时器还支持级联的模式,也就是一个定时器的输出,当作另一个定时器的输入,这样,最大定时时间就是1/72000000*65536*65536*65536*65536 这个时间大概是8000多年,如果还嫌短,那就再级联一个定时器,最大定时时间还会延长65536*65536倍,这个时间大概是34万亿年。

(4)不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能
(5)根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型



使用特权

评论回复
评论
xiaoqi000 2024-1-29 16:43 回复TA
———————————————— 版权声明:本文为CSDN博主「YRr YRr」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/m0_73640344/article/details/134004426 ———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.csdn.net/weixin_68811361/article/details/134273036  
沙发
xiaoqi000|  楼主 | 2024-1-29 16:37 | 只看该作者
2.定时器类型
有高级定时器、通用定时器和基本定时器,这三种定时器是由高级到低级向下兼容的。

高级定时器拥有通用定时器的全部功能
通用定时器拥有基本定时器的全部功能



TM32F103C8T6定时器资源:TIM1、TIM2、TIM3、TIM4
1个高级定时器和3个通用定时器

使用特权

评论回复
板凳
xiaoqi000|  楼主 | 2024-1-29 16:38 | 只看该作者
(1)高级定时器

增加重复次数计数器,可以实现每隔几个计数周期,才发生一次更新事件和更新中断,相当于对输出的更新信号又做了一次分频,将最大计数时间延长了65536倍。原来的结构是每个计数周期完成后都会发生更新。
DTG(Dead Time
Generate)死区生成电路,右边的输出引脚由一个变为了两个互补的输出,可以输出一对互补的PWM波,用于驱动三相无刷电机。
四轴飞行器、电动车的后轮、电钻等,都可能用的是三相无刷电机,三相无刷电机的驱动电路一般需要3个桥臂,每隔桥臂2个大功率开关来控制,总共需要6个大功率开关管来控制,所以这里输出PWM引脚的前三路就变为了互补的输出,而地思路却没什么变化,因为三相无刷电机只需要三路就行了。为了防止互补输出的PWM驱动桥臂时,在开关切换的瞬间,由于器件的不理想,造成短暂的直通现象,所以前面这里就加上了死区生成电路,在开关切换的瞬间,产生一定时长的死区,让桥臂的上下管全都关断,防止直通现象。

使用特权

评论回复
地板
xiaoqi000|  楼主 | 2024-1-29 16:39 | 只看该作者
刹车输入,为电机驱动提供安全保障,如果外部引脚BKIN(Break
IN)产生了刹车信号,或者内部时钟失效,产生了故障,那么控制电路就会自动切断电机的输出,防止意外的发生。

使用特权

评论回复
5
xiaoqi000|  楼主 | 2024-1-29 16:39 | 只看该作者
(2)通用定时器

带黑色阴影的寄存器,都是有影子寄存器这样的缓冲机制的。

包括预分频器、自动重装载寄存器和捕获比较寄存器。

使用特权

评论回复
6
xiaoqi000|  楼主 | 2024-1-29 16:40 | 只看该作者
结构组成

时基单元,由预分频器、计数器、自动重装载寄存器构成,预分频器对时钟进行预分频,计数器自增计数,当计数器计到自动重装值时,计数值清零同时产生更新中断和更新事件。

对于通用定时器而言,计数器的计数模式就不止向上计数这一种了,通用定时器支持向上计数模式,向下计数模式和中央对齐模式。
向上计数模式,计数器从0开始,向上自增,计到重装值,清零同时申请中断,然后开始下一轮,依次循环
向下计数模式,从重装值开始,向下自减,减到0之后,回到重装值同时申请中断,然后继续下一轮,依次循环。
中央对齐模式,就是从0开始,先向上自增,计到重装值,申请中断,然后再向下自减,减到0,再申请中断,然后继续下一轮,依次循环。

使用特权

评论回复
7
xiaoqi000|  楼主 | 2024-1-29 16:40 | 只看该作者
内外时钟源选择,对于基本定时器而言,基准计数时钟只能选择内部时钟,也就是系统频率72MHz,而对于通用定时器,时钟源可以选择内部的72MHz时钟,还可以选择外部时钟

TIMx_ETR引脚上的外部时钟。
比如可以在TIM2_ETR(External)引脚(复用在了PA0)上接一个外部方波时钟,然后配置一下内部的极性、边沿检测和预分频器电路,再配置一下输入滤波电路,这些电路可以对外部时钟进行一定整形,因为是外部引脚的时钟,所以难免会有毛刺,所以需要对输入的波形进行滤波。
滤波后的信号
一路ETRF,进入触发控制器,可以直接选择作为时基单元的时钟,或者相对ETR时钟进行计数,把这个定时器当作计数器来使用,就可以配置这一路的电路,在STM32中,这一路也叫做“外部时钟模式2”
一路TRGI,主要是用作触发输入来使用的,可以触发定时器的从模式或者将触发输入作为外部时钟来使用,当TRGI当作外部时钟来使用的时候,这一路就叫做“外部时钟模式1”

使用特权

评论回复
8
xiaoqi000|  楼主 | 2024-1-29 16:40 | 只看该作者
编码器接口,读取正交编码器的输出波形。

主模式输出,可以把定时器内部的一些事件映射到TRGO引脚上,用于触发其他定时器、DAC或者ADC,比如将更新事件映射到TRGO,用于触发DAC。

输出比较电路,总共有4个通道,分别对应CH1到CH4的引脚,可以用于输出PWM波形,驱动电机。

输入捕获电路,总共有4个通道,分别对应CH1到CH4的引脚,可以用于测量输入方波的频率、占空比等。

捕获/比较寄存器,由输入捕获和输出比较电路共用,因为输入捕获和输出比较不能同时使用,所以寄存器和引脚都共用。

使用特权

评论回复
9
xiaoqi000|  楼主 | 2024-1-29 16:40 | 只看该作者
(3)基本定时器

1. 图中向上的折线箭头UI,代表这里会产生中断信号,像这种计数值等于自动重装值产生的中断,一般叫做更新中断,这个更新中断之后会通往NVIC,再配置好NVIC的定时器通道,那定时器的更新中断就能得到CPU的响应了。
2. 向下的箭头U,代表的是会产生一个事件,这里对应的事件就叫做“更新事件”,更新事件不会触发中断,但可以触发内部其他电路的工作。

使用特权

评论回复
10
xiaoqi000|  楼主 | 2024-1-29 16:40 | 只看该作者
基本流程

从基准时钟,到预分频器,再到计数器,计数器计数自增,同时不断地与自动重装载寄存器进行比较,计数值与自动重装值相等时,即更新时间到,这时会产生一个更新中断和更新事件,CPU响应更新中断,就完成了定时中断的任务。

使用特权

评论回复
11
xiaoqi000|  楼主 | 2024-1-29 16:41 | 只看该作者
基本结构

预分频器、计数器和自动重装寄存器,构成了最基本的计数计时电路,将这一块电路称作时基单元。

预分频器之前,连接的是基准计数时钟的输入,由于基本定时器只能选择内部时钟,所以可以直接认为,CK_PSC时钟线直接连到了内部时钟CK_INT上。

内部时钟CK_INT的来源是RCC_TIMxCLK,这里的频率值一般都是系统的主频72MHz,所以通向时基单元的计数基准频率就是72MHz。
预分频器,可以对72MHz的计数时钟进行预分频。

比如这个寄存器写0,就是不分频,或者说1分频,输出频率=输入频率=72MHz。如果预分频器写1,就是2分频,输出频率=输入频率/2=36MHz,以此类推。预分频器的值和实际的分频系数相差了1,即实际分频系数=预分频器的值+1。
16位寄存器,可以写的最大值为216-1=65536,也就是65536分频,对输入的基准频率提前进行一个分频的操作。
计数器,可以对预分频后的计数时钟进行计数,计数时钟每来一个上升沿,计数器的值就+1。

16位寄存器,里面的值可以从0一直加到65535,如果再加的话,计数器就会回到0重新开始。计数器的值在计时过程中会不断地自增运行。当自增运行到目标值时,产生中断,就完成了定时的任务。
自动重装载寄存器,存储目标值

16位寄存器,存储我们写入的计数目标,在运行的过程中,计数值不断自增,自动重装值是固定的,当计数值等于自动重装值时,也就是定时时间到了,就会产生一个中断信号,并且清零计数器。计数器自动开始下一次的计数计时。

使用特权

评论回复
12
xiaoqi000|  楼主 | 2024-1-29 16:41 | 只看该作者
3.主模式触发DAC

- 主从触发模式,可以让内部的硬件在不受程序的控制下实现自动运行,可以减轻CPU的负担。
- 正常情况下,如果想要每隔一段时间触发DAC,就要先设置一个定时器产生中断,每隔一段时间在中断程序中调用代码手动触发一次DAC转换,然后DAC输出,会使主程序处于频繁被中断的状态。会影响主程序的运行和其他中断的响应。

使用特权

评论回复
13
xiaoqi000|  楼主 | 2024-1-29 16:41 | 只看该作者
使用主模式可以把定时器的更新事件,TRGO(Trigger
Out)的位置,然后TRGO直接接到DAC的触发转换引脚上,这样定时器的更新就不需要通过中断来触发DAC转换了。仅需要把更新事件通过主模式映射到TRGO,然后TRGO就会直接去触发DAC了。整个过程不需要软件的参与,实现了硬件的自动化,这就是主模式的作用。

使用特权

评论回复
14
xiaoqi000|  楼主 | 2024-1-29 16:41 | 只看该作者
4.定时中断基本结构
PSC预分频器、CNT计数器、ARR自动重装载寄存器构成的时基单元。

运行控制,表示控制寄存器的一些位,比如启动停止,向上和向下计数等等,操作这些寄存器就能控制时基单元的运行了。

可选时钟源

RCC提供的内部时钟 (内部时钟模式)

ETR引脚提供的外部时钟 (外部时钟模式2)

触发输入(TRGI)作为外部时钟 (外部时钟模式1)

ETR外部时钟
ITRx其他定时器
TIx输入捕获通道
编码器模式

使用特权

评论回复
15
xiaoqi000|  楼主 | 2024-1-29 16:42 | 只看该作者
产生更新中断,中断信号会先在状态寄存器里置一个中断标志位,这个标志位会通过中断输出控制,到NVIC申请中断。

中断输出控制,由于定时器模块很多地方都要申请中断,比如更新要申请中断,触发信号也要申请中断,输入捕获和输出比较匹配时也会申请中断,这些中断都要经过中断输出控制,如果需要这个中断,就允许,如果不要这个中断,就禁止。中断输出控制就是一个中断输出的允许位。


使用特权

评论回复
16
xiaoqi000|  楼主 | 2024-1-29 16:42 | 只看该作者
5.预分频器时序
基本定义

CK_PSC,表示预分频器的输入时钟。
CNT_EN,计数器使能,高电平计数器正常运行,低电平计数器停止。
CK_CNT,计数器时钟,既是预分频器的时钟输出,也是计数器的时钟输入。

使用特权

评论回复
17
xiaoqi000|  楼主 | 2024-1-29 16:42 | 只看该作者
基本流程

开始时,计数器未使能,计数器时钟不运行。
使能后,前半段,预分频器系数为1(1分频),计数器的时钟等于预分频器前的时钟,后半段,预分频器系数变为2(2分频),计数器的时钟就也变为预分频器前时钟的一半了。
在计数器时钟的驱动下,下面的计数器寄存器也跟随时钟的上升沿不断自增,在计数值到达FC(ARR自动重装值)之后,计数值变为0。当计数值计到和重装值相等,并且下一个时钟来临时,计数值才清零。同时产生一个更新事件。

使用特权

评论回复
18
xiaoqi000|  楼主 | 2024-1-29 16:42 | 只看该作者
缓冲机制

预分频寄存器实际上有两个,预分频控制寄存器只供读写用,并不直接决定分频系数。
缓冲寄存器(也叫做影子寄存器),才是真正起作用的寄存器
比如在某个时刻,把预分频寄存器由0改成1,如果在此时立刻改变时钟的分频系数,就会导致,在一个计数周期内,前半部分和后半部分的频率不一样,计数记到一半,计数频率突然就改变了,虽然一般不会有什么太大影响。
缓冲寄存器,使得我们在计数计到一半的时候改变了分频值,但是这个变化并不会立刻生效,而是会等到本次计数周期结束时,产生了更新事件,预分频寄存器的值才会被传递到缓冲寄存器里面去,此时才会生效。所以,有了缓冲机制,即使我们在计数中途改变了预分频值,计数频率仍然会保持为原来的频率,直到本轮计数完成,在下一轮计数时,改变后的分频值才会起作用。
预分频计数器内部实际上也是靠计数来完成分频的,当预分频值为0时,计数器就一直为0,直接输出原频率,当预分频值为1时,计数器就0、1、0、1这样计数,在回到0
的时候,输出一个脉冲,这样输出频率就是输入频率的2分频。

使用特权

评论回复
19
xiaoqi000|  楼主 | 2024-1-29 16:42 | 只看该作者

使用特权

评论回复
20
xiaoqi000|  楼主 | 2024-1-29 16:42 | 只看该作者
6.计时器时序
基本定义

CK_INT 内部时钟72MHz
CNT_EN 时钟使能,高电平启动
CK_CNT 计数器时钟,这里分频系数为2,2分频

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

741

帖子

0

粉丝