Мерял 2 канала по очереди - внешний вход (к ноге через фильтр подключен нормирующий усилитель) и внутренний датчик температуры. АЦП сконфигурено так:
Код
REF0CN = 0x17;// Vref = 2.2 B, темп. сенсор вкл., генератор тока вкл.
// внутренний буфер вкл.
ADC0MX = 0x0B;// замеры с выв. Р1.3
ADC0CF = 0xF8;// SAR = Fclk/32, 1 замер за раз
ADC0TK = 0x07;// posttracking - режим замера. Он дает наибольшую точность
// время накопления напряжения макс. - 16 SAR
ADC0CN = 0x80;// АЦП вкл.
// 16/04/07 - замер по переполнению таймера 2
ADC0CN = 0x83;
IDA0CN = 0xF4;// ЦАП вкл., 0,25 мА, выравнивание вправо.
Данные с АЦП читались в прерывании:
Код
void ADC0_ISR(void) interrupt INTERRUPT_ADC0_EOC
{
register unsigned short int t;
AD0INT = 0;
if (ADC0MX == PRESS_EXT)
{
ADC0MX = TEMP_INT;
t = ADC0;
if (t>0x140)// игнорируем значения меньше 170 мВ
PressData.upress = t;
ADC0 = 0;
}
else
{
ADC0MX = PRESS_EXT;
PressData.temp = ADC0;
ADC0 = 0;
}
}
Это первозданный вид прерывания.
В диапазоне входных напряжений 0,73 - 0,88 В заметил такой глюк:
один раз upress = 0x580 и temp = 0x715, один раз наоборот... Т.е. какая-то ерунда. Почему это возникало, да еще и в таком узком диапазоне (150 мВ из полной шкалы 2,2 В), я не выяснял. Помогла перестановка строк - изменение ADC0MX поставил в конец блоков. Глюк исчез.
Код
{
t = ADC0;
if (t>0x140)// игнорируем значения меньше 170 мВ
PressData.upress = t;
ADC0 = 0;
ADC0MX = TEMP_INT;
}