реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> переключение каналов АЦП в C8051F320, задержка при считывании
NikP
сообщение Mar 18 2010, 08:20
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 168
Регистрация: 25-08-05
Пользователь №: 7 944



Делаю устройство в котором постоянно измеряется сигнал с одного входа (однофазный режим ). При наступлении некоторых условий нужно переключить вход АЦП на другой канал, измерить сигнал, и вернуться на первый. Все что касается этой части привожу ниже.
//-------------------------
// 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 мс мало для заряда пикофарадной емкости?
Вопрос такой: что может приводить к такой ситуации и можно ли сделать более грамотно ( с точки зрения работы микроконтроллера).
Go to the top of the page
 
+Quote Post
barabek
сообщение Mar 18 2010, 09:53
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831



Цитата(NikP @ Mar 18 2010, 18:20) *
AD0BUSY = 1;
//**3
V_out_k=Cena_razr*ADC_out; //**1
.
//***1

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

PS. После изменения канала мультиплексора AMX0P = хх и командой AD0BUSY = 1; необходимо обеспечить время заряда входных емкостей. У Вас идет без задержек - обеспечивается ли требуемое время? Могут быть ошибки в измерениях.
Go to the top of the page
 
+Quote Post
NikP
сообщение Mar 18 2010, 11:51
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 168
Регистрация: 25-08-05
Пользователь №: 7 944



[
PS. После изменения канала мультиплексора AMX0P = хх и командой AD0BUSY = 1; необходимо обеспечить время заряда входных емкостей. У Вас идет без задержек - обеспечивается ли требуемое время?
[/quote]
После изменения канала мультиплексора я всавлял задержку до 65 миллисекунд. По моим прикидкам должно было хватить на заряд входных емкостей. Или я не прав? А в остальном мысль понятная.
Go to the top of the page
 
+Quote Post
barabek
сообщение Mar 18 2010, 21:39
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831



Цитата(NikP @ Mar 18 2010, 21:51) *
После изменения канала мультиплексора я всавлял задержку до 65 миллисекунд. По моим прикидкам должно было хватить на заряд входных емкостей. Или я не прав?

Не знаю, все зависит от Вашей сцены, какой делитель на входе или что там у Вас. Формулы для расчета даны в описании. Но вообще 65мс довольно много. Наверняка хватит с большим избытком. Это легко проверить. На 1 канал подаете максимальное постоянное напряжение, на второй минимальное. Затем меряете только с одного канала, отключив переключение мультиплексора. Запоминаете результаты. После меряете каналы поочередно, и сравниваете, не влияют ли каналы друг на друга.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 03:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01831 секунд с 7
ELECTRONIX ©2004-2016