0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

总结一下定时器的几种输出比较模式

冬至子 来源:小陈学不停 作者:小陈学不停 2023-07-21 16:17 次阅读

1 背景

最近有接触到通过可控硅的方式来控制交流风机或者电烙铁功率,STM32定时器输出比较模式,刚好可以满足这种需求,借此机会总结一下定时器的几种输出模式。

2 STM32的定时器比较输出

STM32的定时器比较输出一共有8种,记录一下初始化方法和逻辑分析仪的波形。

在官网搜索对应的型号找到用户手册,比如STM32F103ZET6
找到比较模式相关配置的描述
TIMx capture/compare mode register 1 (TIMx_CCMR1)
Address offset: 0x18 Reset value: 0x0000
The channels can be used in input (capture mode) or in output (compare mode). The
direction of a channel is defined by configuring the corresponding CCxS bits. All the other
bits of this register have a different function in input and in output mode. For a given bit,
OCxx describes its function when the channel is configured in output, ICxx describes it
function when the channel is configured in input. Take care that the same bit can have a
different meaning for the input stage and for the output stage。

图片

图片

图片

图片

图片

2.1 OCxM 输出匹配模式

OC1M用于配置通道1,通道2则在OC2M上

2.1.1 TIM_OCMODE_TIMING
000:Frozen冻结模式
TIMx_CCR1和计数器TIMx_CNT之间的比较对输出没有影响

2.1.2 TIM_OCMODE_ACTIVE
001: Set channel 1 to active level on match。
匹配时将输出为有效电平,当TIMx_CNT=TIMx_CCR1时强制输出为高电平

2.1.3 TIM_OCMODE_INACTIVE
010: Set channel 1 to inactive level on match。
匹配时将输出为无效电平,当TIMx_CNT=TIMx_CCR1时强制输出为高低电平

2.1.4 TIM_OCMODE_TOGGLE
011: 当TIMx_CNT=TIMx_CCR1时电平翻转。

2.1.5 TIM_OCMODE_FORCED_INACTIVE
100: Force inactive level,强制输出为低电平(无效电平)

2.1.6 TIM_OCMODE_FORCED_ACTIVE
101: Force active level,强制输出为高电平(有效电平)

2.1.7 TIM_OCMODE_PWM1
110: PWM mode 1
当TIMx_CNT

2.1.8 TIM_OCMODE_PWM2
111: PWM mode 2
当TIMx_CNT

3 实测波形

在上电时默认会有个100ms的高电平,作为一个直观的起始信号

预分频设置为(72000000/2000)-1,最大计数为415-1,则周期是(1*415/2000)=(0.207)s

3.1 TIM_OCMODE_TIMING

3.1.1初始化代码

void TIM1_PWM_Init(u16 arr,u16 psc)
{
    htim2.Instance = TIM2;
    htim2.Init.Prescaler = psc;
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim2.Init.Period = arr;
    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
    htim2.Init.RepetitionCounter = 0;
    HAL_TIM_OC_Init(&htim2);
    sConfigOC.OCMode = TIM_OCMODE_TIMING;;
    sConfigOC.Pulse = 0;
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2);
    TIM_CCxChannelCmd(TIM2, TIM_CHANNEL_2, TIM_CCx_ENABLE);//
    HAL_TIM_Base_Start_IT(&htim2);
}

3.1.2 波形

极性是高电平时,上电后100ms后一直保持低电平

图片

极性是低电平时,一直保持高电平

图片

3.2 TIM_OCMODE_ACTIVE

3.2.1初始化代码

void TIM1_PWM_Init(u16 arr,u16 psc)
{
    htim2.Instance = TIM2;
    htim2.Init.Prescaler = psc;
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim2.Init.Period = arr;
    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
    htim2.Init.RepetitionCounter = 0;
    HAL_TIM_OC_Init(&htim2);
    sConfigOC.OCMode = TIM_OCMODE_ACTIVE;
    sConfigOC.Pulse = 0;
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2);
    TIM_CCxChannelCmd(TIM2, TIM_CHANNEL_2, TIM_CCx_ENABLE);//
    HAL_TIM_Base_Start_IT(&htim2);
}

3.2.2 波形

