蓝桥杯嵌入式脉冲捕获测量占空比
时间: 2025-04-18 20:48:38 浏览: 29
### 使用嵌入式系统进行脉冲捕获以测量占空比
在蓝桥杯竞赛中,使用嵌入式系统特别是STM32系列微控制器可以高效地完成脉冲信号的捕获并计算其占空比。通过配置定时器的工作模式以及相应的中断处理程序能够精确获取所需数据。
#### 配置定时器IC通道用于输入捕获
为了实现这一目标,需先初始化TIMx外设为特定工作状态——即设置成上升沿触发下的输入捕捉模式;同时指定使用的具体信道(比如CH1),这一步骤确保了当检测到电平跳变时能及时记录当前计数值作为时间戳保存下来以便后续分析处理[^1]。
```c
// 初始化 TIMx 定时器 IC 通道
void MX_TIMx_IC_Init(void)
{
__HAL_RCC_TIMx_CLK_ENABLE(); // 开启定时器时钟
htim.Instance = TIMx;
// 设置定时器参数...
// 输入捕获通道配置
sConfig.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING; // 上升沿触发
sConfig.ICSelection = TIM_ICSELECTION_DIRECTTI; // TI1FP1映射至 CH1
HAL_TIM_IC_ConfigChannel(&htim, &sConfig, TIM_CHANNEL_1);
}
```
#### 中断服务例程ISR设计
每当发生一次有效的边沿事件之后就会进入对应的中断向量表项执行一段预定义好的函数体,在此期间读取寄存器中的值进而推导出高/低电平时长从而求得最终结果[^3]。
```c
extern uint32_t RisingEdgeCaptureValue;
extern uint32_t FallingEdgeCaptureValue;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) {
if (__HAL_TIM_IS_CAPTURE_COMPARE_DIRECTION(htim, TIM_CHANNEL_1)) { // 判断是上升还是下降沿
RisingEdgeCaptureValue = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); // 记录上升沿时刻
} else {
FallingEdgeCaptureValue = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); // 记录下降沿时刻
// 计算周期T=|Falling-Rising|
uint32_t Period = abs((int)(FallingEdgeCaptureValue - RisingEdgeCaptureValue));
// 如果需要进一步计算频率f,则 f=1/T
// 占空比DutyCycle=(HighLevelDuration / TotalPeriod)*100%
float DutyCycle = ((float)((RisingEdgeCaptureValue - PreviousFallingEdgeCaptureValue) % Period) / Period) * 100.0f;
// 更新前次下降沿位置供下次循环使用
PreviousFallingEdgeCaptureValue = FallingEdgeCaptureValue;
}
// 清除标志位准备下一轮采样
__HAL_TIM_CLEAR_FLAG(htim, TIM_IT_CC1);
}
}
```
上述代码片段展示了如何利用STM32内部资源来达成对PWM波形特征参量的有效监测与解析操作。值得注意的是实际应用过程中还需考虑诸如噪声抑制、异常情况处理等因素的影响以提高系统的稳定性和可靠性。
阅读全文
相关推荐


















