Добрый день уважаемый ALL!
При тестировании работы модуля АЦП в контроллере PIC16F690 столкнулся с такой ситуацией:
Опрашиваю три канала (по очередно, для исключения лишних влияющих факторов перед каждым опросом изменяю прошивку, изменяя только номер канала).
Настройки и фрагмент кода отвечающий за преобразование и передачу в ПЭВМ:
GIE = 0; // Запрещаем все прерывания (глобально)
TRISA = 1; // ANSEL = 0b00000111; // AN0, AN1, AN2 аналоговый вход
ANSELH = 0b00000100; // AN10 аналоговый вход
/* кофигурирование АЦП ADCON0
bit_0 (1) (ADON) включение АЦП - 1/0 включен/выключен,
bit_1 (0) (GODONE) - 1/0 - включение преобразования/преобразование закончено
bit_5:2 (0000) (CHSx) - выбор канала считывания (0000 = канал 0)
bit_6 (0)(VCFG) - выбор источника опрного напряжения 1/0 pin/VDD
bit_7 (1)(ADFM) - выравнивание результата 1/0 правое/левое */
ADCON0 = 0b10101001;
/* кофигурирование АЦП ADCON1
bit_3:0 резерв
bit_6:4 (101) (ADCSx) - выбор частоты преобразования для 4 МГц Fosc/16 (Fosc/8 !!! Работает некорректно)
bit_7 резерв */
ADCON1 = 0b00010000;
Delay(2);
for (i = 0; i < 40; i += 2)
{
GODONE = 1;
while(GODONE); // ждем окончания преобразования
gData.Data[i] = ADRESL;
gData.Data[i+1] = ADRESH;
Delay(2);
}
SendByte(START_BYTE);
SendByte(44);
SendByte(gData.DeviceId);
for (i = 0; i < 40; i++)
{
SendByte(gData.Data[i]);
}
SendByte(gData.DataCRC);
gState = stWaitStartByte;
}
Не понятно почему 2 канала (AN0 и AN2) считываются приблизительно одинаковые значения, а канал АN1 выдает существенно заниженные результаты, причем если подать на вход напряжение питания (Uref для эксперемента используюю Udd), то вместо 1023 выдает 1021.
в каналах AN0 и AN2 первые три считывания массива как правило отличаются от всех остальных (17), причем результат первого считывания уходит за пределы 3-сигма, повторяемость этого феномена очень высокая, что наводит мысль о систематической его природе.
Вход АЦП подключен к емкости (1 мкф) опорного источника (может его резистором нужно подтягивать к GND ?)
Подскажите пожалуйста может я что то упустил?