1. 项目背景与问题概述
作为一名参加过多次蓝桥杯嵌入式竞赛的老选手,今天想和大家复盘一下第16届省赛中遇到的几个典型问题。这次比赛我最终得分71.8/85,主要失分点集中在PWM参数设置、按键逻辑和状态显示等几个方面。通过这次踩坑经历,我总结出一些嵌入式开发中容易忽视的细节问题,特别是关于STM32的定时器配置和按键处理逻辑。
比赛使用的是蓝桥杯嵌入式开发板,主控芯片为STM32系列,开发环境为Keil MDK。题目要求实现一个带参数调节功能的监控系统,需要通过按键控制PWM输出的频率和占空比,并实时显示系统状态。
2. 核心问题分析与解决方案
2.1 PWM频率与占空比显示误差问题
在比赛中,R37(占空比)和R38(频率)的显示出现了较大误差,这直接导致了多个测试点的失分。经过赛后分析,发现问题主要出在以下几个方面:
-
PWM频率设置函数未优化
- 原始代码直接使用简单的分频计算,没有考虑时钟树配置和定时器重装载值的精确匹配
- 改进方案:采用更精确的频率计算公式:
c复制void PWM_SetFrequency(TIM_HandleTypeDef *htim, uint32_t freq) { uint32_t timer_clock = HAL_RCC_GetPCLK1Freq() * 2; // 获取定时器时钟 uint32_t prescaler = (timer_clock / (freq * 0xFFFF)) + 1; uint32_t period = (timer_clock / (prescaler * freq)) - 1; __HAL_TIM_SET_PRESCALER(htim, prescaler - 1); __HAL_TIM_SET_AUTORELOAD(htim, period); }
-
占空比转换算法存在误差
- 原始代码使用简单的线性映射,没有考虑死区时间和最小脉冲宽度
- 改进后的占空比计算:
c复制float duty_ratio = (float)(pu
