stm32的定时器输入捕获与输出比较讲解.docx

上传人:b****7 文档编号:10418355 上传时间:2023-02-11 格式:DOCX 页数:15 大小:342.25KB
下载 相关 举报
stm32的定时器输入捕获与输出比较讲解.docx_第1页
第1页 / 共15页
stm32的定时器输入捕获与输出比较讲解.docx_第2页
第2页 / 共15页
stm32的定时器输入捕获与输出比较讲解.docx_第3页
第3页 / 共15页
stm32的定时器输入捕获与输出比较讲解.docx_第4页
第4页 / 共15页
stm32的定时器输入捕获与输出比较讲解.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

stm32的定时器输入捕获与输出比较讲解.docx

《stm32的定时器输入捕获与输出比较讲解.docx》由会员分享,可在线阅读,更多相关《stm32的定时器输入捕获与输出比较讲解.docx(15页珍藏版)》请在冰豆网上搜索。

stm32的定时器输入捕获与输出比较讲解.docx

stm32的定时器输入捕获与输出比较讲解

stm32的定时器输入捕获与输出比较

(2015-09-2809:

26:

24)

转载▼

标签:

分类:

stm32

it

明确一点对比AD的构造,stm32有3个AD,每个AD有很多通道,使用哪个通道就配置

成哪个通道,这里定时器也如此,有很多定时器TIMx,每个定时器有很多CHx(通道),可

以配置为输入捕捉——测量频率用,也可以配置为输出比较输出PWM使用

输入捕捉:

可以用来捕获外部事件,并为其赋予时间标记以说明此事件的发生时刻。

外部事件发生的触发信号由单片机中对应的引脚输入(具体可以参考单片机的datasheet),

也可以通过模拟比较器单元来实现。

时间标记可用来计算频率,占空比及信号的其他特征,以及为事件创建日志,主要是用来测量外部信号的频率。

输出比较:

定时器中计数寄存器在初始化完后会自动的计数。

从bottom计数到top。

并且有不同的工作模式。

另外还有个比较寄存器。

一旦计数寄存器在从bottom到top计数过程中与比较寄存器匹

配则会产生比较中断(比较中断使能的情况下)。

 

然后根据不同的工作模式计数寄存器将清零或者计数到

top值。

1、朋友,可以解释一下输入捕获的工作原理不?

很简单,当你设置的捕获开始的时候,cpu会将计数寄存器的值复制到捕获比较寄存器中并开始计数,当再次捕捉到电平变化时,这是计数寄存器中的值减去刚才复制的值就是这段电平的持续时间,你可以设置上升沿捕获、下降沿捕获、或者上升沿下降沿都捕获。

它没多大用处,最常用来测频率。

计数寄存器的初值,是自己写进去的吗?

是的,不过默认不要写入

我如果捕获上升沿,两个值相减,代表的时两个上升沿中间那段电平的时间。

对不?

是的

timerl有五个通道(对应五个10引脚),在同一时刻,只能捕获一个引脚的值,对不?

那是肯定的,通道很像ADC通道,是可以进行切换的。

那输出比较的原理你可以帮我介绍一下不?

这里有两个单元:

一个计数器单元和一个比较单元,比较单元就是个双缓冲寄存器,比较单元的值是可以根据不同的模式设置的,与此同时,计数器在不停的计数,并不停的与比较寄存器中的值进行比较,当计数器的值与比较寄存器的值相等的时候一个比较匹配就发生了,根据自己的设置,匹配了是io电平取反、变低、还是变高,就会产生不同的波形了。

比较单元的值是人为设进去的吧?

是的,但是他要根据你的控制寄存器的配置,来初始化你的比较匹配寄存器

5:

3

CMP[2:

0]

000

itltolWHK成选畀・卅崔时■的G尊于在TICCO中的比较也迭丼操f

OOOt

庄比较淆涂轨出

01

泄比较忧換3ft.出

Olh

隹向上比较设置総曲・Kom

<■■4匕比较講徐諛由・在0设覽

!

0h

没奇馥用

1101

没有便用

Hh

