Добрый день уважаемый 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 ?)
Подскажите пожалуйста может я что то упустил?
|