历史上的今天

今天是:2024年10月13日(星期日)

正在发生

2018年10月13日 | STM32F10x利用定时器测量脉冲宽度

发布者:静逸闲云 来源: eefocus关键字:STM32F10x  定时器  脉冲宽度 手机看文章 扫描二维码
随时随地手机看文章

  硬件:STM32F103C8T6


  平台: ARM-MDk V5.11


 


  前面一篇文章讲过如何利用定时器测量信号的频率(见[STM32F10x] 利用定时器测量频率),使用的是定时器的捕获/比较单元(Capture/compare),它也可以测量输入信号的脉冲宽度。


  利用定时器测量脉冲宽度有两种方法。


  方法1:


  在捕获中断函数里改变捕获信号的触发沿(上升沿触发改为下降沿触发,或者下降沿触发改为上升沿触发),通过两次触发得到的计数器的差值,来计算出脉冲宽度。这种


  方法需要定时器的配置和[STM32F10x] 利用定时器测量频率方法是一样的,不同的地方在中断函数里修改触发沿,以TIM2, 捕获通道2为例:


        if(CapState == 0)

        {

            

            // First time capture  

            Val1         = TIM_GetCapture2(TIM2);

            CapState     = 1;

            

            // Change the trigger  

            TIM2->CCER         |=    1UL << 5;

        }


        else if(CapState == 1)

        {

            // Second time capture  

            Val2 = TIM_GetCapture2(TIM2);

            

            // Change the trigger  

            TIM2->CCER         &=    ~(1UL << 5);


            // Capture computation  

            if (Val2 > Val1)

            {

                CapVal = Val2 - Val1; 

            }

            else

            {

                CapVal = ((0xFFFF - Val1) + Val2); 

            }




        CapState = 0;


     }



  当然,在第一次捕获的时候将计数器清零,然后第二次捕获直接读取捕获值也是一个不错的选择,如下,




        if(CapState == 0)

        {

            

            // First time capture 

           TIM_GetCapture2(TIM2);

           CapState     = 1;

            

            // Change the trigger  

            TIM2->CCER         |=    1UL << 5;


            // Clear CNT  

            TIM_SetCounter(TIM2, 0);

        }


        else if(CapState == 1)

        {

            // Second time capture  

            CapVal = TIM_GetCapture2(TIM2);

            

            // Change the trigger  

            TIM2->CCER         &=    ~(1UL << 5);




        CapState = 0;

     }    


  触发沿的配置在CCER这个寄存器里面,这里直接对寄存器进行操作,具体请查阅STM32F10x的参考说明书。


 


  方法2:


  利用定时器的PWM输入模式(PWM input mode)。所谓的PWM模式,其实就是利通了定时器捕获单元映射功能,定时器捕获单元1(IC1)和捕获单元2(IC2)可以映射


  到同一个捕获通道,一个捕获单元配置成捕获上升沿信号,另一个捕获单元配置成捕获下降沿信号,那么两个捕获值的差就是脉冲宽度的值。还是以TIM2, 捕获通道2


  为例,配置代码如下:




 1 void CaptureConfig(void)

 2 {

 3     TIM_ICInitTypeDef  TIM_ICInitStructure;

 4     

 5     TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_IndirectTI;

 6     TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;

 7     TIM_ICInitStructure.TIM_ICFilter    = 0x0;

 8     TIM_ICInitStructure.TIM_Channel     = TIM_Channel_1;

 9     TIM_ICInitStructure.TIM_ICPolarity  = TIM_ICPolarity_Rising;

10     TIM_PWMIConfig(TIM2, &TIM_ICInitStructure);

11     

12     // TIM enable counter  

13     TIM_Cmd(TIM2, ENABLE);

14 

15     // Enable the CC1, CC2 Interrupt Request  

16     TIM_ITConfig(TIM2, TIM_IT_CC2 | TIM_IT_CC1, ENABLE);

17 }


各行代码的意思:


L2:指定捕获单元的映射方式,TIM_ICSelection_IndirectTI 说明捕获单元1(IC1)和捕获单元2(IC2)映射到捕获通道2(TI2,这里是指捕获通道2,区别


定时器TIM2),假如该值为TIM_ICSelection_DirectTI,则捕获单元1(IC1)和捕获单元2(IC2)映射到捕获通道1(TI1)。


L8, L9:  指定捕获单元触发的信号沿(上升沿还是下降沿)。TIM_Channel_1对应捕获单元1(IC1),TIM_Channel_2对应捕获单元2(IC2)注意这里


只需要指定一个捕获单元,另一个捕获单元将会在调用初始化函数TIM_PWMICConfig时设定为相反的边沿。


L16:允许捕获单元1和捕获单元2的中断。


这样,当捕获通道2(TI2)检测到上升沿时,捕获单元1(IC1)将会记录下计数器的值,同时捕获单元1的中断标志位(CC1IF)将置位;


当捕获通道2(TI2)检测到下降沿时,捕获单元2(IC2)将会记录下计数器的值,同时捕获单元2的中断中断标志位(CC2F)将置位。


中断处理函数示例代码如下:



    if(TIM_GetITStatus(DEMOD_CAPTURE_TIM, TIM_IT_CC1) == SET)

    {

        TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);

        TIM_GetCapture1(TIM2);

        TIM_SetCounter(TIM2, 0);

               

    }    

    else if(TIM_GetITStatus(DEMOD_CAPTURE_TIM, TIM_IT_CC2) == SET)

    {

        TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);

        CapVal = TIM_GetCapture2(TIM2);

    }

 

总结:  


