Почему некоторые аналоговые контакты на моем PIC32 сообщают об обнулении при отключении, а другие - о ненулевом? - PullRequest
1 голос
/ 04 октября 2011

Я использую PIC32MX534F064L ( таблица данных ) и пытаюсь прочитать несколько аналоговых выводов (помеченных от AN0 до AN15).

Поскольку ни один из этих выводов не подключен ни к чему, я ожидаю прочитать значение ноль. Вместо этого от AN0 до AN5 я читаю значения от 650 до 900. Только из остальных (от AN6 до AN15) я получаю значение ноль.

Когда каждый из выводов подключен к источнику, они сообщают правильно. Каждый из выводов с AN0 по AN15 сообщит 0 для 0,0 В и 1023 для 3,3 В.

Я пробовал выбирать значения в парах, и каждое в отдельности. Независимо от того, взяты ли образцы вместе, AN0 сообщит ненулевые значения (обычно около 700-800), а AN13 сообщит 0.

Моей первой мыслью было, что я как-то не смог правильно настроить АЦП. Вот мой код:

#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 (CNPUE

Что еще я могу попробовать? Я что-то не так делаю в своем коде?

Ответы [ 3 ]

1 голос
/ 04 октября 2011

Что ж, ваши ожидания неверны!

Минимальное входное сопротивление источника должно составлять всего несколько килоОм.Если контакты АЦП плавают (не подключены), непредсказуемое значение внутреннего паразитного тока приведет к тому, что измеренное значение будет больше 0. Помните, что конденсатор образца АЦП имеет только небольшую пФ емкость, поэтому плавающие контакты могут колебаться в широком диапазоне напряжений также от внешнего ЭМ(электромагнитные) воздействия.Таким образом, подключите не менее 1М резисторов для понижения напряжения на выводе АЦП, сопротивление резистора для опускания зависит от времени выборки АЦП.Если время дискретизации АЦП короткое, уменьшите значение сопротивления резистора.

РЕДАКТИРОВАТЬ: Проверьте таблицу , стр. 214, параметр AD17: Рекомендуемое сопротивление аналогового источника напряжения составляет 5 кОм. и AD15 говорят, что это макс.Ток утечки на входных контактах АЦП может составлять + / - 0,61 мкА .

1 голос
/ 04 октября 2011

Вероятно, это просто шум, поскольку входы имеют высокий импеданс, когда ничего не подключено. Попробуйте заземлить входы (подключите к 0 В) в качестве эксперимента - тогда значения должны быть близки к 0. Если необходимо, чтобы входы были нулевыми, когда ничего не подключено, подключите понижающий резистор к каждому входу (между входом и 0 В). чтобы снизить импеданс - это должно быть значение 10 кОм.

0 голосов
/ 26 августа 2013

Не оставляйте контакты не подключенными!Неподключенный вывод - это, по сути, антенна, которая может воспринимать напряжения вне диапазона Vss и Vdd.В разделе 2.10 таблицы данных сказано, что ни в коем случае не оставляйте какие-либо контакты неподключенными (или, если вы это сделаете, сконфигурируйте их как выходы и снизьте их до минимума.)

Если вы хотите проверить A2D, вы можете настроить вывод как цифровойвыход (аналоговая настройка переопределяет только цифровой вход), а затем поднимите его до высокого и низкого уровня для проверки.

...