OpenEdv-开源电子网

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

超声波脉宽测距可用,检测其它脉宽就可用了

[复制链接]

14

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
242
金钱
242
注册时间
2015-12-28
在线时间
51 小时
发表于 2016-1-29 18:09:20 | 显示全部楼层 |阅读模式
5金钱
新手刚玩stm32,修改别人的例程然后写了一个超声波测距的程序,通过中断来记录脉宽的时间进而计算出距离。
主函数
int main(void)
{         float Distance[3],d;       
        int flag_d=0,i=0;
        Stm32_Clock_Init(9);        //系统时钟
        delay_init(72);                            //延时
  Ultran_Init();                                //GPIO初始化ˉ
        TIM3_Int_Init(9,7199);  //10/(72 000 000/7200) = 1/1 000 = 1ms
        EXTIX_Init();
  while(1)
        { Trig_Sent();
        delay_ms(10);
                if(flag)
                {        Distance[i++]=170*((Count_Times*10+(TIM3->CNT+1)*1.0)/10000);
                        Count_Times=0;
                        TIM3->CNT=0;
                        if(i==3)
                        {     i=0;
                                flag_d=1;
                                d=(Distance[0]+Distance[1]+Distance[2])/3;
                                if(((d-Distance[0]<=0.05)||(d-Distance[0]>=-0.05))&&
                                        ((d-Distance[1]<=0.05)||(d-Distance[1]>=-0.05))&&
                                        ((d-Distance[2]<=0.05)||(d-Distance[2]>=-0.05)));                                               
                                else                                                                //三次数据相差5cm则重新采样
                                        flag_d=0;
                        }
                }
                if(d<0.1&&flag_d)
                {
                        PBout(5)=1;       
                        delay_ms(60);
                        d= 1;
                        flag_d=0;
                 }          
                else if(d<0.2&&flag_d)
                {
                        PEout(5)=1;   
                        delay_ms(60);
                        d= 1;
                        flag_d=0;
                }
                else if(d<0.3&&flag_d)
                {
                        PBout(5)=1;       
                        PEout(5)=1;   
                        delay_ms(60);
                        d= 1;
                        flag_d=0;
                }
                PBout(5)=0;
                PEout(5)=0;
        }       
}



void Trig_Sent(void)
{
                TRIG_Send=1;
                delay_us(20);
                TRIG_Send=0;
}

这个程序是完全可以测量超声波的。
但是我测量平衡传感器的时候就出问题了,测量平衡传感器也是一个脉宽信号,5ms高电平,10ms 的周期。高电平时4v,接上管脚就是3.3v了。
问题就出在中断那里,正常情况下(也就是超声波测距时候)是上升沿一次下降沿一次,但是测量平衡传感器就乱来了。
这是测量平衡时候的主函数
int main(void)
{                       
  float Distance[3],d;       
        volatile int time_cnt=0;
        Stm32_Clock_Init(9);
        delay_init(72);                           
  Ultran_Init();
        TIM3_Int_Init(9,7199);  //10/(72 000 000/7200) = 1/1 000 = 1ms
        EXTIX_Init();
        while(1)
        {       
              if(flag){                     //下降沿中断的标志位
                time_cnt=        Time_cnt;  //Time_cnt为计算脉宽的时间,在中断中计算(先不管那么多了)
                }
        }

中断函数
void EXTI0_IRQHandler(void)
{               
        if(GPIOA->IDR&1)                  //接的是管脚PA0
        {                         
                TIM3_Start();       
                flag=0;
        }
        if(!(GPIOA->IDR&1))
        {        //PEout(5)=1;
                TIM3_Stop();
                flag=1;
        }
        EXTI_ClearITPendingBit(EXTI_Line0);
}
大神帮帮看看。

gpio初始化

gpio初始化

中断函数

中断函数



中断初始化

中断初始化

定时器初始化

定时器初始化

超声波 - 中断计数.rar

1.61 MB, 下载次数: 276

超声波测距

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

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 07:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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