[STM32F3] 在STM32F303上设置定时器以生成PWM波形

[复制链接]
 楼主| 610u 发表于 2024-3-27 19:59 | 显示全部楼层 |阅读模式
选择定时器和通道:首先确定要使用的定时器和PWM输出通道。STM32F303具有多个定时器,每个定时器都有多个PWM输出通道。根据需要选择一个可用的定时器和相应的PWM输出通道。

配置定时器时钟:配置定时器的时钟源和分频因子。定时器的时钟源可以是内部时钟源(例如APB时钟)或外部时钟源。选择适当的时钟源并根据需要设置分频因子以获得所需的PWM频率。

配置定时器模式:选择定时器的工作模式。通常,PWM波形的生成需要将定时器配置为PWM模式或者输出比较模式。在PWM模式下,定时器将自动根据预设的PWM周期和占空比生成PWM波形。

 楼主| 610u 发表于 2024-3-27 20:00 | 显示全部楼层
配置PWM周期和占空比:设置PWM周期和占空比。PWM周期决定PWM波形的频率,而占空比决定了PWM波形的高电平时间比例。通过配置定时器的自动重载寄存器和比较寄存器来实现。

使能定时器和PWM输出:配置完定时器后,必须使能定时器以开始计数,并且使能PWM输出通道以使其输出PWM波形。
 楼主| 610u 发表于 2024-3-27 20:00 | 显示全部楼层
下面是一个简单的示例代码,演示如何在STM32CubeIDE中配置定时器以生成PWM波形:

  1. #include "main.h"
  2. #include "stm32f3xx_hal.h"

  3. TIM_HandleTypeDef htim2;

  4. void SystemClock_Config(void);
  5. static void MX_GPIO_Init(void);
  6. static void MX_TIM2_Init(void);

  7. int main(void)
  8. {
  9.   HAL_Init();
  10.   SystemClock_Config();
  11.   MX_GPIO_Init();
  12.   MX_TIM2_Init();
  13.   HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);

  14.   while (1)
  15.   {
  16.   }
  17. }

  18. void SystemClock_Config(void)
  19. {
  20.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  21.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  22.   __HAL_RCC_PWR_CLK_ENABLE();
  23.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  24.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  25.   RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  26.   RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  27.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  28.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  29.   RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  30.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  31.   {
  32.     Error_Handler();
  33.   }
  34.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
  35.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  36.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  37.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  38.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  39.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  40.   {
  41.     Error_Handler();
  42.   }
  43. }

  44. void MX_TIM2_Init(void)
  45. {
  46.   TIM_MasterConfigTypeDef sMasterConfig = {0};
  47.   TIM_OC_InitTypeDef sConfigOC = {0};

  48.   htim2.Instance = TIM2;
  49.   htim2.Init.Prescaler = 79; // Assuming 1 MHz TIM2 clock after prescaler
  50.   htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  51.   htim2.Init.Period = 999; // PWM frequency = TIM2 clock / (Prescaler * (Period + 1))
  52.   htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  53.   if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
  54.   {
  55.     Error_Handler();
  56.   }
  57.   sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  58.   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  59.   if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  60.   {
  61.     Error_Handler();
  62.   }
  63.   sConfigOC.OCMode = TIM_OCMODE_PWM1;
  64.   sConfigOC.Pulse = 500; // 50% duty cycle
  65.   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  66.   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  67.   if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  68.   {
  69.     Error_Handler();
  70.   }
  71. }
 楼主| 610u 发表于 2024-3-27 20:00 | 显示全部楼层
在这个示例代码中,TIM2被配置为PWM模式,并且PWM周期为1ms(1kHz PWM频率),占空比为50%。TIM2的时钟源假设为HSI(内部高速时钟),通过分频因子设置为1MHz。
micoccd 发表于 2024-3-28 11:18 | 显示全部楼层
注意定时器的预分频器和重复计数器的设置
您需要登录后才可以回帖 登录 | 注册

本版积分规则

53

主题

568

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

53

主题

568

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部