STM32PWM调频率
STM32PWM调频率
好的,在 STM32 微控制器上调整 PWM 信号的频率,核心在于修改驱动该 PWM 通道的定时器 (TIM) 的计数周期。以下是详细的中文步骤和说明:
核心原理:
PWM 频率主要由定时器的两个寄存器决定:
- 预分频器 (Prescaler - PSC): 用于对定时器的输入时钟 (
f_CK) 进行分频,得到实际的计数器时钟 (f_CK_CNT)。
f_CK_CNT = f_CK / (PSC + 1) - 自动重装载寄存器 (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 的值。
调整步骤:
-
确定目标频率: 明确你需要的 PWM 频率 (
f_desired)。 -
计算可用值:
- 根据你的 STM32 型号和时钟树配置,确定分配给该定时器的输入时钟频率 (
f_CK)。 - 使用频率公式:
f_desired = f_CK / [(PSC + 1) * (ARR + 1)] - 你需要为
PSC和ARR选择合适的数值。PSC和ARR都是 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值过小可能导致频率控制不精确或无法达到目标。
- 根据你的 STM32 型号和时钟树配置,确定分配给该定时器的输入时钟频率 (
-
编写代码修改寄存器:
- 根据你使用的开发库(标准外设库、HAL 库、LL 库),调用相应的函数或直接操作寄存器来设置新的
PSC和ARR值。
常用方法 (以 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);
- 根据你使用的开发库(标准外设库、HAL 库、LL 库),调用相应的函数或直接操作寄存器来设置新的
-
关键注意事项:
- 占空比变化: 改变 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)。
- 占空比变化: 改变 ARR 一定会改变 PWM 的周期,如果你的占空比是由比较寄存器 (
总结步骤:
- 计算所需的
PSC和ARR值,使f = f_CK / [(PSC+1)*(ARR+1)]接近目标频率。 - (推荐) 停止 PWM 输出。
- 使用 HAL/LL 宏或直接写寄存器,设置新的
ARR(和PSC,如果需要)。 - 触发一个定时器更新事件 (
__HAL_TIM_GENERATE_SWUPDATE()) 使新值生效。 - 重新计算并设置
CCRx值,以维持或设置新的占空比。 - (如果之前停止了) 重新启动 PWM 输出。
通过正确设置定时器的 PSC 和 ARR 寄存器,并处理好占空比调整和更新事件,你就能精确地控制 STM32 PWM 输出的频率。
STM32CubeMX输出可调频率与占空比的PWM
1,新建工程,我选的是STM32F103ZET6芯片,选择定时器的PWM功能。2、配置时钟,我这里配的是内部时钟,有需要的可以自己改。3、配置定时器,默认就可以,因为代码里面需要对配置的初始化代码
2023-05-11 10:00:25
STM32读取光敏AD值自动调节屏幕亮度PWM
前提:STM32PWM配置完成(这里是通道4),PWM设置越大,屏幕背光越亮PWM调节函数:__HAL_TIM_SetCompare(&
资料下载
佚名
2022-01-14 13:07:21
STM32 PWM配置完成
前提:STM32PWM配置完成(这里是通道4),PWM设置越大,屏幕背光越亮PWM调节函数:__HAL_TIM_SetCompare(&
stm32pwm和dac 精选资料分享
stm32pwm和dac一、PWM练习Keil软件仿真二、输出周期为2kHz的正炫波形三、数字音频转换为模拟音频一、PWM练习
stm32PWM DAC原理
stm32PWM DAC原理简而言之:改变PWM占空比,利用DAC和ADC显示电压PWM本质上其实就是是一种周期一定,而高低电平占空比可调的方波
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- EDA是什么?有什么作用?
- dtmb信号覆盖城市查询
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- amoled屏幕和oled区别
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机
- 元宇宙概念龙头股一览