STM32H7的HRTIM配置输出5组不同频率,不同占空比的波形,同时5组互补输出也是没问题的
说明:官方例程:HRTIM_MultiplePWM
我这里对例程做了简单修改,输出不同频率,默认情况下五组都输出的2MHz波形,不同占空比。
static/image/hrline/4.gif
测试的前三组TIMA,TIMB,TIMC的输出
static/image/hrline/4.gif
测试代码
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#define HRTIM_MAX_PERIOD1000
#define HRTIM_TIMA_PULSE1 500
#define HRTIM_TIMB_PULSE1 250
#define HRTIM_TIMC_PULSE1 100
#define HRTIM_TIMD_PULSE1 500
#define HRTIM_TIME_PULSE1 500
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Timer handler declaration */
HRTIM_HandleTypeDef HrtimHandle;
HRTIM_TimeBaseCfgTypeDef sConfig_time_base;
HRTIM_SimplePWMChannelCfgTypeDef sConfig_Channel;
/* Private function prototypes -----------------------------------------------*/
static void SystemClock_Config(void);
static void Error_Handler(void);
static void CPU_CACHE_Enable(void);
/* Private functions ---------------------------------------------------------*/
/**
* @briefMain program
* @paramNone
* @retval None
*/
int main(void)
{
/* Enable the CPU Cache */
CPU_CACHE_Enable();
/* STM32H7xx HAL library initialization:
- Configure the Systick to generate an interrupt each 1 msec
- Set NVIC Group Priority to 4
- Low Level Initialization
*/
HAL_Init();
/* Configure the system clock to 400 MHz */
SystemClock_Config();
/*##-1- Configure the HRTIM peripheral ######################################################*/
/* Initialize the HRTIM structure */
HrtimHandle.Instance = HRTIM1;
HrtimHandle.Init.HRTIMInterruptResquests = HRTIM_IT_NONE;
HrtimHandle.Init.SyncOptions = HRTIM_SYNCOPTION_NONE;
HAL_HRTIM_Init(&HrtimHandle);
/*##-2- Configure the HRTIM TIMA PWM channels 1 #############################################*/
sConfig_time_base.Mode = HRTIM_MODE_CONTINUOUS;
sConfig_time_base.Period = HRTIM_MAX_PERIOD;
sConfig_time_base.PrescalerRatio = HRTIM_PRESCALERRATIO_DIV1;
sConfig_time_base.RepetitionCounter = 0;
HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A, &sConfig_time_base);
sConfig_Channel.Polarity = HRTIM_OUTPUTPOLARITY_LOW;
sConfig_Channel.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
sConfig_Channel.Pulse = HRTIM_TIMA_PULSE1;
HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A,
HRTIM_OUTPUT_TA1, &sConfig_Channel);
/*##-3- Configure the HRTIM TIMB PWM channels 1 #############################################*/
sConfig_time_base.Mode = HRTIM_MODE_CONTINUOUS;
sConfig_time_base.Period = HRTIM_MAX_PERIOD/2;
sConfig_time_base.PrescalerRatio = HRTIM_PRESCALERRATIO_DIV1;
sConfig_time_base.RepetitionCounter = 0;
HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_B, &sConfig_time_base);
sConfig_Channel.Polarity = HRTIM_OUTPUTPOLARITY_LOW;
sConfig_Channel.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
sConfig_Channel.Pulse = HRTIM_TIMB_PULSE1;
HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_B,
HRTIM_OUTPUT_TB1, &sConfig_Channel);
/*##-4- Configure the HRTIM TIMC PWM channels 1 #############################################*/
sConfig_time_base.Mode = HRTIM_MODE_CONTINUOUS;
sConfig_time_base.Period = HRTIM_MAX_PERIOD/4;
sConfig_time_base.PrescalerRatio = HRTIM_PRESCALERRATIO_DIV1;
sConfig_time_base.RepetitionCounter = 0;
HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_C, &sConfig_time_base);
sConfig_Channel.Polarity = HRTIM_OUTPUTPOLARITY_LOW;
sConfig_Channel.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
sConfig_Channel.Pulse = HRTIM_TIMC_PULSE1;
HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_C,
HRTIM_OUTPUT_TC1, &sConfig_Channel);
/*##-5- Configure the HRTIM TIMD PWM channels 1 #############################################*/
sConfig_time_base.Mode = HRTIM_MODE_CONTINUOUS;
sConfig_time_base.Period = HRTIM_MAX_PERIOD;
sConfig_time_base.PrescalerRatio = HRTIM_PRESCALERRATIO_DIV1;
sConfig_time_base.RepetitionCounter = 0;
HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_D, &sConfig_time_base);
sConfig_Channel.Polarity = HRTIM_OUTPUTPOLARITY_HIGH;
sConfig_Channel.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
sConfig_Channel.Pulse = HRTIM_TIMD_PULSE1;
HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_D,
HRTIM_OUTPUT_TD1, &sConfig_Channel);
/*##-6- Configure the HRTIM TIME PWM channels 1 #############################################*/
sConfig_time_base.Mode = HRTIM_MODE_CONTINUOUS;
sConfig_time_base.Period = HRTIM_MAX_PERIOD;
sConfig_time_base.PrescalerRatio = HRTIM_PRESCALERRATIO_DIV1;
sConfig_time_base.RepetitionCounter = 0;
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 = HRTIM_TIME_PULSE1;
HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E,
HRTIM_OUTPUT_TE1, &sConfig_Channel);
/*##-7- Start PWM signals generation #########################################################*/
if (HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_A, HRTIM_OUTPUT_TA1) != HAL_OK)
{
/* PWM Generation Error */
Error_Handler();
}
if (HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_B, HRTIM_OUTPUT_TB1) != HAL_OK)
{
/* PWM Generation Error */
Error_Handler();
}
if (HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_C, HRTIM_OUTPUT_TC1) != HAL_OK)
{
/* PWM Generation Error */
Error_Handler();
}
if (HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_D, HRTIM_OUTPUT_TD1) != HAL_OK)
{
/* PWM Generation Error */
Error_Handler();
}
if (HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E, HRTIM_OUTPUT_TE1) != HAL_OK)
{
/* PWM Generation Error */
Error_Handler();
}
/* Infinite loop */
while (1)
{
}
}
{:8:}
每组都可以精确计数脉冲数不? 不用内部定时器级联 roguebear 发表于 2019-1-24 21:26
每组都可以精确计数脉冲数不? 不用内部定时器级联
我估计是不行的。1主5从共6个TIM只管输出pwm 硬汉老师本人新手想问一下 这个高分辨率的定时器可以做输出捕获测量频率?有没有例程 大佬,我遇到问题了,我试了下HRTIM_TIMERINDEX_TIMER_A ~ HRTIM_TIMERINDEX_TIMER_E只能输出HRTIM_OUTPUT_Tx1输出,HRTIM_OUTPUT_Tx2无法输出。 // 高精度定时器初始化函数,用于初始化输出频率&基础占空比
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);
} GPIO 初始化检查过了,应该是没问题的。百思不得其解。 dsl1784 发表于 2021-7-14 00:16
GPIO 初始化检查过了,应该是没问题的。百思不得其解。
你跑我楼主位的官方代码正常吗 eric2013 发表于 2021-7-14 01:37
你跑我楼主位的官方代码正常吗
正常的5个通道都输出的。 dsl1784 发表于 2021-7-14 08:27
正常的5个通道都输出的。
回头我试试,你可以使用CubeMX生成个代码先对比下 有时间可以研究看下,用Simple的API方便是方便。 我后面还是用复杂的Wave方式达成了10路PWM的输出。 dsl1784 发表于 2021-7-15 16:33
有时间可以研究看下,用Simple的API方便是方便。 我后面还是用复杂的Wave方式达成了10路PWM的输出。
好的,HRTIM后面要深入搞下,很多地方还没有去研究挖掘,发挥不了威力。 您好,直接把代码放到main文件中不对,有很多没定义的 苗苗儿 发表于 2022-7-11 17:10
您好,直接把代码放到main文件中不对,有很多没定义的
那估计是HAL库版本不同造成的。
不是这个问题的话,就是移植有问题了
请教下如何通过HRTIM 生成交替的pwm脉冲波。通用定时器有中心对齐模式选择。请教楼主怎么实现
gurong60 发表于 2022-9-17 17:41
请教下如何通过HRTIM 生成交替的pwm脉冲波。通用定时器有中心对齐模式选择。请教楼主怎么实现
可以使用HRIM的DMA,这样就可以发任意波形了。 这个是官方例程吗,硬汉能给个链接么? fei6203150 发表于 2024-1-5 10:39
这个是官方例程吗,硬汉能给个链接么?
下载STM32CubeH7的软件包,解压后检索HRTIM_MultiplePWM gurong60 发表于 2022-9-17 17:41
请教下如何通过HRTIM 生成交替的pwm脉冲波。通用定时器有中心对齐模式选择。请教楼主怎么实现
请问楼上搞定了吗?搞定的话,能不能解释一下如何设置的。谢谢! Neil 发表于 2024-3-4 18:28
请问楼上搞定了吗?搞定的话,能不能解释一下如何设置的。谢谢!
使用HRTIM的DMA方式就行,可以发送任意脉冲。
页:
[1]