(根据B站up主keysking的STM32教程视频的笔记)
【STM32】动画讲解轻松学会STM32的PWM_哔哩哔哩_bilibili
什么是PWM?
PWM,全称为脉冲宽度调制(Pulse Width Modulation),是一种调制技术,用于控制模拟电路中的电源输出。
它通过调节信号的占空比(即高电平持续的时间与整个周期的比率)来控制电流或电压,从而实现对设备的控制。
PWM 的优点是可以通过数字信号实现对模拟输出的精确控制,并且由于它在开关之间切换,效率较高。(以下是三种占空比不同的PWM波形)

因为数字信号只有高低电平两种状态,只要不是太强的干扰,都不会影响对电平的判断,因此数字信号传输数据的速度就更快更稳定。

PWM的几个关键参数为:
-
频率(Frequency):即高低电平切换的速度,切换的速度越快则频率越高,1000Hz的PWM波意味着1秒钟有1000个脉冲
-
占空比(Duty Cycle):即每个周期内,高电平所占的宽度
-
例如图中
50% duty cycle
,即高/低电平的时间各占50%; -
图中的
75% duty cycle
,高电平占75%,低电平占25%; -
图中的
25% duty cycle
,高电平占25%,低电平占75%;
-


操作步骤:
将SYS设置为Serial Wire模式

然后设置高速时钟源为晶振

在时钟设置里,将HCLK设置为72MHz,然后回车,让其自动设置

接着将TIM3设置为内部时钟,通道1设置为PWM模式(其中,定时器TIM3的通道1为PA6口)

将PSC设置为71、ARR设置为99------则此时PWM的频率为 Freq=72MHz/(72*100)=10000Hz
,此时PWM的周期为0.1ms



点击保存生成代码。
然后,启动PWM---使用代码HAL_TIM_PWM_Start (&htim3, TIM_CHANNEL_1);

因为PWM的占空比由比较寄存器决定,因此,我们调用设置比较寄存器的函数
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,i);

HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
for(int i=0;i<100;i++)
{
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,i);
HAL_Delay(20);
}
for(int i=99;i>=0;i--)
{
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,i);
HAL_Delay(20);
}
}