定位器与PWM的LED控制

一,STM32定时器原理介绍

STM32微控制器使用定时器模块来执行定时任务,例如生成精确的时间延迟、测量时间间隔、控制PWM输出等。在STM32系列中,定时器被设计为多功能且灵活,可以根据需要进行配置。每个定时器模块通常包括一个或多个计数器和一些控制寄存器,可以通过写入特定的寄存器来配置定时器的工作模式、计数方式、时钟源等。
1. 选择适当的定时器模块和计数器:不同的STM32系列拥有不同数量和类型的定时器模块,需要根据具体需求选择合适的模块和计数器。
2. 配置定时器的工作模式:定时器可以设置为定时模式、脉冲计数模式、输入捕获模式等不同模式。
3. 配置定时器的时钟源和分频系数:可以选择内部时钟源或外部时钟源,并设置合适的分频系数以获得期望的计数频率。
4. 编写中断服务程序(如果需要):可以配置定时器产生中断,以便在计数器溢出或达到特定值时执行相应的中断服务程序。

通过合理配置和应用定时器模块,STM32微控制器可以实现各种定时任务和计时功能,提高系统的灵活性和性能。

通用定时器 


定时器的定时时间主要取决于定时周期和预分频因子

计算公式为: 定时时间=(ARR+1)×(预分频值PSC+1)/输入时钟频率 或          

   T=(TIM_Period +1)*(TIM_Prescaler +1)/TIMxCLK 这里ARR+1是因为计数器都是从0开始计数的 

PWM介绍

 PWM(Pulse Width Modulation,脉冲宽度调制)是一种利用脉冲宽度即占空比实现对模拟信号进行控制的技术,即是对模拟信号电平进行数字表示的方法。

广泛应用于电力电子技术中,比如PWM控制技术在逆变电路中的应用;     PWM还应用于直流电机调速,如变频空调的交直流变频调速,除实现调速外,还具有节能等特性。

STM32定时器PWM的工作原理

STM32的定时器除了TIM6和TIM7,其他定时器都可以用来产生PWM输出;

高级定时器TIM1和TIM8可以同时产生多达7路的PWM输出; 通用定时器能同时产生多达4路的PWM输出;

STM32中每个定时器有4个输入通道:TIMx_CH1~TIMx_CH4;

每个通道对应1个捕获/比较寄存器TIMx_CRRx,将寄存器值和计数器值相比较,通过比较结果输出高低电平,从而得到PWM信号;

脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。

占空比(Duty Cycle),是指在一个周期内,高电平时间占整个信号周期的百分比,即高电平时间与周期的比值: 占空比=Tp/T

 PWM工作原理

在PWM的一个周期内,定时器从0开始向上计数,在0-t1时间段,定时器计数器TIMx_CNT值小于TIMx_CCRx值,输出低电平; 在t1-t2时间段,定时器计数器TIMx_CNT值大于TIMx_CCRx值,输出高电平; 当定时器计数器的值TIMx_CNT达到ARR时,定时器溢出,重新从0开始向上计数,如此循环。

PWM频率计算举例
使能定时器和相关IO口时钟。调用函数:RCC_APB1PeriphClockCmd()
RCC_APB2PeriphClockCmd();
初始化IO口为复用功能输出。调用函数:GPIO_Init();
这里是要把PB5用作定时器的PWM输出引脚,所以要重映射配置,所以需要开- 启AFIO时钟,同时设置重映射;调用函数:RCC_APB2PeriphClockCmd();GPIO_PinRemapConfig();
初始化定时器。调用函数:ARR,PSC等:TIM_TimeBaseInit();
初始化输出比较参数。调用函数:TIM_OC2Init();
使能预装载寄存器。调用函数:TIM_OC2PreloadConfig();
使能定时器。调用函数:TIM_Cmd();
不断改变比较值CCRx,达到不同的占空比效果;调用函TIM_SetCompare2()

二,用定时器计数方式,控制LED以2s的频率周期性地亮-灭

工程创建

SYS选择 Serial Wire

RCC选择Crystall/Ceramic Resonator

 在TIM2中选择

 

 这里我选择PA4为输出端

注意的是输出端是高电平,不然会一直亮 ,

在TIM2中NVIC里选上 

 

 在时钟里选上以下

 选MDK—ARM

keil编程

在mian函数中加入第一个代码

  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模式控制呼吸灯

新建工程,RCC选择如下

 SYS选择如下

TIM3选择如下,NVIC记得选上。 

 调成如下图 

时钟调整如下图

选MDK—ARM 

 keil编程

在mian函数中加入第一个

  /* 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 */

编译后烤进去结果

四,观察PWM输出波形

keil点击魔法棒调试如下

debug如下 

 

 选择逻辑分析仪

 添加引脚

 由于时钟设置为72MHZ,所以72分频后得到1MHZ的时钟;1MHZ的时钟,计数500次,得到时间500/1000000=0.5毫秒;每隔0.5毫秒,定时器产生一次定时中断

五,总结

 在这次的实验帮助我们更好地理解和学习stm32和使用,如有不足请多多指点

  • 23
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值