完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
前言
上一篇说了基本定时器。本篇讲讲通用定时器。 通用定时器有TIM2/3/4/5。功能就复杂多了: 除了具备基本的定时外, 主要用于测量脉冲的频率和脉冲的宽度以及输出PWM。这些下面的程序都会有。 还具备编码器接口。每个通用定时器都是相互独立的。 高级控制定时器(TIM1 和 TIM8)和通用定时器在基本定时器的基础上引入了外部引脚,可以实现输入捕获和输出比较功能。高级控制定时器比通用定时器增加了可编程死区互补输出、重复计数器、带刹车(断路)功能,这些功能都是针对工业电机控制方面。这几个功能在本书不做详细的介绍,主要介绍常用的输入捕获和输出比较功能。 高级控制定时器时基单元包含一个 16 位自动重装载寄存器 ARR,一个 16 位的计数器CNT,可向上/下计数,一个 16 位可编程预分频器 PSC,预分频器时钟源有多种可选,有内部的时钟、外部时钟。还有一个 8 位的重复计数器 RCR,这样最高可实现 40 位的可编程定时。 1.通用定时器结构 1.1 时钟源 有四个时钟源可选: 内部时钟源 CK_INT 外部时钟模式 1:外部输入捕获引脚 TIx(x=1,2,3,4),来自外部输入捕获引脚上的边沿信号,计数器可以在选定的输入端(引脚1:TI1FP1或TIF_ED,引脚2:TI2FP2)每个上升沿或下降沿计数。 外部时钟模式 2:外部触发输入 ETR,计数器能在外部输入ETR的每个上升沿或下降沿计数。 内部触发输入(ITRx),来自芯片内部其他定时器的出发输入,使用一个定时器作为另一个定时器的预分频器。 1.2 控制器 控制器部分包括触发控制器、从模式控制器以及编码器接口。触发控制器用来针对片内外设输出触发信号,比如为其它定时器提供时钟和触发 DAC/ADC 转换。 编码器接口专门针对编码器计数而设计。从模式控制器可以控制计数器复位、启动,递增/递减、计数。有关控制器部分只需熟练阅读寄存器描述即可。 1.3 时基单元 时基单元功能包括四个寄存器,分别是计数器寄存器(CNT)、预分频器寄存器(PSC)、自动重载寄存器(ARR)和重复计数器寄存器(RCR)。其中重复计数器 RCR 是高级定时器独有,通用和基本定时器没有。 前面三个寄存器都是 16 位有效,TIMx_RCR寄存器是 8 位有效。 1.3.1 计数器 CNT 及其计数模式 计数器有三种计数模式,分别为递增计数模式、递减计数模式和递增/递减(中心对齐)计数模式。 1.递增计数 这和基本定时器功能一样。如果禁用重复计数器,在计数器生成上溢事件就马上生成更新事件(UEV);如果使能重复计数器,每生成一次上溢事件重复计数器内容就减 1,直到重复计数器内容为 0 时才会生成更新事件。 2.递减计数 计数器从自动重载寄存器 ARR 值开始计数,每来一个 CK_CNT 脉冲计数器就减 1,直到计数器值为 0,然后计数器又从自动重载寄存器 ARR 值开始递减计数并生成计数器下溢事件,计数器总是如此循环计数。 如果禁用重复计数器,在计数器生成下溢事件就马上生成更新事件;如果使能重复计数器,每生成一次下溢事件重复计数器内容就减 1,直到重复计数器内容为 0 时才会生成更新事件。 3.中心对齐模式下,计数器从 0 开始递增计数,直到计数值等于(ARR-1)值生成计数器上溢事件,然后从 ARR 值开始递减计数直到 1 生成计数器下溢事件。然后又从 0 开始计数,如此循环。每次发生计数器上溢和下溢事件都会生成更新事件。 1.3.2 自动重载寄存器 ARR 自动重载寄存器 ARR 用来存放与计数器 CNT 比较的值,如果两个值相等就递减重复 计数器。可以通过 TIMx_CR1 寄存器的 ARPE 位控制自动重载影子寄存器功能,如果ARPE 位置 1,自动重载影子寄存器有效,只有在事件更新时才把 TIMx_ARR 值赋给影子寄存器。如果 ARPE 位为 0,则修改 TIMx_ARR 值马上有效。 1.3.3 重复计数器 RCR(高级) 在基本/通用定时器发生上/下溢事件时直接就生成更新事件,但对于高级控制定时器 却不是这样,高级控制定时器在硬件结构上多出了重复计数器,在定时器发生上溢或下溢事件是递减重复计数器的值,只有当重复计数器为 0 时才会生成更新事件。在发生 N+1 个上溢或下溢事件(N 为 RCR 的值)时产生更新事件。 1.4 输入捕获 输入捕获可以对输入的信号的上升沿,下降沿或者双边沿进行捕获,常用的有测量输 入信号的脉宽和测量 PWM 输入信号的频率和占空比这两种。输入捕获的大概的原理就是,当捕获到信号的跳变沿的时候,把计数器 CNT 的值锁存到捕获寄存器 CCR 中,把前后两次捕获到的 CCR 寄存器中的值相减,就可以算出脉宽或者频率。如果捕获的脉宽的时间长度超过你的捕获定时器的周期,就会发生溢出,这个我 们需要做额外的处理。 1.4.1 输入通道 需要被测量的信号从定时器的外部引脚 TIMx_CH1/2/3/4 进入,通常叫 TI1/2/3/4,在后面的捕获讲解中对于要被测量的信号我们都以 TIx 为标准叫法。 1.5 输出比较 输出比较就是通过定时器的外部引脚对外输出控制信号,有冻结、将通道 X (x=1,2,3,4)设置为匹配时输出有效电平、将通道 X 设置为匹配时输出无效电平、翻转、强制变为无效电平、强制变为有效电平、 PWM1 和 PWM2 这八种模式,具体使用哪种模式由寄存器 CCMRx 的位 OCxM[2:0]配置。 其中 PWM 模式是输出比较中的特例,使用的也最多。 输出比较的输出信号最终是通过定时器的外部 IO 来输出的,分别为 CH1/2/3/4,其中前面三个通道还有互补的输出通道 CH1/2/3N。更加详细的 IO 说明还请查阅相关的数据手册。 1.6 断路功能(高级) 断路功能就是电机控制的刹车功能,使能断路功能时,根据相关控制位状态修改输出信号电平。在任何情况下, OCx 和 OCxN 输出都不能同时为有效电平,这关系到电机控制常用的 H 桥电路结构原因。 断路源可以是时钟故障事件,由内部复位时钟控制器中的时钟安全系统(CSS)生成,也可以是外部断路输入 IO,两者是或运算关系。 系统复位启动都默认关闭断路功能,将断路和死区寄存器(TIMx_BDTR)的 BKE 为置 1,使能断路功能。可通过 TIMx_BDTR 寄存器的 BKP 位设置设置断路输入引脚的有效电平,设置为 1 时输入 BRK 为高电平有效,否则低电平有效。 发送断路时,将产生以下效果: TIMx_BDTR 寄存器中主输出模式使能(MOE)位被清零,输出处于无效、空闲或 复位状态; 根据相关控制位状态控制输出通道引脚电平;当使能通道互补输出时,会根据情 况自动控制输出通道电平; 将 TIMx_SR 寄存器中的 BIF 位置 1,并可产生中断和 DMA 传输请求。 如果 TIMx_BDTR 寄存器中的 自动输出使能(AOE)位置 1,则 MOE 位会在发生下 一个 UEV 事件时自动再次置 1。 2.输入捕获应用 输入捕获一般应用在两个方面,一个方面是脉冲跳变沿时间测量,另一方面是 PWM输入测量。 2.1 测量频率 当捕获通道 TIx 上出现上升沿时,发生第一次捕获,计数器 CNT 的值会被锁存到捕获寄存器 CCR 中,而且还会进入捕获中断,在中断服务程序中记录一次捕获(可以用一个标志变量来记录),并把捕获寄存器中的值读取到 value1 中。当出现第二次上升沿时,发生第二次捕获,计数器 CNT 的值会再次被锁存到捕获寄存器 CCR 中,并再次进入捕获中断,在捕获中断中,把捕获寄存器的值读取到 value3 中,并清除捕获记录标志。利用 value3 和value1 的差值我们就可以算出信号的周期(频率)。 2.2 测量脉宽 当捕获通道 TIx 上出现上升沿时,发生第一次捕获,计数器 CNT 的值会被锁存到捕获寄存器 CCR 中,而且还会进入捕获中断,在中断服务程序中记录一次捕获(可以用一个标志变量来记录),并把捕获寄存器中的值读取到 value1 中。然后把捕获边沿改变为下降沿捕获,目的是捕获后面的下降沿。当下降沿到来的时候,发生第二次捕获,计数器 CNT 的值会再次被锁存到捕获寄存器 CCR 中,并再次进入捕获中断,在捕获中断中,把捕获寄存器的值读取到 value3 中,并清除捕获记录标志。然后把捕获边沿设置为上升沿捕获。 在测量脉宽过程中需要来回的切换捕获边沿的极性,如果测量的脉宽时间比较长,定时器就会发生溢出,溢出的时候会产生更新中断,我们可以在中断里面对溢出进行记录处理。 2.3 PWM 输入模式 测量脉宽和频率还有一个更简便的方法就是使用 PWM 输入模式,该模式是输入捕获的特例,只能使用通道 1 和通道 2, 通道 3 和通道 4 使用不了。与上面那种只使用一个捕获寄存器测量脉宽和频率的方法相比, PWM 输入模式需要占用两个捕获寄存器。 当使用 PWM 输入模式的时候,因为一个输入通道(TIx)会占用两个捕获通道(ICx),所以一个定时器在使用 PWM 输入的时候最多只能使用两个输入通道(TIx)。 我们以输入通道 TI1 工作在 PWM 输入模式为例来讲解下具体的工作原理,其他通道 以此类推即可。 PWM 信号由输入通道 TI1 进入,因为是 PWM 输入模式的缘故,信号会被分为两路,一路是 TI1FP1,另外一路是 TI2FP2。其中一路是周期,另一路是占空比,具体哪一路信号对应周期还是占空比,得从程序上设置哪一路信号作为触发输入,作为触发输入的哪一路信号对应的就是周期,另一路就是对应占空比。作为触发输入的那一路信号还需要设置极性,是上升沿还是下降沿捕获,一旦设置好触发输入的极性,另外一路硬件就会自动配置为相反的极性捕获,无需软件配置。一句话概括就是:选定输入通道,确定触发信号,然后设置触发信号的极性即可,因为是 PWM 输入的缘故,另一路信号则由硬件配置,无需软件配置。 当使用 PWM 输入模式的时候必须将从模式控制器配置为复位模式(配置寄存器SMCR 的位 SMS[2:0]来实现),即当我们启动触发信号开始进行捕获的时候,同时把计数器 CNT 复位清零。 2.4 时序图分析 PWM 输入模式 PWM 信号由输入通道 TI1 进入,配置 TI1FP1 为触发信号,上升沿捕获。当上升沿的时候 IC1 和 IC2 同时捕获,计数器 CNT 清零,到了下降沿的时候, IC2 捕获,此时计数器CNT 的值被锁存到捕获寄存器 CCR2 中,到了下一个上升沿的时候, IC1 捕获,计数器CNT 的值被锁存到捕获寄存器 CCR1 中。其中 CCR2+1 测量的是脉宽, CCR1+1 测量的是周期。 这里要注意的是 CCR2 和 CCR1 的值在计算占空比和频率的时候都必须加 1, 因为计数器是从 0 开始计数的。 从软件上来说,用 PWM 输入模式测量脉宽和周期更容易,付出的代价是需要占用两 个捕获寄存器. 3. 输出比较应用 输出比较模式总共有 8 种,具体的由寄存器 CCMRx 的位 OCxM[2:0]配置。我们这里只讲解最常用的 PWM 模式,其他几种模式具体的看数据手册即可。 PWM 输出就是对外输出脉宽(即占空比)可调的方波信号,信号频率由自动重装寄 存器 ARR 的值决定,占空比由比较寄存器 CCR 的值决定。 PWM 模式分为两种, PWM1 和 PWM2,总得来说是差不多,就看你怎么用而已,具体的区别见表 以 PWM1 模式来讲解。 以计数器 CNT 计数的方向不同还分为边沿对齐模式和中心对齐模式。 PWM 信号主要都是用来控制电机,一般的电机控制用的都是边沿对齐模式, FOC 电机一般用中心对齐模式。我们这里只分析这两种模式在信号感官上(即信号波形)的区别,具体在电机控制中的区别不做讨论,到了你真正需要使用的时候就会知道了。 3.1 PWM 边沿对齐模式 在递增计数模式下,计数器从 0 计数到自动重载值( TIMx_ARR 寄存器的内容),然后重新从 0 开始计数并生成计数器上溢事件 在边沿对齐模式下,计数器 CNT 只工作在一种模式,递增或者递减模式。这里我们以CNT 工作在递增模式为例,在中, ARR=8, CCR=4, CNT 从 0 开始计数,当 CNT 3.2 PWM 中心对齐模式 在中心对齐模式下, 计数器 CNT 是工作做递增/递减模式下。开始的时候, 计数器CNT 从 0 开始计数到自动重载值减 1(ARR-1),生成计数器上溢事件;然后从自动重载值开始向下计数到 1 并生成计数器下溢事件。之后从 0 开始重新计数。 图 是 PWM1 模式的中心对齐波形, ARR=8, CCR=4。第一阶段计数器 CNT 工 作在递增模式下,从 0 开始计数,当 CNT 在波形图上我们把波形分为两个阶段,第一个阶段是计数器 CNT 工作在递增模式的波形,这个阶段我们又分为①和②两个阶段,第二个阶段是计数器 CNT 工作在递减模式的波形,这个阶段我们又分为③和④两个阶段。 要说中心对齐模式下的波形有什么特征的话,那就是①和③阶段的时间相等,②和④阶段的时间相等。 中心对齐模式又分为中心对齐模式 1/2/3 三种,具体由寄存器 CR1 位 CMS[1:0]配置。 具体的区别就是比较中断中断标志位 CCxIF 在何时置 1:中心模式 1 在 CNT 递减计数的时候置 1,中心对齐模式 2 在 CNT 递增计数时置 1,中心模式 3 在 CNT 递增和递减计数时都置 1 4.定时器初始化结构体 4.1 TIM_TimeBaseInitTypeDef 在基本定时器章节中已经说过。 4.2 TIM_OCInitTypeDef 输出比较结构体 TIM_OCInitTypeDef 用于输出比较模式,与 TIM_OCxInit 函数配合使用完成指定定时器输出通道初始化配置。 高级控制定时器有四个定时器通道,使用时都必须单独设置。 typedef struct { uint16_t TIM_OCMode; // 比较输出模式 uint16_t TIM_OutputState; // 比较输出使能 uint16_t TIM_OutputNState; // 比较互补输出使能 uint32_t TIM_Pulse; // 脉冲宽度 uint16_t TIM_OCPolarity; // 输出极性 uint16_t TIM_OCNPolarity; // 互补输出极性 uint16_t TIM_OCIdleState; // 空闲状态下比较输出状态 uint16_t TIM_OCNIdleState; // 空闲状态下比较互补输出状态 } TIM_OCInitTypeDef; 1.比较输出模式选择,总共有八种,常用的为 PWM1/PWM2。它设定CCMRx 寄存器 OCxM[2:0]位的值。 2.比较输出使能,决定最终的输出比较信号 OCx 是否通过外部引脚输出。它设定 TIMx_CCER 寄存器 CCxE/CCxNE 位的值。 3.TIM_OutputNState:比较互补输出使能,决定 OCx 的互补信号 OCxN 是否通过外部引脚输出。它设定 CCER 寄存器 CCxNE 位的值。 4.比较输出脉冲宽度,实际设定比较寄存器 CCR 的值,决定脉冲宽度。可设置范围为 0 至 65535 5.比较输出极性,可选 OCx 为高电平有效或低电平有效。它决定着定时器通道有效电平。它设定 CCER 寄存器的 CCxP 位的值。 6.比较互补输出极性,可选 OCxN 为高电平有效或低电平有效。它设定 TIMx_CCER 寄存器的 CCxNP 位的值。 7.空闲状态时通道输出电平设置,可选输出 1 或输出 0,即在空闲状态(BDTR_MOE 位为 0)时,经过死区时间后定时器通道输出高电平或低电平。它设定CR2 寄存器的 OISx 位的值。 8.空闲状态时互补通道输出电平设置,可选输出 1 或输出 0,即在空闲状态(BDTR_MOE 位为 0)时,经过死区时间后定时器互补通道输出高电平或低电平,设定值必须与 TIM_OCIdleState 相反。它设定是 CR2 寄存器的 OISxN 位的值。 4.3 TIM_ICInitTypeDef 输入捕获结构体 TIM_ICInitTypeDef 用于输入捕获模式,与 TIM_ICInit 函数配合使用完成定时器输入通道初始化配置。如果使用 PWM 输入模式需要与 TIM_PWMIConfig 函数配合使用完成定时器输入通道初始化配置。 typedef struct { uint16_t TIM_Channel; // 输入通道选择 uint16_t TIM_ICPolarity; // 输入捕获触发选择 uint16_t TIM_ICSelection; // 输入捕获选择 uint16_t TIM_ICPrescaler; // 输入捕获预分频器 uint16_t TIM_ICFilter; // 输入捕获滤波器} TIM_ICInitTypeDef; 1.捕获通道 ICx 选择,可选 TIM_Channel_1、 TIM_Channel_2、TIM_Channel_3 或 TIM_Channel_4 四个通道。它设定 CCMRx 寄存器 CCxS 位 的值。 2.输入捕获边沿触发选择,可选上升沿触发、下降沿触发或边沿跳变触发。它设定 CCER 寄存器 CCxP 位和 CCxNP 位的值。 3.输入通道选择,捕获通道 ICx 的信号可来自三个输入通道,分别为TIM_ICSelection_DirectTI、 TIM_ICSelection_IndirectTI 或 TIM_ICSelection_TRC,具体的区别见图。如果是普通的输入捕获, 4 个通道都可以使用,如果是 PWM 输入则只能使用通道 1 和通道 2。 它设定 CCRMx 寄存器的 CCxS[1:0]位的值。 4.输入捕获通道预分频器,可设置 1、 2、 4、 8 分频,它设定 CCMRx寄存器的 ICxPSC[1:0]位的值。如果需要捕获输入信号的每个有效边沿,则设置 1 分频即可 5.输入捕获滤波器设置,可选设置 0x0 至 0x0F。它设定 CCMRx 寄存器ICxF[3:0]位的值。一般我们不使用滤波器,即设置为 0。 4.4 TIM_BDTRInitTypeDef(高级) 断路和死区结构体 TIM_BDTRInitTypeDef 用于断路和死区参数的设置,属于高级定时器专用,用于配置断路时通道输出状态,以及死区时间。它与 TIM_BDTRConfig 函数配置使用完成参数配置。 这个结构体的成员只对应 BDTR 这个寄存器,有关成员的具体使用配置请参考手册 BDTR 寄存器的详细描述。 typedef struct { uint16_t TIM_OSSRState; // 运行模式下的关闭状态选择 uint16_t TIM_OSSIState; // 空闲模式下的关闭状态选择 uint16_t TIM_LOCKLevel; // 锁定配置 uint16_t TIM_DeadTime; // 死区时间 uint16_t TIM_Break; // 断路输入使能控制 uint16_t TIM_BreakPolarity; // 断路输入极性 uint16_t TIM_AutomaticOutput; // 自动输出使能} TIM_BDTRInitTypeDef;
这一篇是我文章中篇幅最大的,介绍了通用计时器和高级计时器。 下一篇我们将有很多关于这个的实验: 1.脉宽测量 2.pwm输出 3.pwm互补输出 4.pwm捕获测量频率脉宽 5.利用定时器进行电容按键检测 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1712 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1600 浏览 1 评论
1038 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
715 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1651 浏览 2 评论
1903浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
694浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
546浏览 3评论
567浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
535浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-12 06:14 , Processed in 0.654733 second(s), Total 49, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号