我正在使用PIC32MX534F064L(数据表),并尝试读取它的几个模拟引脚(标记为 AN0 到 AN15)。
这些引脚都没有连接到任何东西,我希望读取的值为零。相反,在 AN0 到 AN5 上,我读取了 650 到 900 之间的值。仅从其余部分(AN6 到 AN15)我得到的值为零。
当每个引脚连接到源时,它们会正确报告。每个引脚(AN0 到 AN15)将报告 0 表示 0.0V,报告 1023 表示 3.3V。
我试过成对地对这些值进行采样,并且每个都是单独的。无论是一起采样还是分开采样,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 的数据表,我注意到两件事:
引脚 AN0 到 AN5,错误报告非零值的引脚也是 CNx 引脚。这些引脚是“更改通知”引脚,用于在引脚上的值发生变化时引发中断。
可以在所有 CNx 引脚上启用“弱上拉”。
所以我尝试通过使用这一行来禁用“弱上拉”:
mCNClose();
这会禁用所有 CNx 引脚及其上拉电阻。可悲的是,这没有帮助。当我检查 CN-pull-up-register (CNPUE
我还能尝试什么?我在我的代码中做错了吗?