当前位置: 代码网 > 服务器>网络>网络协议 > 【STM32】定时器与PWM的LED控制

【STM32】定时器与PWM的LED控制

2024年08月01日 网络协议 我要评论
定时器的定时时间主要取决于定时周期和预分频因子,计算公式为:定时时间=(ARR+1)×(预分频值PSC+1)/输入时钟频率或 T=(TIM_Period +1)*(TIM_Prescaler +1)/TIMxCLK这里ARR+1是因为计数器都是从0开始计数的。在PWM的一个周期内,定时器从0开始向上计数,在0-t1时间段,定时器计数器TIMx_CNT值小于TIMx_CCRx值,输出低电平;当定时器计数器的值TIMx_CNT达到ARR时,定时器溢出,重新从0开始向上计数,如此循环。

目录

一、定时器

1.定时器模块的功能

2.stm32定时器类别

3.通用定时器

二、pwm

1.工作原理

2.pwm标准外设库输出配置

三、用定时器计数方式,控制led以2s的频率周期性亮灭

1.stm32cube配置

(1)gpio配置

(2)rcc配置

(3)sys配置

(4)tim2配置

(5)clock配置

(6)项目配置

2.keil代码编写​编辑

3.实验结果

四、采用定时器pwm模式,让 led 以呼吸灯方式渐亮渐灭,周期为1~2秒

1.stm32cube配置

(1)rcc配置

(2)sys配置

(3)tim3配置

(4)gpio配置

2.keil代码编写

3.程序烧录及实验结果

4.keil波形图查看


一、定时器

1.定时器模块的功能

stm32定时器模块主要有计数、定时、输入捕获、输出比较这四个功能。其中:

计数:脉冲计数,使用使用微控制器内部的外部时钟(pclk)来计数,是对固定周期的脉冲信号计数。

定时:时间控制,通过对微控制器内部的时钟脉冲进行计数实现定时功能。

输入捕获:对输入信号进行捕获,实现对脉冲的频率测量,可用于对外部输入信号脉冲宽度的测量,比如测量电机转速。

输出比较:将计数器计数值和设定值进行比较,根据比较结果输出不同电平,用于控制输出波形,比如直流电机的调速。

2.stm32定时器类别

stm32定时器主要分为基本定时器、通用定时器和高级定时器。

下面是stm32定时器的分类比较表:

定时器基本定时器**(tim6、tim7)**通用定时器**timx(x=2~5)**高级定时器**(tim1、tim8)**
计数器类型16**位,向上**16**位,向上、向下、向上/向下**16**位,向上、向下、向上/向下**
预分频系数1**~65535之间的任意数**1**~65535之间的任意数**1**~65535之间的任意数**
输入**/捕获通道**四个独立通道:输入捕获、输出比较、**pwm生成、单脉冲模式输出**四个独立通道:输入捕获、输出比较、**pwm生成、单脉冲模式输出**
产生中断**/dma**可以可以可以
刹车(电机控制)可以

3.通用定时器

stm32通用定时器timx(x=2,3,4,5)主要由时钟源、时钟单元、捕获和比较通道等构成,核心是可编程预分频驱动的16位自动装载计数器。

(1)时钟源

当定时器使用内部时钟时,定时器的时钟源统称为timxclk。timxclk的系统默认的时钟频率为72mhz,但其时钟来源并不相同。

定时器tim2~tim7挂接在apb1上定时器tim1和tim8挂接在apb2上。

若外部晶振的频率为8mhz,则系统默认的时钟频率为72mhz

apb1预分频器的分频系数设置为2,则pclk1=36mhz;

apb2预分频系数设置为1,则pclk2=72mhz,tim1和tim8的时钟频率timxclk=72mhz;

cortex系统时钟由ahb时钟(hclk)8分频得到,即systick的频率为9mhz。

(2)预分频器psc

可以以1~65535之间的任意数值对时钟源ck_psc的时钟频率进行分频,输出ck_cnt脉冲供计数器cnt进行计数。

(3)计数器cnt

timxcnt是一个16位的寄存器,计数范围为1~65535,可以向上计数、向下计数或向下向上双向计数。

