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 つの点に気付きました。
0 以外の値を誤って報告するピン AN0 ~ AN5 も CNx ピンです。これらのピンは「変更通知」ピンであり、ピンの値が変更されたときに割り込みを発生させることを目的としています。
すべての CNx ピンで有効にできる「弱いプルアップ」があります。
そこで、次の行を使用して「弱いプルアップ」を無効にしようとしました。
mCNClose();
これにより、すべての CNx ピンとそのプルアップが無効になります。残念ながら、これは役に立ちませんでした。そして、CN-pull-up-register(CNPUE)の値を確認したところ、
他に何を試すことができますか?コードで何か間違ったことをしていますか?