美文网首页
stm32---输入捕获

stm32---输入捕获

作者: 蜗牛blue_wang | 来源:发表于2019-08-07 10:48 被阅读0次

STM32F1 除了基本定时器 TIM6 和 TIM7,其他定时器都具有输入捕 获功能。输入捕获可以对输入的信号的上升沿,下降沿或者双边沿进行捕获,通 常用于测量输入信号的脉宽、测量 PWM 输入信号的频率及占空比


原理: 输入捕获模式下,

  • 当相应的 ICx 信号检 测到上升沿/下降沿后,把当前定时器的值存入捕获/比较寄存器(TIMx_CCRx)。
  • 当高电平时间长时,定时器配置向上计数,会溢出多次
  • 高电平时间 = 溢出次数 x 定时器计数最大值 + 捕获/比较寄存器的值(us)


    捕获.PNG

u8 TIM5_CH1_CAPTURE_STA; //输入捕获状态
其最高位为1表示一次高电平时间捕获完成
次高位(6)为0表示出现高电平,为1表示出现低电平

u8 TIM5_CH1_CAPTURE_TIMES; //定时器溢出次数
其0--5位来计数

u16 TIM5_CH1_CAPTURE_VAL;//输入捕获值

道 ICx 可以映射到 2 个 TIx 上,比如 IC1 可以直接映射 到 TI1 上,也可以间接映射到 TI2 上,但是不能映射到 TI3 和 TI4 上。假如我们 直接映射在 TI1 上,参数为 TIM_ICSelection_DirectTI。


input.c

#include "input.h"

u8 TIM5_CH1_CAPTURE_STA; //输入捕获状态 
u8  TIM5_CH1_CAPTURE_TIMES; //定时器溢出次数
u16 TIM5_CH1_CAPTURE_VAL;//输入捕获值


void TIM5_CH1_Input_Init(u16 per,u16 psc)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    NVIC_InitTypeDef NVIC_InitStuucture;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_ICInitTypeDef TIM_ICInitStructure;
    
    //1*开启定时器和GPIOA的时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //key_up按键
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //下拉模式
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    
    //2*定时器优先级配置和初始化
    NVIC_InitStuucture.NVIC_IRQChannel = TIM5_IRQn;
    NVIC_InitStuucture.NVIC_IRQChannelPreemptionPriority = 2;
    NVIC_InitStuucture.NVIC_IRQChannelSubPriority = 2;
    NVIC_InitStuucture.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStuucture);
    
    //3*定时器5配置
    TIM_TimeBaseInitStructure.TIM_Period = per;
    TIM_TimeBaseInitStructure.TIM_Prescaler = psc;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上递增模式
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitStructure);
    
    //4*设置通用定时器的输入捕获参数,开启输入捕获功能 
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; //通道1
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;  //预分配系数,不分频就设置1
    TIM_ICInitStructure.TIM_ICFilter = 0x00; //不用过滤器
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //输入捕获极性,上升沿
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //直接映射到TI1
    TIM_ICInit(TIM5,&TIM_ICInitStructure);
    TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE); //定时器中断配置
    
    //5*开启定时器
    TIM_Cmd(TIM5,ENABLE); 
    
}

void TIM5_IRQHandler()
{
    //3*
    if((TIM5_CH1_CAPTURE_STA&0x80)==0) //防止在输出数据时再次按下按键输出,一次捕获完成TIM5_CH1_CAPTURE_STA=1,则不会再进入下面if程序
    {
        
        //1*
        if(TIM_GetITStatus(TIM5,TIM_IT_CC1)==1) //出现捕获中断
        {
            if((TIM5_CH1_CAPTURE_STA&0x40)==0) //TIM5_CH1_CAPTURE_STA的次高位用来判断是否是下降沿中断。此if是当上升沿进入
            {
                TIM5_CH1_CAPTURE_STA=0;
                TIM5_CH1_CAPTURE_VAL=0;
                TIM5_CH1_CAPTURE_STA |= 0x40; //表示一次高电平捕获完成并为判断下降沿到来最准备
                
                TIM_Cmd(TIM5,DISABLE); //往定时器写值先关闭
                TIM_SetCounter(TIM5,0);//定时器初值是0
                TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);
                TIM_Cmd(TIM5,ENABLE);
                
            }
            else
            {
                TIM5_CH1_CAPTURE_STA |= 0x80; //一次捕获完成
                TIM5_CH1_CAPTURE_VAL = TIM_GetCapture1(TIM5); //获取计数器中的数,https://www.cnblogs.com/alan666/p/8311783.html
                TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising);
                
            }
        }
        
        //2*
        if(TIM_GetITStatus(TIM5,TIM_IT_Update)==1) //发生溢出中断
        {
            if(TIM5_CH1_CAPTURE_STA&0x40) //确保此时是高电平触发后的溢出中断
            {           
                if((TIM5_CH1_CAPTURE_TIMES&0x3f)==0x3f) //后6位来记录溢出次数,这里表示6位全部都记满了
                {
                    TIM5_CH1_CAPTURE_STA |= 0x80; //直接给状态最高位1,强制退出
                    TIM5_CH1_CAPTURE_VAL = 0xffff; //为最大计数值
                }
                else
                {                                                                                                                                                                                                                                                                                               
                    TIM5_CH1_CAPTURE_TIMES++;//溢出次数加1
                }
            }
        }
        
    }
    TIM_ClearITPendingBit(TIM5,TIM_IT_CC1|TIM_IT_Update);
}

