Помогите пожалуйста разобраться с непонятной проблемой в работе АЦП.
Глюк был обнаружен в "большой" схеме и программе. Для эксперимента выкинул всё из схемы, а тестовую программу взял из slac015k, но всё равно происходит вот что:
На вход АЦП контроллера подаётся напряжение с потенциометра. К этому же входу также подключен вольтметр. Подкручивая потенциометр, постепенно уменьшаю напряжение от 2,5В до 0,0В на входе АЦП, что и подтверждается показаниями вольтметра. А вот если контролировать показания АЦП в программе, то сначала напряжения совпадают, в интервале примерно 1,4В - 1,2В контроллер выдаёт постоянное значение примерно 1,25В (если в отсчётах - 0x07FF, ровно половина диапазона), потом опять показания совпадают. Вот попытался изобразить график: (наклонная прямая - показания вольтметра, точками показаны показания АЦП в контроллере).

Программа (пробовал разные настройки, например вот в таком виде):
Код
#include <msp430x13x.h>
static double v_in = 0.0;
int main(void)
{
WDTCTL = WDTPW+WDTHOLD; // Stop watchdog timer
P6SEL |= 0xFF; // Enable all A/D channels
ADC12CTL0 = ADC12ON + SHT0_2; // Turn on ADC12, set sampling time
ADC12CTL1 = SHP; // Use sampling timer
ADC12MCTL0 = SREF_2 + INCH_7; // Vr+ = VeREF+ (external)
ADC12CTL0 |= ENC; // Enable conversions
while (1)
{
ADC12CTL0 |= ADC12SC; // Start conversion
while ((ADC12IFG & BIT0) == 0)
;
v_in = ADC12MEM0 * 2.5 / 4095.0; // BREAKPOINT HERE
}
}
По схеме: контроллер питается от 3,3В, внешнее опорное напряжение 2,5В, есть аналоговая земля, между входом и AVss подвешен конденсатор (пробовал и без него), пробовал три разных контроллера (два 149-ых и один 133-ий), схема в принципе тоже менялась...
Везде одно и то же - "подвисание" показаний в середине диапазона. Чувствую, что ерунда какая-то, но в чём дело - не могу разобраться. Нужен свежий взгляд.
В чём может быть дело?