浅析 stm32 定时器中断、PWM、输入捕获信号

 

一、定时器:

   定时器的时钟来源四个:

1.内部时钟(CK_INT)(常用

2.外部时钟模式1:外部输入脚(TIx)

3.外部时钟模式2:外部触发输入(ETR)(仅适用TIM2,3,4)

4.内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器

浅析 stm32 定时器中断、PWM、输入捕获信号_第1张图片

    大多数情况下选择内部时钟作为定时器的时钟来源(APB),APB时钟是由AHB总线分频得来的,在系统初始化时,会默认将参数设置为:

SYSCLK=168M

AHB时钟=168M

APB1时钟=42M

所以APB1的分频系数=AHB/APB1时钟=4

注:除非APB1的分频系数是1,否则通用定时器的时钟等于APB1时钟的2倍。所以通用定时器的时钟等于84M(很重要,对于计算定时器溢出)

定时器定时时间到达,产生中断:

    定时器中有三个比较重要的寄存器,计数寄存器、自动重装载寄存器、预分频寄存器。

三个寄存器从字面上都很好理解,计数寄存器就是负责计数;自动重装载寄存器就是负责倒计时走完,重新装入数值;预分频寄存器就是负责将时钟进行分频。

    粗暴地讲其中的联系是预分频寄存器将时钟源分频之后将决定计数寄存器几个周期计数一次,而当计数寄存器中的值变为0或者到达预定最大值时,将触发某个位,从而将重装载寄存器重新装入计数寄存器。下图中设置了计数方式为向下计数,当计数寄存器中的值为0时,将产生一个溢出、更新事件,进而产生中断

定时时间计算:

Tout(溢出时间)=(ARR+1)(PSC+1)/Tclk =(重装载值+1)(预分频系数+1)/时钟频率

周期 = 1/频率 = 1/((时钟)/(分频系数)) = 1/((psc+1)/Tclk)

一个周期具体几秒得看分频系数与时钟

注:+1是因为寄存器从0开始计算,Tclk是定时器的时钟频率。而不是分频之后的时钟频率。

浅析 stm32 定时器中断、PWM、输入捕获信号_第2张图片

二、PWM

   Pwm是一个周期内,高电平持续时间占据整个周期的时间的比例。通常用百分比表示。单片机想要输出pwm,可利用定时器模拟输出pwm方波。在一个周期内控制高电平时间与低电平时间。

    Stm32定时器可通过设置相应寄存器直接产生pwm,在stm32中,占空比大小是有CCRx寄存器控制的。当CCRx比较小时,占空比就很大/很小;当CCRx较大时,占空比很小/很大。这里会出现pwm这种不确定情况,是因为还有一个很重要的寄存器CCMRx决定着输出极性,即有效电平,所以CCMRx中有两种pwm模式,pwm1模式:在向上计数时,当目前的计数CNT < CCRx时,通道1为有效电平,否则为无效电平,在向下计数时,当目前的计数CNT > CCRx时,通道1为无效电平,否则为有效电平。(这里有效电平为高或者为低,是由寄存器CCER的CC1P为决定)。pwm2模式则相反

三、输入捕获信号

   通过检测相应通道上的边沿信号,在边沿信号发生跳变(上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获(捕获高电平/低电平时间)。

   输入捕获需要注意的还是捕获上升沿与下降沿时的判断,对于要较精准的判断是上升沿还是下降沿的实验或者项目中,一定要采用滤波,因为外界因素,像抖动或者电压不稳,有时会造成误判,进而产生电波毛刺,导致结果与实际并不符合。

你可能感兴趣的:(stm32修炼)