登录/注册

STM32 频率可变PWM

STM32 频率可变PWM

更多

在STM32中生成频率可变的PWM,通常通过调整定时器的自动重装载值(ARR)预分频系数(PSC)来实现。以下是详细步骤和示例:


关键概念

  1. PWM频率公式: [ \text{Freq} = \frac{\text{Timer Clock}}{(\text{PSC} + 1) \times (\text{ARR} + 1)} ]

    • Timer Clock:定时器时钟源(如72MHz)
    • PSC:预分频系数(0~65535)
    • ARR:自动重装载值(0~65535)
  2. 占空比公式: [ \text{Duty Cycle} = \frac{\text{CCR}}{\text{ARR} + 1} \times 100\% ]

    • CCR:捕获/比较寄存器值,决定高电平时间。

实现步骤

1. 定时器初始化

// 以TIM3为例,配置PWM输出
TIM_HandleTypeDef htim3;

void PWM_Init(void) {
  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 71;         // PSC=71,定时器时钟=72MHz/(71+1)=1MHz
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 999;           // ARR=999,初始频率=1MHz/(999+1)=1kHz
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  HAL_TIM_PWM_Init(&htim3);

  // 配置PWM通道(以通道1为例)
  TIM_OC_InitTypeDef sConfigOC = {0};
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 500;             // 初始占空比50%(CCR=500)
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);

  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); // 启动PWM
}

2. 动态调整频率

通过修改ARRPSC实时改变频率:

// 方法1:修改ARR(保持占空比)
void Set_PWM_Frequency(uint32_t freq) {
  uint32_t timer_clock = 72000000; // 假设定时器时钟72MHz
  uint32_t psc = htim3.Init.Prescaler;
  uint32_t arr = (timer_clock / (psc + 1) / freq) - 1;

  // 保持占空比比例
  uint32_t ccr = htim3.Instance->CCR1 * (arr + 1) / (htim3.Instance->ARR + 1);

  __HAL_TIM_SET_AUTORELOAD(&htim3, arr); // 更新ARR
  __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, ccr); // 更新CCR
}

// 方法2:修改PSC(影响同一定时器的所有通道)
void Set_PWM_Prescaler(uint32_t psc) {
  __HAL_TIM_SET_PRESCALER(&htim3, psc);
}

注意事项

  1. 同步更新:修改ARR或PSC后,调用__HAL_TIM_SET_AUTORELOAD__HAL_TIM_SET_PRESCALER会自动触发硬件更新事件,确保新值生效。
  2. 占空比保持:若需保持占空比,需同步调整CCR值(如方法1所示)。
  3. 定时器共享:同一定时器的所有通道共享ARR和PSC,修改会影响所有通道频率。
  4. 频率范围:确保计算后的ARR和PSC值不超过16位寄存器范围(0~65535)。

示例代码调用

// 初始化PWM
PWM_Init();

// 运行时将频率改为2kHz
Set_PWM_Frequency(2000);

// 或者直接修改ARR(不保持占空比)
__HAL_TIM_SET_AUTORELOAD(&htim3, 499); // 新频率=1MHz/(499+1)=2kHz

通过上述方法,可灵活调整STM32的PWM频率。实际应用中需根据硬件配置(如时钟源)调整参数。

请问怎么用HRTIM输出可变占空比的PWM?

现在可以输出单路PWM,但可变占空比的PWM不知道怎么配置。请大佬帮助!

2025-07-25 08:16:35

STM32CUBEMX开发GD32F303(12)----输出PWM及修改PWM频率与占空比

本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过开发板内进行验证。 本章主要配置定时器输出PWM,同

2022-11-30 14:40:07

STM32CUBEIDE(11)----输出PWM及修改PWM频率与占空比

本章STM32CUBEMX配置STM32F103输出PWM,并在示波器中查看效果。

2022-11-30 14:12:45

STM32 PWM任意频率计算

STM32 PWM任意频率计算以STM32F103为例总频是72M,定时

资料下载 哈哈哈 2021-12-02 18:06:06

STM32F4时钟触发ADC双通道采样DMA传输进行FFT+测频率+采样频率可变+显示波形(详细解读)...

STM32F4时钟触发ADC双通道采样DMA传输进行FFT+测频率+采样频率可变

资料下载 王利祥 2021-12-01 18:06:12

STM32产生固定频率和占空比可变PWM

讲述如何设置PWM波的频率和初始占空比,以及如何实现占空比可调的PWM。本文中笔者使用的

资料下载 吴藩 2021-12-01 13:36:10

频率可变的多信号发生器设计与实现

一片CD4001和一片通用双运放TL082CP,设计制作一个频率可变的多信号发生器。

资料下载 佚名 2021-05-08 11:28:46

PWM多路可变频率可调占空比输出的proteus原理图免费下载

Proteus8.9 仿真STM32407ZGT6系列010_PWM多路可变频率可调占空比输出程序和仿真工程文件。

资料下载 kaillen 2020-05-06 08:00:00

STM32多路PWM信号频率如何检测?

频率检测的原理是什么?STM32多路PWM信号频率如何检测?

2022-02-14 07:32:11

STM32如何使用PWM输入模式测试频率和占空比?

STM32如何使用PWM输入模式测试频率和占空比?

2022-02-08 06:40:56

如何利用STM32测量PWM的波频率及占空比?

如何利用STM32测量PWM的波频率及占空比?

2021-11-18 07:00:51

stm32pwm频率和占空比设置

stm32中pwm频率和占空比设置一、所需软件安装二、操作2.1 PWM

2021-08-09 08:47:48

PWM的详细介绍和PWM频率PWM值的区别说明

对于pwm,想必很多朋友都有所耳闻。但是,大家对于pwm真的了解吗?譬如,pwm频率

2020-12-12 09:55:39

STM32F4_TIM输出PWM波形 (可调频率、占空比)

STM32F4_TIM输出PWM波形(可调频率、占空比)

2020-03-24 11:26:07

STM32如何实现可调频率、 占空比的PWM波形,且可指定输出脉冲个数?

STM32如何实现可调频率、占空比的PWM波形,且可指定输出脉冲个数?

2020-03-12 11:04:06

7天热门专题 换一换
相关标签