Делаю устройство в котором постоянно измеряется сигнал с одного входа (однофазный режим ). При наступлении некоторых условий нужно переключить вход АЦП на другой канал, измерить сигнал, и вернуться на первый. Все что касается этой части привожу ниже.
//-------------------------
// Adc_Init
//-------------------------
void Adc_Init(void)
{
REF0CN = 0x0E;
AMX0P = 0x08; // начало измерения с P2.0
AMX0N = 0x1F; // однофазный режим
ADC0CF = 0x08; // частота дискретизации, формат выходных данных
ADC0CN = 0x80; // преобразование начинается при установке бита AD0BUSY
}
//---------------------------
// Main Routine
//---------------------------
while (1)
{
.
.
.
if(k)
{
AMX0P = 0x09; // на вход АЦП подключается напряжение
// с калибровочного канала
AD0BUSY = 1;
//**3
V_out_k=Cena_razr*ADC_out; //**1
.
//***1
.
AMX0P = 0x08; // на вход АЦП подключается рабочий канал
AD0BUSY = 1;
//**4
V_out=Cena_razr*ADC_out; //**2
.
//***2
.
}
.
.
.
При работе в отладчике заметил, что в точке , помеченной //**1 V_out_k показывает не значение на входе канала k , а значение рабочего канала. Соответственно, в точке //**2 V_out наоборот показывает значение на входе канала k, а не значение рабочего ( происходил останов программы в точках,условно обозначенных //***1 и //***2).
Попытался в точки //**3 и //**4 вставить задержку порядка 65 мс - не помогло.
Когда в эти точки вставил пустой цикл ( т.е. считывал данные в пустоту)
for(N=0;N<5;N++)
{
ADC_out_buf=ADC_out;
AD0BUSY = 1;
}
показания стали соответствовать истинным.
В даташите заметил только замечания насчет необходимости дать время зарядиться входным конденсаторам ( порядка нескольких пф), и ничего насчет пустого считывания. Но неужели задержки 65 мс мало для заряда пикофарадной емкости?
Вопрос такой: что может приводить к такой ситуации и можно ли сделать более грамотно ( с точки зрения работы микроконтроллера).