STM32F10x系列的定时器是一个很灵活的东西,想灵活应用它首先要理解它的原理和运作的过程。定时器的捕获单元和捕获通道是比较容易混淆的两个东西


简单来说,STM32F10x的每个通用定时器有4个捕获通道(TI1, TI2, TI3, TI4, 对应4个GPIO口),每个捕获通道对应一个捕获单元,即IC1, IC2, IC3, IC4,


其中捕获单元1和捕获单元2可以映射到同一个捕获通道,TI1或者TI2。


关键字:STM32F10x  定时器  脉冲宽度 引用地址:STM32F10x利用定时器测量脉冲宽度

上一篇:STM32F407 PC13-PC15作为GPIO的方法
下一篇:STM32F407系统时钟解析

推荐阅读

环境: ubuntu 13.10 stm32f103zet6 一 STM 32 GCC 安装stm32 属于arm cortex-m系列thumb指令集,所以给arm用的arm-none-eabi就可以了,首先是下载下载地址:https://launchpad.NET/gcc-arm-embedded/+download下载其中的gcc-arm-none-eabi-version-linux.tar.bz2解压到你知道的目录会产生 gcc-arm-none-eabi的文件夹把该编...
(文章来源:中国智能化网) 机器人从结构上讲属于一个空间开链机构,其中各个关节的运动是独立的,为了实现末端点的运动轨迹,需要多关节的运动协调,其控制系统较普通的控制系统要复杂得多。 机器人控制系统的特点如下: (1)机器人的控制是与机构运动学和动力学密切相关的。在各种坐标下都可以对机器人手足的状态进行描述,应根据具体的需要对参...
日前,以“我们制造联接”为主题的SENSOR CHINA完美收官,中外传感器企业乘着新基建的东风,踏浪而来,展示各自与产业链交融互动的创新落地成果,出尽风头。今年展会上国际大厂的创新密码和爆款是什么?国民新势力又有何不同往年的惊喜进展?而同期十余场高峰论坛论道热门产业趋势,压力、气体、3D视觉等论坛场场爆满,丰富的产业交流活动轮番开展,短短3...
很早之前就想做一款无刷电机控制器,忙于工作一直没有弄。最近有点时间画板,打样,焊接,调试,总算顺利的转起来。期间也遇到很多问题,上网查资料,自己量波形前前后后搞了差不多近一个月,(中间又出差一周)总算搞的差不多了,特意写个总结。板子外观100*60mm 中等大小。DC 12V输入,设计最大电流10A.(实际没试过那么大的电机,手头的电机也就5 6A...

史海拾趣

问答坊 | AI 解惑

如何从单片机I/O口发送串行数据?

   如题,想从一个AVR单片机其中一个口发送16位串行数据到74HC595中,该如何操作?      做循环,一位一位发吗? …

查看全部问答∨

2007年全国大学生电子设计竞赛 基本仪器和主要元器件清单【更新08-30】

本帖最后由 paulhyde 于 2014-9-15 08:57 编辑 2007年全国大学生电子设计竞赛 基本仪器和主要元器件清单 1、基本仪器清单 20MHz普通示波器(双通道,外触发输入,有X轴输入,可选带Z轴输入) 60MHz双通道数字示波器 低频信号发生器(1Hz~ ...…

查看全部问答∨

清洁机器人Roomba工作机理

前言: 洗尘机器人已经问世很多年了,而市场上也已经有多款洗尘机器人出售,价格从1000多人民币,到12000多人民币。当然功能上也有很多不同。最新的清洁机器人已经相当智能化,不但能根据您的需要来定时清洁,还能够在清洁过程中自行充电,然后待 ...…

查看全部问答∨

你觉得英语在电子设计中的比重有多大?

本帖最后由 paulhyde 于 2014-9-15 09:14 编辑 现在很多资料,一些代理商 都倾向于把资料翻译成中文,这样可以更好地宣传推广 但是英语的瓶颈对于我们浏览国外电子类网站,了解国外的电子类行情,是个不小的阻碍 你觉得英语在电子设计中的比重有 ...…

查看全部问答∨

全彩LED显示屏专用LED的选择和使用

本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 全彩LED显示屏的最关键部件是LED器件。原因有三:第一,LED是全彩屏整机中使用数量最多的关键器件,每平方米会使用几千至几万只LED;第二,LED是决定整屏光学显示性能的主体,直接影响观众对显 ...…

查看全部问答∨

奉献安森美的电源设计手册,中文的

奉献安森美的电源设计手册,中文的哦,呵呵…

查看全部问答∨

针对江苏电竞 MSP430 FG4619开发板的学习

本帖最后由 paulhyde 于 2014-9-15 09:19 编辑  你会需要的  …

查看全部问答∨

上传一本入门PLC的好书!~

图解继电器与可编程序控制器 [ 本帖最后由 wanghongyang 于 2010-10-20 22:22 编辑 ]…

查看全部问答∨

AM335x学习心得之kernel优化方法

在加载LINUX内核的时,要对内核进行交叉编译,这个过程要需要等待很长的时间,移植内核后,如果内核太大,在启动的过程中要需要很长的时间去引导。在学习视频第三讲时,提出了几个可以优化内核的方法,对以后项目开发会比较有用。区域优化,主要包 ...…

查看全部问答∨

【菜鸟FPGA学习帖】第4帖 基础实例一

【菜鸟FPGA学习帖】第4帖 基础实例一 (例程中dout高三位分别为D4 D3 D2)第一章VHDL中有四类操作符,逻辑操作符、关系操作符、算术操作符、符号操作符逻辑操作符AND OR NAND NOR XOR XNOR NOT,如果在一个表达式中有两个以上算符,需要使用括号把 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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