STM32F429第二十篇之高级定时器——PWM(OSSI,OSSR)

前言

从本文开始,介绍F429的高级时钟特性。本文主要介绍高级时钟的PWM功能的应用。关于PWM,本文重点介绍实现带有断路功能的双通道互补无延时的PWM波的实现方式。

本文主要参考文献为:

  • ST.RM0090 参考手册
  • 刘火良.STM32库开发实战指南.机械工业出版社

更新列表:

  • 2021.02.23——更新关于OSSI与OSSR分析。
  • 2021.04.16——更新关于PWM时序

高级定时器

本文不打算详细介绍高级定时器的每个特点,因为高级定时器的内容太多琐碎与复杂。本文决定通过以实验的方式,分别介绍高级定时器的三个应用场景:

  • PWM波输出
  • 输入捕获
  • 编码器功能

通过三个比较常用的应用场景,比较全面的将高级定时器分解介绍。若以后遇到其他的应用场景,再详细介绍。
在这里插入图片描述
首先,我们看一下官方提供的高级定时器框图。该框图相对于基本定时器十分复杂,先大致了解一下即可。在此处,本文重点介绍高级定时器与芯片外部的接口。在框图中,输入接口在框图的左边,输出接口在框图的右边。通过观察该框图,可以了解到:F429的高级定时器与外部的物理接口可以大致分成以下三种类型:

  1. 外部触发输出接口 TIMx_ETR。
  2. 刹车输入接口 TIMx_BKIN
  3. 四通道接口

其中,前两种接口在图上比较明确不再详细展开,下面重点讲解一下四通道接口:
在高级定时器中,每个定时器有4个通道。而每个通道与芯片外部都有对应的物理接口。需要注意的是,其中输入接口是的对应关系可以通过寄存器配置,而输出接口是直接对应无法改变的。输入接口与通道是一一对应的,而每个通道提供输出接口的同时还提供对应的互补接口。也就是说,每一个通道对应两个输出接口。另外需要注意的就是,虽然在框图中将每个通道输入接口和输出接口分开画在框图的左右两侧,其实在物理上,名称相同的接口为同一个接口。

高级定时器与通用定时器的对外接口与F429的管脚对应关系总结如下:

通道TIM1TIM8TIM2TIM5TIM3TIM4TIM9TIM10TIM11TIM12TIM13TIM14
CH1PA8/PE9/PC10PC6/PI15PA0/PA5/PA15PA0/PH10PA6/PC6/PB4PD12/PB6PE5/PA2PF6/PB8PF7/PB9PH6/PB14PF8/PA6PF9/PA7
CH1NPA7/PE8/PB13PA5/PA7/PH13
CH2PE11/PA9PC7/PI6PA1/PB3PA1/PH11PA7/PC7/PB5PD13/PB7PE6/PA3PH9/PB15
CH2NPB0/PE10/PB14PB0/PB14/PH14
CH3PE13/PA10PC8/PI7PA2/PB10PA2/PH12PB0/PC8PD14/PB8
CH3NPB1/PE12/PB15PB1/PB15/PH15
CH4PE14/PA11PC9/PI2PA3/PB11PA3/PI0PB1/PC9PD15/PB9
ETRPE7/PA12PA0/PI3PA0/PA5/PA15PD2PE0
BKINPA6/PE15/PB12PA6/PI4

PWM模式

PWM即脉冲宽度调制模式,PWM的频率由TIMx_ARR寄存器值确定,其占空比由比较寄存器TIMx_CCRx值确定。
在这里插入图片描述
在PWM模式中,信号流经的主要模块已经通过红色方框圈起来,大致分成以下三个部分:

  1. 时钟来源和基础定时器一样,直接来自RCC提供的内部时钟。
  2. 计数器模块和基本定时器基本一致。和基本定时器相比,只是多了一个重复计数器(Repetion Counter)。该功能暂时不到,暂且不论。所以,这部分只需要当做基本定时器的结构处理即可。
  3. 输出通道。输出通道共有4个,本文圈出只是1通道,以此为例。
    在这里插入图片描述

关于基本定时器的更多知识,可以参考博客<STM32F429第十八篇之基本定时器> 。

其基本原理是,随着内部时钟的脉冲,CNT的计数值不断变化。当CNT的值产生溢出或者等于Capture/Compare 1 寄存器时,其OCxREF的电平发生变化,从而输出通道与互补输出通道的电平跟着变化。所以,自动重载寄存器(AutoReload Register)的值决定了计数器(CNT)的计数周期,也就是PWM的频率。而比较寄存器(Capture/Compare 1 Register)的值决定了PWM的占空比。

以边缘对齐模式为例,只要 TIMx_CNT < TIMx_CCRx,PWM 参考信号 OCxREF 便为 高电平,否则为低电平。如果 TIMx_CCRx 中的比较值大于自动重载值(TIMx_ARR 中),则 OCxREF 保持为“1”。如果比较值为 0,则 OCxRef 保持为“0”。

在这里插入图片描述
注意:

  1. ARR寄存器的数值加1,才是PWM波的周期数。
  2. CCRx寄存器的值直接等于有效电平的时间。

互补通道与刹车

互补通道与刹车功能是高级寄存器特有的功能。

在使用互补通道时,往往还需要考虑死区等特殊功能。而本文为了简单起见,不再考虑死区区间。通过配置TIMx_CCER寄存器,来使能互补通道,且将OCxREF 重定向到 OCx 输出或 OCxN 输出。

