硬汉嵌入式论坛

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

[HRTIM] STM32H7的HRTIM配置输出5组不同频率,不同占空比的波形,同时5组互补输出也是没问题的

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2018-8-30 14:52:25 | 显示全部楼层 |阅读模式
说明:

官方例程:HRTIM_MultiplePWM

我这里对例程做了简单修改,输出不同频率,默认情况下五组都输出的2MHz波形,不同占空比。


测试的前三组TIMA,TIMB,TIMC的输出

QQ截图20180830144943.png


测试代码

  1. /* Private typedef -----------------------------------------------------------*/
  2. /* Private define ------------------------------------------------------------*/
  3. #define HRTIM_MAX_PERIOD  1000
  4. #define HRTIM_TIMA_PULSE1 500
  5. #define HRTIM_TIMB_PULSE1 250
  6. #define HRTIM_TIMC_PULSE1 100
  7. #define HRTIM_TIMD_PULSE1 500
  8. #define HRTIM_TIME_PULSE1 500

  9. /* Private macro -------------------------------------------------------------*/
  10. /* Private variables ---------------------------------------------------------*/
  11. /* Timer handler declaration */
  12. HRTIM_HandleTypeDef                 HrtimHandle;

  13. HRTIM_TimeBaseCfgTypeDef            sConfig_time_base;
  14. HRTIM_SimplePWMChannelCfgTypeDef    sConfig_Channel;
  15.        
  16. /* Private function prototypes -----------------------------------------------*/
  17. static void SystemClock_Config(void);
  18. static void Error_Handler(void);
  19. static void CPU_CACHE_Enable(void);

  20. /* Private functions ---------------------------------------------------------*/

  21. /**
  22.   * @brief  Main program
  23.   * @param  None
  24.   * @retval None
  25.   */
  26. int main(void)
  27. {

  28.   /* Enable the CPU Cache */
  29.   CPU_CACHE_Enable();

  30.   /* STM32H7xx HAL library initialization:
  31.        - Configure the Systick to generate an interrupt each 1 msec
  32.        - Set NVIC Group Priority to 4
  33.        - Low Level Initialization
  34.   */
  35.   HAL_Init();

  36.   /* Configure the system clock to 400 MHz */
  37.   SystemClock_Config();

  38.   /*##-1- Configure the HRTIM peripheral ######################################################*/
  39.   /* Initialize the HRTIM structure */
  40.   HrtimHandle.Instance = HRTIM1;
  41.   HrtimHandle.Init.HRTIMInterruptResquests = HRTIM_IT_NONE;
  42.   HrtimHandle.Init.SyncOptions = HRTIM_SYNCOPTION_NONE;

  43.   HAL_HRTIM_Init(&HrtimHandle);

  44.   /*##-2- Configure the HRTIM TIMA PWM channels 1 #############################################*/
  45.   sConfig_time_base.Mode = HRTIM_MODE_CONTINUOUS;
  46.   sConfig_time_base.Period = HRTIM_MAX_PERIOD;
  47.   sConfig_time_base.PrescalerRatio = HRTIM_PRESCALERRATIO_DIV1;
  48.   sConfig_time_base.RepetitionCounter = 0;
  49.          
  50.   HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A, &sConfig_time_base);         
  51.          
  52.   sConfig_Channel.Polarity = HRTIM_OUTPUTPOLARITY_LOW;
  53.   sConfig_Channel.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
  54.   sConfig_Channel.Pulse = HRTIM_TIMA_PULSE1;
  55.          
  56.   HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A,
  57.                                           HRTIM_OUTPUT_TA1, &sConfig_Channel);
  58.        
  59.   /*##-3- Configure the HRTIM TIMB PWM channels 1 #############################################*/
  60.   sConfig_time_base.Mode = HRTIM_MODE_CONTINUOUS;
  61.   sConfig_time_base.Period = HRTIM_MAX_PERIOD/2;
  62.   sConfig_time_base.PrescalerRatio = HRTIM_PRESCALERRATIO_DIV1;
  63.   sConfig_time_base.RepetitionCounter = 0;
  64.          
  65.   HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_B, &sConfig_time_base);         
  66.          
  67.   sConfig_Channel.Polarity = HRTIM_OUTPUTPOLARITY_LOW;
  68.   sConfig_Channel.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
  69.   sConfig_Channel.Pulse = HRTIM_TIMB_PULSE1;
  70.          
  71.   HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_B,
  72.                                           HRTIM_OUTPUT_TB1, &sConfig_Channel);
  73.        
  74.   /*##-4- Configure the HRTIM TIMC PWM channels 1 #############################################*/
  75.   sConfig_time_base.Mode = HRTIM_MODE_CONTINUOUS;
  76.   sConfig_time_base.Period = HRTIM_MAX_PERIOD/4;
  77.   sConfig_time_base.PrescalerRatio = HRTIM_PRESCALERRATIO_DIV1;
  78.   sConfig_time_base.RepetitionCounter = 0;
  79.          
  80.   HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_C, &sConfig_time_base);         
  81.          
  82.   sConfig_Channel.Polarity = HRTIM_OUTPUTPOLARITY_LOW;
  83.   sConfig_Channel.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
  84.   sConfig_Channel.Pulse = HRTIM_TIMC_PULSE1;
  85.          
  86.   HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_C,
  87.                                           HRTIM_OUTPUT_TC1, &sConfig_Channel);
  88.        
  89.   /*##-5- Configure the HRTIM TIMD PWM channels 1 #############################################*/       
  90.   sConfig_time_base.Mode = HRTIM_MODE_CONTINUOUS;
  91.   sConfig_time_base.Period = HRTIM_MAX_PERIOD;
  92.   sConfig_time_base.PrescalerRatio = HRTIM_PRESCALERRATIO_DIV1;
  93.   sConfig_time_base.RepetitionCounter = 0;
  94.          
  95.   HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_D, &sConfig_time_base);         
  96.                                                                                                                                                
  97.   sConfig_Channel.Polarity = HRTIM_OUTPUTPOLARITY_HIGH;
  98.   sConfig_Channel.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
  99.   sConfig_Channel.Pulse = HRTIM_TIMD_PULSE1;
  100.          
  101.   HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_D,
  102.                                           HRTIM_OUTPUT_TD1, &sConfig_Channel);                                                                                                                                       
  103.        
  104.   /*##-6- Configure the HRTIM TIME PWM channels 1 #############################################*/
  105.   sConfig_time_base.Mode = HRTIM_MODE_CONTINUOUS;
  106.   sConfig_time_base.Period = HRTIM_MAX_PERIOD;
  107.   sConfig_time_base.PrescalerRatio = HRTIM_PRESCALERRATIO_DIV1;
  108.   sConfig_time_base.RepetitionCounter = 0;
  109.          
  110.   HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E, &sConfig_time_base);         
  111.          
  112.   sConfig_Channel.Polarity = HRTIM_OUTPUTPOLARITY_LOW;
  113.   sConfig_Channel.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
  114.   sConfig_Channel.Pulse = HRTIM_TIME_PULSE1;
  115.          
  116.   HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E,
  117.                                           HRTIM_OUTPUT_TE1, &sConfig_Channel);
  118.        
  119.   /*##-7- Start PWM signals generation #########################################################*/
  120.   if (HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A, HRTIM_OUTPUT_TA1) != HAL_OK)
  121.   {
  122.     /* PWM Generation Error */
  123.     Error_Handler();
  124.   }     
  125.   if (HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_B, HRTIM_OUTPUT_TB1) != HAL_OK)
  126.   {
  127.     /* PWM Generation Error */
  128.     Error_Handler();
  129.   }
  130.   if (HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_C, HRTIM_OUTPUT_TC1) != HAL_OK)
  131.   {
  132.     /* PWM Generation Error */
  133.     Error_Handler();
  134.   }
  135.   if (HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_D, HRTIM_OUTPUT_TD1) != HAL_OK)
  136.   {
  137.     /* PWM Generation Error */
  138.     Error_Handler();
  139.   }
  140.   if (HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E, HRTIM_OUTPUT_TE1) != HAL_OK)
  141.   {
  142.     /* PWM Generation Error */
  143.     Error_Handler();
  144.   }
  145.   /* Infinite loop */
  146.   while (1)
  147.   {
  148.   }
  149. }
