蓝桥杯嵌入式改变pwm频率
时间: 2025-05-28 10:39:36 浏览: 35
### 改变PWM频率的方法及代码示例
在蓝桥杯嵌入式比赛的场景下,通过STM32G431芯片可以实现对PWM信号频率的动态调整。以下是具体方法及其对应的代码示例。
#### 动态修改PWM频率的核心逻辑
为了改变PWM的频率,可以通过设置定时器的自动重装载寄存器(ARR)来完成。这会影响整个PWM周期的时间长度。具体的计算公式为:
\[
f_{PWM} = \frac{f_{CLK}}{(PSC + 1) \times (ARR + 1)}
\]
其中:
- \( f_{PWM} \) 是目标PWM频率,
- \( f_{CLK} \) 是定时器时钟频率,
- \( PSC \) 是预分频系数,
- \( ARR \) 是自动重装载值。
因此,在运行过程中可以根据上述公式重新计算并更新\( ARR \),从而达到改变PWM频率的目的[^2]。
#### 实现代码示例
以下是一个完整的代码片段,用于展示如何动态更改PWM频率:
```c
// 定义全局变量存储当前频率值
uint32_t currentFrequency = 0;
void Update_PWM_Frequency(TIM_HandleTypeDef *htim, uint32_t frequency) {
// 计算新的ARR值
uint32_t new_ARR = (SystemCoreClock / ((htim->Init.Prescaler + 1) * frequency)) - 1;
if(new_ARR >= 0xFFFF){
Error_Handler(); // 如果超出范围,则处理错误
}
// 设置新的ARR值到定时器
__HAL_TIM_SET_AUTORELOAD(htim, new_ARR);
// 更新定时器以应用新参数
HAL_TIM_PWM_Start(htim, TIM_CHANNEL_2);
}
// 中断回调函数中调用此函数以实时更新频率
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) {
if (htim->Instance == TIM3) {
tim3_value_2 = __HAL_TIM_GET_COUNTER(&htim3);
__HAL_TIM_SET_COUNTER(&htim3, 0);
// 根据捕获值计算新的频率
PR2 = 1000000 / tim3_value_2;
// 将新频率传递给Update_PWM_Frequency函数
Update_PWM_Frequency(&htim3, PR2);
}
}
```
以上代码展示了如何基于输入捕捉模式获取外部信号周期,并据此动态调整PWM输出频率。
#### 显示频率至LCD屏幕
如果需要将当前测量得到的PWM频率显示出来,可利用字符串格式化工具`sprintf()`配合LCD驱动库完成操作:
```c
char str[50];
sprintf(str, "FRQ(RP2): %d Hz", PR2);
LCD_DisplayStringLine(Line8, (uint8_t *)str);
```
该部分负责把最新的频率数值打印到指定行数的位置上以便观察效果[^2]。
---
###
阅读全文
相关推荐


















