2017-10-16 96 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變量寫一個樣本,並從主回​​路和輸出它不斷地讀取它。相反,您應該只輸出一次新的樣本(使得串行數據更小,更容易專注於實際內容和採樣時間)

  • 在考慮正確的公式之前,您應該驗證您的採樣機制是否正確。沒有關於你的傳感器的細節,無論如何,這裏沒有人能夠判斷你的配方。

  • 相反採樣可以使用處理器的輸入捕捉電路(由於更準確,更少的抖動中斷等待時間)

  • 自由運行計數器代替復位計數器寄存器爲零,你可以減去兩個的彼此連續樣本(由於較少樣本抖動中斷等待時間)

  • 代替從切換標誌推斷邊緣的,詢問硬件繞銷或邊沿觸發中斷的狀態(或捕獲)