1

我正在尝试使用 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<<6);              //Turning on conversion
   while(ADIF==0);
   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);
   }
 }

代码有什么问题吗?因为在燃烧它之后,我从模拟传感器输入得到湿土壤的低电压和干土壤的高电压,这没问题……但问题是,在 borh 情况下,我总是在 PC0 处得到高电压……没有变化在干湿土壤的值中..在这种情况下,实际问题在哪里..电路设计或代码有什么问题吗?还有一件事,谁能告诉我测量我从 PC0 获得的输出值的正确方法,这反过来又打开/关闭泵?

4

1 回答 1

1

在转换开始之前您没有清除ADIF标志。在第一次通过后,它将始终读取 1。添加一行来清除标志(通过将 1 写入标志位。是的,写入 1 使其变为 0。它不是常规寄存器)。

此外,您没有正确读取标志。ADIF是一个字节中的一个位,因此您需要使用位掩码读取该字节。(您实际上是在测试 is 2==0ADIF定义为 2。)

int adc(void)
 {
   int lower_bits,higher_bits,result; 

   ADCSRA |= (1 << ADIF);  // <<<<<< Add this to clear flag

   ADCSRA |= (1 << ADSC);  //ADCSRA|=(1<<6);  //Turning on conversion

   while(ADCSRA & (1 << ADIF) == 0);  //while(ADIF==0); <<<<<< Change this

   lower_bits=ADCL;
   higher_bits=ADCH;
   result=lower_bits|(higher_bits<<8);         //Accessing converted value by shifting
   return result;
 }

实际上,您已经在不经意间清除了标志。如果它是 1,则ADCSRA在该位置有一个 1 ADIF,并且它被再次写入。但最好还是更明确地说明你的意思。同样,您可以将这两个操作组合成一个作业。

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;
 }

我无法确认您的其余代码和接线是否正确,因为我没有看过,这是第一个明显的问题。修复它,如果您仍有问题,请更新您的问题。

于 2015-12-07T21:21:47.693 回答