复制代码




回复

使用道具 举报

609

主题

3045

回帖

4892

积分

至尊会员

积分
4892
发表于 2018-8-30 15:15:17 | 显示全部楼层

回复

使用道具 举报

56

主题

904

回帖

1072

积分

至尊会员

积分
1072
发表于 2019-1-24 21:26:13 | 显示全部楼层
每组都可以精确计数脉冲数不? 不用内部定时器级联
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2020-2-19 02:01:32
roguebear 发表于 2019-1-24 21:26
每组都可以精确计数脉冲数不? 不用内部定时器级联

我估计是不行的。1主5从共6个TIM只管输出pwm

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2020-4-28 08:50:36 | 显示全部楼层
硬汉老师  本人新手  想问一下 这个高分辨率的定时器可以做输出捕获测量频率?  有没有例程
回复

使用道具 举报

2

主题

21

回帖

27

积分

新手上路

积分
27
发表于 2021-7-14 00:15:03 | 显示全部楼层
大佬,我遇到问题了,我试了下HRTIM_TIMERINDEX_TIMER_A ~ HRTIM_TIMERINDEX_TIMER_E  只能输出HRTIM_OUTPUT_Tx1输出,HRTIM_OUTPUT_Tx2无法输出。
回复

使用道具 举报

2