互补信号 OCx 和 OCxN 通过以下多个控制位的组合进行激活:TIMx_CCER 寄存器中的 CCxE 和 CCxNE 位以及 TIMx_BDTR 和 TIMx_CR2 寄存器中的 MOE、OISx、OISxN、OSSI 和 OSSR 位。

在这里插入图片描述
注意:
此处中文文档过于陈旧,最新的英文参考手册有不同的描述,如下所示:
在这里插入图片描述
关于OSSR和OSSI的作用,看文档有点云里雾里,通过实验,我个人认为其主要作用如下:

OSSR在MOE=1时起作用,即PWM处于运行状态。下面分条陈述:

  1. 若互补通道都使能(CCxE=CCxNE=1),此时很容易理解,两个端口按照配置正常输出PWM波。
  2. 若互补通道都禁用(CCxE=CCxNE=0),此时存疑,可以认为两个端口都处于高阻状态。
  3. 若互补通道有一个使能,一个禁用。则使能的端口正常输出PWM波,禁用的端口的状态与OSSR相关。
    若OSSR=0,则禁用端口输出高阻(存疑),与CCxP或者CCxNP无关。
    若OSSR=1,则禁用端口输出无效电平。假设OC1N为被禁用,即(CC1NE=0),则此时OC1N的输出为无效电平,即CC1NP为0时,高电平有效,输出电平为0,CC1NP为1是,低电平有效,输出电平为1。

OSSI与OSSR的作用很类似,其只有在MOE=0时起作用,即PWM处于高阻状态。我们假定互补的两个通道都使能,下面分条陈述:

  1. 若OISx与OSIxN不同,有且只有一个电平为高电平,则通道输出的电平对应空闲状态。即OCxN=OSIxN,OCx=OISx。
  2. 若OISx=OSIxN=1时,只有CCxP=CCxNP=0时,OCx=OCxN=0;其余时候OCx=OCxN=1。
  3. 若OISx=OSIxN=0时,与前面相似,只有CCxP=CCxNP=1时,OCx=OCxN=1,其余时候OCx=OCxN=0。
    上面3种情况是OSSI=1的效果,若OSSI=0,此时输出高阻(存疑)。

可以这样理解:若是OISx=OSIxN且CCxP=CCxNP时,此时输出的是无效电平。其余的时候,OCxN=OSIxN,OCx=OISx。

真值表如下:

OSSI01111
OSIxx0011
OSIxNx0101
CCxPx1xx0
CCxNPx1xx0
OCxx1010
OCxNx1100
OSSR01111
CCxPx使能使能01
CCxNPx01使能使能
OCxx使能使能01
OCxNx01使能使能

发生断路(断路输入上出现所选电平)时:

在这里插入图片描述

重要寄存器

与PWM通道相关的重要寄存器如下所示:

CCMR1
在这里插入图片描述
在该寄存器中,需要配置以下几位:
在这里插入图片描述

在这里插入图片描述

CR1

在这里插入图片描述

在该寄存器中,需要配置以下几位:
在这里插入图片描述
在这里插入图片描述

EGR
在这里插入图片描述
在这里插入图片描述

CCER
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

BDTR

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

CR2

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 6
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32高级定时器中,死区时间是指在 PWM 输出切换时,两个输出通道之间的时间间隔。可以通过设置死区时间来避免两个输出通道同时输出电平的问题,从而保证输出电路的稳定性。 在 STM32高级定时器中,设置死区时间需要以下步骤: 1. 选择定时器通道,并设置死区时间寄存器的值。 2. 使能死区时间功能。 3. 配置定时器PWM 模式,使其支持死区时间功能。 下面是一个示例代码,演示如何设置 STM32高级定时器的死区时间: ``` // 选择定时器通道 TIM_OC_InitTypeDef sConfigOC; sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = channelPulse; // 设置 PWM 脉冲宽度 sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; // 设置死区时间寄存器的值 TIM_BDTR_InitTypeDef sConfigBDTR; sConfigBDTR.OSSRState = TIM_OSSR_DISABLE; sConfigBDTR.OSSIState = TIM_OSSI_DISABLE; sConfigBDTR.LockLevel = TIM_LOCKLEVEL_OFF; sConfigBDTR.DeadTime = deadTime; // 设置死区时间 sConfigBDTR.BreakState = TIM_BREAK_DISABLE; sConfigBDTR.BreakPolarity = TIM_BREAKPOLARITY_HIGH; sConfigBDTR.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; // 使能死区时间功能 HAL_TIM_PWM_ConfigChannel(&htim, &sConfigOC, TIM_CHANNEL_1); HAL_TIM_PWM_ConfigChannel(&htim, &sConfigOC, TIM_CHANNEL_2); HAL_TIMEx_BDTRConfig(&htim, &sConfigBDTR); // 配置定时器PWM 模式 TIM_MasterConfigTypeDef sMasterConfig; sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfigSynchronization(&htim, &sMasterConfig); ``` 在上面的示例代码中,`deadTime` 变量是死区时间的值,根据实际应用需求进行设置。同时,需要注意将 `TIM_BDTR_InitTypeDef` 结构体中的其它成员也进行正确的设置,以保证定时器能够正常工作。 希望这些信息能够对您有所帮助。如果您还有其它问题或需要进一步了解,可以继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值