硬汉嵌入式论坛

 找回密码
 立即注册
查看: 247|回复: 5
收起左侧

[有问必答] STM32G474的HRTIM输出PWM问题

[复制链接]

4

主题

8

回帖

20

积分

新手上路

ARMMRA

积分
20
发表于 2025-6-11 15:21:57 | 显示全部楼层 |阅读模式
请教一下各位大佬,项目需要产生一个高频的PWM,我参考了Getting started with HRTIM - stm32mcu这个链接的教程,配置了我手头的STM32G474单片机的HRTIM的TA1试一下,配置和链接中一致,按照图中的配置PWM频率应该为83.05Khz,占空比为50%(TIMA_DUTY_CYCLE=0.5),但烧写进去启动后发现实际PWM频率刚好为83.05Khz的一半,而且想通过修改TIMA_DUTY_CYCLE这个值更改占空比并不生效,排查不出是哪里的问题,希望得到大家的指导,谢谢!图中是我使用的配置和代码片段,不胜感激!

PixPin_2025-06-11_15-15-10.png



回复

使用道具 举报

4

主题

8

回帖

20

积分

新手上路

ARMMRA

积分
20
 楼主| 发表于 2025-6-11 19:02:31 | 显示全部楼层
C:\Users\jiawe\Desktop\dm.png
回复

使用道具 举报

4

主题

8

回帖

20

积分

新手上路

ARMMRA

积分
20
 楼主| 发表于 2025-6-11 19:03:18 | 显示全部楼层
C:\Users\jiawe\Desktop\dm2.png
不好意思,另外两张截图上传失败了,重新上传
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116747
QQ
发表于 2025-6-12 08:19:30 | 显示全部楼层
HRTIM的配置计算有点特殊,这个是我整理的H7的HRTIM,应该和G4差不多

