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