搜索
bottom↓
回复: 4

STM32定时器输入捕获测量信号延迟,求教!

[复制链接]

出0入0汤圆

发表于 2013-5-9 14:29:15 | 显示全部楼层 |阅读模式
最近想使用STM32F103的定时器捕获功能测量两个方波输入信号的延迟,使用TIM2的ch1和ch2,都设置为上升沿捕获,使能定时器输入捕获中断,在定时器当中处理延迟测量。定时器初始化部分代码如下:

static void TIM2_NVIC_Config(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
   
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);                                                                                                         
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;          
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;       
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

static void TIM2_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_ICInitTypeDef  TIM_ICInitStructure;
       
        // TIM2 clock enable
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    // GPIOA clock enable
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);       
       
        // TIM2 channel1 pin(PA.00) configuration
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        // CH1 configuration: Input Capture mode, Rising Edge
        TIM_ICInitStructure.TIM_Channel = TIM_Channel_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 channel2 pin(PA.01) configuration
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        // CH2 configuration: Input Capture mode, Rising Edge
        TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
        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 enable counter */
        TIM_Cmd(TIM2, ENABLE);

        /* Enable the CC1/CC2 Interrupt Request */
        TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);
        TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE);
}

void Timer_Init(void)
{
        TIM2_NVIC_Config();
        TIM2_Config();
}

TIM2中断处理部分代码如下:
void TIM2_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM2, TIM_IT_CC1) == SET)
        {
                /* Clear TIM2 Capture compare interrupt pending bit */
                TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);

                if(CaptureNumber == 0)
                {
                        /* Get the Input Capture value */
                        IC3ReadValue1 = TIM_GetCapture2(TIM2);
                        CaptureNumber = 1;
                }
        }
       
        if(TIM_GetITStatus(TIM2, TIM_IT_CC2) == SET)
        {
                /* Clear TIM2 Capture compare interrupt pending bit */
                TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);

                if(CaptureNumber == 1)   
                {
                        /* Get the Input Capture value */
                        IC3ReadValue2 = TIM_GetCapture2(TIM2);
                        CaptureNumber = 0;

                        /* Capture computation */
                        if (IC3ReadValue2 > IC3ReadValue1)
                        {
                                Capture = (IC3ReadValue2 - IC3ReadValue1);
                        }
                        else
                        {
                                Capture = ((0xFFFF - IC3ReadValue1) + IC3ReadValue2);
                        }
                }
        }
}

定时器驱动时钟为72MHz,外部输入两路信号均为3KHz,两路信号相位差为70deg,但目前得到的Capture始终为24000,不知是和缘故。是否还需要其他什么配置才能够保证用同一个计数器的两个通道捕获?求教。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2013-5-9 17:30:42 来自手机 | 显示全部楼层
自己顶下,下午仔细看了定时器,又看看代码!读取捕获寄存器输出那句有问题!

出0入0汤圆

发表于 2013-5-11 15:59:11 | 显示全部楼层
个人想法:利用2个外部中断加TIM定时解决吧,第一个上升沿开TIM,第二个上升沿中断关TIM

出0入0汤圆

发表于 2013-7-7 12:04:51 | 显示全部楼层
jr9910 发表于 2013-5-9 17:30
自己顶下,下午仔细看了定时器,又看看代码!读取捕获寄存器输出那句有问题! ...

到底什么问题?求解答啊

出0入0汤圆

发表于 2020-6-3 11:29:06 | 显示全部楼层
我使用输入捕获,有时候会捕获的信号不完整,比如需要捕获一段8位长度的信号,最终捕获的信号没有到8位。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 04:34

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表