Я использую 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, я заметил две вещи:
Контакты AN0-AN5, которые неправильно сообщают о ненулевых значениях, также являются контактами CNx. Эти выводы являются выводами «Уведомление об изменении» и предназначены для создания прерывания при изменении значения на выводах.
На всех выводах CNx можно включить «слабое подтягивание».
Поэтому я попытался отключить «слабое подтягивание» с помощью этой строки:
mCNClose();
Что отключает все выводы CNx и их подтягивания. К сожалению, это не помогло. И когда я проверил значение регистра подтягивания CN (CNPUE
Что еще я могу попробовать? Я что-то не так делаю в своем коде?