input.h

#ifndef _input_H
#define _input_H



#include "system.h"


extern u8 TIM5_CH1_CAPTURE_STA; //输入捕获状态 
extern u16 TIM5_CH1_CAPTURE_VAL;//输入捕获值
extern u8 TIM5_CH1_CAPTURE_TIMES;
void TIM5_CH1_Input_Init(u16 per,u16 psc);



#endif

main.c

#include "systick.h"
#include "led.h"
#include "system.h"
#include "key.h"
#include "usart.h"
#include "input.h"


int main()
{
    u8 i;
    u32 indata;
    SysTick_Init(72);  //系统时钟初始
    LED_INIT(); 
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 
    USART1_Init(9600);
    TIM5_CH1_Input_Init(0xffff,71); // //以1M频率计数
    while(1)
    { 
        if((TIM5_CH1_CAPTURE_STA&0x80)) //成功捕获
        {
            indata = TIM5_CH1_CAPTURE_TIMES&0x3f;  //溢出的次数
            indata *=0xffff;   //次数*最大计数值
            indata += TIM5_CH1_CAPTURE_VAL;
            printf("高电平持续时间: %d us\r\n",indata);
            TIM5_CH1_CAPTURE_STA = 0; //清0,为下次作准备
        }
        i++;
        if(i%20==0)
        {
            led1=!led1;
        }
        delay_ms(10);
    }
}

相关文章

  • stm32---输入捕获

    STM32F1 除了基本定时器 TIM6 和 TIM7,其他定时器都具有输入捕 获功能。输入捕获可以对输入的信号的...

  • OC之捕获连接 AVCaptureConnection

    AVCaptureConnection 捕获会话中特定捕获输入对和捕获输出对象之间的连接。 捕获输入 AVCap...

  • 输入捕获

    tim定时器有输入捕获。 ADC也有输入捕获。

  • 二维码扫描

    /** Capture 捕获 输入端Input (绑定输入设备-摄像头) (捕获摄像头画面的数据) 会话Sessi...

  • 五 TextInput

    输入控件; onChangeText 方法,可以实时捕获到输入文字的改变; onSubmitEditing 方法,...

  • iOS---AVCaptureSession

    AVCaptureSession管理捕获活动并协调从输入设备到捕获输出的数据流的对象。 要执行实时捕获,需要实例化...

  • AVFoundation 初探之----自定义系统相机

    AVCaptureSession开启捕获任务,配置定制捕获任务的输入源(多种摄像头),通过AVFoundation...

  • WireShark(二)捕获过滤器

    如何使用捕获过滤器 点击捕获,选项,然后在所选择的捕获过滤器上输入对应的捕获表达式 抓包过滤器 type(类型) ...

  • 进阶学习3-输入输出 / 条件和循环的复用/异常

    总结 输入输出 条件和循环的复用 异常捕获 控制台输入 val = input(str) input输入变量值类型...

  • iOS AVCaptureDevice

    简介 AVCaptureDevice 一种为捕获会话提供输入(例如音频或视频)并提供针对特定于硬件的捕获功能的控件...

网友评论

      本文标题:stm32---输入捕获

      本文链接:https://www.haomeiwen.com/subject/fapndctx.html