使用STM32Cube+keil实现
STM32CubeMX配置
- 根据需要的引脚,选择所需要的定时器(本文使用芯片为STM32H750VBT6)可知用到的是TIM4,将4个通道都配置为PWM输出
- 确定TIM4定时器在哪条时钟总线上,查《STM32H7xx参考手册》可知TIM4在APB1总线
- APB1的时钟总线设置如下图,可以得出定时器频率为240MHz
- 回到TIM4的参数设置界面,通过Prescaler和Counter Period设置溢出频率,auto-reload preload设置为Enable,表示每次溢出后重新进行计数。这里时钟频率是240M,溢出频率计算方法:240M/(Prescaler+1)(Counter Period+1)=2KHz,溢出周期为1/2K=500us,也就是说,每过500us重新开始计数
- 设置每个通道的pulse值来调节占空比,这里设置为125,占空比计算公式:pulse/counter period=125/250=50%,将Output compare preload设置为Enable
Keil代码
在tim.c中可以找到关于tim4的初始化函数,这里为了其他功能对传入的参数做了一些小调整
void MX_TIM4_Init(uint16_t arr)
{
/* USER CODE BEGIN TIM4_Init 0 */
/* USER CODE END TIM4_Init 0 */
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
/* USER CODE BEGIN TIM4_Init 1 */
/* USER CODE END TIM4_Init 1 */
htim4.Instance = TIM4;
htim4.Init.Prescaler = 480-1;/* 预分频系数 */
htim4.Init.CounterMode = TIM_COUNTERMODE_UP;/* 递增计数模式 */
htim4.Init.Period = arr-1;/* 自动装载值 */
htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_PWM_Init(&htim4) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 100;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM4_Init 2 */
/* USER CODE END TIM4_Init 2 */
HAL_TIM_MspPostInit(&htim4);
}
初始化之后使用这几个函数实现对pwm输出的控制
//开启pwm输出
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_3);
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_4);
//关闭pwm输出
HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_1);
HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_2);
HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_3);
HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_4);
使用这个宏定义设置pwm输出的占空比,
__HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__)