主题

21

回帖

27

积分

新手上路

积分
27
发表于 2021-7-14 00:16:15 | 显示全部楼层
// 高精度定时器初始化函数,用于初始化输出频率&基础占空比
void InitHRTIM(void)
{
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
HRTIM_TimeBaseCfgTypeDef         sConfig_time_base = {0};
HRTIM_SimplePWMChannelCfgTypeDef   sConfig_Channel = {0};

```
// HRTIM定时的默认配置
HrtimMaxPeriod = 50000000 / DEFAULT_PWM_PHQ;  //4分频系数(200/4=50MHz)计算出的周期计数值(DEFAULT_PWM_PHQ 来自app_data.h)

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

/*##-2- 初始化HRTIM ###################################################*/
HrtimHandle.Instance = HRTIM1;  /* 例化,使用的HRTIM1 */
HrtimHandle.Init.HRTIMInterruptResquests = HRTIM_IT_NONE; /* 用于配置支持的中断请求,当前配置无中断 */
HrtimHandle.Init.SyncOptions = HRTIM_SYNCOPTION_NONE;     /* 配置HRTIM作为Master,发送同步信号,或者作为Slave,接收同步信号,当前配置没有做同步功能 */

HAL_HRTIM_Init(&HrtimHandle);

/*##-3 - Configure the HRTIM TIMx PWM  #############################################*/
sConfig_time_base.Mode = HRTIM_MODE_CONTINUOUS;
sConfig_time_base.Period = HrtimMaxPeriod - 1;
sConfig_time_base.PrescalerRatio = HRTIM_PRESCALERRATIO_DIV4;  // 4 分Timer时钟,即8分主时钟
sConfig_time_base.RepetitionCounter = 0;

HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A, &sConfig_time_base);
HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_B, &sConfig_time_base);
HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_C, &sConfig_time_base);
HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_D, &sConfig_time_base);
HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E, &sConfig_time_base);

sConfig_Channel.Polarity = HRTIM_OUTPUTPOLARITY_LOW;
sConfig_Channel.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
sConfig_Channel.Pulse = (HrtimMaxPeriod * DEFAULT_PWM_PUL / 100) - 1;

HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A,
                                                                                HRTIM_OUTPUT_TA1, &sConfig_Channel);
HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A,
                                                                                HRTIM_OUTPUT_TA2, &sConfig_Channel);

HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_B,
                                                                                HRTIM_OUTPUT_TB1, &sConfig_Channel);
HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_B,
                                                                                HRTIM_OUTPUT_TB2, &sConfig_Channel);

HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_C,
                                                                                HRTIM_OUTPUT_TC1, &sConfig_Channel);
HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_C,
                                                                                HRTIM_OUTPUT_TC2, &sConfig_Channel);

HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_D,
                                                                                HRTIM_OUTPUT_TD1, &sConfig_Channel);
HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_D,
                                                                                HRTIM_OUTPUT_TD2, &sConfig_Channel);

HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E,
                                                                                HRTIM_OUTPUT_TE1, &sConfig_Channel);
HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E,
                                                                                HRTIM_OUTPUT_TE2, &sConfig_Channel);

HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A,HRTIM_OUTPUT_TA1);
HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A,HRTIM_OUTPUT_TA2);
HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_B,HRTIM_OUTPUT_TB1);
HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_B,HRTIM_OUTPUT_TB2);
HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_C,HRTIM_OUTPUT_TC1);
HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_C,HRTIM_OUTPUT_TC2);
HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_D,HRTIM_OUTPUT_TD1);
HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_D,HRTIM_OUTPUT_TD2);
HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E,HRTIM_OUTPUT_TE1);
HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E,HRTIM_OUTPUT_TE2);
}
回复

使用道具 举报

2

主题

21

回帖

27

积分

新手上路

积分
27
发表于 2021-7-14 00:16:48 | 显示全部楼层
GPIO 初始化检查过了,应该是没问题的。  百思不得其解。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-7-14 01:37:20 | 显示全部楼层
dsl1784 发表于 2021-7-14 00:16
GPIO 初始化检查过了,应该是没问题的。  百思不得其解。

你跑我楼主位的官方代码正常吗
回复

使用道具 举报

2

主题

21

回帖

27

积分

新手上路

积分
27
发表于 2021-7-14 08:27:08 | 显示全部楼层
eric2013 发表于 2021-7-14 01:37
你跑我楼主位的官方代码正常吗

正常的5个通道都输出的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-7-15 08:10:26 | 显示全部楼层
dsl1784 发表于 2021-7-14 08:27
正常的5个通道都输出的。

回头我试试,你可以使用CubeMX生成个代码先对比下
回复

使用道具 举报

2

主题

21

回帖

27

积分

新手上路

积分
27
发表于 2021-7-15 16:33:29 | 显示全部楼层
有时间可以研究看下,用Simple的API方便是方便。 我后面还是用复杂的Wave方式达成了10路PWM的输出。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-7-16 09:40:37 | 显示全部楼层
dsl1784 发表于 2021-7-15 16:33
有时间可以研究看下,用Simple的API方便是方便。 我后面还是用复杂的Wave方式达成了10路PWM的输出。

好的,HRTIM后面要深入搞下,很多地方还没有去研究挖掘,发挥不了威力。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2022-7-11 17:10:22 | 显示全部楼层
您好,直接把代码放到main文件中不对,有很多没定义的 image.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2022-7-11 19:53:46 | 显示全部楼层
苗苗儿 发表于 2022-7-11 17:10
您好,直接把代码放到main文件中不对,有很多没定义的

那估计是HAL库版本不同造成的。

不是这个问题的话,就是移植有问题了

回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2022-9-17 17:41:13 | 显示全部楼层
请教下如何通过HRTIM 生成交替的pwm脉冲波。通用定时器有中心对齐模式选择。请教楼主怎么实现 360截图20220917173945728.jpg

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2022-9-18 08:26:05 | 显示全部楼层
gurong60 发表于 2022-9-17 17:41
请教下如何通过HRTIM 生成交替的pwm脉冲波。通用定时器有中心对齐模式选择。请教楼主怎么实现

可以使用HRIM的DMA,这样就可以发任意波形了。
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2024-1-5 10:39:46 | 显示全部楼层
这个是官方例程吗,硬汉能给个链接么?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2024-1-6 09:17:14 | 显示全部楼层
fei6203150 发表于 2024-1-5 10:39
这个是官方例程吗,硬汉能给个链接么?

下载STM32CubeH7的软件包,解压后检索HRTIM_MultiplePWM
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2024-3-4 18:28:56 | 显示全部楼层
gurong60 发表于 2022-9-17 17:41
请教下如何通过HRTIM 生成交替的pwm脉冲波。通用定时器有中心对齐模式选择。请教楼主怎么实现

请问楼上搞定了吗?搞定的话,能不能解释一下如何设置的。谢谢!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2024-3-5 11:47:37 | 显示全部楼层
Neil 发表于 2024-3-4 18:28
请问楼上搞定了吗?搞定的话,能不能解释一下如何设置的。谢谢!

使用HRTIM的DMA方式就行,可以发送任意脉冲。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 03:02 , Processed in 0.244990 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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