STM32F103定时器输入捕获功能

发布者:老桃子最新更新时间:2022-01-29 来源: eefocus关键字:STM32F103  定时器  输入捕获功能 手机看文章 扫描二维码
随时随地手机看文章

  STM32F103单片机的定时器不仅能输出PWM波,而且还能捕获输入的PWM波。可以通过定时器的捕获功能测量输入PWM波的周期和占空比。


  在输入捕获模式下,当检测到ICx信号上相应的边沿后,计数器的当前值被锁存到捕获/比较寄存器(TIMx_CCRx)中。当发生捕获事件时,相应的CCxIF标志(TIMx_SR寄存器)被置1,如果开放了中断或者DMA操作,则将产生中断或者DMA请求。如果发生捕获事件时CCxIF标志已经为高,那么重复捕获标志CCxOF(TIMx_SR寄存器)被置1。写CCxIF=0可清除CCxIF,或读取存储在TIMx_CCRx寄存器中的捕获数据也可清除CCxIF。写CCxOF=0可清除CCxOF。


  这里就使用捕获模式测量PWM波形的高电平时长,具体实现原理简单的来说就是,当第一个上升沿到来之后,清空计数器,当第一个下降沿到来之后,此时计数器的值就是高电平的值。


设置代码如下:


void TIM5_Cap_Init(u16 arr, u16 psc)

{

    GPIO_InitTypeDef GPIO_InitStructure;

    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

    TIM_ICInitTypeDef TIM_ICInitStructure;

    NVIC_InitTypeDef NVIC_InitStructure;


    //时钟初始化

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    //IO口初始化

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

    //TIM5初始化

    TIM_TimeBaseStructure.TIM_Period = arr;

    TIM_TimeBaseStructure.TIM_Prescaler = psc;

    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

    TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);

    //TIM5输入捕获参数

    TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01 选择输入端 IC1映射到TI1上

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

    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;  //映射到TI1上

    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频

    TIM_ICInitStructure.TIM_ICFilter = 0x00; //IC1F=0000 配置输入滤波器 不滤波

    TIM_ICInit(TIM5, &TIM_ICInitStructure);

    //中断分组初始化

    NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);


    TIM_ITConfig(TIM5, TIM_IT_Update | TIM_IT_CC1, ENABLE);

    TIM_Cmd(TIM5, ENABLE);

}


u8  TIM5CH1_CAP_STA = 0;    //输入捕获状态

u16 TIM5CH1_CAP_VAL; //输入捕获值

void TIM5_IRQHandler(void)

{

    if((TIM5CH1_CAP_STA & 0x80) == 0)

    {

        if(TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET) //溢出中断

        {

            if(TIM5CH1_CAP_STA & 0x40) //已经捕获到高电平了

            {

                if((TIM5CH1_CAP_STA & 0x3F) == 0x3F) //高电平太长了

                {

                    TIM5CH1_CAP_STA |= 0x80; //标记成功捕获了一次

                    TIM5CH1_CAP_VAL = 0xFFFF;

                }

                else

                    TIM5CH1_CAP_STA++;

            }

        }

        if(TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET) //捕获中断

        {

            if(TIM5CH1_CAP_STA & 0x40) //下降沿捕获

            {

                TIM5CH1_CAP_STA |= 0x80; //标记成功捕获一次高电平脉宽

                TIM5CH1_CAP_VAL = TIM_GetCapture1(TIM5);

                TIM_OC1PolarityConfig(TIM5, TIM_ICPolarity_Rising); //设置上升沿捕获

            }

            else     //上升沿捕获

            {

                TIM5CH1_CAP_STA = 0; //清空

                TIM5CH1_CAP_VAL = 0;

                TIM_SetCounter(TIM5, 0);

                TIM5CH1_CAP_STA |= 0x40; //标记捕获到了高电平

                TIM_OC1PolarityConfig(TIM5, TIM_ICPolarity_Falling); //设置下降沿捕获

            }

        }

    }

    TIM_ClearITPendingBit(TIM5, TIM_IT_Update | TIM_IT_CC1);

}


  这里使用定时器5的通道1来进行捕获,首先设置通道1为上升沿捕获,当上升沿触发中断之后,清空计数器的值,然后将中断设置为下降沿中断。当下一次下降沿中断触发后,此时的时间就是PWM波的高电平时间,接着再将中断设置为上升沿中断,等待下一次高电平的触发。


  每次捕获成功时,在主函数中将高电平时长打印出来。


