在atmega16中输出错误

时间:2015-12-09 19:51:34

标签: microcontroller avr atmega atmel

我正在尝试使用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的干湿土壤值没有变化..在这种情况下,实际问题是什么?电路设计或代码中有什么问题吗?

1 个答案:

答案 0 :(得分:0)

您是否已将AREF连接到5V?您其他类似帖子的接线示意图并未显示。

作为旁注,您可以考虑使用ADLAR,左对齐。那么你只需看一个字节,因为你似乎并不关心10位精度。