2015-12-09 93 views
0

我正在嘗試使用ATmega16構建自動植物灌溉系統。邏輯是,傳感器將在PA0上給出一個模擬輸入,它將與預設值進行比較以打開/關閉水泵。atmega16輸出錯誤

以下是我們使用的代碼片段:

#include<avr/io.h> 
int adc(void); 
void pump(void); 
int adc_value; 
int main(void) 
{ 
    DDRC=0x01;       //Defining PC0 as output 
    ADCSRA=0x87;     //Setting the mode of operation 
    ADMUX=0x00;      //Selection of channel and bit alignment 
    while(1) 
    { 
    adc_value=adc();    //reading moisture level 
    pump();        //Pump activator routine 
    } 
    return 0; 
} 

int adc(void) 
{ 
    int lower_bits,higher_bits,result; 
    ADCSRA |= (1 << ADSC)|(1 << ADIF); //Turn on conversion and clear flag 
    while(ADCSRA & (1 << ADIF) == 0); //wait for flag 
    lower_bits=ADCL; 
    higher_bits=ADCH; 
    result=lower_bits|(higher_bits<<8);   //Accessing converted value by shifting 
    return result; 
} 

void pump(void) 
{ 
    if(adc_value>=700)        //Pump ON trigger point 
    { 
    PORTC|=(1<<0); 
    } 
    else if(adc_value<=600)      //Pump Off trigger point 
    { 
    PORTC&=~(1<<0); 
    } 
} 

這有什麼錯的代碼?因爲在燃燒之後,我從模擬傳感器輸入端得到低溼度**(0.15 **)溼土和高電壓(4.84)乾燥土,這是可以的......但問題是,我總是獲得電壓像0.7(有時是0.15)在PC0在這兩種情況下(我用萬用表測量這個)。在PC0處,乾土和溼土的數值沒有變化..在這種情況下,實際問題在哪裏?電路設計或代碼中有什麼錯誤嗎?

回答

0

您是否將AREF連接至5V?來自其他類似帖子的接線原理圖未顯示。

作爲一個附註,你可以考慮使用ADLAR,左對齊。那麼你只需要看一個字節,因爲你似乎並不關心10位精度。

+0

我還沒有將AREF連接到5V。它是強制性的嗎?還有一件事,我還沒有理解這句話:「作爲附註,你可以考慮使用ADLAR,左對齊,然後你只需要看一個字節,因爲你似乎不關心10位精度無論如何「 - 請你澄清一下嗎? @UncleO – user3114849

+0

@ user3114849我詢問AREF的原因是,您已經在ADMUX寄存器中選擇了該選項,REFS1 = REFS0 = 0。如果您想使用AVCC,那麼您需要爲這些位選擇「01」,並將一個電容器連接到AREF。 – UncleO

+0

@ user3114849將ADLAR位置1,左對齊ADCH和ADCL中的10位ADC結果。如果您不關心您是否具有8位或10位精度,則可以將ADLAR設置爲ADMUX,並只讀ADCH以獲得0至255的值,其中255是V達到AVCC(或AREF或2.56 V,取決於在ADMUX中選擇哪個比較源)。然後你可以測試'ADCH> = 175'和'ADCH <= 150',忽略ADCL中的2個LSB。 – UncleO