extern u8  TIM5CH1_CAP_STA;    //输入捕获状态

extern u16 TIM5CH1_CAP_VAL; //输入捕获值

int main(void)

{

    u32 temp = 0;

    delay_init();        //延时函数初始化

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    uart_init(115200);

    LED_Init();


    LED0 = 1;

    LED1 = 1;

    delay_ms(500);

    LED0 = 0;

    LED1 = 0;


    TIM3_PWM_Init(3600-1,0);             //不分频。PWM频率=72000000/3600=20Khz   PB5输出PWM

    TIM5_Cap_Init(0xffff, 72 - 1); //以1Mhz的频率计数  PA0


    printf("Input Capture test!!!rn");

    while(1)

    {

        delay_ms(10);

TIM_SetCompare2(TIM3,TIM_GetCapture2(TIM3)+1);


if(TIM_GetCapture2(TIM3)==3600)

            TIM_SetCompare2(TIM3,0);


        if(TIM5CH1_CAP_STA & 0X80) //成功捕获到了一次上升沿

        {

            temp = TIM5CH1_CAP_STA & 0X3F;

            temp *= 65536; //溢出时间总和

            temp += TIM5CH1_CAP_VAL; //得到总的高电平时间

            printf("HIGH:%d us %d ms %d srn", temp,temp/1000,temp/1000000); //打印总的高点平时间

            TIM5CH1_CAP_STA = 0; //开启下一次捕获

        }

    }

}


定时器3用来产生一个PWM波,然后通过定时器5的捕获功能来测量PWM波的高电平时间。

关键字:STM32F103  定时器  输入捕获功能 引用地址:STM32F103定时器输入捕获功能

上一篇:STM32F103看门狗功能实现
下一篇:STM32F103通过IIC总线读取EEPROM

推荐阅读最新更新时间:2024-11-11 10:22