/*
*********************************************************************************************************
*   函 数 名: bsp_SetHRTIMOutPWM
*   功能说明: 配置HRTIM的TIMER D输出两路PWM,周期都是100KHz,PA11引脚输出占空比50%,PA12引脚输出的占空比25%。
*   形    参: 无
*   返 回 值: 无
*********************************************************************************************************
*/
void bsp_SetHRTIMOutPWM(void)
{
    GPIO_InitTypeDef   GPIO_InitStruct;
    RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};

    /*##-1- 使能时钟 ################################################*/
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_HRTIM1_CLK_ENABLE();

     
    /*##-2- 配置HRTIM的主频时钟 ######################################*/
    PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_HRTIM1;
    /*
        HRTIM时钟有两种选择:
        1、使用CPU主频时钟,本程序配置的是400MHz,对应参数RCC_HRTIM1CLK_CPUCLK。
        2、使用通用定时器时钟,本程序是200MHz,对应参数RCC_HRTIM1CLK_TIMCLK。
    */
    PeriphClkInitStruct.Hrtim1ClockSelection = RCC_HRTIM1CLK_CPUCLK;
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
    {
        Error_Handler(__FILE__, __LINE__);
    }

    /*##-3- 配置HRTIM的TIMER D使用的两个输出通道引脚PA11和PA12 #######*/  
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;

    GPIO_InitStruct.Alternate = GPIO_AF2_HRTIM1;
    GPIO_InitStruct.Pin = GPIO_PIN_11;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Alternate = GPIO_AF2_HRTIM1;
    GPIO_InitStruct.Pin = GPIO_PIN_12;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
     
    /*##-4- 初始化HRTIM ###################################################*/
    HrtimHandle.Instance = HRTIM1;  /* 例化,使用的HRTIM1 */
    HrtimHandle.Init.HRTIMInterruptResquests = HRTIM_IT_NONE; /* 用于配置支持的中断请求,当前配置无中断 */
    HrtimHandle.Init.SyncOptions = HRTIM_SYNCOPTION_NONE;     /* 配置HRTIM作为Master,发送同步信号,或者作为Slave,接收同步信号,当前配置没有做同步功能 */
     
    HAL_HRTIM_Init(&HrtimHandle);
     
    /*##-5- 配置HRTIM的TIMER D 时基 #########################################*/
    /*
        PWM的频率 = 400MHz / HRTIM_TIMD_PERIOD
                  = 400000000 / 4000
                  = 100KHz
    */
    sConfig_time_base.Mode = HRTIM_MODE_CONTINUOUS; /* 连续工作模式 */
    sConfig_time_base.Period = HRTIM_TIMD_PERIOD;   /* 设置周期 */
    sConfig_time_base.PrescalerRatio = HRTIM_PRESCALERRATIO_DIV1; /* 设置HRTIM分频,当前设置的1分频,也就是不分频 */
    sConfig_time_base.RepetitionCounter = 0;        /* 设置重复计数器为0,即不做重复计数 */
           
    HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_D, &sConfig_time_base);

    /*##-6- HRTIM的TIMER D配置 #############################################*/
    sConfig_timerD.DMARequests = HRTIM_TIM_DMA_NONE;         /* 不使用DMA */   
    sConfig_timerD.HalfModeEnable = HRTIM_HALFMODE_DISABLED; /* 关闭HALF模式 */
    sConfig_timerD.StartOnSync = HRTIM_SYNCSTART_DISABLED;   /* 设置同步输入端接收到上升沿信号后,不启动定时器 */
    sConfig_timerD.ResetOnSync = HRTIM_SYNCRESET_DISABLED;   /* 设置同步输入端接收到上升沿信号后,不复位定时器 */
    sConfig_timerD.DACSynchro = HRTIM_DACSYNC_NONE;          /* 不使用DAC同步事件 */
    sConfig_timerD.PreloadEnable = HRTIM_PRELOAD_ENABLED;    /* 使能寄存器预加载 */
    sConfig_timerD.UpdateGating = HRTIM_UPDATEGATING_INDEPENDENT;      /* 独立更新,与DMA突发传输完成无关 */
    sConfig_timerD.BurstMode = HRTIM_TIMERBURSTMODE_MAINTAINCLOCK;     /* 在突发模式下,定时器正常运行 */
    sConfig_timerD.RepetitionUpdate = HRTIM_UPDATEONREPETITION_ENABLED;/* 设置重计数器事件可以触发寄存器更新 */
    sConfig_timerD.ResetUpdate = HRTIM_TIMUPDATEONRESET_DISABLED;      /* 当HRTIM TIMER的计数器复位时或者计数回滚到0时,不触发寄存器更新 */
    sConfig_timerD.InterruptRequests = HRTIM_TIM_IT_NONE;              /* 不使用中断 */
    sConfig_timerD.PushPull = HRTIM_TIMPUSHPULLMODE_DISABLED;          /* 不开启推挽模式 */
    sConfig_timerD.FaultEnable = HRTIM_TIMFAULTENABLE_NONE;            /* 不使用HRTIM TIMER的Fault通道 */
    sConfig_timerD.FaultLock = HRTIM_TIMFAULTLOCK_READWRITE;           /* 不开启HRTIM TIMER的异常使能状态写保护 */
    sConfig_timerD.DeadTimeInsertion = HRTIM_TIMDEADTIMEINSERTION_DISABLED;/* 不开启死区时间插入 */
    sConfig_timerD.DelayedProtectionMode = HRTIM_TIMER_D_E_DELAYEDPROTECTION_DISABLED;/* 不开启HRTIM TIMER的延迟保护模式 */
    sConfig_timerD.UpdateTrigger= HRTIM_TIMUPDATETRIGGER_NONE;         /* Master或者TIMER(A到E)更新时,不同步更新寄存器 */
    sConfig_timerD.ResetTrigger = HRTIM_TIMRESETTRIGGER_NONE;          /* 无复位触发 */

    HAL_HRTIM_WaveformTimerConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_D, &sConfig_timerD);

    /*##-7- 配置HRTIM的TIMER D的比较输出 ###########################*/
    sConfig_compare.AutoDelayedMode = HRTIM_AUTODELAYEDMODE_REGULAR; /* 这里使用标准模式,即未使用自动延迟 */
    sConfig_compare.AutoDelayedTimeout = 0;                          /* 由于前面的参数未使用自动延迟模式,此参数无作用 */
    /*
        设置定时器比较单元的比较值:
        最小值要大于等于3个HRTIM时钟周期。
        最大值要小于等于0xFFFF – 1
    */
    sConfig_compare.CompareValue = HRTIM_TIMD_PERIOD / 2;  /* 占空比50% */
    HAL_HRTIM_WaveformCompareConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_D, HRTIM_COMPAREUNIT_1, &sConfig_compare);
    sConfig_compare.CompareValue = HRTIM_TIMD_PERIOD / 4;  /* 占空比25% */
    HAL_HRTIM_WaveformCompareConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_D, HRTIM_COMPAREUNIT_2, &sConfig_compare);


    /*##-8- 定时器输出配置 ##########################################*/   
    sConfig_output_config.Polarity = HRTIM_OUTPUTPOLARITY_LOW;    /* 设置定时器输出极性 */
    sConfig_output_config.SetSource = HRTIM_OUTPUTRESET_TIMCMP1;  /* 定时器比较事件1可以将输出置位 */
    sConfig_output_config.ResetSource = HRTIM_OUTPUTSET_TIMPER;   /* 定时器周期性更新事件可以将输出清零 */
    sConfig_output_config.IdleMode = HRTIM_OUTPUTIDLEMODE_NONE;   /* 输出不受突发模式影响 */
    sConfig_output_config.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE; /* 设置空闲状态输出低电平 */
    sConfig_output_config.FaultLevel = HRTIM_OUTPUTFAULTLEVEL_NONE;   /* 输出不受异常输入影响 */
    sConfig_output_config.ChopperModeEnable = HRTIM_OUTPUTCHOPPERMODE_DISABLED; /* 关闭Chopper模式 */
    sConfig_output_config.BurstModeEntryDelayed = HRTIM_OUTPUTBURSTMODEENTRY_REGULAR; /* 设置从突发模式切换到空闲模式,不插入死区时间 */

    HAL_HRTIM_WaveformOutputConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_D, HRTIM_OUTPUT_TD1, &sConfig_output_config);
     
    sConfig_output_config.SetSource = HRTIM_OUTPUTRESET_TIMCMP2;  /* 定时器比较事件2可以将输出置位 */   
    HAL_HRTIM_WaveformOutputConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_D, HRTIM_OUTPUT_TD2, &sConfig_output_config);
     
    /*##-9- 启动PWM输出 #############################################*/
    if (HAL_HRTIM_WaveformOutputStart(&HrtimHandle,  HRTIM_OUTPUT_TD1 + HRTIM_OUTPUT_TD2) != HAL_OK)
    {
        Error_Handler(__FILE__, __LINE__);
    }

    /*##-10- 启动计数器 #############################################*/
    if (HAL_HRTIM_WaveformCounterStart(&HrtimHandle, HRTIM_TIMERID_TIMER_D) != HAL_OK)
    {
        Error_Handler(__FILE__, __LINE__);
    }
     
}
回复

使用道具 举报

4

主题

8

回帖

20

积分

新手上路

ARMMRA

积分
20
 楼主| 发表于 2025-6-12 09:22:45 | 显示全部楼层
eric2013 发表于 2025-6-12 08:19
HRTIM的配置计算有点特殊,这个是我整理的H7的HRTIM,应该和G4差不多

/*

谢谢,刚来论坛不太熟,几张图片还不会上传,所以显示不出来,不好意思哈
回复

使用道具 举报

4

主题

8

回帖

20

积分

新手上路

ARMMRA

积分
20
 楼主| 发表于 2025-6-12 18:53:25 | 显示全部楼层
eric2013 发表于 2025-6-12 08:19
HRTIM的配置计算有点特殊,这个是我整理的H7的HRTIM,应该和G4差不多

/*

已经解决了,output里某个配置设置错了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-7-4 21:25 , Processed in 0.688214 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表