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

发布者:Meiren520最新更新时间:2024-06-18 来源: elecfans关键字:定时器  输出比较模式  STM32 手机看文章 扫描二维码
随时随地手机看文章

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,然后输出持续为高电平(无效电平)

[1] [2]
关键字:定时器  输出比较模式  STM32 引用地址:总结一下定时器的几种输出比较模式

上一篇:使用单片机设计一种火灾监测报警系统?
下一篇:独立看门狗的一点经验

推荐阅读最新更新时间:2024-11-12 11:42

STM32学习笔记之ADC--DMA方式
程序功能是把ADC1模块里通道14的输入电压转换后通过USART2发送到PC,在PC机上用串口调试助手观察接收数据: STM32是12位ADC,测量结果基本还可以!程序用了DMA来传输ADC转换值,调高了读取速度。串口部分用是上一篇串口调试笔记里的代码。 #include stm32f10x_lib.h #include stdio.h #define ADC1_DR_Address ((u32)0x4001244C) #ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PR
[单片机]
<font color='red'>STM32</font>学习笔记之ADC--DMA方式
STM32单片机的八种GPIO口模式
GPIO 是通用输入/输出端口的简称,本文以STM32为例进行说明,其他的单片机功能上都是大同小异,学会STM32的GPIO,我们可以触类旁通。 GPIO 的引脚与外部硬件设备连接,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。 STM32的八种GPIO口模式 1) GPIO_Mode_AIN 模拟输入; 2) GPIO_Mode_IN_FLOATING 浮空输入; 3) GPIO_Mode_IPD 下拉输入; 4) GPIO_Mode_IPU 上拉输入; 5) GPIO_Mode_Out_OD 开漏输出; 6) GPIO_Mode_Out_PP 推挽输出; 7) GPIO_Mode_AF_OD 复用开漏输
[单片机]
<font color='red'>STM32</font>单片机的八种GPIO口<font color='red'>模式</font>
经典收藏!stm32最小系统完整版
采用stm32f103rc的 STM32 最小系统详细解析图,如下: 一、 STM32 主电路 二、USB转串口下载电路 注:此图中二极管D1不用接! 三、SWD模式调试仿真电路 四、指示电路 五、整体电路 注:此图中二极管D1不用接!
[单片机]
经典收藏!<font color='red'>stm32</font>最小系统完整版
STM32 I2C总线 自我总结学习
现在打算彻底搞清楚STM32的I2C总线通信----首先是对AT24C02的读写----手上有PCF8574的IO扩展芯片,也是I2C协议的,希望实现多个控制! STM32的I2C有自带的硬件驱动,也可以使用GPIO模拟-----先总结一下硬件驱动下的问题。 ----------------------------------硬件下-----以AT24C02与PCF8574为例--------------- ------第一部分是简单宏定义------- #define I2C_Speed 300000 //传输速率--挂载原件多时要求降低速率,自己在调试过程中出现过这样问题 #define I2C1_OWN
[单片机]
<font color='red'>STM32</font> I2C总线 自我总结学习
STM32-快速上手ADC
1. ADC端口映射 ADC肯定要外部输入信号的,通过IO口进行采集,IO与ADC通道的对应关系如下: 2. 配置 2.1 配置步骤 开启需要用到的ADCx时钟和对应的IO时钟 ADC模块和GPIO模块都在APB2时钟下 void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); 配置ADCx预分频器分频系数 void RCC_ADCCLKConfig(uint32_t RCC_PCLK2); 配置需要用到的对应IO设置为模拟输入 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTyp
[单片机]
STM32-快速上手ADC
把GuiLite移植到STM32
1 Gui移植结果 一些演示效果: 2 GuiLite介绍 GuiLite是一个开源的图形用户界面框架,只依赖于一个单一的头文件库(GuiLite.h),不需要很复杂的文件管理,代码量平易近人。 GuiLite由4千行C++代码编写,单片机上也能流畅运行,其最低的硬件运行要求如下: GuiLite具有很强的跨平台特性: 支持的操作系统:iOS/macOS/WatchOS,Android,Linux(ARM/x86-64),Windows(包含VR),RTOS… 甚至无操作系统的单片机 支持的开发语言:C/C++, Swift, Java, Javascript, C#, Golang… 支
[单片机]
把GuiLite移植到<font color='red'>STM32</font>上
STM32学习笔记-Flash做为存储器储存数据
说到STM32的FLSAH,我们的第一反应是用来装程序的,实际上,STM32的片内FLASH不仅用来装程序,还用来装芯片配置、芯片ID、自举程序等等。当然, FLASH还可以用来装数据。 自己收集了一些资料,现将这些资料总结了一下,不想看的可以直接调到后面看怎么操作就可以了。 FLASH分类 根据用途,STM32片内的FLASH分成两部分:主存储块、信息块。 主存储块用于存储程序,我们写的程序一般存储在这里。 信息块又分成两部分:系统存储器、选项字节。 系统存储器存储用于存放在系统存储器自举模式下的启动程序(BootLoader),当使用ISP方式加载程序时,就是由这个程序执行。这个区域由芯片厂写入BootLoader,
[单片机]
STM32怎么读取输出口电平
其实你自己在库函数源文件也能找到,以PC13为例: 要是你设置为输入: GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13);//读取输入口PC13值 要是你设置为输出: GPIO_ReadOutputDataBit (GPIOC,GPIO_Pin_13); //读取输入口PC13值 我看的原函数,两个读取函数操作区别在于读取的寄存器不一样,分别是: GPIOx- IDR GPIOx- ODR
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved