PWM简介
STM32 的 PWM 信号主要通过定时器 (Timer) 的输出比较 (OC) 或PWM 模式 实现,核心逻辑可以理解为:
-
定时器计数:定时器从 0 开始向上计数,直到达到你设定的 “自动重装值 (ARR)”,然后重置为 0,循环往复。
-
比较匹配:当计数值等于你设定的 “比较值 (CCR)” 时,GPIO 引脚的电平翻转(高→低或低→高)。
-
PWM 参数:
- 频率:由
ARR和定时器时钟频率决定(频率 = 定时器时钟 / (ARR + 1)); - 占空比:由
CCR决定(占空比 = CCR / (ARR + 1) × 100%)。
- 频率:由
STM32 常用的定时器有通用定时器(TIM2-TIM5)、高级定时器(TIM1、TIM8),都支持 PWM 输出,其中高级定时器还支持互补 PWM(带死区),适合电机控制。
STM32cubeMX配置
系统时钟为80Hz,PWM输出频率为:系统时钟/预分频时钟
补充
各个模式代表的含义
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 */
}