OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3828|回复: 0

测量传感器接受时间差出现很大误差

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2021-1-15
在线时间
3 小时
发表于 2021-1-15 11:30:44 | 显示全部楼层 |阅读模式
想用通过测出声音传感器接收信号的时间差来定位声源,但是用stm32定时器测出来的值总是不准确,这是为啥。将5个声音传感器接到5个外部中断,然后每次进入中断判断是否为第一次进入,是则将定时器清0,否则读取定时器 值,且每次进入中断后我都把那条中断线关了,防止多次进入同一个中断,但是最终结果总是出现问题。求大佬指点,我也就不改了,然后主函数中我又把中断打开了。中断代码如下:
#include "exti.h"
#include "lcd.h"
#include  "usart.h"
#include "key.h"
#include "delay.h"
extern volatile int flag;
extern volatile long int time[5];
extern volatile int sensor[5];
extern volatile int i;
void EXTIX_Init(void){
        NVIC_InitTypeDef         NVIC_InitStructure;
        EXTI_InitTypeDef        EXTI_InitStructure;
        KEY_Init();
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
       
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0);
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC,EXTI_PinSource1);
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOD,EXTI_PinSource2);
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource3);
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB,EXTI_PinSource4);

        EXTI_InitStructure.EXTI_Line=EXTI_Line0|EXTI_Line1|EXTI_Line2|EXTI_Line3|EXTI_Line4;
        EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;                               
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;               
        EXTI_InitStructure.EXTI_LineCmd=ENABLE;
        EXTI_Init(&EXTI_InitStructure);                                                                       
       
        NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;                                                                       
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x00;                       
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02;                                                       
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;                                                                               
        NVIC_Init(&NVIC_InitStructure);                                                                                                                                       
       
       
        NVIC_InitStructure.NVIC_IRQChannel=EXTI1_IRQn;                                                               
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01;                       
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02;                                                       
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;                                                                               
        NVIC_Init(&NVIC_InitStructure);                                                                                                                                       
       
        NVIC_InitStructure.NVIC_IRQChannel=EXTI2_IRQn;                                                               
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02;                       
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02;                                               
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;                                                                               
        NVIC_Init(&NVIC_InitStructure);                                                                                                                                       
       
       

        NVIC_InitStructure.NVIC_IRQChannel=EXTI3_IRQn;                                                               
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x03;                       
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02;                                                       
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;                                                                               
        NVIC_Init(&NVIC_InitStructure);                                                                                                                                       
       
        NVIC_InitStructure.NVIC_IRQChannel=EXTI4_IRQn;                                                               
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x04;                       
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02;                                                       
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;                                                                               
        NVIC_Init(&NVIC_InitStructure);                                                                                                                                       
}

void EXTI0_IRQHandler(void){
                EXTI->IMR&=~(EXTI_Line0);                                                                               
        if(flag==0){                                                                                                                                       
                                TIM_Cmd(TIM3,ENABLE);                                                                                
                                TIM_SetCounter(TIM3,0);
                                flag=1;                                                                                                                                        
                }
                time[i]=TIM_GetCounter(TIM3);                                                               
                sensor[i]=1;                                                                                                                         
                i++;                                                                                                                                                 
                EXTI_ClearITPendingBit(EXTI_Line0);                                       
}
void EXTI1_IRQHandler(void){
                        EXTI->IMR&=~(EXTI_Line1);                                                                               
        if(flag==0){                                                                                                                                       
                                TIM_Cmd(TIM3,ENABLE);                                                                        
                                TIM_SetCounter(TIM3,0);
                                flag=1;                                                                                                                                                 
                }
                time[i]=TIM_GetCounter(TIM3);                                                       
                sensor[i]=2;                                                                                                                         
                i++;                                                                                                                                          
                EXTI_ClearITPendingBit(EXTI_Line1);                               
}
void EXTI2_IRQHandler(void){
                        EXTI->IMR&=~(EXTI_Line2);                                                                               
        if(flag==0){                                                                                                                                       
                                TIM_Cmd(TIM3,ENABLE);                                                                        
                                TIM_SetCounter(TIM3,0);
                                flag=1;                                                                                                                                                 
                }
                                time[i]=TIM_GetCounter(TIM3);                                                       
                                sensor[i]=3;                                                                                                               
                                i++;                                                                                                               
                                EXTI_ClearITPendingBit(EXTI_Line2);                                       
}
void EXTI3_IRQHandler(void){
                EXTI->IMR&=~(EXTI_Line3);                                                                               
        if(flag==0){                                                                                                                               
                                TIM_Cmd(TIM3,ENABLE);                                                                                
                                TIM_SetCounter(TIM3,0);
                                flag=1;                                                                                                                                                 
                }
                                time[i]=TIM_GetCounter(TIM3);                                                               
                                sensor[i]=4;                                                                                       
                                i++;                                                                                                               
                                EXTI_ClearITPendingBit(EXTI_Line3);                                       
}
void EXTI4_IRQHandler(void){
                        EXTI->IMR&=~(EXTI_Line4);                                                                               
        if(flag==0){                                                                                                                                       
                                TIM_Cmd(TIM3,ENABLE);                                                                        
                                TIM_SetCounter(TIM3,0);
                                flag=1;                                                                                                                                       
                }
                                time[i]=TIM_GetCounter(TIM3);                                                               
                                sensor[i]=5;                                                                                                               
                                i++;                                                                                                                                                         
                                EXTI_ClearITPendingBit(EXTI_Line4);                                       
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-3-1 01:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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