蓝桥杯嵌入式赛道PWM波生成调频率和占空比

8 阅读3分钟

PWM简介

STM32 的 PWM 信号主要通过定时器 (Timer)  的输出比较 (OC)  或PWM 模式 实现,核心逻辑可以理解为:

  1. 定时器计数:定时器从 0 开始向上计数,直到达到你设定的 “自动重装值 (ARR)”,然后重置为 0,循环往复。

  2. 比较匹配:当计数值等于你设定的 “比较值 (CCR)” 时,GPIO 引脚的电平翻转(高→低或低→高)。

  3. PWM 参数

    • 频率:由 ARR 和定时器时钟频率决定(频率 = 定时器时钟 / (ARR + 1));
    • 占空比:由 CCR 决定(占空比 = CCR / (ARR + 1) × 100%)。

STM32 常用的定时器有通用定时器(TIM2-TIM5)、高级定时器(TIM1、TIM8),都支持 PWM 输出,其中高级定时器还支持互补 PWM(带死区),适合电机控制。

STM32cubeMX配置

系统时钟为80Hz,PWM输出频率为:系统时钟/预分频时钟 image.png

补充

image.png image.png

各个模式代表的含义

1. Input Capture direct mode

  • 功能:直接输入捕获模式。
  • 说明:当对应引脚检测到特定边沿(上升 / 下降 / 双边沿)时,定时器会立即将当前计数值锁存到捕获寄存器中,用于精确测量信号的周期、脉宽等参数。
  • 典型场景:测量方波频率、脉冲宽度。

2. Input Capture direct mode from Remap

  • 功能:重映射引脚的直接输入捕获模式。
  • 说明:功能与直接输入捕获完全相同,只是输入信号来自经过引脚重映射后的备用引脚,是为了灵活适配 PCB 的布线需求。

3. Input Capture indirect mode

  • 功能:间接输入捕获模式。
  • 说明:此模式下,捕获信号不是直接来自对应通道的引脚,而是来自其他通道的触发事件,常用于级联测量或同步多通道信号。

4. Input Capture triggered by TRC

  • 功能:由 TRC(跟踪)触发的输入捕获模式。
  • 说明:捕获触发源来自调试跟踪模块(TRC)的外部触发信号,主要用于调试和复杂的多系统同步场景。

5. Output Compare No Output

  • 功能:输出比较无输出模式。
  • 说明:定时器会比较计数器值与比较寄存器值,当两者匹配时会触发中断或 DMA 请求,但不会在引脚上产生任何电平变化。
  • 典型场景:生成定时中断,用于周期性任务调度。

6. Output Compare CH2

  • 功能:通道 2 的输出比较模式。
  • 说明:当计数器值与比较寄存器值匹配时,会在通道 2 的引脚上输出预设的电平(如置高、置低或翻转),用于生成固定电平的定时信号。

7. PWM Generation No Output

  • 功能:PWM 生成无输出模式。
  • 说明:定时器内部会生成 PWM 波形,但不会在引脚上输出,通常用于内部测试或配合其他外设同步工作。

8. PWM Generation CH2

  • 功能:通道 2 的 PWM 生成模式。
  • 说明:在通道 2 的引脚上输出标准 PWM 波形,可通过调整比较寄存器的值来改变占空比,用于电机驱动、LED 调光等场景。

代码部分

占空比计数

*通过调整CCR寄存器值,占空比=CCR/(ARR+1)100%

占空比设置方法

1.操作寄存器: TIM2->CCR2=50;

2.通过函数调整:HAL_StatusTypeDef HAL_TIM_SetCompare(TIM_HandleTypeDef *htim, uint32_t Channel);

{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);     //开启定时器通道
  TIM2->CCR2=50;                               //设置占空比为50%
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}