2015-12-09 114 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