登录/注册

STM32PWM调频率

STM32PWM调频率

更多

好的,在 STM32 微控制器上调整 PWM 信号的频率,核心在于修改驱动该 PWM 通道的定时器 (TIM) 的计数周期。以下是详细的中文步骤和说明:

核心原理:

PWM 频率主要由定时器的两个寄存器决定:

  1. 预分频器 (Prescaler - PSC): 用于对定时器的输入时钟 (f_CK) 进行分频,得到实际的计数器时钟 (f_CK_CNT)。
    f_CK_CNT = f_CK / (PSC + 1)
  2. 自动重装载寄存器 (Auto-Reload Register - ARR): 定义了计数器的计数上限。计数器从 0 开始向上计数到 ARR 值,然后溢出回到 0 重新开始(向上计数模式)。每次计数器溢出就对应一个完整的 PWM 周期。
    PWM 周期 (T) = (ARR + 1) * (1 / f_CK_CNT)
    PWM 频率 (f) = f_CK_CNT / (ARR + 1) = f_CK / [(PSC + 1) * (ARR + 1)]

因此,要改变 PWM 频率,你需要修改 ARR 的值和/或 PSC 的值。

调整步骤:

  1. 确定目标频率: 明确你需要的 PWM 频率 (f_desired)。

  2. 计算可用值:

    • 根据你的 STM32 型号和时钟树配置,确定分配给该定时器的输入时钟频率 (f_CK)。
    • 使用频率公式:f_desired = f_CK / [(PSC + 1) * (ARR + 1)]
    • 你需要为 PSCARR 选择合适的数值。
      • PSCARR 都是 16 位或 32 位整数(取决于定时器)。
      • 通常先设定一个合适的 PSC 值(范围 0 - 65535),目的是让 f_CK_CNT 足够高,以便 ARR 能在一个合理范围内(比如几十到几千)设定出接近你需要的频率。
      • 然后计算所需的 ARR 值:ARR = (f_CK / (f_desired * (PSC + 1))) - 1
      • 计算出的 ARR 值必须是一个整数,并且不能超过定时器的最大允许值 (0xFFFF 或 0xFFFFFFFF)。如果计算出的 ARR 不是整数或超过了最大值,需要调整 PSC 的值重新计算。
    • 目标: 找到一个 PSC 值,使得计算出的 ARR 尽可能接近整数,且落在有效范围内。
    • 权衡: ARR 值越大,PWM 频率分辨率越高(可以调整的频率变化更精细),但绝对精度可能受限;ARR 值过小可能导致频率控制不精确或无法达到目标。
  3. 编写代码修改寄存器:

    • 根据你使用的开发库(标准外设库、HAL 库、LL 库),调用相应的函数或直接操作寄存器来设置新的 PSCARR 值。

    常用方法 (以 HAL 库为例):

    • 方法 1: 修改 ARR (推荐,通常更高效):

      // 假设 htim 是你的 TIM_HandleTypeDef 结构体指针
      // 计算好新的 ARR 值 (new_arr) 和可能的 PSC 值 (new_psc, 如果需要修改的话)
      // 通常只改 ARR 就能满足大部分频率调整需求
      
      // 停止 PWM 输出 (可选,但安全做法是先停止)
      HAL_TIM_PWM_Stop(&htim, TIM_CHANNEL_X); // 替换 X 为你的通道号
      
      // 设置新的 ARR 值 (使用 HAL 宏)
      __HAL_TIM_SET_AUTORELOAD(&htim, new_arr); // 动态修改 ARR
      
      // 如果需要修改 PSC,设置新的 PSC 值 (使用 HAL 宏)
      __HAL_TIM_SET_PRESCALER(&htim, new_psc); // 动态修改 PSC
      
      // 重要:如果修改了 ARR 或 PSC,通常需要生成一个定时器更新事件来重新加载影子寄存器
      __HAL_TIM_GENERATE_SWUPDATE(&htim); // 触发软件更新事件
      // 或者 HAL_TIM_GenerateEvent(&htim, TIM_EVENTSOURCE_UPDATE); // 等效
      
      // 重新启动 PWM 输出 (如果之前停止了)
      HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_X);
    • 方法 2: 重新初始化定时器基配置 (更彻底):

      HAL_TIM_PWM_Stop(&htim, TIM_CHANNEL_X); // 停止 PWM
      
      // 修改句柄中的基配置参数
      htim.Instance->PSC = new_psc;      // 直接修改预分频器寄存器
      htim.Instance->ARR = new_arr;      // 直接修改自动重装载寄存器
      
      // 重新初始化定时器基配置 (这会设置预分频器、周期、计数模式等)
      if (HAL_TIM_Base_Init(&htim) != HAL_OK) {
          // 错误处理
      }
      
      // 如果需要,重新初始化 PWM 通道 (通常修改基配置后通道配置不变,可以省略)
      // if (HAL_TIM_PWM_Init(&htim) != HAL_OK) { ... }
      
      // 重新配置 PWM 通道的占空比 (因为 ARR 变了,之前的 CCR 占空比可能已改变!)
      __HAL_TIM_SET_COMPARE(&htim, TIM_CHANNEL_X, new_ccr); // 设置新的比较值 (CCRx) 以维持或改变占空比
      
      // 重新启动 PWM
      HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_X);
  4. 关键注意事项:

    • 占空比变化: 改变 ARR 一定会改变 PWM 的周期,如果你的占空比是由比较寄存器 (CCRx) 的固定值设定的,那么占空比 (CCRx / (ARR + 1)) 也会随之改变!为了保持占空比不变,在修改 ARR 后,必须按比例重新计算并设置 CCRx 的新值 (new_ccr = (old_ccr * (new_arr + 1)) / (old_arr + 1)) 或者根据新的 ARR 值重新设置你想要的占空比值。
    • 影子寄存器: ARR 和 PSC 通常有影子寄存器。修改它们的值后,需要等待下一次更新事件 (UEV) 或手动触发一个更新事件 (使用 __HAL_TIM_GENERATE_SWUPDATE()TIM_EGR.UG=1),新的值才会生效(从预加载寄存器加载到影子寄存器)。
    • 计数器模式: 上述公式和说明基于最常见的向上计数模式。其他模式(向下计数、中央对齐)的周期和频率计算略有不同,但核心思想不变:修改计数周期 (ARR) 和计数器时钟源 (PSC)。
    • 动态调整: 在 PWM 输出过程中动态修改 ARR/PSC 是可行的,如方法 1 所示。注意在修改寄存器和使用软件更新事件时的时序。通常先停止 PWM (Stop) 是最安全的,但熟练后也可以在不停止计数的情况下修改(利用自动重装载预加载功能 TIMx_CR1.ARPE 和合适的更新事件时机)。
    • 库选择: HAL 库 (__HAL_TIM_SET_XXX) 和 LL 库 (LL_TIM_SetXXX) 提供了方便的宏/函数来安全地修改寄存器。标准库直接操作 TIMx->PSC / TIMx->ARR 也是可以的。
    • 定时器选择: 确保你修改的是生成目标 PWM 信号的那个定时器实例 (TIMx) 及其正确的通道 (TIM_CHANNEL_X)。