极性是低电平时,会先输出脉宽为计数周期的高电平,当TIMx_CNT=TIMx_CCR2后输出一直为低电平(有效电平)

图片

极性是高电平时,会先输出脉宽为计数周期的低电平,当TIMx_CNT=TIMx_CCR2后输出一直为高电平(有效电平)

图片

3.3 TIM_OCMODE_INACTIVE

3.3.1初始化代码

void TIM1_PWM_Init(u16 arr,u16 psc)
{
    htim2.Instance = TIM2;
    htim2.Init.Prescaler = psc;
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim2.Init.Period = arr;
    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
    htim2.Init.RepetitionCounter = 0;
    HAL_TIM_OC_Init(&htim2);
    sConfigOC.OCMode = TIM_OCMODE_INACTIVE;
    sConfigOC.Pulse = 0;
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2);
    TIM_CCxChannelCmd(TIM2, TIM_CHANNEL_2, TIM_CCx_ENABLE);//
    HAL_TIM_Base_Start_IT(&htim2);
}

3.3.2 波形

极性是低电平时,当TIMx_CNT=TIMx_CCR2时会出现一个低电平,但持续时间很短,然后一直输出一个高电平(无效电平)

图片

极性是高电平时,一直输出为低电平(无效电平)

图片

3.4 TIM_OCMODE_TOGGLE

3.4.1初始化代码

void TIM1_PWM_Init(u16 arr,u16 psc)
{
    htim2.Instance = TIM2;
    htim2.Init.Prescaler = psc;
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim2.Init.Period = arr;
    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
    htim2.Init.RepetitionCounter = 0;
    HAL_TIM_OC_Init(&htim2);
    sConfigOC.OCMode = TIM_OCMODE_TOGGLE;
    sConfigOC.Pulse = arr/2;
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2);
    TIM_CCxChannelCmd(TIM2, TIM_CHANNEL_2, TIM_CCx_ENABLE);//
    HAL_TIM_Base_Start_IT(&htim2);
}

3.4.2 波形

极性是低电平时,会先输出一个脉宽为半个计数周期的高电平,然后一直不停地翻转出一个脉宽为一个计数周期的电平

图片

极性是高电平时,会先输出一个脉宽为半个计数周期的低电平,然后一直不停地翻转出一个脉宽为一个计数周期的电平

图片

3.5 TIM_OCMODE_PWM1

3.5.1初始化代码

void TIM1_PWM_Init(u16 arr,u16 psc)
{
    htim2.Instance = TIM2;
    htim2.Init.Prescaler = psc;
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim2.Init.Period = arr;
    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
    htim2.Init.RepetitionCounter = 0;
    HAL_TIM_OC_Init(&htim2);
    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = arr*2/3;
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2);
    TIM_CCxChannelCmd(TIM2, TIM_CHANNEL_2, TIM_CCx_ENABLE);//
    HAL_TIM_Base_Start_IT(&htim2);
}

3.5.2 波形

极性是低电平时,当TIMx_CNT

图片

极性是高电平时,当TIMx_CNT

图片

3.6 TIM_OCMODE_PWM2

3.6.1初始化代码

void TIM1_PWM_Init(u16 arr,u16 psc)
{
    htim2.Instance = TIM2;
    htim2.Init.Prescaler = psc;
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim2.Init.Period = arr;
    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
    htim2.Init.RepetitionCounter = 0;
    HAL_TIM_OC_Init(&htim2);
    sConfigOC.OCMode = TIM_OCMODE_PWM2;
    sConfigOC.Pulse = arr*2/3;
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2);
    TIM_CCxChannelCmd(TIM2, TIM_CHANNEL_2, TIM_CCx_ENABLE);//
    HAL_TIM_Base_Start_IT(&htim2);
}

3.6.2 波形

极性是低电平时,当TIMx_CNT

图片

极性是高电平时,当TIMx_CNT

图片

3.7 TIM_OCMODE_FORCED_ACTIVE

3.7.1初始化代码

