高档操控定时器(TIM1 和TIM8)
TIM1和TIM8定时器的功用包含:
● 16位向上、向下、向上/ 下主动装载计数器
● 16位可编程( 能够实时修正)预分频器,计数器时钟频率的分频系数为1~65535 之间的恣意数值
● 多达4个独立通道:
─ 输入捕获
─ 输出比较
─ PWM生成(边际或中心对齐形式)
─ 单脉冲形式输出
● 死区时刻可编程的互补输出
●运用外部信号操控定时器和定时器互联的同步电路
● 答应在指定数目的计数器周期之后更新定时器寄存器的重复计数器
● 刹车输入信号能够将定时器输出信号置于复位状况或许一个已知状况
● 如下事情发生时发生中止/DMA :
─ 更新:计数器向上溢出/ 向下溢出,计数器初始化(经过软件或许内部/ 外部触发)
─ 触发事情(计数器发动、中止、初始化或许由内部/ 外部触发计数)
─ 输入捕获
─ 输出比较
─ 刹车信号输入
● 支撑针对定位的增量(正交)编码器和霍尔传感器电路
● 触发输入作为外部时钟或许按周期的电流办理
通用定时器(TIMx)
通用TIMx (TIM2、TIM3、TIM4和TIM5)定时器功用包含:
● 16位向上、向下、向上/ 向下主动装载计数器
● 16位可编程( 能够实时修正)预分频器,计数器时钟频率的分频系数为1~65536 之间的恣意数值
● 4个独立通道:
─ 输入捕获
─ 输出比较
─ PWM生成(边际或中心对齐形式)
─ 单脉冲形式输出
● 运用外部信号操控定时器和定时器互连的同步电路
● 如下事情发生时发生中止/DMA :
─ 更新:计数器向上溢出/ 向下溢出,计数器初始化(经过软件或许内部/ 外部触发)
─ 触发事情(计数器发动、中止、初始化或许由内部/ 外部触发计数)
─ 输入捕获
─ 输出比较
● 支撑针对定位的增量(正交)编码器和霍尔传感器电路
● 触发输入作为外部时钟或许按周期的电流办理
根本定时器(TIM6 和TIM7)
TIM6和TIM7定时器的主要功用包含:
● 16位主动重装载累加计数器
● 16位可编程( 可实时修正)预分频器,用于对输入的时钟按系数为1~65536 之间的恣意数值
分频
● 触发DAC的同步电路
● 在更新事情(计数器溢出)时发生中止/DMA 恳求
STM32的通用定时器是一个经过可编程预分频器(PSC)驱动的16 位主动装载计数器(CNT)构成。STM32的通用定时器能够被用于:丈量输入信号的脉冲长度(输入捕获)或许发生输出波形(输出比较和PWM)等。 运用定时器预分频器和RCC时钟操控器预分频器,脉冲长度和波形周期能够在几个微秒到几个毫秒间调整。STM32的每个通用定时器都是彻底独立的,没有相互同享的任何资源。
留意单元模块时钟总线
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是运用微处理器的数字输出来对模仿电路进行操控的一种十分有用的技能。简略一点,便是对脉冲宽度的操控。STM32的定时器除了TIM6和7。其他的定时器都能够用来发生PWM输出。其间高档定时器TIM1和TIM8能够一起发生多达7路的PWM输出。而通用定时器也能一起发生多达4路的PWM输出,这样,STM32最多能够一起发生30路PWM输出!
要使STM32的通用定时器TIMx发生PWM输出,除了定时器介绍的寄存器外,咱们还会用到3 个寄存器,来操控PWM 的。这三个寄存器别离是:捕获/比较形式寄存器(TIMx_CCMR1/2)、捕获/比较使能寄存器(TIMx_CCER)、捕获/比较寄存器(TIMx_CCR1~4)。
TIM3_CH2默许是接在PA7面的,而咱们的DS0接在PB5上面,假如一般MCU,或许就只能用飞线把PA7飞到PB5上来完结了,不过,咱们用的是STM32,它比较高档,能够经过重映射功用,把TIM3_CH2映射到PB5上。 STM32的重映射操控是由复用重映射和调试IO 装备寄存器(AFIO_MAPR)操控的。
1)敞开TIM3时钟以及复用功用时钟,装备PB5为复用输出。
要运用TIM3,咱们必须先敞开TIM3的时钟,还要装备PB5为复用输出,这是由于TIM3_CH2通道将重映射到PB5上,此刻,PB5归于复用功用输出。
库函数使能TIM3时钟的办法是:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟
库函数设置AFIO时钟的办法是:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //复用时钟使能
设置PB5为复用功用输出的办法:GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
2)设置TIM3_CH2重映射到PB5上。
由于TIM3_CH2默许是接在PA7上的,所以咱们需求设置TIM3_REMAP为部分重映射(经过AFIO_MAPR装备),让TIM3_CH2重映射到PB5上面。在库函数函数里边设置重映射的函数是:
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
STM32重映射只能重映射到特定的端口。第一个进口参数能够理解为设置重映射的类型,比方TIM3部分重映射进口参数为 GPIO_PartialRemap_TIM3,这点能够望文生义了。所以TIM3部分重映射的库函数完结办法是: GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
3)初始化TIM3,设置TIM3的ARR和PSC。
在敞开了TIM3的时钟之后,咱们要设置ARR和PSC两个寄存器的值来操控输出PWM的周期。当PWM周期太慢(低于50Hz)的时分,咱们就会显着感觉到闪耀了。因而,PWM周期在这儿不宜设置的太小。这在库函数是经过TIM_TimeBaseInit函数完结的,在上一节定时器中止章节咱们现已有解说,这儿就不具体解说,调用的格局为:
TIM_TimeBaseStructure.TIM_Period = arr; //设置主动重装载值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟切割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数形式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //依据指定的参数初始化TIMx的
4)设置TIM3_CH2的PWM形式,使能TIM3的CH2输出。
接下来,咱们要设置TIM3_CH2为PWM形式(默许是冻住的),由于咱们的DS0是低电平亮,而咱们期望当CCR2的值小的时分,DS0就暗,CCR2值大的时分,DS0就亮,所以咱们要经过装备TIM3_CCMR1的相关位来操控TIM3_CH2的形式。在库函数中,PWM通道设置是经过函数TIM_OC1Init()~TIM_OC4Init()来设置的,不同的通道的设置函数不一样,这儿咱们运用的是通道2,所以运用的函数是TIM_OC2Init()。
void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
5)使能TIM3。
在完结以上设置了之后,咱们需求使能TIM3。使能TIM3的办法前面现已解说过: TIM_Cmd(TIM3, ENABLE); //使能TIM3
6)修正TIM3_CCR2来操控占空比。
最终,在经过以上设置之后,PWM其实现已开端输出了,仅仅其占空比和频率都是固定的,而咱们经过修正TIM3_CCR2则能够操控CH2的输出占空比。继而操控DS0的亮度。 在库函数中,修正TIM3_CCR2占空比的函数是:
void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2); 天经地义,关于其他通道,别离有一个函数姓名,函数格局为TIM_SetComparex(x=1,2,3,4)。
经过以上6个过程,咱们就能够操控TIM3的CH2输出PWM波了。