stm32使用hrtim输出pwm时如何设置输出极性为负

HRTIM1->sTimerxRegs[2].OUTxR = 0x100; //使能死区模式,输出极性为正

负的话要把0x100改成多少

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/648590
  • 你也可以参考下这篇文章:【STM32H7教程】第64章 STM32H7的高分辨率定时器HRTIM应用之PWM实现
  • 除此之外, 这篇博客: stm32通用定时器pwm输入模式中的 功能实现 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

    以STM32F103RC为例,我们选择PA6引脚,使用TIM3_CH1功能,如下图:
    123

    下面列出主要步骤:

    第一步:打开TIM3和GPIO的时钟。

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//时钟使能
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA时钟
    

    第二步:初始化GPIO引脚功能

    //PA6引脚GPIO初始化,用于捕获输入的pwm信号,测量其周期
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(GPIOA, &GPIO_InitStruct);
    

    第三步:初始化定时器timebase

    //定时器初始化
    TIM_ARRPreloadConfig(TIM3, ENABLE);
    TIM_TimeBaseInitTypeStruct.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitTypeStruct.TIM_CounterMode = TIM_CounterMode_Up;//计数方式
    TIM_TimeBaseInitTypeStruct.TIM_Period = arr;//自动装载值
    TIM_TimeBaseInitTypeStruct.TIM_Prescaler = psc;//预分频系数
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitTypeStruct);
    

    第四步:初始化捕获参数

    //channel1 设置捕获参数
    TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;
    TIM_ICInitStruct.TIM_ICFilter = 0xf;    //采样频率设为0.56MHz,连续采8次,可以滤掉14微秒的干扰
    TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;  //捕获极性
    TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1; //每检测到一个有效边沿就捕获一次
    TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI; 
    TIM_PWMIConfig(TIM3, &TIM_ICInitStruct);
    
    TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);
    TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);
    TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);
    

    第五步:配置定时器的中断

    //使能定时器的中断,包括更新中断、CC1捕获中断
    TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_CC1,ENABLE);
    

    第六步:配置NVIC irq通道,初始化NVIC

    //中断优先级分组
    NVIC_InitTypeStruct.NVIC_IRQChannel = TIM3_IRQn;//中断通道 
    NVIC_InitTypeStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitTypeStruct.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitTypeStruct.NVIC_IRQChannelSubPriority = 0;
    NVIC_Init(&NVIC_InitTypeStruct);
    

    第七步:使能定时器

    TIM_Cmd(TIM3,ENABLE);
    

    第八步:编写定时器中断服务函数

    //中断服务函数
    void TIM3_IRQHandler(void)
    {
    	//判断是否为定时器3产生的中断
    	if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)
    	{   
            if(s_tim3_IC_edge == 1)		//在一个pwm周期内计数器溢出要计数
    		{
    			s_tim3_exceed++;
    		}
            
    		//要手动的清理中断标志位
    		TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
    	}
    
        if(TIM_GetITStatus(TIM3,TIM_IT_CC1)==SET)   //捕获CC1中断
        {
            //要手动的清理中断标志位
            TIM_ClearITPendingBit(TIM3,TIM_IT_CC1);
            
            /* Get the Input Capture value */
            s_tim3_IC_val = TIM_GetCapture1(TIM3);
    
            if (s_tim3_IC_val != 0)
            {
                /* Duty cycle computation */
                s_tim3_pwminput_dutycycle = (TIM_GetCapture2(TIM3) * 100) / s_tim3_IC_val;
    
                /* Frequency computation */
                s_tim3_pwminput_freq = TIM3_TIME_BASE / s_tim3_IC_val;
            }
            else
            {
                s_tim3_pwminput_dutycycle = 0;
                s_tim3_pwminput_freq = 0;
            }
        }
    }
    

    主任务通过以下函数获取pwm的频率和占空比:

    uint16_t timer_get_pwm_period(void)
    {
        return s_tim3_pwminput_freq;
    }
    
    uint16_t timer_get_pwm_dutycycle(void)
    {
        return s_tim3_pwminput_dutycycle;
    }
    

    目前没有开发板,无法进行硬件实验,后面有时间再慢慢补充相关知识点和可能遇到的问题。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

你可以将0x100更改为0xFFFF。输出极性为负

// 先将SETx2比特位清零
HRTIM1->sTimerxRegs[2].SETx2 = 0;

// 设置RSTx2比特位为1
HRTIM1->sTimerxRegs[2].RSTx2 = 1;

