1

PIC32MX534F064L (データシート)を使用しており、そのアナログ ピン (AN0 ~ AN15 とマーク) のいくつかを読み取ろうとしています。

これらのピンはどれも接続されていないため、読み取り値はゼロであると予想されます。代わりに、AN0 から AN5 で 650 から 900 の間の値を読み取ります。残り (AN6 から AN15) からのみ、ゼロの値を取得します。

各ピンがソースに接続されている場合、正しくレポートされます。AN0 ~ AN15 の各ピンは、0.0V の場合は 0、3.3V の場合は 1023 を報告します。

値をペアで、それぞれ個別にサンプリングしてみました。一緒にサンプリングしても別々にサンプリングしても、AN0 はゼロ以外の値 (通常は約 700 ~ 800) を報告し、AN13 は 0 を報告します。

最初に考えたのは、どういうわけか ADC を適切にセットアップできなかったということでした。これが私のコードです:

#include <stdio.h>
#include <plib.h>

unsigned int an0;
unsigned int offset;
char buffer[100];

int main(void)
{
  SYSTEMConfigPerformance(72000000L);
  CloseADC10();

  #define ADC_CONFIG1 ADC_MODULE_ON | ADC_FORMAT_INTG | \
                      ADC_CLK_AUTO | ADC_AUTO_SAMPLING_ON
  #define ADC_CONFIG2 ADC_VREF_AVDD_AVSS | ADC_OFFSET_CAL_DISABLE | \
                      ADC_SCAN_OFF | ADC_SAMPLES_PER_INT_2 | \
                      ADC_ALT_BUF_ON | ADC_ALT_INPUT_ON
  #define ADC_CONFIG3 ADC_CONV_CLK_INTERNAL_RC | ADC_SAMPLE_TIME_15
  #define ADC_CONFIGSCAN SKIP_SCAN_ALL
  #define ADC_CONFIGPORT ENABLE_AN0_ANA

  SetChanADC10( ADC_CH0_NEG_SAMPLEA_NVREF | ADC_CH0_POS_SAMPLEA_AN0 );
  OpenADC10( ADC_CONFIG1, ADC_CONFIG2, ADC_CONFIG3, \
             ADC_CONFIGPORT, ADC_CONFIGSCAN );
  EnableADC10();

  while ( ! mAD1GetIntFlag() ) { }

  while (1)
  {
    offset = 8 * ((~ReadActiveBufferADC10() & 0x01));
    an0 =  ReadADC10(offset);
    sprintf(buffer, "AN0 = %u", an0);
  }

  return 0;
}

PIC のデータシートを調べたところ、次の 2 つの点に気付きました。

  1. 0 以外の値を誤って報告するピン AN0 ~ AN5 も CNx ピンです。これらのピンは「変更通知」ピンであり、ピンの値が変更されたときに割り込みを発生させることを目的としています。

  2. すべての CNx ピンで有効にできる「弱いプルアップ」があります。

そこで、次の行を使用して「弱いプルアップ」を無効にしようとしました。

mCNClose();

これにより、すべての CNx ピンとそのプルアップが無効になります。残念ながら、これは役に立ちませんでした。そして、CN-pull-up-register(CNPUE)の値を確認したところ、

他に何を試すことができますか?コードで何か間違ったことをしていますか?

4

3 に答える 3

2

うーん、あなたの予想は間違っています!

ソースの最小入力抵抗は、データシートを確認して、わずか数キロオームにする必要があります。ADC ピンがフローティング (接続されていない) 場合、内部寄生電流の予測できない値により、測定値が 0 よりも大きくなります。ADC のサンプル コンデンサの容量はわずか pF しかないため、フローティング ピンは外部 EM からも広い電圧範囲で発振する可能性があることに注意してください。 (電磁) 影響。したがって、ADC ピンの電圧をプルダウンするために、少なくとも 1M の抵抗を接続します。プルダウン抵抗の抵抗値は、ADC のサンプル時間に依存します。ADC のサンプル時間が短い場合は、抵抗のプルダウン値を減らします。

編集:データシートの 214 ページのパラメーター AD17 を確認してください:アナログ電圧源の推奨インピーダンスは 5 KOhms です。 そしてAD15はその最大だと言います。ADC 入力ピンの漏れ電流は +/-0.61 uAです。

于 2011-10-04T10:02:40.323 に答える
1

何も接続されていない場合、入力は高インピーダンスになるため、おそらく単なるノイズです。実験として入力を接地 (0V に接続) してみてください - 値は 0 に近くなるはずです。何も接続されていないときに入力をゼロにする必要がある場合は、各入力にプルダウン抵抗を接続します (入力と 0V の間)。インピーダンスを下げるには、10k オームの値で十分です。

于 2011-10-04T09:55:20.097 に答える