【stm32】定时器输出PWM波形(hal库)

一. PWM基本原理

PWM是一种通过调节信号的占空比(Duty Cycle)来控制输出平均电压的技术。占空比是指高电平时间与整个周期时间的比值。例如:

  • 占空比为50%时,输出平均电压为电源电压的一半。

  • 占空比为100%时,输出始终为高电平。

二、STM32定时器生成PWM的原理

STM32的定时器可以通过以下步骤生成PWM信号:

  1. 计数器:定时器内部有一个计数器,根据时钟源进行递增或递减计数。

  2. 自动重装载寄存器(ARR):定义PWM信号的周期(频率)。

  3. 比较寄存器(CCR):定义PWM信号的占空比。

  4. 输出模式:定时器可以配置为在计数器值等于比较寄存器值时切换输出电平。

三、 PWM生成步骤

以下是配置STM32定时器生成PWM的基本步骤:

  1. 使能定时器时钟:通过RCC寄存器使能定时器的时钟。

  2. 配置定时器模式:

  • 设置计数模式(向上、向下或中心对齐)。

  • 配置预分频器(Prescaler)以调整计数器时钟频率。

  • 设置自动重装载寄存器(ARR)以定义PWM周期。

  1. 配置PWM模式:
  • 选择PWM模式(PWM模式1或PWM模式2)。

  • 设置比较寄存器(CCR)以定义占空比。

  1. 配置GPIO:
  • 将定时器的输出通道映射到特定的GPIO引脚。

  • 配置GPIO为复用功能(Alternate Function)。

  1. 启动定时器:使能定时器开始生成PWM信号。

四、 关键参数

PWM频率:由定时器时钟频率、预分频器和自动重装载寄存器(ARR)决定

PWM频率 = 定时器时钟频率 / (预分频器 + 1) / (ARR + 1)

占空比:由比较寄存器(CCR)决定。

占空比 = (CCR + 1) / (ARR + 1)

五、代码

复制代码
#include "PWM.h"

TIM_HandleTypeDef PWM_InitStructure;
TIM_OC_InitTypeDef PWM_InitStruct;
void PWM_Init(void)
{
	PWM_InitStructure.Instance = TIM1;
	PWM_InitStructure.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
	PWM_InitStructure.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;//分频因子
	PWM_InitStructure.Init.CounterMode = TIM_COUNTERMODE_UP;//计数模式:向上计数
	PWM_InitStructure.Init.Period = 500 - 1;//自动重装载值ARR
	PWM_InitStructure.Init.Prescaler = 84 - 1;//分频系数PSC
	PWM_InitStructure.Init.RepetitionCounter = 0;//重复计数器
	HAL_TIM_PWM_Init(&PWM_InitStructure);
	
	PWM_InitStruct.OCMode = TIM_OCMODE_PWM1;
	PWM_InitStruct.Pulse = (500 - 1)/2;
	PWM_InitStruct.OCPolarity = TIM_OCPOLARITY_HIGH;
	
	HAL_TIM_PWM_ConfigChannel(&PWM_InitStructure,&PWM_InitStruct,TIM_CHANNEL_1);
	
	HAL_TIM_PWM_Start(&PWM_InitStructure,TIM_CHANNEL_1);
}

void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
	if(htim->Instance == TIM1)
	{
		__HAL_RCC_TIM1_CLK_ENABLE();//开启定时器1的时钟
	__HAL_RCC_GPIOE_CLK_ENABLE();//开启GPIOE的时钟  TIM1_CH1---->PE9
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;				//复用推挽输出
	GPIO_InitStructure.Pin = GPIO_PIN_9;					//引脚9
	GPIO_InitStructure.Pull = GPIO_PULLUP;					//上拉
	GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;	//超高速
	GPIO_InitStructure.Alternate = GPIO_AF1_TIM1;			//复用功能
	HAL_GPIO_Init(GPIOE,&GPIO_InitStructure);
	}
}

void TIM1_SetCompare(uint32_t compare)
{
	TIM1->CCR1 = compare;
}
相关推荐
Jcenav4 小时前
OCXO外围电路设计指南
单片机·嵌入式硬件
Nautiluss4 小时前
一起玩XVF3800麦克风阵列(八)
大数据·人工智能·嵌入式硬件·github·音频·语音识别
神圣的大喵4 小时前
平台无关的嵌入式通用按键管理器
c语言·单片机·嵌入式硬件·嵌入式·按键库
三佛科技-134163842124 小时前
FT8353系列(FT8353A/B/C/CD/DD/K/KD/PD)隔离型LED恒流驱动IC芯片 典型应用电路
单片机·物联网·智能家居·pcb工艺
无人装备硬件开发爱好者5 小时前
深度解析:STM32 MDK 工程 HEX 文件转 BIN 文件 —— 原理、方法、优缺点与实战指南(中)
stm32·嵌入式软件·hex2bin
阿拉斯攀登5 小时前
嵌入式-硬件基础:了解三极管
单片机·嵌入式硬件·三极管
逐步前行5 小时前
C51_74HC165并口转串口
单片机·51单片机
HarrySunCn6 小时前
如何使用VSCode开发Arduino项目
ide·vscode·单片机·编辑器
嵌入式的飞鱼6 小时前
SD NAND 焊接避坑指南:LGA-8 封装手工焊接技巧与常见错误
人工智能·stm32·单片机·嵌入式硬件·tf卡
三佛科技-134163842127 小时前
LN8K05A/B/C_5V非隔离AC-DC电源芯片 典型应用场景、典型电路、与阻容降压的对比分析
单片机·嵌入式硬件·物联网·智能家居·pcb工艺