定时器与PWM


任务要求:

  1. 之前作业中的延时功能都是通过循环、delay/Hal_delay函数等实现,本次作业通过定时器Timer方式实现时间的精准控制,相当于给CPU上了一个闹钟,CPU平时处理其它任务,当定时时间到了以后,处理定时相关的任务。请设置一个5秒的定时器,每隔5秒从串口发送“hello windows!”;同时设置一个2秒的定时器,让LED等周期性地闪烁,实现一个多任务并发运行的功能。思考,如果不采用定时器,如何同时完成上面两个周期性任务?
  2. 使用TIM3和TIM4,分别输出一个PWM波形,PWM的占空比随时间变化,去驱动你外接的一个LED以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),实现2个 LED呼吸灯的效果。

一、定时器任务

1.项目创建

选择我们所需要的芯片
在这里插入图片描述
配置RCC
在这里插入图片描述
配置SYS
在这里插入图片描述
配置GPIO端口
在这里插入图片描述
配置定时器TIM2
在这里插入图片描述
配置定时器TIM3
在这里插入图片描述
配置NVIC
在这里插入图片描述
配置优先级
在这里插入图片描述
配置USART
在这里插入图片描述
配置时钟
在这里插入图片描述
之后点击Project Manager进行配置
在这里插入图片描述
在这里插入图片描述
最后生成代码

2.编写代码

在图示位置添加代码

	HAL_TIM_Base_Start_IT(&htim2);
	HAL_TIM_Base_Start_IT(&htim3);


在这里插入图片描述
串口发送代码
在图示位置添加代码

uint8_t hello[20]="hello windows!\r\n";

在这里插入图片描述
定时中断回调代码
在图示位置添加代码

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	static uint32_t time_cnt =0;
	static uint32_t time_cnt3 =0;
	if(htim->Instance == TIM2)
	{
		if(++time_cnt >= 400)
		{
			time_cnt =0;
			HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_3);
		}
	}
	if(htim->Instance == TIM3)
	{
		if(++time_cnt3 >= 1000)
		{
			time_cnt3 =0;
    HAL_UART_Transmit(&huart1,hello,20,100000);
		}
			
	}
}

在这里插入图片描述

3.连接元器件

按照下图安装元器件
在这里插入图片描述

4.实验结果

定时器1

定时器2

5.不使用定时器的实现方法

如果不使用定时器,可以通过以下方法实现两个周期性任务:

循环计数法:
使用一个全局变量作为计数器。
在主循环中,每次循环增加计数器。
当计数器达到5秒对应的值时,发送串口数据,并重置计数器。
当计数器达到2秒对应的值时,切换LED状态,并重置计数器。

操作系统调度:
使用一个简单的实时操作系统(如FreeRTOS)来管理任务。
创建两个任务,一个任务负责发送串口数据,另一个任务负责LED闪烁。
操作系统负责调度这两个任务,确保它们按周期执行。

二、 LED呼吸灯

1.项目创建

选择我们所需要的芯片
在这里插入图片描述
配置RCC
在这里插入图片描述
配置SYS
在这里插入图片描述
配置定时器TIM3
在这里插入图片描述
配置定时器TIM4
在这里插入图片描述
配置时钟
在这里插入图片描述
配置项目
在这里插入图片描述
在这里插入图片描述
之后生成代码

2.代码编写

打开生成的keil文件
定义全局变量
在图示位置输入代码

uint16_t pwm=0;   //占空比

在这里插入图片描述
打开PWM通道
在图示位置添加代码

HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); 
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1); 

在这里插入图片描述
在while中写入代码

while (pwm< 500)
	  {
		  pwm++;
		  __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwm);  
    __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_1, pwm);  			
		  HAL_Delay(1);
	  }
	  while (pwm)
	  {
		  pwm--;
		  __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwm);    
       __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_1, pwm);  
			
		  HAL_Delay(1);
	  }
	  HAL_Delay(200);

在这里插入图片描述

3.元器件连接

在这里插入图片描述

4.实验结果

PWM呼吸灯

三、总结与心得体会

1.使用定时器实现多任务并发运行的优点:

时间精度高: 定时器可以提供精确的时间控制,确保任务按预定周期执行。
CPU利用率高: 在非定时器溢出期间,CPU可以处理其他任务,提高系统效率。

而不使用定时器的方法(如循环计数法或操作系统调度)虽然也能实现多任务,但可能存在以下问题:
时间精度低: 循环计数法依赖于主循环的执行速度,可能导致时间精度不高。
系统复杂度高: 使用操作系统调度需要额外的配置和调试,增加了系统的复杂度。
因此,定时器是实现多任务并发运行的一种有效且高效的方法。

2.PWM原理

PWM(脉冲宽度调制)原理:

PWM通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值)。PWM控制技术的重要理论基础是面积等效原理,即冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。

PWM的应用:
PWM可以在合适的信号频率下,通过一个周期里改变占空比的方式来改变输出的有效电压。这种原理使得PWM能够实现D/A转换,并用于控制LED亮度、电机转速等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值