Появилась у меня недавно платка, чем-то напоминающая Olimex LPC-H2103. В платке я задействовал таймер, spi, uart, подключил два 7-мисегментных индикатора. PLL выключил (Cclk=Pclk=Fosc=14.7456 МГц). Теперь взялся за АЦП. Примеры скачал. Запустил АЦП в Burst режиме (с прерыванием):
PINSEL0 |= 0x00F00000; // AD3,4
PINSEL1 |= 0x0003F000; // AD0,1,2
ADCR = 0x0020921F;
ADCR |= 0x00010000; // start burst mode
CLKDIV = 147-1 = 146, т.е. АЦП работает на ~100 КГц.
Задействованы аналоговые входы AD0..AD4.
В прерывании опрашиваю входы и результат загоняю в массив:
unsigned int r, ch;
r = ADGDR;
ch = (r >> 24) & 0x00000007;
ADCresult[ch] = (unsigned short)((r>>6) & 0x03FF);
Потом данные из массива отправляю по uart'у и вывожу целую и десятичную часть на 2 индикатора.
Всё работает, но есть одно "НО". У меня не соответствуют значения напряжения в АЦП (10-битный код из регистра ADGDR) и напряжения на аналоговом входе. Я подаю на вход AD4 (вывод 36) напряжение от 0 до 3,3 В. При этом показания напряжения АЦП отличаются от входного на несколько сот милливольт: вместо 3,0В АЦП выдаёт 2,9В; вместо 1,8В - 1,6В; вместо 0,5В - 0,4В - т.е. само отличие непостоянно: чем ближе к нулю, тем оно меньше.
10-битный код я преобразовываю в напряжение следующим образом: [код]*Vref, где Vref=3.3B - образцовое напряжение АЦП (вывод Vdda). Например, если код равен 0x02F6, то это соответствует напряжению 2501 милливольт, однако на вход AD4 подано напряжение 2.9 вольт! Разница в 400 мВ!
Может я неверно расчитываю показания АЦП? Как убрать такое несоответствие?
Ещё у меня младшие 8 бит постоянно меняются, т.е. в коде 0x02F6 число 0xF6 после следующего
измерения АЦП будет уже другим, например: 0x02E5, 0x02FE.
Это наверное нестабильность по питанию? Или какие-то помехи?