定时器与PWM的LED控制

定时器与PWM的LED控制

一、定时器控制LED周期性亮灭

一)定时器的工作原理

在这里插入图片描述

从时钟源产生框可以看到

定时器时钟有四种来源:
● 内部时钟(CK_INT)
● 外部时钟模式1:外部输入脚(TIx) (输入捕获的引脚)
● 外部时钟模式2:外部触发输入(ETR)
● 内部触发输入(ITRx):(定时器级联)使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。

产生CK_PSC时钟,然后在从模式控制器内设置好计数模式(向上向下),再经过预分频器产生CK_CNT,若为CNT计数器向下计数,则当其计数到0时,自动重装载寄存器会重新为CNT计数器装载新值重新递减计数,并产生一个更新事件。

时基单元:
● 计数器寄存器(TIMx_CNT)
● 预分频器寄存器 (TIMx_PSC)
● 自动装载寄存器 (TIMx_ARR)
输入捕获:信号通过捕获通道进入,经滤波,经分频,到捕获比较寄存器。(经输入捕获与输出比较的四个通道其实是一个)

二)STM32CubeMX新建文件

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这里我们 arr=4999 psc=6399 Tclk=16Mhz Tout = (5000*6400)/16 us = 2s

在这里插入图片描述

在这里插入图片描述

三)Keil程序

  HAL_TIM_Base_Start_IT(&htim2);

在这里插入图片描述

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    static unsigned char ledState = 0;
    if (htim == (&htim2))
    {
        if (ledState == 0)
            HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);
        else
            HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
        ledState = !ledState;
    }
}

在这里插入图片描述

四)实践结果

在这里插入图片描述

二、PWM模式控制LED呼吸灯

一)PWM原理

​ 脉冲宽度调制(Pulse width modulation,PWM)是一种对模拟信号电平进行数字编码的方法。

​ STM32的每个通用定时器都有独立的4个通道可以用来作为:输入捕获、输出比较、PWM输出、单脉冲模式输出等。

​ STM32的定时器除了TIM6和TIM7(基本定时器)之外,其他的定时器都可以产生PWM输出。其中,高级定时器TIM1、TIM8可以同时产生7路PWM输出

在这里插入图片描述

假定定时器工作在向上计数 PWM模式:

当 CNT<CCRx 时,输出 0

当 CNT>=CCRx 时输出 1

当 CNT 达到 ARR 值的时候,重新归零,然后重新向上计数,依次循环。

改变 CCRx 的值,就可以改变 PWM 输出的占空比,改变 ARR 的值,就可以改变 PWM 输出的频率。

二)STM32CubeMX新建文件

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

三)Keil程序

  /* USER CODE BEGIN 1 */
	
	uint16_t pwmVal=0;   //PWM占空比  
    uint8_t dir=1;  

  /* USER CODE END 1 */

  /* USER CODE BEGIN 2 */

  HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);

  /* USER CODE END 2 */

while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	  while (pwmVal< 500)
	  {
		  pwmVal++;
		  __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal);    //修改比较值,修改占空比
//		  TIM3->CCR1 = pwmVal;    与上方相同
		  HAL_Delay(1);
	  }
	  while (pwmVal)
	  {
		  pwmVal--;
		  __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal);    //修改比较值,修改占空比
//		  TIM3->CCR1 = pwmVal;     与上方相同
		  HAL_Delay(1);
	  }
	  HAL_Delay(200);

  }
  /* USER CODE END 3 */

四)实践结果

在这里插入图片描述

参考链接

https://blog.csdn.net/Morzart/article/details/134123197

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值