e络盟社区启动555定时器疯狂设计挑战赛
挑战赛旨在庆祝首款555定时器诞生50周年 中国上海,2022年9月23日 – 安富利旗下全球电子元器件产品与解决方案分销商e络盟通过其在线社区发起555定时器疯狂设计挑战赛,以庆祝首款555定时器IC(555振荡器)诞生50周年。 挑战赛要求社区成员使用555定时器进行创新或独特项目开发。555定时器具备多种功能,可用于开发各种电路设计。凡按要求提交设计方案的参赛选手均有机会赢得所需组件用于构建设计项目。 555定时器在50年前一经面世便迅速成为了最受欢迎的高精度定时器件之一,不仅功能强大且价格低廉。它既可以直接用作计时器来产生单脉冲或长时间延时,也可以作为张弛振荡器,能够产生占空比为50%至100%的稳定方波波形。
[模拟电子]
e络盟社区启动555<font color='red'>定时器</font>疯狂设计挑战赛
stm32库函数学习篇通用定时器输入捕获功能
实现功能:PA8随意延时驱动led灯闪烁,并且将PA8用杜邦线连接到PA7口,PA7是通用定时器TIM3的2通道,在TIM3_CH2触发中断程序中取反连接到PD2口的led灯,指示中断程序运行,并且每次进入中断后改变触发捕获的极性。实现两个led灯会交替闪烁。 先有必要了解stm32定时器的输入触发模块,如下图: 需要注意的是,一眼望去一个定时器似乎有8个通道,左边四个,右边四个,但其实左边和右边是共用相同的IO引脚,所以名称标注是一模一样。也就是说,每个通用定时器都只有四个独立通道,当某一通道作为了输入触发功能那就不能再作为输出匹配功能。这一点我们也可以从其他地方找到印证。比如TIM_ITConfig()函数中如下
[单片机]
stm32库函数学习篇通用<font color='red'>定时器</font><font color='red'>输入</font><font color='red'>捕获</font><font color='red'>功能</font>
STM32--SYSTICK超简易定时器
上次的 定时器搞得我比较晕,勉强调通了程序,就实用主义来说应该算是勉强合格了。 当然CORTEX-M3独有的定时功能可是超级简单的 那就是SySTick,所谓的系统定时器.配置方式简单 简单的不能再简单,因为STM32 的库函数已经帮我们搞好了,只需要调用一个函数,就可以配 置系统时钟的频率和开启系统时钟的中断.呵呵....不过这么好用的定时器只有一个。 //SYSTICK 分频--1ms的系统时钟中断 if (SysTick_Config(SystemFrequency / 1000)) { /* Capture error */ while (1); } 就是这么简单,系统就会产生一个1MS 的系统时钟中断(如果除数是50
[单片机]
STM32--SYSTICK超简易<font color='red'>定时器</font>
51单片机T0定时器应用1
1.实验任务   用AT89S51单片机的定时/计数器T0产生一秒的定时时间,作为秒计数时间,当一秒产生时,秒计数加1,秒计数到60时,自动从0开始。硬件电路如下图所示 2.电路原理图 图4.15.1 3.系统板上硬件连线 (1).把“单片机系统”区域中的P0.0/AD0-P0.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求:P0.0/AD0对应着a,P0.1/AD1对应着b,……,P0.7/AD7对应着h。 (2).把“单片机系统”区域中的P2.0/A8-P2.7/A15端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求:P2.0/A8对应着a,P2.1/A9对
[单片机]
51单片机T0<font color='red'>定时器</font>应用1
系统时钟和定时器;MPLL和定时器
写在前面:觉得这章比较简单,没有花较大篇幅来讲,很多寄存器的相关用法可以参照S 3C2440的官方手册,很容易看懂 1系统时钟 (1) FCLK:用于CPU核 HCLK:用于AHB总线上设备:CPU核、存储器控制器、中断控制器、LCD控制器、DMA和USB主机模块 PCLK:用于APB总线上设备:WATCHDOG、IIS、I2C、PWM定时器、MMC接口、ADC、UART、GPIO、RTC和SPI (2 )开发板时钟频率为12 MHZ,通过PLL提高系统时钟:MPLL和UPLL(S3C2440);UPLL用于USB设备,MPLL用于FCLK、HCLK、PLCK (3 )上电 FCLK=Fin(外部输入时钟) 设置MPLL
[单片机]
基于Xilinx FPGA的边界扫描应用
上一篇文章,介绍了基于STM32F103的JTAG边界扫描应用,演示了TopJTAG Probe软件的应用,以及边界扫描的基本功能。本文介绍基于Xilinx FPGA的边界扫描应用,两者几乎是一样。 1. 获取芯片的BSDL文件 FPGA的BSDL文件获取方式,可以参考之前的文章:BSDL文件获取。 以Xilinx Kintex-7系列FPGA XC7K325T为例,可以在BSDL Library网站获取,或者在ISE、Vivado的安装目录获取, D:ProgramXilinx14.7ISE_DSISEkintex7data D:ProgramXilinxVivadoVivado2018.3ids_liteISEkintex
[单片机]
基于Xilinx FPGA的边界扫描应用
STM8S定时器操作
综述 STM8S提供三种类型的 TIM 定时器:高级控制型(TIM1)、通用型(TIM2/TIM3/TIM5)和基本型定时器(TIM4/TIM6)。它们虽有不同功能但都基于共同的 架构 。此共同的架构使得采用各个定时器设计应用变得非常容易与方便(相同的寄存器映射,相同的基本功能)。 本文只针对STM8S103该芯片进行介绍,该芯片的定时器个数为3个,每个类型的定时器都一个,分别为高级控制型(TIM1)、通用型(TIM2)、基本型定时器(TIM4)。 关于STM8S103手册的TIM简介 每个定时器的功能都有详细介绍,大家可以认真看下。 TIMx详细讲解 3.1 TIM1解析 TIM1_Prescaler    :即预分
[单片机]
小尺寸、低功耗!思瑞浦发布高性能车规级看门狗定时器专用芯片TPV710Q
聚焦模拟芯片和嵌入式处理器的供应商思瑞浦3PEAK(股票代码:688536)全新推出小尺寸、低功耗、车规级看门狗定时器专用芯片TPV710Q,在汽车座舱、T-Box、BMS、ESS、工业控制设备等领域得到了广泛应用。 TPV710Q提供AEC-Q100 Grade1认证 ,静态功耗6μA,提供多个可用看门狗超时周期10ms、100ms、0.6s、1.6s、3.2s、6.4s和12.8s,并带有EN控制,保证最小Vcc=1.67V有效。 MCU正常工作的时候,每隔一段时间输出一个信号到喂狗端,给 WDT清零,如果超过规定的时间不喂狗(一般在程序跑飞时),WDT定时超过,就会给出一个复位信号到MCU,使MCU复位,防止程序发生
[汽车电子]
小尺寸、低功耗!思瑞浦发布高性能车规级看门狗<font color='red'>定时器</font>专用芯片TPV710Q

