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處,乾土和溼土的數值沒有變化..在這種情況下,實際問題在哪裏?電路設計或代碼中有什麼錯誤嗎?
我還沒有將AREF連接到5V。它是強制性的嗎?還有一件事,我還沒有理解這句話:「作爲附註,你可以考慮使用ADLAR,左對齊,然後你只需要看一個字節,因爲你似乎不關心10位精度無論如何「 - 請你澄清一下嗎? @UncleO – user3114849
@ user3114849我詢問AREF的原因是,您已經在ADMUX寄存器中選擇了該選項,REFS1 = REFS0 = 0。如果您想使用AVCC,那麼您需要爲這些位選擇「01」,並將一個電容器連接到AREF。 – UncleO
@ 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