2017-10-16 116 views
0

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

#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; 
} 
+0

[序列化C中的数据结构]的可能重复(https://stackoverflow.com/questions/371371/serialize-data-structures-in-c) –

+1

@GianlucaGhettini这个问题与序列化无关,但远程地,与*串行通讯*。 – JimmyB

回答

1

我看到改善的一些选项在你的开发:

  • 您从ISR变量写一个样本,并从主回​​路和输出它不断地读取它。相反,您应该只输出一次新的样本(使得串行数据更小,更容易专注于实际内容和采样时间)

  • 在考虑正确的公式之前,您应该验证您的采样机制是否正确。没有关于你的传感器的细节,无论如何,这里没有人能够判断你的配方。

  • 相反采样可以使用处理器的输入捕捉电路(由于更准确,更少的抖动中断等待时间)

  • 自由运行计数器代替复位计数器寄存器为零,你可以减去两个的彼此连续样本(由于较少样本抖动中断等待时间)

  • 代替从切换标志推断边缘的,询问硬件绕销或边沿触发中断的状态(或捕获)

相关问题