Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: переключение каналов АЦП в C8051F320
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
NikP
Делаю устройство в котором постоянно измеряется сигнал с одного входа (однофазный режим ). При наступлении некоторых условий нужно переключить вход АЦП на другой канал, измерить сигнал, и вернуться на первый. Все что касается этой части привожу ниже.
//-------------------------
// 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 мс мало для заряда пикофарадной емкости?
Вопрос такой: что может приводить к такой ситуации и можно ли сделать более грамотно ( с точки зрения работы микроконтроллера).
barabek
Цитата(NikP @ Mar 18 2010, 18:20) *
AD0BUSY = 1;
//**3
V_out_k=Cena_razr*ADC_out; //**1
.
//***1

Так Вы даете команду на преобразование и тут же считываете содержимое, которое у Вас осталось от предыдущего преобразования. Это в корне неверно. В другой ситуации у Вас между этими строками попадет прерывание и Вы уже считаете новое значение (а может быть какое-то ложное).
Нужно запустить преобразование, дождаться снятия флага AD0BUSY (поллингом или, лучше, в прерывании), а затем считать нужное значение и только после этого можно давать команду на новое преобразование. Как-то так.

PS. После изменения канала мультиплексора AMX0P = хх и командой AD0BUSY = 1; необходимо обеспечить время заряда входных емкостей. У Вас идет без задержек - обеспечивается ли требуемое время? Могут быть ошибки в измерениях.
NikP
[
PS. После изменения канала мультиплексора AMX0P = хх и командой AD0BUSY = 1; необходимо обеспечить время заряда входных емкостей. У Вас идет без задержек - обеспечивается ли требуемое время?
[/quote]
После изменения канала мультиплексора я всавлял задержку до 65 миллисекунд. По моим прикидкам должно было хватить на заряд входных емкостей. Или я не прав? А в остальном мысль понятная.
barabek
Цитата(NikP @ Mar 18 2010, 21:51) *
После изменения канала мультиплексора я всавлял задержку до 65 миллисекунд. По моим прикидкам должно было хватить на заряд входных емкостей. Или я не прав?

Не знаю, все зависит от Вашей сцены, какой делитель на входе или что там у Вас. Формулы для расчета даны в описании. Но вообще 65мс довольно много. Наверняка хватит с большим избытком. Это легко проверить. На 1 канал подаете максимальное постоянное напряжение, на второй минимальное. Затем меряете только с одного канала, отключив переключение мультиплексора. Запоминаете результаты. После меряете каналы поочередно, и сравниваете, не влияют ли каналы друг на друга.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.