void TIM1_PWM_Init(u16 arr,u16 psc)
{
    htim2.Instance = TIM2;
    htim2.Init.Prescaler = psc;
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim2.Init.Period = arr;
    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
    htim2.Init.RepetitionCounter = 0;
    HAL_TIM_OC_Init(&htim2);
    sConfigOC.OCMode = TIM_OCMODE_FORCED_ACTIVE;
    sConfigOC.Pulse = 0;
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2);
    TIM_CCxChannelCmd(TIM2, TIM_CHANNEL_2, TIM_CCx_ENABLE);//
    HAL_TIM_Base_Start_IT(&htim2);
}

3.7.2 波形

极性是低电平时,一直输出为低电平(有效电平)。

图片

极性是高电平时,一直输出为高电平(有效电平)。

图片

3.8 TIM_OCMODE_FORCED_INACTIVE

3.8.1初始化代码

void TIM1_PWM_Init(u16 arr,u16 psc)
{
    htim2.Instance = TIM2;
    htim2.Init.Prescaler = psc;
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim2.Init.Period = arr;
    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
    htim2.Init.RepetitionCounter = 0;
    HAL_TIM_OC_Init(&htim2);
    sConfigOC.OCMode = TIM_OCMODE_FORCED_INACTIVE;
    sConfigOC.Pulse = 0;
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2);
    TIM_CCxChannelCmd(TIM2, TIM_CHANNEL_2, TIM_CCx_ENABLE);//
    HAL_TIM_Base_Start_IT(&htim2);
}

3.8.2 波形

极性是低电平时,一直输出为高电平(无效电平)。

图片

极性是高电平时,一直输出为低电平(无效电平)。

图片

4 应用场景

假设可控硅是低电平导通,我们需要在初始化时输出为高电平,在过零时输出一个低电平,电平的时间可控。

4.1 初始化定时器为TIM_OCMODE_INACTIVE模式

void TIM1_PWM_Init(u16 arr,u16 psc)
{
    htim2.Instance = TIM2;
    htim2.Init.Prescaler = psc;
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim2.Init.Period = arr;
    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
    htim2.Init.RepetitionCounter = 0;
    HAL_TIM_OC_Init(&htim2);
    sConfigOC.OCMode = TIM_OCMODE_INACTIVE;
    sConfigOC.Pulse = 0;
    sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2);
    TIM_CCxChannelCmd(TIM2, TIM_CHANNEL_2, TIM_CCx_ENABLE);//
    HAL_TIM_Base_Start_IT(&htim2);
}

4.2 使用按键来模拟过零信号,平时输出为高电平(无效电平),当按键按下时,强制输出为低电平,并且脉宽为207.5*360/415=180ms,然后输出持续为高电平(无效电平)

key = KEY_Scan(0);
if(key == KEY0_PRES) 
{
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);  
    TIM2- >CCMR1 = (TIM_OCMODE_FORCED_ACTIVE< < 8);    
    TIM2- >CNT=0;
    TIM2- >CCR2 = (90*4-1); 
    TIM2- >CCMR1 = (TIM_OCMODE_INACTIVE< < 8);  
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);
    LED0 =!LED0;           
}

4.3 实测波形

图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 可控硅
    +关注

    关注

    43

    文章

    895

    浏览量

    71638
  • 比较器
    +关注

    关注

    14

    文章

    1633

    浏览量

    107086
  • 预分频器
    +关注

    关注

    0

    文章

    18

    浏览量

    8115
  • STM32F103ZET6
    +关注

    关注

    9

    文章

    67

    浏览量

    21090
  • stm32定时器
    +关注

    关注

    0

    文章

    13

    浏览量

    2289
