STM32--输入捕获和输出比较

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

概述

首先,明确一点对比AD的构造,stm32有3个AD, 每个AD有很多通道(一个外设可以有多个中断通道,但是每个中断通道只有一个外设),使用哪个通道就配置成哪个通道(只设置用一个就可以),这里定时器也如此,有很多定时器TIMx,每个定时器有很多CHx(通道),可以配置为输入捕捉-------测量频率用,

也可以配置为输出比较--------输出PWM使用

输入捕获

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

外部事件发生的触发信号由单片机中对应的引脚输入(对应的引脚设置成输入)(具体可以参考单片机的datasheet),也可以通过模拟比较器单元来实现。

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

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

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

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

是的,不过默认不要写入(即计数寄存器为零)

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

是的

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

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

输出比较

输出比较:定时器中的计数寄存器在初始化完后会自动的计数,从bottom计数到top,并且有不同的工作模式。另外,还有个比较寄存器。一旦计数寄存器在从bottom到top 计数过程中与比较寄存器匹配(在计数的过程中进行比较,不单指bottom或top)则会产生比较中断(比较中断使能的情况下),这里的匹配指的是计数寄存器的值与比较寄存器的值相等。

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

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

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

调试STM32的定时器好几天了,也算是对STM32的定时器有了点清楚的认识了。我需要测量4路信号的频率然后通过DMA将信号的频率传输到存储器区域,手册说的很明白每个定时器有4个独立通道。然后我就想能不能将这4路信号都连接到一个定时器的4个通道上去。理论上应该是行的通的。刚开始俺使用的是TIM2的123通道,TIM4的2通道来进行频率的测量。由于没有频率发生器,所以我用tim3作为信号源,用TIM2,TIM4来进行测量就ok了(刚好4个通道了)。

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

TIM_ICInitStructure.TIM_ICMode =TIM_ICMode_ICAP; //配置为输入捕获模式

TIM_ICInitStructure.TIM_Channel =TIM_Channel_1; //选择通道1

TIM_ICInitStructure.TIM_ICPolarity =TIM_ICPolarity_Rising; //输入上升沿捕获

TIM_ICInitStructure.TIM_ICSelection =TIM_ICSelection_DirectTI; //通道方向选择

TIM_ICInitStructure.TIM_ICPrescaler =TIM_ICPSC_DIV1;

//每次检测到捕获输入就触发一次捕获

TIM_ICInitStructure.TIM_ICFilter =0x0; //滤波

TIM_ICInit(TIM2, &TIM_ICInitStructure); //TIM2通道1配置完毕

TIM_ICInitStructure.TIM_ICMode = TIM_ICMode_ICAP; //配置为输入捕获模式

TIM_ICInitStructure.TIM_Channel =TIM_Channel_3; //选择通道3

TIM_ICInitStructure.TIM_ICPolarity =TIM_ICPolarity_Rising; //输入上升沿捕获

TIM_ICInitStructure.TIM_ICSelection =TIM_ICSelection_DirectTI; //

TIM_ICInitStructure.TIM_ICPrescaler =TIM_ICPSC_DIV1;

//每次检测到捕获输入就触发一次捕获

TIM_ICInitStructure.TIM_ICFilter = 0x0; //滤波

TIM_ICInit(TIM2, &TIM_ICInitStructure); //TIM2通道3配置完毕

以上是输入捕获配置,还需要做的工作就是(参考stm32参考手册的TIM的结构框图):

TIM_SelectInputTrigger(TIM2,TIM_TS_TI1FP1);

//参考TIM结构图选择滤波后的TI1输入作为触发源,触发下面程序的复位

TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset);

//复位模式-选中的触发输入(TRGI)的上升沿初始化计数器,并且产生一个更新线号

TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_Enable);

//主从模式选择

这样我们就可以很轻松的就得到了连接在TIM2的通道1上的信号的频率,但是3通道的频率的值永远都是跳动的不准,测试了半天也没有找到根本原因,请看TIM的结构框图的一部分

相关文档
最新文档