嵌入式备忘录(二) STM32H7配置PWM输出

使用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__) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值