定时器&PWM练习

一、定时器控制LED闪烁

1、新建工程,进行基本配置。通过点击“ACCESS TO MCU SELECTOR”来创建一个新的工程:

在这里插入图片描述
打开外部时钟,点击“System Core”,选择RCC,在右侧弹出的菜单栏中选择“Crystal/Ceramic Resonator”。

选择调试接口,点击“System Core”,选择RCC。,在右侧弹出的菜单栏中选择“Serial Wire”。

2、配置IO。LED部分和实验2一样,配置PC15,并命名为D1。这里我们只使用一个LED,做演示用。

3、配置定时器2。这里我们使用定时器2来实现定时的功能。如图所示,依次点击位置1,选中定时器2;位置2,配置定时器2的时钟源为内部时钟;位置3,分频系数为71,向上计数模式,计数周期为5000,使能自动重载模式。
在这里插入图片描述
3、配置中断。如下图所示,开启定时器2的中断。
在这里插入图片描述
如下图所示,生成定时器2中断优先级配置代码。在这里插入图片描述
4、时钟配置
5、生成工程文件。
6、修改工程。生成工程后,打开,添加中断响应之后所需的一些代码
代码如下:

//¶¨Ê±Æ÷»Øµ÷º¯Êý

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static uint32_t time_cnt =0;

if(htim->Instance == TIM2)
{
	if(++time_cnt >= 100)
	{
		time_cnt =0;
		HAL_GPIO_TogglePin(D1_GPIO_Port,D1_Pin);
	}
}

}

修改后,保存,编译、下载,重新上电。可以看到LED1差不多每隔0.5秒翻转一次,实现了我们想要的效果。

二、stm32f103呼吸灯

编程实现
1、硬件相关宏定义
bsp_breathing.h 文件在这里插入图片描述
在这里插入图片描述
定义了三组LED的宏,通过修改代码中的 #define LIGHT_COLOR RED_LIGHT语句,可以切换使用红、绿、蓝三种颜色的呼吸灯。 在每组宏定义中,定义了定时器编号、定时器时钟使能、红灯中PB5引脚重映射操作、GPIO 端口和引脚号、通道对应的比较寄存器名以及中断通道和中断服务函数名。 定时器的比较寄存器 CCRx 在控制呼吸灯的单个周期内需要切换为 PWM表中不同的数值,所以需要利用定时器中断。
2、GPIO初始化
bsp_breathing.c 文件
在这里插入图片描述
其中由于红灯使用的引脚需要用到第二功能,本代码 使用宏 BRE_GPIO_REMAP_FUN ()进行了该引脚的功能重定义操作
3、定义 PWM表
PWM表则是一个周期内比较寄存器CCRx的变化值,即脉冲宽度的变化值。
bsp_breathing.c 文件
在这里插入图片描述
PWM表的范围为0~1024
在这里插入图片描述
4、定时器 PWM配置
bsp_breathing.c 文件
在这里插入图片描述在这里插入图片描述

代码中初始化了控制 RGB 灯用的定时器, 它被配置为向上计数,PWM 通道输出也被配置成当计数器 CNT 的值小于输出比较寄存器CCRx的值时,PWM通道输出低电平,点亮LED灯。在函数的最后还使能了定时器中断,每当定时器的一个计数周期完成时,产生中断,配合中断服务函数,即可切换 CCRx 比较寄存器的值。
代码中的 TIM_Period和 TIM_Prescaler是关键配置。 其中 TIMPeriod 被配置为(1024-1),它控制定时器的定时周期,定时器的计数寄存器 CNT从 0开始,每个时钟会对计数器加 1,计数至 1023时完成一次计数,产生中断,也 就是说一共 1024 个计数周期,与 PWM 表元素中的最大值相同。若定时器的输出比较寄存器CCRx被赋值为PWM表中的元素,即可改变输出对应占空比的PWM波,控制LED灯, 如: 若CCRx=1,那么在CNT<CCRx时,通道输出低电平,LED灯亮,CNT>CCRx时,输出高电平,LED灯灭,此时𝑇IME(𝐿𝐸𝐷_𝑂𝑁) / TIME(𝑇𝐿𝐸𝐷_𝑂𝐹𝐹) = 1 / 1024 ;
根据PWM 表更新 CCRx 的值,即可输出占空比呈呼吸特性曲线变化的 PWM波形,达到呼吸灯的效果。
5、定时器中断服务函数
stm32f10x_it.c 文件
在这里插入图片描述
在中断服务函数中,包含两个静态变量 period_cnt和 pwm_index。 其中 pwm_index 比较容易理解,它用于指示当前要使用 PWM 表中的哪个元素,从而 在BRE_TIMx->BRE_CCRx = indexWave[pwm_index];语句中可以给 CCRx赋予正确的数值,而且当 PWM表中的数据都使用一遍时,pwm_index将重新指向 PWM表的开头,开始下一次呼吸循环。 在本例的单次呼吸循环中,每个PWM表元素都会使用10次,代码中利用period_cnt 变量指示当前使用的次数,当 period_cnt> period_class 时(即 period_cnt>10 时),pwm_index 才会指向下一个元素。每个 PWM 表元素使用多次,主要是为了在 TIMPeriod、PWM 表的 点数、TIM_Prescaler 都固定的情况下,通过调整每个元素的重复次数可以调整整个拟合波 形的周期。如把代码中的比较值 period_class 改为 100,每个 PWM 表遍历一次的时间就变 为原来配置的 10 倍,其拟合的呼吸周期也就相应地改变了。
6、计算拟合周期
TIMPeriod、PWM 表的点数、TIM_Prescaler 以及 period_cnt 都会影响到 拟合曲线的周期,而在实际应用中又有如下要求:

TIMPeriod:定时器的计数周期,它的值必须与 PWM 表中的极大值相等(应用中 赋值需要减1),而PWM表的极大值决定了控制的分辨率。例如极大值为10时, PWM 占空比只有 10 个等级,精确到 0.1,当极大值为 1000 时,PWM 占空比有 1000个等级,精确到 0.001。
TIM_Prescaler:定时器时钟分频因子,它控制定时器计数器 CNT 计数加 1 所需要 的时间,它的值太大会导致输出的单个 PWM 波周期过长,影响控制的动态特性。 如控制LED灯时,该值太大会导致LED灯开关时间变长,闪烁明显。一般来说, 该值越小越好。
PWM 表的点数:PWM 表的点数即对拟合曲线的采样点数,采样点越多,能更好 地还原拟合曲线,采样点太少,可能会导致失真
period_class:周期倍数,即 PWM 表中每个元素的循环次数,它影响拟合曲线的 周期。当 period_class=1时,可以输出本配置中周期最短的拟合曲线。

三、总结

通过在STM32上进行定时器和PWM的配置,我对产生原理和配置方法以及使用领域有了更加深刻的了解和认识,对我们学习和使用STM32以及其他单片机起着非常重要的作用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值