匕址化罐HT14CMP[M】不蠢

上面这个总看不懂,好像不不止你说的那几种情况:

“匹配了是io电平取反、变低、

还是变高,就会产生不同的波形了”

就是比较匹配了你要10电平怎么办?

是清0还是置1?

还是怎么样?

这样才能产生波

形啊要不然你要比较单元有什么用呢?

设置输出就是置1,清除输出就是置0,切换输出就是将原来的电平取反,对不?

是的你理解的很快

011:

计数器向上计数达到最大值时将引脚置1,达到0时,引脚电平置0,,对不?

序怎么写啊?

求高人指点

1、陪定时器1的功能为特殊功能,不是普通10在PERCFG这里

2、P1SEL引脚选择

3、P1DIR设为输出

4、T3CC0设置周期

5、T3CC1设置占空比

6、T3CCTL0设置通道0

7、T3CCTL1设置通道1

8、T3CTL设为模模式

9、用T3CTL打开即可

************以下是用定时器做频率源,用定时器测量该频率的应用程序!

***********

调试STM32的定时器好几天了,也算是对STM32的定时器有了点清楚的认识了。

我需要测量4路信号的频率然后通过DMA将信号的频率传输到存储器区域,手册说的很

明白每个定时器有4个独立通道。

然后我就想能不能将这4路信号都连接到一个定时器的4

个通道上去。

理论上应该是行的通的。

刚开始俺使用的是TIM2的123通道,TIM4的2

通道来进行频率的测量。

由于没有频率发生器,所以我用tim3作为信号源,用TIM2,TIM4

来进行测量就ok了(刚好4个通道了)。

请看一开始的程序,以TIM2的1,3通道为例子(2通道设置方法一样)

配置为输

TIM」ClnitStructure.TIM」CMode=TIM」CModeICAP;//

入捕获模式

TIM」ClnitStructure.TIM」CPolarity=TIM」CPolarityRising;//输入上升沿

捕获

TIM」CInitStructure.TIM」CSelection=TIM」CSelectionDirectTI;//通道方

向选择

TIM」ClnitStructure.TIM」CPrescaler=TIMICPSCDIV1;//每次检测

到捕获输入就触发一次捕获

TIM」ClnitStructure.TIM」CFilter=0x0;

//滤波

TIM」Clnit(TIM2,&TIM」ClnitStructure);//TIM2

通道1配置完毕

TIM」CInitStructure.TIM」CMode=TIM」CModeICAP;//配置为输入捕获

模式

TIM」ClnitStructure.TIMChannel=TIMChannel3;//选择通道3

TIM」ClnitStructure.TIM」CPolarity=TIM」CPolarityRising;//输入上升沿

捕获

TIM」ClnitStructure.TIM」CSelection=TIM」CSelectionDirectTI;//

TIM」ClnitStructure.TIM」CPrescaler=TIMICPSCDIV1;//每次检测

到捕获输入就触发一次捕获

TIM」ClnitStructure.TIM」CFilter=0x0;//滤波

以上是输入捕获配置

还需要做的工作就是(参考stm32参考手册的TIM的结构框图)

TIMSelectInputTrigger(TIM2,TIMTSTI1FP1);//参考TIM结构

图选择滤波后的TI1输入作为触发源,触发下面程序的复位

TIMSelectSlaveMode(TIM2,TIMSlaveModeReset);//复位模式-选中

的触发输入(TRGI)的上升沿初始化计数器,并且产生一个更新线号

TIMSelectMasterSlaveMode(TIM2,TIMMasterSlaveModeEnable);

//主从模式选择

这样我们就可以很轻松的就得到了连接在TIM2的通道1上的信号的频率,但是3

通道的频率的值永远都是跳动的不准,测试了半天也没有找到根本原因,请看TIM的结构

框图的一部分

ETRF

TRGC

RP—-|—

»inputFilter

—>TRC

Trigger

CcnTrolier

SlSvB

F.tade

Controller

Reset

EncoderInterface

 

 

红色箭头所指,这才找到原因,触发的信号源只有这四种,而通道3上的计数器

的值不可能在接受到信号的上升沿时候,有复位这个动作,找到原因了。

这就是3通道上

的数据不停跳动的原因,要想得到信号的频率也是有办法的,可以取连续两次捕捉的值之差,这个值就是信号的周期,自己根据实际情况去算频率吧。

有以上可以得到:

stm32的TIM2的四个通道可以同时配置成输入捕捉模式,但是计算CH3,CH4

言号的频率步骤有点繁琐(取前后捕捉的差值),但是他的CH1,和CH2可以轻松得到

//参考TIM结构

通道1

TIMSelectlnputTrigger(TIM2,TIMTSTI1FP1);

图选择滤波后的TI1输入作为触发源,触发下面程序的复位

复位模式-选中

TIMSelectSlaveMode(TIM2,TIMSlaveModeReset);//

的触发输入(TRGI)的上升沿初始化计数器,并且产生一个更新线号

TIMx->CRR1的值即为信号的周期

通道2:

TIM_SelectInputTrigger(TIM2,TIM_TS_TI2FP2);//

参考TIM结构

图选择滤波后的TI1输入作为触发源,触发下面程序的复位

复位模式-选中

TIMSelectSlaveMode(TIM2,TIMSlaveModeReset);//

的触发输入(TRGI)的上升沿初始化计数器,并且产生一个更新线号

TIMx->CRR2的值即为信号的周期

STM32的定时器外设功能强大得超出了想像力,STM32一共有8个都为

16位的定时器。

其中TIM6、TIM7是基本定时器;TIM2、TIM3、TIM4、TIM5

是通用定时器;TIM1和TIM8是高级定时器。

这些定时器使STM32具有定时、信号的频率测量、信号的PWM测量、PWM输出、三相6步电机控制及编码器

接口等功能,都是专门为工控领域量身订做的

基本定时器:

具备最基本的定时功能,下面是它的结构:

 

IL根据控制位的垃疋'

—在U韦件时传送饱皱载寄存器至实虹寄存崔

、4事件

中断和DMA输岀

我们来看看它的启动代码:

voidTIM2Configuration(void)

{基本定时器TIM2的定时配置的结构体(包含定时器配置的所有元素例如:

TIM_Period=

计数值)

TIMTimeBaselnitTypeDefTIMTimeBaseStructure;

设置TIM2CLK为72MHZ(即TIM2外设挂在APB1上,把它的时钟打开。

RCCAPB1PeriphClockCmd(RCCAPB1PeriphTIM2’ENABLE);

设置计数值位1000

TIMTimeBaseStructure.TIMPeriod=1000;

将TIM2CLK为72MHZ除以72=1MHZ为定时器的计数频率

TIMTimeBaseStructure.TIMPrescaler=71;

这个TIMClockDivision是设置时钟分割,这里不分割还是1MHZ的计数频率

TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;

设置为向上计数模式;(计数模式有向上,向下,中央对齐1,中央对齐2,中央对齐3)

TIMTimeBaseStructure.TIMCounterMode=TIMCounterModeUp;

将配置好的设置放进stm32f10x-tim.c的库文件中

TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);

清除标志位

TIMClearFlag(TIM2,TIMFLAGUpdate);

使能TIM2中断

TIMITConfig(TIM2,TIMITUpdate,ENABLE);

使能TIM2外设

TIMCmd(TIM2,ENABLE);

通用定时器:

就比基本定时器复杂得多了。

除了基本的定时,它主要用在测量输入脉冲

的频率、脉冲宽与输出PWM脉冲的场合,还具有编码器的接口。

我们来详细讲解:

如何生成PWM脉冲通用定时器可以利用GPIO引脚进行脉冲输出,在配置为比较输出、PWM输出功能时,捕获/比较寄存器TIMx_CCR被用作比较功能,下面把它简称为比较寄存器这里直接举例说明定时器的PWM输出工作过程:

若配置脉冲计数器TIMx_CNT

为向上计数,而重载寄存器TIMx_ARR(相当于库函数写法的TIM_Period的值

N)被配置为N,即TIMx_CNT的当前计数值数值X在TIMxCLK时钟源的驱动

下不断累加,当TIMx_CNT的数值X大于N时,会重置TIMx_CNT数值为0重新计数。

而在TIMxCNT计数的同时,TIMxCNT的计数值X会与比较寄存器TIMx_CCR

预先存储了的数值A进行比较,当脉冲计数器TIMx_CNT的数值X小于比较寄存器TIMx_CCR的值A时,输出高电平(或低电平),相反地,当脉冲计数器

的数值X大于或等于比较寄存器的值A时,输出低电平(或高电平)

如此循环,得到的输出脉冲周期就为重载寄存器TIMx_ARR存储的数值(N+1)

乘以触发脉冲的时钟周期,其脉冲宽度则为比较寄存器TIMx_CCR的值A乘以

触发脉冲的时钟周期,即输出PWM的占空比为A/(N+1)

如果不想看的可以直接看我标注的红色字体,就大体可以理解。

F面我们来编写具体代码和讲解:

voidTIM3GPIOConfig(void)

{配置TIM3复用输出PWM的10

GPIOInitTypeDefGPIO」nitStructure;

打开TIM3的时钟

RCCAPB1PeriphClockCmd(RCCAPB1PeriphTIM3,ENABLE);

打开GPIOA和GPIOB的时钟

RCCAPB2PeriphClockCmd(RCCAPB2PeriphGPIOA|RCCAPB2PeriphGPI0B,

ENABLE);

配置PA6.PA7的工作模式

GPIOInitStructure.GPIOPin=GPIOPin6|GPIOPin7;

GPIOInitStructure.GPIOMode=GPIOModeAFPP;

配置PB0.PB1的工作模式

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPI0_Pin_1;

GPIOInit(GPIOB,&GPIOInitStructure);

voidTIM3ModeConfig(void)

TIMTimeBaselnitTypeDefTIMTimeBaseStructure;//初始化TIM3的时间基数单

TIMOCInitTypeDefTIMOCInitStructure;//初始化TIM3的外设

u16CCR1Val=500;

u16CCR2Val=375;

u16CCR3Val=250;

u16CCR4Val=125;〃PWM信号电平跳变值(即计数到这个数值以后都是低电平之前都是高电平)

TIM3的时间基数单位设置(如计数终止值:

999,从0开始;计数方式:

向上计数)

TIMTimeBaseStructure.TIMPeriod=999;

TIMTimeBaseStructure.TIMPrescaler=0;

TIMTimeBaseStructure.TIMCounterMode=TIMCounterModeUp;

TIM3的外设的设置

TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//TIM脉冲宽度调制模式1

TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//这个暂时不知道,stm32固件库里没有搜到。

应该是定时器输出声明使能的意思

TIMOCInitStructure.TIMPulse=CCR1Val;//设置了待装入捕获比较寄存器的脉冲

TIMOCInitStructure.TIMOCPolarity=TIMOCPolarityHigh;//TIM输出比较极性高

TIMOC1Init(TIM3,&TIMOCInitStructure);

TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能或者失能TIMx在

CCR1上的预装载寄存器

F面3路PWM输出和上面的一样不再解说

TIMOCInitStructure.TIMOutputState=TIMOutputStateEnable;

TIMOCInitStructure.TIMPulse=CCR2Val;

TIMOC2Init(TIM3,&TIMOCInitStructure);

TIMOC2PreloadConfig(TIM3,TIMOCPreloadEnable);

TIMOCInitStructure.TIMOutputState=TIMOutputStateEnable;

TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);

TIMOCInitStructure.TIMOutputState=TIMOutputStateEnable;

TIM_OCInitStructure.TIM_Pulse=CCR4_Val;

TIM_OC4Init(TIM3,&TIM_OCInitStructure);

TIMOC4PreloadConfig(TIM3,TIMOCPreloadEnable);

TIMARRPreloadConfig(TIM3,ENABLE);//使能TIM3重载寄存器ARR

TIMCmd(TIM3,ENABLE);//使能TIM3

审太累了边看边写都这个点了2014年7月27日0:

24:

13在自己床上写的。

面是看看我们程序达到的4路PWM的效果:

爲匚*>gi〕;v>SiDZgYUr-'KC'1t^.L>,.'<^O-®ttW.^-JtM1■册怕-gpuf^F"^那唧0*(Z1辭切齬鉱屮pi可•"/Tt

FiwEon'wew^MdnttflutP眄nwhFm如已阳*ail*常坤

」A4⑥I*-鼻=*;卜I>

Ip工rair

-E

鼻峥^10錢.wpiAjWtmr

.士T

可以看到明显占空比不同的4路pwm波。

这一节终于讲完,个人觉得敲一遍代码学起来还是蛮容易懂的。

希望看到的人也能搞懂。

最后补充一点pwm具体能干什么?

特别是对广大电子DIY爱好者的应用:

智能小车的电机控制:

我们可以利用pwm来控制我们的智能小车的车速;

机器人:

给“机器人关节”舵机周期一定(我以前玩过具体多少毫秒忘记了)

pwm波就可以控制舵机的转动角度了;

呼吸灯:

输入不同的pwm波就可以达到明暗渐明渐暗的

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 交通运输

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1