STM32定时器的几种输出模式

发布时间:2023-08-22  

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

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    个8位的特殊功能寄存器TMOD和TCON,TMOD负责控制和确定T0和T1的功能和工作模式,TCON用来控制T0和T1启动或停止计数,同时包含定时/计数器的状态。 TF1:定时器1溢出标志。定时......
    的初始值,以便精确地控制采集时间。   定时器模式0是51单片机定时器的一种工作模式,也被称为13位定时器模式。在这种模式下,定时器的计数器宽度为13位,可以实现的计时范围为0~8191个机器周期。定时器模式0......
    器的编程和应用。 概述:两个可编程的定时器/计数器T1、T0。 两种工作模式: (1)计数器工作模式 (2)定时器工作模式 4种工作方式(方式0-方式3)。 6.1 定时器/计数器的结构 TMOD:选择定时器......
    ,当进入掉电模式时功耗可降至0.1μA以下。   2. 休眠模式   当单片机进入掉电模式时,外部晶振停振、CPU、定时器、串行口全部停止工作,只有外部中断继续工作。使单片机进入休眠模式......
    ”。 IT0:外部中断源0触发方式控制位。此位为1设置为底电平触发,为0设置为下降沿触发。 51单片机定时器4种工作模式 工作模式0: 由TL0的低5位和TH0的全部8位共同构成一个13位的定时器/计数......
    :设置特殊功能寄存器TMOD,配置好工作模式。 第二:设置计数寄存器TH0和TL0的初值。 第三:设置TCON,通过TRX置1来让定时器开始计数。 第四:判断TCON寄存器的TFX位,监测定时器......
    GPIO 8种工作模式(gpio_init.GPIO_Mode): (1) GPIO_Mode_AIN 模拟输入 (2) GPIO_Mode_IN_FLOATING 浮空输入 (3......
    为计数模式。 M1M0:工作方式设置位。定时/计数器有四种工作方式。 3.定时/计数器的工作方式 前面我们知道,TMOD中m1m0为工作方式设置位,共有4中方式 (1)方式0: 方式 0 为......
    特殊功能寄存器TMOD,配置好工作模式。 第二:设置计数寄存器TH0和TL0的初值。 第三:设置TCON,通过TRX置1来让定时器开始计数。 第四:判断TCON寄存器的TFX位,监测定时器溢出情况 这里......
    ,STM32H7系列芯片配备了丰富的定时器模块,既具备通用性又具备高性能,支持多种工作模式,可以满足多种嵌入式应用对高精度、多信号输出的需求。 本文基于STM32H7芯片,研究了定时器同步启动技术在PWM......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>