我正在尝试使用ATmega16构建一个自动植物浇水系统。逻辑是,传感器将在PA0处给出模拟输入,将其与预设值进行比较以打开/关闭水泵。
以下是我们使用的代码片段:
#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),这是好的......但问题是,我总是< / strong>在两种情况下在PC0获得 0.7 (有时像0.15)的电压(我使用万用表进行测量)。 PC0的干湿土壤值没有变化..在这种情况下,实际问题是什么?电路设计或代码中有什么问题吗?
答案 0 :(得分:0)
您是否已将AREF连接到5V?您其他类似帖子的接线示意图并未显示。
作为旁注,您可以考虑使用ADLAR,左对齐。那么你只需看一个字节,因为你似乎并不关心10位精度。