1

我正在使用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 的数据表,我注意到两件事:

  1. 引脚 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 回答
0

不要让引脚悬空!未连接的引脚本质上是一个天线,可以拾取 Vss 和 Vdd 范围之外的电压。数据表的第 2.10 节说不要让任何引脚悬空(或者如果你这样做,将它们配置为输出并将它们驱动为低电平。)

如果您想测试您的 A2D,您可以将引脚配置为数字输出(模拟设置仅覆盖数字输入),然后将其驱动为高电平和低电平以进行测试。

于 2013-08-25T21:24:20.743 回答