STM32三种定时器:高级控制定时器(TIM1与TIM8)、通用定时器(TIM2~TIM5)、基本定时器(TIM6与TIM7)。
TIM1与TIM8定时器的功能
(1)16位向上、向下、向上/下自动装载计数器
(2)16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值
(3)多达4个独立通道:
─ 输入捕获
─ 输出比较
─ PWM生成(边缘或中间对齐模式)
─ 单脉冲模式输出
(4)死区时间可编程的互补输出
(5)使用外部信号控制定时器和定时器互联的同步电路
(6)允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器
(7)刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态
(8)如下事件发生时产生中断/DMA:
─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
─ 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
─ 输入捕获
─ 输出比较
─ 刹车信号输入
(9)支持针对定位的增量(正交)编码器和霍尔传感器电路
(10)触发输入作为外部时钟或者按周期的电流管理
TIM2~TIM5定时器基本功能
(1)16位向上、向下、向上/向下自动装载计数器
(2)16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值
(3)4个独立通道:
─ 输入捕获
─ 输出比较
─ PWM生成(边缘或中间对齐模式)
─ 单脉冲模式输出
(4)使用外部信号控制定时器和定时器互连的同步电路
(5)如下事件发生时产生中断/DMA:
─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
─ 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
─ 输入捕获
─ 输出比较
─ 支持针对定位的增量(正交)编码器和霍尔传感器电路
─ 触发输入作为外部时钟或者按周期的电流管理
TIM6与TIM7定时器的基本功能:
(1)16位自动装载累加计数器
(2)16位可编程(可实时修改)预分频器,用于对输入的时钟按系数为1~65535之间的任意数值分频
(3)触发DAC的同步电路
(4)在更新事件(计数器溢出)时产生中断/DMA请求
上面的3中定时器可以看到,基本定时器TIM6与TIM7好型纯粹做定时用,通用定时器与高级定时器则可以完成其他操作,像输入捕获、输出比较、PWM波生成等。
各定时器通道对应的引脚:
TIM1与TIM8高级定时器通道引脚:
通道1 | TIM1_CH1 | PA8 |
通道1 | TIM1_CH1N | PB13 |
通道2 | TIM1_CH2 | PA9 |
通道2 | TIM1_CH2N | PB14 |
通道3 | TIM1_CH3 | PA10 |
通道3 | TIM1_CH3N | PB15 |
通道4 | TIM1_CH4 | PA11 |
TIM1除了上面的基本通道外,它还有TIM1_ETR与TIM1_BKIN两个功能。TIM1_ETR是外部触发输入引脚;TIM1_BKIN是故障信号(如果他对应的引脚是高电平),则关闭TIM1的输出,。它们对应的引脚如下:
外部触发输入 | TIM1_ETR | PA12 |
故障信号 | TIM1_BKIN | PB12 |
通道1 | TIM8_CH1 | PC6 |
通道1 | TIM8_CH1N | PA7 |
通道2 | TIM8_CH2 | PC7 |
通道2 | TIM8_CH2N | PB0 |
通道3 | TIM8_CH3 | PC8 |
通道3 | TIM8_CH3N | PB1 |
通道4 | TIM8_CH4 | PC9 |
TIM8跟TIM1一样,也有TIM8_ETR与TIM8_BKIN这两个功能,对应的引脚如下:
外部触发输入 | TIM8_ETR | PA0 |
故障信号 | TIM8_BKIN | PA6 |
TIM2~TIM5通过用定时器通道引脚:
通道1 | TIM2_CH1 | PA0 |
通道2 | TIM2_CH2 | PA1 |
通道3 | TIM2_CH3 | PA2 |
通道3 | TIM2_CH4 | PA3 |
通道1 | TIM3_CH1 | PA6 |
通道2 | TIM3_CH2 | PA7 |
通道3 | TIM3_CH3 | PB0 |
通道4 | TIM3_CH4 | PB1 |
通道1 | TIM4_CH1 | PB6 |
通道2 | TIM4_CH2 | PB7 |
通道3 | TIM4_CH3 | PB8 |
通道 4 | TIM4_Ch4 | PB9 |
通道1 | TIM5_CH1 | PA0 |
通道2 | TIM5_CH2 | PA1 |
通道3 | TIM5_CH3 | PA2 |
通道4 | TIM5_CH4 | PA3 |
上面的定时器对应的引脚只能说是一般情况下是这样的,如果考虑定时器复用功能重映射的话,则会有些出入,在《参考手册》中列出了一些定时器重映射的引脚,如下面几张图片所示:
TIM6与TIM7基本定时器,在芯片上没有对用的引脚,因为它只做定时用。
根据上面定时器的通道与引脚,可以知道这些定时器用作PWM输出时,TIM1与TIM8可以各输出7路PWM波,而TIM2~TIM5则可以各输出4路PWM波,TIM6与TIM7无法输出PWM波。其中TIM1与TIM8的7路PWM波中可以有3对互补PWM波,所谓的互补就是生成的PWM波极性相反 ,如TIM1_CH1输出为高电平时,TIM1_CH1N输出为低电平。互补PWM波代码中是这样实现的,如下参考代码:
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR1_Val; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; TIM_OC1Init(TIM1, &TIM_OCInitStructure);
可以看到,在配置PWM波时,TIM1_CH1与TIM1_CH1N的一些特性都相反,这样的话才能输出互补的PWM波。TIM1与TIM8成为高级定时器,它们像是专门为控制电机而设定的,两路互补信号正好控制电机驱动器中的H桥通道,而且还可以自由地控制死区时间。死区的概念:TIM1与TIM8输出两路互补信号,输出的瞬时关断与接通的这段时间就叫做死区。看下面的一个关于死区的信号图:
第一条信号是参考信号,第二条比如说是TIM_CH1输出的信号,第三条是TIM1_CH1N输出的信号。图中可以看到,TIM1_CH1与TIM1_CH1N两条输出信号的在电平变化的地方相差delay的延时时间,这个delay就叫做死区时间。为什么要有死区这个配置呢?可以联系实际,在H桥整流电路中,如果带有死区的信号来控制H桥的开关,那么就可以保证H桥的稳定的工作,而不会出现在开关瞬间而导致的短路现象。
OCMode的六种模式:
TIM_OCMode | 函数库描述 | 解释 |
TIM_OCMode_Timing | TIM输出比较时间模式 | 冻结,输出比较不起作用 |
TIM_OOCMode_Active | TIM输出比较主动模式 | 当比较发生时,强制输出高电平 |
TIM_OCMode_Inactiive | TIM输出比较非主动模式 | 当比较发生时,强制输出低电平 |
TIM_OCMode_Toggle | TIM输出比较触发模式 | 当比较发生时,输出翻转 |
TIM_OCMode_PWM1 | TIM脉冲宽度调制模式1 | PWM1 |
TIM_OCMode_PWM2 | TIM脉冲宽度调制模式2 | PWM2 |
下面一段代码:
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OCMode_PWM1与TIM_OCMode_PWM2的区别:
TIM_OCMode_PWM1模式下:在增计数时,定时器的计数值TIMx_CNT定时器的计数值TIMx_CNT>CCCR1_Val为有效电平,否则为无效电平。
TIM_OCMode_PWM2模式下:在增计数时,定时器的计数值TIMx_CNT定时器的计数值TIMx_CNT>CCCR1_Val为无效电平,否则为有效电平。
有效与无效电平由TIM_OCInitStructure.TIM_OCPolarity决定:
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High 则高电平为有效电平,低电平为无效电平。
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low 则高电平为有效电平,低电平为无效电平。
如果配置成TIM_OCMode_Timing模式的话,则冻结,输出比较不起作用,当输出比较的计数值TIMx_CNT==CCR1_Val时,对参考信号OC1REF不起作用。
如果配置成TIM_OOCMode_Active模式的话,在计数值TIMx_CNT==CCCR1_Val时,它就会强制参考信号OC1REF为高。
如果配置成TIM_OCMode_Inactiive模式的话,在计数值TIMx_CNT==CCCR1_Val时,它就会强制参考信号OC1REF为低。
如果配置成TIM_OCMode_Toggle模式的话,在计数值TIMx_CNT==CCCR1_Val时,它就会翻转参考信号OC1REF的电平。
上一篇:STM32 定时器正交编码器模式 寄存器配置程序
下一篇:stm32 多路ADC+DMA 在内存中各路ADC的数据是如何界定的
推荐阅读最新更新时间:2024-03-16 16:16