把它修改为比HRTIM1定时器周期更大的值,比如HRTIM1定时器周期是 0x1000,你给它给成0x2000就行

低4位(LSB)设置为1

STM32 PWM输出极性的实验
可以参考下


在PWM初始化函数中,通过TIM_OCInitStructure.TIM_OCPolarity设置输出极性,

    //配置PWM模式(TIMx_CCMR)
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
    //配置输出使能(TIMx_CCER)  0:禁止输出  1:输出到对应引脚
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    //配置输出极性(TIMx_CCER)  0:OCx高电平有效  1:OCx低电平有效
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
    //配置CCR寄存器(TIMx_CCRx) 16位宽
    TIM_OCInitStructure.TIM_Pulse = 64;
    TIM_OC2Init(TIM3, &TIM_OCInitStructure);

STM32的HRTIM模块可以用于生成PWM信号,其输出极性可以通过设置相关的寄存器来控制。具体来说,对于输出极性为负的情况,你需要设置HRTIM_SET2RCR1寄存器的EEV1POL位。

将0x100更改为0x000

在STM32系列芯片中,HRTIM模块是一个高精度定时器模块,可以用于产生多路PWM信号。HRTIM模块的输出极性可以通过设置HRTIM_TIMx_FLT与HRTIM_TIMx_OUT寄存器进行配置。

  1. HRTIM_TIMx_FLT寄存器配置

HRTIM_TIMx_FLT寄存器是用于配置HRTIM的故障管理器,可以用于配置输出极性。这个寄存器可以通过HAL库函数进行配置。

首先要使能HRTIM的故障管理器:

HAL_HRTIM_FaultModeCtl(&hhrtim,HRTIM_FAULTMO_MCE | HRTIM_FAULTMO_EXDFBK);

这个函数使能了HRTIM的故障管理器,并且配置了当外部触发信号EXDFBK(信号源可以从GPIO、外部中断等)触发时,故障管理器将使HRTIM输出停止,并且可以自定义故障处理方式。

接下来,需要配置HRTIM_TIMx_FLT寄存器:

HRTIM_FaultBlankingCfgTypeDef sFaultBlankingCfg;

sFaultBlankingCfg.BlankingSource = HRTIM_FAULTBLANKING_SRC_NONE;
sFaultBlankingCfg.BlankingTime = 0x00;

HAL_HRTIM_FaultBlankingConfig(&hhrtim, HRTIM_FAULT_TIMFAULT1, &sFaultBlankingCfg);

这个函数用于配置HRTIM_TIMx_FLT寄存器,其中HRTIM_FAULT_TIMFAULT1表示要配置的故障掩码。如果要配置多个故障掩码,可以分别配置多次。sFaultBlankingCfg结构体中的BlankingSource成员表示故障控制信号来源,这里我们设置为HRTIM_FAULTBLANKING_SRC_NONE,即关闭故障控制。BlankingTime表示故障掩码持续时间,如果故障控制被打开,则在延迟指定时间后,输出将会重新启动。

  1. HRTIM_TIMx_OUT寄存器配置

HRTIM_TIMx_OUT寄存器用于配置HRTIM输出端口的极性及占空比等参数。

HRTIM_OutputCfgTypeDef sOutputConfig;

sOutputConfig.Polarity = HRTIM_OUTPUTPOLARITY_LOW;
sOutputConfig.SetSource = HRTIM_OUTPUTSET_TIMPER;
sOutputConfig.ResetSource = HRTIM_OUTPUTRESET_TIMCMP1;
sOutputConfig.IdleMode = HRTIM_OUTPUTIDLEMODE_NONE;
sOutputConfig.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
sOutputConfig.FaultLevel = HRTIM_OUTPUTFAULTLEVEL_NONE;
sOutputConfig.ChopperModeEnable = DISABLE;
sOutputConfig.BurstModeEntryDelayed = DISABLE;

HAL_HRTIM_WaveformOutputConfig(&hhrtim, HRTIM_OUTPUT_TA1, &sOutputConfig);

上面代码中,HRTIM_OUTPUT_TA1表示要配置的HRTIM输出通道。sOutputConfig结构体中的Polarity成员用于配置输出信号的极性,这里我们设置为HRTIM_OUTPUTPOLARITY_LOW,即负极性输出。其他参数可以根据需要进行设置。

最后,需要设置HRTIM输出占空比。这个可以通过HAL库函数进行设置。

HAL_HRTIM_WaveformOutputStart(&hhrtim, HRTIM_OUTPUT_TA1);

