一、实验要求:
使用TIM3和TIM4,分别输出一个PWM波形,PWM的占空比随时间变化,去驱动你外接的一个LED以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),实现2个 LED呼吸灯的效果。
PWM波介绍:
1.PWM波
在一个周期波形中,高电平占整个周期的比例称之为占空比,而高电平宽度通常被称为脉冲宽度。当我们在控制占空比,从而控制电路导通或者关闭时间,从而控制导通的有效电压。
PWM的频率:
指1秒钟内信号从高电平到低电平再回到高电平的次数。
PWM的周期:
T = 1 / f,周期 = 1 / 频率
PWM的占空比:
指一个脉冲周期内,高电平的时间与整个周期时间的比例
脉宽时间:
高电平时间,脉宽时间占总周期时间的比例,就是占空比
调节PWM:
PWM就是通过脉冲宽度调制,通过调节占空比,就可以调节脉冲宽度(脉宽时间),而频率就是单位时间内脉冲信号的次数,频率越大,占空比越大。
分频-计数时钟
定时器时钟提供较高的频率,计数器不需要这么高的频率来计数,所以会进行降频,使用一个合适的低频时钟来计数。
定时器时钟经过PSC预分频器之后,即CK_CNT,用来驱动计数器计数。PSC是一个16位的预分频器,可以对时钟TIMxCLK进行1~65536之间的任何一个数进行分频。
即:CK_CNT = TIMxCLK / (PSC+1)
比如,使用STM32F4的通用定时器2(TIM2CLK为APB1的时钟的两倍即84MHz),PSC设置为83,则计数时钟为84MHz/(83+1)=1MHz,即1ms计一个数。
计数器
计数器是一个16位的计数器,只能往上计数,最大数值为65535。当计数达到自动重装载值时产生更新事件,并清零从头开始计数。
2.定时器输出PWM原理
定时器工作模式设置为向上计数PWM模式,且当CNT<CCRx时,输出1,当CNT>=CCRx时输出0,则:
当CNT值小于CCRx的时候,IO输出高电平(1),
当CNT值大于等于CCRx的时候,IO输出低电平(0),
当 CNT 达到 ARR 值的时候,重新归零,然后重新向上计数,依次循环。
二、开始实验
1.工程设置
在STM32CubeMX中新建文件夹并按如下进行设置
(1)打开System core,点击RCC设置为外部时钟源
(2)设置串口通信
(3)设置定时器
设置分频系数为71,计数周期为500,其它默认。
设置占空比初始值为10。
其余配置不变
(4)引脚设置:
工程设置结束生成工程文件并打开
2.代码编写
(1)添加一个变量用来储存占空比
uint16_t duty_num = 10; //定义变量储存占空比
在main.c文件中找到
/* USER CODE BEGIN PV */
和
/*USER CODE END PV */
并将此变量添加在里面
(2)添加启动定时器TIM2和管道2以及定时器TIM4和管道4的代码,输出PWM
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_4); //开启定时器4和4号通道
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2); //开启定时器2和2号通道
在main.c文件中找到
/* USER CODE BEGIN 2 /
和
/ USER CODE END 2*/
并将代码添加在里面
(3)添加执行呼吸灯程序的代码
//每隔50毫秒,占空比加10,如果超过500(也就是PWM周期),自动变成0.
HAL_Delay(50);
duty_num = duty_num + 10;
if(duty_num > 500)
{
duty_num = 0;
}
__HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_4,duty_num);
__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,duty_num);
在main.c文件中找到
/*USER CODE BEGIN 3 */
和
/*USER CODE END 3 */
并将代码添加在里面
编译无误后进行烧录
3.实验结果演示
(1)PWM波形
(2)结果演示
参考博客:
https://blog.csdn.net/qq_66144143/article/details/127600830