收藏 人收藏

    评论

    相关推荐

    分享一下定时器的编程技巧

    分享一下定时器的编程技巧和编程实例的讲解,每句都分析讲解,方便初学者学习和进步
    发表于 09-28 11:16

    STM32定时器几种模式介绍

    32的定时器主要有 时基单元,比较输出,输入捕获和PWM输出几种工作模式。其中时基单元和
    发表于 07-06 08:02

    单片机定时器实验总结

    单片机定时器实验总结定时器中断是单片机最重要的个功能,开始学的时候遇到了不少的问题,通过不断地学习解决了不少问题,其实学会之后也没有什
    发表于 07-14 06:58

    一下定时器的用法以及PWM的调速

    今天我们来讲一下定时器的用法以及PWM的调速我们最初接触的51单片机有两组定时器(计数),因为既可以定时,又可以计数,因此叫做定时器(计数
    发表于 12-07 12:10

    STM32定时器的使用学习

    快速固定频率采集数据的话建议学习一下定时器触发数据通过DMA传递接下来可以学习一下定时器的使用了32常用的定时器功能有PWM波输出,PWM波输入判断占空比和频率,
    发表于 01-06 07:48

    定时器基础知识与PWM输出原理是什么

    转速等。本篇先介绍定时器的基础知识,然后对照这些知识介绍一下定时器输出PWM的基本原理,以及编程实现与代码分析。首先来看一下定时器的基础介绍。1
    发表于 01-25 08:16

    关于定时器的单脉冲输出模式应用

    单脉冲输出模式定时器比较输出应用中的种特殊情况或者特殊应用,是
    的头像 发表于 02-14 15:54 1.6w次阅读
    关于<b class='flag-5'>定时器</b>的单脉冲<b class='flag-5'>输出</b><b class='flag-5'>模式</b>应用

    浅谈定时器基础知识与PWM输出原理

    转速等。 本篇先介绍定时器的基础知识,然后对照这些知识介绍一下定时器输出PWM的基本原理,以及编程实现与代码分析。 首先来看一下定时器的基础介绍。 1
    的头像 发表于 04-05 10:35 1.4w次阅读
    浅谈<b class='flag-5'>定时器</b>基础知识与PWM<b class='flag-5'>输出</b>原理

    单片机MSP430入门-理论⑦--定时器模块-定时器A②

    单片机MSP430入门-理论⑦--定时器模块-定时器A②上期大概给大家汇总介绍了,定时器模块中比较重要并且常用的定时器A,大概说了
    发表于 11-19 17:51 9次下载
    单片机MSP430入门-理论⑦--<b class='flag-5'>定时器</b>模块-<b class='flag-5'>定时器</b>A②

    51单片机定时器问题总结

    勉强看懂,然后开始写代码,虽然写成功了,但是我还是觉得有些懵懵懂懂的.于是我找了些书还有开发板的帮助手册看,总结一下。谈谈自己的看法定时器和中断只学了
    发表于 11-23 16:51 2次下载
    51单片机<b class='flag-5'>定时器</b>问题<b class='flag-5'>总结</b>

    通过TIM输出比较定时器

    ~0xFFFF之间循环计时。本例通过MC9S12XS128的TIM模块的输出比较个简单的定时器。以下为本例所用到的寄存的介绍:TIOS
    发表于 11-26 20:21 11次下载
    通过TIM<b class='flag-5'>输出</b><b class='flag-5'>比较</b>做<b class='flag-5'>一</b>个<b class='flag-5'>定时器</b>

    电机控制基础——定时器基础知识与PWM输出原理

    转速等。本篇先介绍定时器的基础知识,然后对照这些知识介绍一下定时器输出PWM的基本原理,以及编程实现与代码分析。首先来看一下定时器的基础介绍。1
    发表于 11-30 14:21 38次下载
    电机控制基础——<b class='flag-5'>定时器</b>基础知识与PWM<b class='flag-5'>输出</b>原理

    【捕获比较模式】msp430定时器比较捕获理解

    MSP430的定时器中有比较捕获的概念,刚刚接触非常生疏。看了半天终于清楚: 比较模式: 这是定时器的默认
    发表于 12-16 16:55 10次下载
    【捕获<b class='flag-5'>比较</b><b class='flag-5'>模式</b>】msp430<b class='flag-5'>定时器</b><b class='flag-5'>比较</b>捕获理解

    STM32定时器几种输出模式

    最近有接触到通过可控硅的方式来控制交流风机或者电烙铁功率,STM32的定时器输出比较模式,刚好可以满足这种需求,借此机会总结
    的头像 发表于 01-12 16:49 5475次阅读
    STM32<b class='flag-5'>定时器</b>的<b class='flag-5'>几种</b><b class='flag-5'>输出</b><b class='flag-5'>模式</b>

    555定时器的工作模式

    (monostable)和双稳态(astable)模式。 单稳态模式 单稳态模式也叫单触发模式,是555
    的头像 发表于 10-24 10:10 1376次阅读