超声波测距传感器(HCSR-04)与avr ATmega-32接口?

时间:2015-03-06 10:18:29

标签: c sensor avr atmega

我正在使用带有AVR ATmega32A的超声波测距/声纳传感器(HCSR-04)。我已经编写了代码,了解了传感器如何工作的概念,但是虽然程序编译正确,但设备并没有给出任何结果。

液晶显示屏显示超出范围"这意味着PINC1并不高。我的方法是检查一个位是高还是低正确?我应该使用bit_is_set(PORTC,PINC1)功能吗?我使用的默认频率为1 MHz。 PINC0连接到trig,PINC1是回声输入。这是代码:

#include<avr/io.h>
#include<util/delay.h>
#include"lcd.h"

int main(void){
    ini_lcd();
    TCCR1B|=1<<CS10;
    DDRC|=1<<PINC0;
    int a=0,b=0;
    while(1){
        TCNT1=0;
        PORTC|=1<<PINC0;
        while(TCNT1<100);
        PORTC&=~(1<<PINC0);

        TCNT1=0;
        while(!(PORTC&(1<<PINC1))) && TCNT1<30000) ;  // checking if echo has become high  and not exceeding the time for max range i.e 5 m
        ///send_string("out");
        b=TCNT1;
        if(b<30000){
            TCNT1=0;
            while(PORTC&(1<<PINC1));    // waiting until the echo become low again
            a=TCNT1;
            go_to_pos(1,5);
            send_int(a/58);
        } else {
            go_to_pos(1,5);
            send_string("out of range");
        }
        _delay_ms(20);
    }
}

2 个答案:

答案 0 :(得分:1)

我在代码中看到的重复几次的主要问题是你是如何尝试读取输入I / O行的,例如:

while(PORTC&(1<<PINC1));    // waiting until the echo become low again

应该成为:

while(PINC&(1<<PINC1));    // waiting until the echo become low again

PORT寄存器是输出锁存器,将包含写入它们的最后一个值或上电默认值为零。您需要使用PIN寄存器来读取I / O引脚的当前状态。

答案 1 :(得分:0)

当检查Echo引脚时,你需要在TCNT1 = 300000而不是30000时进行滴答计数,因为你的时钟是1000000 HZ然后每个0.1us TCNT1增加1所以300000滴答你得到30000 us(等待时间)等于回波在5米处返回所需的时间(HCSR04的最大范围)