amobbs.com 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
回复: 4

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

[复制链接]
(226246089)

打赏出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,不知是和缘故。是否还需要其他什么配置才能够保证用同一个计数器的两个通道捕获?求教。
(226235202)

打赏出0元收入0元

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

打赏出0元收入0元

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

打赏出0元收入0元

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

到底什么问题?求解答啊
(3172098)

打赏出0元收入0元

发表于 2020-6-3 11:29:06 | 显示全部楼层
我使用输入捕获,有时候会捕获的信号不完整,比如需要捕获一段8位长度的信号,最终捕获的信号没有到8位。
回帖提示: 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号-1 )

GMT+8, 2020-7-10 04:37

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

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