这个函数用于启动HRTIM输出,并且根据HRTIM_TIMx_CMPy寄存器的值来确定输出的占空比。可以根据需要在输出前进行设置。

总的来说,HRTIM的输出极性设置需要通过配置HRTIM_TIMx_FLT和HRTIM_TIMx_OUT寄存器来完成。

STM32是一款广泛应用于各种电子系统的微控制器,而HRTIM模块是它内置的一个高分辨率定时器模块。该模块可以提供7个不同的PWM输出模式,同时提供高分辨率和精度的输出。在使用STM32的HRTIM模块时,需要设置PWM输出的极性,以便在电路中正确地控制输出信号。本文将详细介绍如何在STM32中使用HRTIM模块输出PWM信号并设置输出极性为负。

  1. HRTIM模块简介

HRTIM模块是STM32芯片内部的高分辨率定时器,由于其高分辨率和精度,可以用于各种应用,如电机控制、LED照明和电源管理等。HRTIM模块可以提供7个不同的PWM输出模式,其中包括3相6线PWM模式、双边对称PWM模式、单边对称PWM模式、自适应模式、单极性PWM模式、双极性PWM模式和脉冲捕获模式。

  1. HRTIM模块的PWM输出极性设置

在使用HRTIM模块输出PWM信号时,需要设置输出的极性,一般分为正极性和负极性两种。正极性输出表示输出信号在高电平时为正,低电平时为零;负极性输出则表示输出信号在高电平时为零,低电平时为负。在设置输出极性之前,需要确保正确设置HRTIM模块的时钟源和各个定时器的计数模式,并初始化PWM输出通道。

下面是使用STM32的HRTIM模块输出负极性PWM信号的具体步骤:

  1. 开启HRTIM时钟,并配置时钟源。
    RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_HRTIM1, ENABLE);
    HRTIM_SetPrescaler(HRTIM1, 0xF); // 设置HRTIM的分频器,用于将时钟源的频率降低为所需的PWM输出频率。

  2. 初始化HRTIM模块的定时器和PWM输出通道。
    TIM_TimeBaseStructInit(&HRTIM_TimeBaseInitStructure);
    HRTIM_TimeBaseInitStructure.HRTIM_Frequency = 100000000; // 设置HRTIM时钟频率
    HRTIM_TimeBaseInit(HRTIM1, HRTIM_TIMERINDEX_MASTER, &HRTIM_TimeBaseInitStructure);

    HRTIM_TIMBaseInitStructure.HRTIM_CounterMode = HRTIM_COUNTERMODE_UPDOWN;
    HRTIM_TIMBaseInit(HRTIM1, HRTIM_TIMERINDEX_TIMER_A, &HRTIM_TIMBaseInitStructure);

    HRTIM_PWMInitStructure.HRTIM_Polarity = HRTIM_OUTPUTPOLARITY_HIGH; // 设置输出极性为正
    HRTIM_PWMInit(HRTIM1, HRTIM_TIMERINDEX_TIMER_A, HRTIM_OUTPUT_TA1, &HRTIM_PWMInitStructure);

    HRTIM_Enable(HRTIM1, HRTIM_TIMERINDEX_TIMER_A); // 使能定时器和PWM输出通道

  3. 设置输出极性为负。
    HRTIM_OutputCfgTypeDef HRTIM_OutputCfgStructure;
    HRTIM_OutputCfgStructInit(&HRTIM_OutputCfgStructure);
    HRTIM_OutputCfgStructure.Polarity = HRTIM_OUTPUTPOLARITY_LOW;
    HRTIM_OutputCfgStructure.SetSource = HRTIM_OUTPUTSET_TIMCMP1;
    HRTIM_OutputCfgStructure.ResetSource = HRTIM_OUTPUTRESET_TIMPER;
    HRTIM_OutputConfig(HRTIM1, HRTIM_TIMERINDEX_TIMER_A, HRTIM_OUTPUT_TA1, &HRTIM_OutputCfgStructure);

在上述代码中,初始化HRTIM定时器时需要指定计数模式,这里采用了上下计数模式,即定时器在计数到计数器最大值时,会自动翻转并从零开始重新计数。PWM输出通道的初始化需要指定输出极性,这里设置为正极性。在需要输出负极性PWM信号时,还需调用HRTIM_OutputConfig函数设置输出极性为负。其中,SetSource和ResetSource参数分别表示设置输出信号的源和复位输出信号的源。在这里,设置输出信号的源为定时器比较器1(TIMCMP1),复位输出信号的源为定时器周期(TIMPER)。

  1. 配置PWM周期和占空比。
    HRTIM_SetCompare(HRTIM1, HRTIM_TIMERINDEX_TIMER_A, HRTIM_COMPAREUNIT_1, period);
    HRTIM_SetCompare(HRTIM1, HRTIM_TIMERINDEX_TIMER_A, HRTIM_COMPAREUNIT_2, duty_cycle);