推荐帖子

S7-300的数据类型
est—S7-300的数据类型分以下三种:基本数据类型、复合数据类型和参数类型。  一、基本数据类型  1、位(bit)  常称为BOOL(布尔型),只有两个值:0或1。如:I0.0,Q0.1,M0.0,V0.1等。  2、字节(Byte)  一个字节(Byte)等于8位(Bit),其中0位为最低位,7位为最高位。如:IB0(包括I0.0~I0.7位),QB0(包括Q0.0~Q0.7位),MB0,VB0等。范围:00~FF(十进制的0~255)。  3、字(Wor
totopper 工控电子
移植minigui遇到的问题
我用的是S3C44B0的板子已经移植好的uclinux和framebuffer,按照网上一篇点击率较高的帖子进行对minigu1.3.3版本的i移植在进入mde-1.3.0目录编译时遇到了问题,解决到最后出现如下信息:/usr/bin/ld:cannotfind-lmgextcollect2:ldreturned1exitstatus在网上搜索相关的资料,大概问题是库的路径没对导致没有找到对应的库。但是试了许多方法还是不行。谁遇到过这种情况?大家讨论讨
范小川 嵌入式系统
自己做的LM3S9B96的板子,不能下载程序。
今天做的板子终于来了,很兴奋,好不容易焊好,可是不能下载程序。我没有JLINK,用的是TI官方的LM3S9B96developmentkit的板子上的ICDI仿真器。用杜邦线把线连好后,下载程序出现下图所示的提示我试着断开仿真器其中的一条线,比如TDO,错误提示会发生变化先出现下图:点击“确定”后出现下图发生变化是不是代表仿真器识别到了芯片了,但是为什么不能下载呢??请大家帮帮我。先谢谢了。注:我们有两块LM3S9B96developmentki
zzgezi 微控制器 MCU
【分享】4412开发板-嵌入式Linux开发需要掌握的基础知识和技能
1、Linux基础安装Linux操作系统Linux文件系统Linux常用命令Linux启动过程详解熟悉Linux服务能够独立安装Linux操作系统能够熟练使用Linux系统的基本命令认识Linux系统的常用服务安装Linux操作系统Linux基本命令实践设置Linux环境变量定制Linux的服务Shell编程基础使用vi编辑文件使用Emacs编辑文件使用其他编辑器2、Shell
topeet ARM技术
谁能用比较通俗的语言告诉下驱动下的kobject和sys干什么用的?
谁能用比较通俗的语言告诉下驱动下的kobject和sys干什么用的?谢谢!谁能用比较通俗的语言告诉下驱动下的kobject和sys干什么用的?帮顶,同问
weilwo 嵌入式系统
【2024 DigiKey创意大赛】+便携式红外智能吸烟器+结项贴
【2024DigiKey创意大赛】+便携式红外智能吸烟器+结项贴先来看看(半)成品效果:Emmm,热成像模块给我玩坏了,下面是没玩坏之前的效果:下面介绍一下项目想法:我是一名自动化的电子开发者,在开发电路过程中老是需要焊接各种pcb元器件,有一天我在网上看到焊接烟雾会导致不孕不育,我害怕极了,我才20几.还没小孩呢!伤心~我痛定思痛,决定开发一款桌面式焊接吸烟器.在着手开发这款便携式红外智能吸烟器之前,我曾浏览淘宝,寻找市面上是否有类似产品。
老杰瑞 DigiKey得捷技术专区
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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