要得到想要的计数值,需要对输入时钟频率进行分频。

当计数值达到设定值时,便产生溢出事件,溢出时产生中断或dma请求,然后再由自动装载寄存器进行重新加载或更新。

计数器溢出中断属于软件中断,执行相应的定时器中断服务程序。

(4)自动装载寄存器arr

定时器的定时时间主要取决于定时周期和预分频因子,计算公式为:定时时间=(arr+1)×(预分频值psc+1)/输入时钟频率或 t=(tim_period +1)*(tim_prescaler +1)/timxclk这里arr+1是因为计数器都是从0开始计数的。

二、pwm

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

1.工作原理

stm32的定时器除了tim6和tim7,其他定时器都可以用来产生pwm输出。

通用定时器能同时产生多达4路的pwm输出。

stm32中每个定时器有4个输入通道:timx_ch1~timx_ch4;每个通道对应1个捕获/比较寄存器timx_crrx,将寄存器值和计数器值相比较,通过比较结果输出高低电平,从而得到pwm信号。

在pwm的一个周期内,定时器从0开始向上计数,在0-t1时间段,定时器计数器timx_cnt值小于timx_ccrx值,输出低电平;

在t1-t2时间段,定时器计数器timx_cnt值大于timx_ccrx值,输出高电平;

当定时器计数器的值timx_cnt达到arr时,定时器溢出,重新从0开始向上计数,如此循环。

2.pwm标准外设库输出配置

首先配置pwm输出通道,开启tim3时钟:

stm32规定了具体的引脚作为pwm输出引脚,选择不同的引脚时,还必须使用重定向功能(remap)

定时器tim1的引脚复用功能映像:

复用功能tim1_remap[1:0] = 00**(没有重映像)**tim1_remap[1:0] = 01**(部分重映像)**tim1_remap**[1:0] = 11(完全重映像)** (1)
tim1_etrpa12pe7
tim1_ch1pa8pe9
tim1__ch2pa9pe11
tim1_ch3pa10pe13
tim1_ch4pa11pe14
tim1_bkinpb12(2)pa6pe15
tim1_ch1npb13(2)pa7pe8
tim1_ch2npb14(2)pb0pe10
tim1_ch3npb15(2)pb1pe12

定时器tim2的引脚复用功能映像:

复用功能tim2_remap**[1:0]=00(没有重映像)**tim1_remap**[1:0]=01(部分重映像)**tim1_remap[1:0]=10 (**部分重映像)** (1)tim1_remap[1:0]=11**(完全重映像)** (1)
tim2_ch1_etr**(2)**pa0pa15pa0pa15
tim2_ch2pa1pb3pa1pb3
tim2_ch3pa2pb10
tim2_ch4pa3pb11

定时器tim3的引脚复用功能映像:

复用功能tim3_remap[1:0] = 00**(没有重映像)**tim3_remap[1:0] = 10**(部分重映像)**tim3_remap[1:0] = 11**(完全重映像)** (1)
tim3_ch1pa6pb4pc6
tim3_ch2pa7pb5pc7
tim3_ch3pb0pc8
tim3_ch4pb1pc9

三、用定时器计数方式,控制led以2s的频率周期性亮灭

使用stm32f103的 tim2~tim5其一定时器的某一个通道pin(与gpiox管脚复用,见下图),连接一个led,用定时器计数方式,控制led以2s的频率周期性地亮-灭。

1.stm32cube配置

(1)gpio配置

(2)rcc配置

(3)sys配置

(4)tim2配置

(5)clock配置

(6)项目配置

2.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;
    }
}

3.实验结果

四、采用定时器pwm模式,让 led 以呼吸灯方式渐亮渐灭,周期为1~2秒

接上,采用定时器pwm模式,让 led 以呼吸灯方式渐亮渐灭,周期为1~2秒,自己调整占空比变化到一个满意效果;使用keil虚拟示波器,观察 pwm输出波形。

1.stm32cube配置

(1)rcc配置

(2)sys配置

(3)tim3配置

(4)gpio配置

2.keil代码编写

在main.c中对应位置添加下面的代码:

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

3.程序烧录及实验结果

4.keil波形图查看

波形图如下:

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com