在设置完输出极性后,还需配置PWM周期和占空比。在这里,使用HRTIM_SetCompare函数设置PWM周期和占空比。其中,period表示PWM周期,duty_cycle表示PWM的占空比。

  1. 使能HRTIM模块的PWM输出。
    HRTIM_SetOutputState(HRTIM1, HRTIM_OUTPUT_TA1, HRTIM_OUTPUTSTATE_ENABLE);

最后,还需使用HRTIM_SetOutputState函数使能HRTIM模块的PWM输出。

总体来说,使用HRTIM模块输出负极性PWM信号需要以下步骤:

  1. 开启HRTIM时钟,并配置时钟源。
  2. 初始化HRTIM模块的定时器和PWM输出通道。
  3. 设置输出极性为负。
  4. 配置PWM周期和占空比。
  5. 使能HRTIM模块的PWM输出。

需要注意的是,在设置输出极性时,需要根据电路中的具体要求选择正极性输出或负极性输出。而在配置PWM周期和占空比时,需要根据具体的应用场景进行合理的设置。此外,由于HRTIM模块具有高精度和高分辨率的特点,可以在不同的应用场景中发挥重要作用。用户在应用HRTIM模块时,需要深入了解HRTIM模块的各种功能和特性,以充分利用其优点,实现更加高效、精确和可靠的控制。

在STM32使用HRTIM输出PWM时,要将输出极性设置为负,您需要将0x100值进行修改。根据STM32的参考手册,如果要将输出极性设置为负,可以将0x100值更改为0x300。

因此,您的代码可以修改为以下形式:

HRTIM1->sTimerxRegs[2].OUTxR = 0x300; // 使能死区模式,输出极性为负

请注意,上述代码是在HRTIM1的第3个定时器通道上设置输出极性为负值。如果您希望在其他通道上设置输出极性,可以相应地调整HRTIM1->sTimerxRegs和通道索引号。

另外,确保已经正确初始化并启用了HRTIM模块,以及相应的GPIO进行了正确的配置和连接。

在使用STM32的高分辨率定时器 (HRTIM) 输出PWM时,如果你想设置输出极性为负(即在PWM周期开始时默认为高电平,然后变为低电平),你可以将HRTIMx_TIMx_OUTyR bit设置为0来反转输出极性。这个在STM32的每个系列中可能有所不同,具体设置步骤可能略有不同。

HRTIMx_TIMx_OUTyR 是一个位于 HRTIM 控制器寄存器内的位,用于反向设置响应的输出引脚的极性。其中 x 表示 HRTIM 单元编号(例如,HRTIM1),y 表示定时器编号(例如,Timer A),而 OUTyR 是用来设置输出极性的位。

你要修改的是位 HRTIMx_TIMx_OUTyR。这个位通常默认为1,表示在PWM周期开始时HRTIM的输出为低,然后在比较值到达时变为高。如果你想反转这个行为,那么将这个位设为0,这样在PWM周期开始时输出就为高,然后在比较值到达时变为低。

可以参考STM32的相关参考手册中对HRTIM章节的描述,确定具体的设置方式。请个别查阅你正在使用的具体型号的参考手册,因为不同的STM32系列对HRTIM的支持可能会有所不同。

参考gpt:
结合自己分析给你如下建议:
您的问题是关于 STM32 使用 HRTIM 输出 PWM 时如何设置输出极性为负的问题,这可能需要您修改 HRTIM 的输出寄存器 OUTxR 的相应位。
具体来说,如果您想要设置 HRTIM 的 TD1 通道的输出极性为负,您可以参考以下代码:
// 使能死区模式,输出极性为负
HRTIM1->sTimerxRegs[2].OUTxR = 0x200; // 设置 DTEN 和 DTxPOL 位为 1
其中,DTEN 位是死区使能位,当它为 1 时,表示启用死区功能;DTxPOL 位是死区极性位,当它为 1 时,表示输出极性取反。
如果您想要设置其他通道的输出极性为负,您可以根据 HRTIM 的寄存器手册 3 来修改相应的 OUTxR 寄存器和位。