小熊STM32学习总结:STM32的定时器--输入捕捉模式

发布者:幸福家庭最新更新时间:2019-08-15 来源: eefocus关键字:STM32  定时器  输入捕捉模式 手机看文章 扫描二维码
随时随地手机看文章

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


  请看一开始的程序,以TIM2的1,3通道为例子:


  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);



  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);



  这个是输入捕获配置


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



   /* Select the TIM2 Input Trigger: TI2FP2 【输入触发源选择】*/



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



    /* Select the slave Mode: Reset Mode */



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



    /* Enable the Master/Slave Mode */



    TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);       



  //主从模式选择



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


  红色箭头所指,这才找到原因,触发的信号源只有这四种,而通道3上的计数器的值不可能在接受到信号的上升沿时候,有复位这个动作,找到原因了。这就是3通道上的数据不停跳动的原因,要想的到信号的频率也是有办法的,可以取连续两次捕捉的值之差,这个值就是信号的周期,自己根据实际情况去算频率吧。


  有以上可以得到:


  stm32的TIM的四个通道可以同时配置成输入捕捉模式,但是计算CH3,CH4信号的频率步骤有点繁琐(取前后捕捉的差值),但是他的CH1,和CH2可以轻松得到:


  通道1


    /* Select the TIM2 Input Trigger: TI2FP2 【输入触发源选择】*/


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



    /* Select the slave Mode: Reset Mode */



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



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


  通道2:



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



    /* Select the slave Mode: Reset Mode */



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



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



  笔记记得不是太好,还希望对调试这部分的朋友有所帮助!


关键字:STM32  定时器  输入捕捉模式 引用地址:小熊STM32学习总结:STM32的定时器--输入捕捉模式

上一篇:小熊stm32学习总结:stm32f407 GPIO_PinAFConfig 函数
下一篇:关于stm32硬件I2C BUSY锁死的一点说法

推荐阅读最新更新时间:2024-11-16 23:35

STM32八种输入输出模式详解
最近在看数据手册的时候,发现在Cortex-M3里,对于GPIO的配置种类有8种之多: (1)GPIO_Mode_AIN 模拟输入 (2)GPIO_Mode_IN_FLOATING 浮空输入 (3)GPIO_Mode_IPD 下拉输入 (4)GPIO_Mode_IPU 上拉输入 (5)GPIO_Mode_Out_OD 开漏输出 (6)GPIO_Mode_Out_PP 推挽输出 (7)GPIO_Mode_AF_OD 复用开漏输出 (8)GPIO_Mode_AF_PP 复用推挽输出 对于刚入门的新手,我想这几个概念是必须得搞清楚的,平时接触的最多的也就是推挽输出、开漏输出、上拉输入这三种,但一直未曾对这些做过归纳。因此,在这
[单片机]
STM32单片的启动过程解析
一、STM32启动文件详细解析 STM32启动文件详细解析(V3.5.0) 以:startup_stm32f10x_hd.s为例 ;********************(C)COPYRIGHT2011STMicroelectronics******************** ;*FileName:startup_stm32f10x_hd.s ;*Author:MCDApplicationTeam ;*Version:V3.5.0 ;*Date:11-March-2011 ;*Description:STM32F10xHighDensityDevicesvectortableforMDK-ARM ;*toolchain. ;*
[单片机]
【stm32f103】stm32 外部中断(寄存器版)
中断分类 STM32的EXTI控制器支持19 个外部中断/ 事件请求。每个中断设有状态位,每个中断/ 事件都有独立的触发和屏蔽设置。 STM32的19个外部中断对应着19路中断线,分别是EXTI_Line0-EXTI_Line18: 线0~15:对应外部 IO口的输入中断。 线16:连接到 PVD 输出。 线17:连接到 RTC 闹钟事件。 线18:连接到 USB 唤醒事件。 触发方式:STM32 的外部中断是通过边沿来触发的,不支持电平触发。 外部中断分组:STM32 的每一个GP
[单片机]
【stm32f103】<font color='red'>stm32</font> 外部中断(寄存器版)
STM32 keil4 extern问题
最近一个项目,在stm32 keil中移植了别人的一些库文件,编译时出现如下错误提示 .OBJW5100_SPI.axf: Error: L6218E: Undefined symbol FLAG_comerr (referred from master.o). .OBJW5100_SPI.axf: Error: L6218E: Undefined symbol adcval (referred from master.o). .OBJW5100_SPI.axf: Error: L6218E: Undefined symbol nzval (referred from master.o). .OBJW5100_SPI.ax
[单片机]
STM32 USART使用奇偶校验位
无校验位时,数据位常用8位 当使用就校验位时,数据位应设置为9位. 奇偶校验位也包含在数据位中。 详见参考手册:
[单片机]
<font color='red'>STM32</font> USART使用奇偶校验位
STM32的硬件I2C实现及问题
虽然软件可实现I2C读取三轴传感器数据,但I2C作为一种重要的通信协议是一定要搞清楚问题所在的,SO继续研究之前的问题。(网上传言STM32硬件I2C有问题,但仍然有人实现出来) 再次启动程序,依旧是停在原来的位置 等待EV6,网上搜索相关问题好多人都停在了等待EV5上。分析EV5等待问题,主机发送起始信号,没能接受从设备发送的应答, 或者可能都没有发送。此问题应该是接线或IIC初始化代码的问题。 而我此时停在等待EV6,说明已检测到该设备。换句话说从设备已经知道了主设备的存在。却在主设备发送设备地址之后,接受不到从设备的应答信号,自己分析有两种可能,一是设备地址错误,从设备接受到不是自身的设备而地址自然不会应答
[单片机]
<font color='red'>STM32</font>的硬件I2C实现及问题
STM32定时器----通用定时器输出带死区互补PWM
功能:利用一个普通定时器,输出2路互补的、频率可调、占空比可调、死区可调的PWM 原理:如下图,计数模式为中心对齐模式 可以看出,CH3高电平区间是以计数器计到4为中心,向两边延伸的。 而CH4,因为输出极性相反,是以0为中心向两边延伸的。 CCR3变小,占空比上升 CCR4变大,占空比上升 CCR3与CCR4的和为ARR 注意,此模式计数器的计数周期=ARR,这与PWM模式:计数周期 = ARR+1不同 这点参考下图STM32参考手册: 故,整理出代码以及计算公式如下: void TIM3_PWMShiftInit(void) { float Duty = 0; u16 ARR = 0,PSC = 0
[单片机]
基于STM32 MCU的太阳能LED街灯解决方案
随着化石类能源的日益减少,以及温室气体的过度排放导致全球变暖问题越来越受到重视,人们一方面在积极开发各类可再生新能源,另一方面也在倡导节能减排的绿色环保技术。太阳能作为取之不尽、用之不竭的清洁能源,成为众多可再生能源的重要代表;而在照明领域,寿命长、节能、安全、绿色环保、色彩丰富、微型化的led固态照明也已被公认为世界一种节能环保的重要途径。太阳能-LED街灯同时整合了这两者的优势,利用清洁能源以及高效率的LED实现绿色照明。 本文介绍的太阳能-LED街灯方案,能自动检测环境光以控制路灯的工作状态,最大功率点追踪(MPPT)保证最大太阳能电池板效率,恒电流控制LED,并带有蓄电池状态输出以及用户可设定LED工作时间等功能。
[电源管理]
基于<font color='red'>STM32</font> MCU的太阳能LED街灯解决方案
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved