stm32f103c8t6测量pwm频率HAL库
时间: 2025-01-10 15:50:53 浏览: 114
### 使用 STM32F103C8T6 和 HAL 库测量 PWM 频率
为了使用 STM32F103C8T6 及其 HAL 库来测量外部输入的 PWM 信号频率,可以采用捕获模式。具体来说,定时器可以通过检测上升沿或下降沿的时间间隔来计算脉冲宽度和周期,进而得出频率。
#### 定时器配置
首先,在初始化阶段需选择合适的定时器并将其工作模式设为输入捕获模式。对于 STM32 来说,多个 GPIO 引脚可作为不同定时器通道的输入端口用于捕捉事件。这里假设使用 TIM2 的 CH1 (PA0),这与之前提到的小车PWM调速所使用的相同[^3]。
```c
// 初始化TIM2为输入捕获模式
void MX_TIM2_Init(void)
{
__HAL_RCC_TIM2_CLK_ENABLE();
htim2.Instance = TIM2;
htim2.Init.Prescaler = 79; // 假定系统时钟为80MHz,则预分频系数=80-1得到1us计数精度
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 65535; // 自动重装载值最大范围
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.RepetitionCounter = 0;
if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1) != HAL_OK){
Error_Handler();
}
}
```
#### 中断服务程序设计
每当发生一次边沿触发(比如上升沿),就会进入相应的中断处理函数,在此期间记录当前时间戳并与上一次的时间戳相减即可获得该次脉宽。连续两次脉宽之差即代表了一个完整的周期长度,由此便能推算出频率。
```c
uint32_t IC_Val1 = 0, IC_Val2 = 0;
float Frequency = 0.0f;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
static uint32_t previousCaptureValue = 0;
int32_t diffCaptureValue = 0;
/* 获取最新捕获的数据 */
if(htim->Instance==TIM2 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1){
IC_Val2 = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);
/* 计算两个相邻捕获点之间的时间差异 */
if(IC_Val2 >= IC_Val1){
diffCaptureValue = IC_Val2 - IC_Val1;
}else {
diffCaptureValue = ((int32_t)(0xFFFF - IC_Val1)) + IC_Val2 + 1;
}
/* 更新旧捕获数据 */
IC_Val1 = IC_Val2;
/* 将单位转换成Hz */
Frequency = SystemCoreClock / (((diffCaptureValue)*(htim2.Init.Prescaler+1)));
}
}
```
上述代码片段展示了如何通过读取捕获寄存器中的数值变化来确定PWM波形的一个完整周期所需的时间,并据此计算出对应的频率[^4]。
阅读全文
相关推荐

