总结步骤:

  1. 计算所需的 PSCARR 值,使 f = f_CK / [(PSC+1)*(ARR+1)] 接近目标频率。
  2. (推荐) 停止 PWM 输出。
  3. 使用 HAL/LL 宏或直接写寄存器,设置新的 ARR(和 PSC,如果需要)。
  4. 触发一个定时器更新事件 (__HAL_TIM_GENERATE_SWUPDATE()) 使新值生效。
  5. 重新计算并设置 CCRx,以维持或设置新的占空比。
  6. (如果之前停止了) 重新启动 PWM 输出。

通过正确设置定时器的 PSCARR 寄存器,并处理好占空比调整和更新事件,你就能精确地控制 STM32 PWM 输出的频率。

PWM调频的区别 基于PWM的电源管理方案

PWM(脉冲宽度调制)与调频是两种不同的控制技术,它们在电源管理方案中各有其独特的应用和优势。以下是对PWM与

2024-11-28 16:42:03

STM32CubeMX输出可调频率与占空比的PWM

1,新建工程,我选的是STM32F103ZET6芯片,选择定时器的PWM功能。2、配置时钟,我这里配的是内部时钟,有需要的可以自己改。3、配置定时器,默认就可以,因为代码里面需要对配置的初始化代码

2023-05-11 10:00:25

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

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

2022-11-30 14:12:45

STM32读取光敏AD值自动调节屏幕亮度PWM

前提:STM32PWM配置完成(这里是通道4),PWM设置越大,屏幕背光越亮PWM调节函数:__HAL_TIM_SetCompare(&

资料下载 佚名 2022-01-14 13:07:21

STM32 PWM任意频率计算

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

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

STM32PWM与示波器实验

STM32PWM与示波器实验STM32输出PWM波形1、PWM(脉冲宽度

资料下载 而无返还 2021-12-02 13:21:09

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

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

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

基于STM32f103的FFT频率测试程序下载

基于STM32f103的FFT频率测试程序下载

资料下载 shyshyshy 2021-08-02 10:07:20

STM32 PWM配置完成

前提:STM32PWM配置完成(这里是通道4),PWM设置越大,屏幕背光越亮PWM调节函数:__HAL_TIM_SetCompare(&

2022-01-14 07:20:19

stm32 pwm自动计算定时器配置工具相关资料下载

stm32pwm自动计算定时器配置工具

2022-01-12 07:05:03

stm32pwm和dac 精选资料分享

stm32pwm和dac一、PWM练习Keil软件仿真二、输出周期为2kHz的正炫波形三、数字音频转换为模拟音频一、PWM练习

2021-08-10 08:05:25

stm32PWM DAC原理

stm32PWM DAC原理简而言之:改变PWM占空比,利用DAC和ADC显示电压PWM本质上其实就是是一种周期一定,而高低电平占空比可调的方波

2021-07-20 08:23:51

STM32F4_TIM输出PWM波形

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

2020-04-07 11:13:24

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

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

2020-03-24 11:26:07

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

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

2020-03-12 11:04:06

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