Делаю устройство в котором постоянно измеряется сигнал с одного входа (однофазный режим ). При наступлении некоторых условий нужно переключить вход АЦП на другой канал, измерить сигнал, и вернуться на первый. Все что касается этой части привожу ниже. //------------------------- // 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 мс мало для заряда пикофарадной емкости? Вопрос такой: что может приводить к такой ситуации и можно ли сделать более грамотно ( с точки зрения работы микроконтроллера).
|