超声波传感器与AVR连接

时间:2017-10-16 19:39:19

标签: c microcontroller sensor avr

我正在研究一个项目的一部分,用超声波传感器进行读取并通过串行通信发送,我编写代码并提供随机读取,有时给出0作为读数,是我使用的公式为了找到正确的距离!?,或者还有另一个公式,我使用内部8MHz时钟的Atmega32,有人可以帮助我并知道我的代码有什么问题!?。

#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

void inti_serial();

static volatile int pulse = 0;
static volatile int change = 0;

int main(void)
{ 

/* Replace with your application code */
inti_serial();

MCUCR |= (1 << ISC00); //Any logical change on INT0
GICR |= (1 << INT0); //Enable INT0

TCCR1A=0;
sei();

while (1) 
{
PORTC |= (1<<0);
_delay_us(15);
PORTC &= ~(1<<0);
while(!(UCSRA & (1<<UDRE)));
UDR = ((pulse/2)*1*(1/F_CPU)*343) ;
_delay_ms(100);
}
}

ISR(INT0_vect){


if (change==1)//when logic from HIGH to LOW

{

    TCCR1B=0;//disabling counter

    pulse=TCNT1;//count memory is updated to integer

    TCNT1=0;//resetting the counter memory

    change=0;

}

if (change==0)//when logic change from LOW to HIGH

{

    TCCR1B|=(1<<CS10);//enabling counter

    change=1;

}
}

void inti_serial()
{
 UCSRB |= (1<<TXEN);
 UCSRC |= (1<<UCSZ0) | (1<<UCSZ1) | (1<<URSEL);
 UBRRL = 0x33;
}

1 个答案:

答案 0 :(得分:1)

我看到了一些改进开发的选项:

  • 您正在将一个样本从ISR写入变量,并从主循环中连续读取并输出它。相反,您应该只输出一次新样本(使串行数据更小,更容易专注于实际内容和采样时间)

  • 在考虑正确的公式之前,您应该验证您的采样机制是否正确。如果没有关于传感器的详细信息,无论如何都没有人可以判断您的配方。

  • 您可以使用处理器的输入捕获电路(由于中断延迟而更准确,更少抖动),而不是对自由运行的计数器进行采样

  • 不是将计数器寄存器复位为零,而是可以相互减去两个连续的采样(由于中断延迟而减少采样抖动)

  • 不是从切换标志中推断出边缘,而是询问硬件有关引脚状态或触发中断(或捕获)的边缘