HC-SR04调试

(1)超声波HC-SR04测距模块简介

 HC-SR04 超声波测距模块可提供 2cm-400cm 的非接触式距离感测功能, 测距精度可达高到 3mm;模块包括超声波发射器、接收器与控制电路。 

基本工作原理: 
(1)采用 IO 口 TRIG 触发测距,给至少 10us 的高电平信号; 

(2)模块自动发送  8 个 40khz 的方波,自动检测是否有信号返回; 

(3)有信号返回,通过  IO 口 ECHO 输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2; 

HC-SR04调试_第1张图片


(2)调试HC-SR04方法:

         1、通过外部中断。将外部中断的引脚(atmage16的PD2和PD3分别是INT0,、INT1)与HC-SR04的Echo(回响信号输出)接口相连接。利用定时器测出Echo输出的高电平所用的时间。其中通过定时器测量高电平时间,可以在外部中断处理程序中通过控制定时器溢出中断使能来控制计数时间,当外部中断引脚出现电平变化时,使能定时器溢出中断,从而定时器开始计数;当再次出现电平变化时,断开定时器溢出中断,这样可以得到输出高电平的时间;还可以设置一个全局变量time_count,它在定时器中断处理程序中用来计算定时器中断次数,从而可以求得时间。可以在外部中断处理程序控制time_count这个全局变量,当外部中断引脚出现电平变化时,将全局变量time_count置零,一直到下一次电平变化时取time_count的值,就可计算出输出高电平的时间。

         2、不使用外部中断的方法。就像前面一篇博文 HC-SR04超声波测距代码就是用的这种方法。

(3)调试过程中出现的一些现象的原因

        这是我在调试过程中为测试外部中断代码运行的一段代码:

ISR(INT0_vect)
{
    flag ++;
    if(flag == 1)
    {
        PORTB = 0x0f;
        _delay_ms(1);
    }
    else
    {
        flag = 0;
        if(flag == 0)
        {
            PORTB = 0xf0;
            _delay_ms(1);
        }
    }


}

flag是全局变量在开始的时候初始化为0,当程序运行到外部中断0的处理程序时flag = 1,然后进入下面的if条件语句中执行PORTB = 0x0f;(PORTB 引脚是流水灯,目的就是为了要验证此段程序执行);当第二次进入此处理程序时,会进入else语句中,执行里面的语句。这里的现象:PORTB上灯亮度变化比一样。有时候PORTB = 0x0f控制的灯亮些,有时候PORTB = 0xf0控制的灯亮些,有时候却差不多。

经过几个小时的琢磨,有反复想了程序的运行过程后得到一种解释:此超声波探头测试的距离有长有短,则Echo上输出的高电平也会有长有短。所述现象与这有关。当距离测试较短的时候,主程序的延时还没有结束,此时PORTB = 0xf0会一直亮。当测试长距离的时候,当电平第一次变化时PORTB = 0x0f,由于距离较长,到第二次电平变化时的时间也会较长,在这段时间中PORTB = 0x0f一直亮。由于主函数中的延时一定,当第一次电平变化到第二次电平变化的时间变长后,PORTB = 0xf0亮的时间就会变短。这就是上面现象的原因。




你可能感兴趣的:(嵌入式学习)