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

コードに何か問題がありますか? それを燃やした後、アナログセンサー入力から湿った土壌には低電圧が、乾燥した土壌には高電圧が得られますが、問題は、ボーリングの場合、PC0で常に高電圧が得られることです..変化はありません乾いた土と湿った土の値..そのような場合、実際の問題はどこにありますか..回路設計またはコードに何か問題がありますか? もう1つ、ポンプのオン/オフを切り替えているPC0から取得している出力値を測定する適切な方法を教えてください。

4

1 に答える 1

1

ADIF変換が開始される前にフラグをクリアしません。最初の通過後は常に 1 になります。フラグをクリアする行を追加します (フラグ ビットに 1 を書き込むことによって。はい、1 を書き込むと 0 になります。通常のレジスタではありません)。

また、フラグを正しく読み取っていません。ADIFはバイト内のビットであるため、ビットマスクを使用してバイトを読み取る必要があります。(実際にテストしていたのは であり2==0ADIFis は 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、そのADIF位置に 1 があり、再度書き込まれます。しかし、あなたが何をしようとしているのかをもっと明確にしたほうがよいでしょう。同様に、2 つのアクションを 1 つの割り当てに結合することもできます。

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 に答える