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

 
 
> AVR и дифф сигналы, как правильно измерить?
ivainc1789
сообщение Oct 24 2007, 13:50
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 175
Регистрация: 5-01-05
Пользователь №: 1 807



Собрал простую схемку и измерил мультиметром VC9808+ разность ADC4-ADC3=-7mV. Далее попробовал измерить разность напряжений делителей двумя способами: измерить сигналы как single ended и differential с внутренним усилителем с Ку=1. Первый способ стабильно дает правильный результат в 7 милливольт (по модулю). А со вторым проблемы, АЦП возвращает чаще всего 0x3FF, что "в переводе с биполярного режима" равно -1. Получить -7 никак не удается даже произведя 10 измерений и взяв среднее. Где может быть ошибка?

Прикрепленное изображение


Код
unsigned int AdcResult;

__C_task void main (void) {
  unsigned char i;
  unsigned long AdcSumma=0;
  unsigned int tmp1;  
  ADCSRA = BIN(10010110); // 125kHz,Fosc=8MHz
  ADCSRB = BIN(10000000); // bipolar mode
  DIDR0 = BIN(11111111);  // digital inputs disable
  DIDR1 = BIN(11110000);  
  ADMUX = BIN(10010011);  // (ADC4-ADC3)*1
  Delay(500*ms);// wait for ADC stable
  for(i=0;i<10;i++){// get 10 conversions
    SETBIT(ADCSRA,ADSC);while(CHKBIT(ADCSRA,ADSC));
    AdcSumma += ADC;
  }
  AdcResult = AdcSumma/10;
  
  while(1);
}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ivainc1789
сообщение Oct 26 2007, 21:25
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 175
Регистрация: 5-01-05
Пользователь №: 1 807



Код модифицировал так:
Код
signed int AdcResult;
__C_task void main (void) {
  unsigned char i;
  signed long AdcSumma=0;
  signed int tmp1;  
  ADCSRA = BIN(10010110); // 125kHz,Fosc=8MHz
  ADCSRB = BIN(10000000); // bipolar mode
  DIDR0 = BIN(11111111);  // digital inputs disable
  DIDR1 = BIN(11110000);  
  ADMUX = BIN(10010011);  // (ADC4-ADC3)*1
  Delay(500*ms);// wait for ADC stable
  for(i=0;i<10;i++){// get 10 conversions
    SETBIT(ADCSRA,ADSC);while(CHKBIT(ADCSRA,ADSC));
    tmp1 = ADC;
    if (CHKBIT(tmp1,9))tmp1|= 0xFC00;
    AdcSumma += tmp1;
  }
  AdcResult = AdcSumma/10;  
  while(1);
}

Результаты измерений в целом:
(ADC3-ADC3)*20=ADCe=+3;
(ADC4-ADC3)*1=-1;
Смотрел через EEPROM все 10 значений как unsigned int - там большинство результатов 0x3FF, реже 0x000. Округление конечного результата при делении на 10 дает существенную ошибку. Если смотреть на формулу Result = 2*(ADC4-ADC3) - ADCe/10.0 то искомого результата (-3) чуть-чуть не получается... Если следовать общей формуле биполярного режима ADC = (ADC4-ADC3)*512*GAIN/Vref, то уверенно должно возвращаться (-3.2). Вижу необходимость переходить к float. Верно ли?
Go to the top of the page
 
+Quote Post
=GM=
сообщение Oct 27 2007, 14:04
Сообщение #3


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(ivainc1789 @ Oct 26 2007, 21:25) *
Код
signed int AdcResult;
. . . . .
  for(i=0;i<10;i++)
  {
   SETBIT(ADCSRA,ADSC);while(CHKBIT(ADCSRA,ADSC));
   tmp1 = ADC;
   if (CHKBIT(tmp1,9)) tmp1|=0xFC00;
   AdcSumma += tmp1;
  }
  AdcResult = AdcSumma/10;  
  while(1);
}

Оператор if(CHKBIT(tmp1,9)) tmp1|=0xFC00; здесь использовать нельзя, уберите.
Понятно и ёжику, что для усреднения надо сложить 10 результатов измерений, неважно положительные они или отрицательные, и поделить на 10, а вы вдруг хотите сделать все слагаемые положительными. С какого припрыгу?
Цитата(ivainc1789 @ Oct 26 2007, 21:25) *
Смотрел через EEPROM все 10 значений как unsigned int - там большинство результатов 0x3FF, реже 0x000
Ничего не понимаю. Если у вас -7 мВ на входе, то код должен быть равен -3 или 0хFFFD.

Цитата(ivainc1789 @ Oct 26 2007, 21:25) *
Вижу необходимость переходить к float. Верно ли?
А что это вам даст? Сначала получите reasonable значения в целых числах.

Вообще, для получения хорошей точности надо бы слабые диффсигналы мерять с Ку=20 или даже Ку=32, потом поделить на 20 или 32, заодно учесть смещение. А смещение, кстати, лучше мерять непосредственно перед измерением диффсигнала.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
ivainc1789
сообщение Oct 27 2007, 17:16
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 175
Регистрация: 5-01-05
Пользователь №: 1 807



Цитата(=GM= @ Oct 27 2007, 18:04) *
Оператор if(CHKBIT(tmp1,9)) tmp1|=0xFC00; здесь использовать нельзя, уберите.
а вы вдруг хотите сделать все слагаемые положительными. С какого припрыгу?


Данная операция является попыткой перейти от знакового 10 р. значения ADC к обычному знаковому int путем размножения знака влево... Не ВСЕ слагаемые делаются положительными, как вы говорите, а только 10р. отрицательные становятся 16р. отрицательными...

Цитата
Ничего не понимаю. Если у вас -7 мВ на входе, то код должен быть равен -3 или 0хFFFD.


В том то и дело, что результат получен (-1=0xFFFF) и то, если принять меры к обеспечению округления не отбрасыванием остатка а до ближайшего целого, т. к. в выборке из 10-ти значений ВСЕГДА присутствует один 0x0000, остальные 0xFFFF. Отчего такая ошибка сказать затруднительно, особенно на фоне вполне корректного измерения single ended.

Цитата
А что это вам даст? Сначала получите reasonable значения в целых числах.


Согласен. Только вот вариантов источника ошибки больше не видится. АЦП работает на корректной частоте, настройки вроде все верные, меняем только значение ADMUX. Single ended результат подтверждает показания мультиметра, что доказывает исправность входных цепей....

Цитата
А смещение, кстати, лучше мерять непосредственно перед измерением диффсигнала.


Согласен, но помимо смещения есть еще погрешность резисторов в делителях. Например, у меня в зарядном устройстве измеряется сигнал на токоизмерительном резисторе, делители подключены к нему. Для учета этой ошибки нужно подать одинаковое напряжение на сами делители, и это требует "откл" тока токоизмерительного резистора, а это может быть недопустимо. Поэтому такая ошибка измеряется только на старте программы один раз...
Go to the top of the page
 
+Quote Post
=GM=
сообщение Oct 27 2007, 18:46
Сообщение #5


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(ivainc1789 @ Oct 27 2007, 17:16) *
Согласен, но помимо смещения есть еще погрешность резисторов в делителях. Например, у меня в зарядном устройстве измеряется сигнал на токоизмерительном резисторе, делители подключены к нему. Для учета этой ошибки нужно подать одинаковое напряжение на сами делители, и это требует "откл" тока токоизмерительного резистора, а это может быть недопустимо. Поэтому такая ошибка измеряется только на старте программы один раз...

Погрешность резисторов это отдельная песня, не надо бежать впереди паровоза. Начинать надо с ошибки смещения. Для её учёта при измерении диффсигналов надо измерить смещение, выбрав один и тот же канал, и непосредственно после этого измерить диффсигнал, затем вычесть смещение из полученного значения. Вообще, снимите график зависимости кода АЦП от диффсигнала, и всё увидите.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ivainc1789   AVR и дифф сигналы   Oct 24 2007, 13:50
- - ReAl   Надо оцифровать разность при подключении к одному ...   Oct 24 2007, 14:11
|- - ivainc1789   Цитата(ReAl @ Oct 24 2007, 18:11) Надо оц...   Oct 24 2007, 14:36
- - =GM=   Цитата(ivainc1789 @ Oct 24 2007, 12:50) С...   Oct 25 2007, 10:41
|- - ivainc1789   Цитата(=GM= @ Oct 25 2007, 14:41) Разреше...   Oct 25 2007, 16:17
|- - =GM=   Цитата(ivainc1789 @ Oct 25 2007, 16:17) З...   Oct 25 2007, 22:46
|- - ivainc1789   Цитата(=GM= @ Oct 26 2007, 02:46) Ну, есл...   Oct 26 2007, 05:57
|- - =GM=   Цитата(ivainc1789 @ Oct 26 2007, 04:57) Р...   Oct 26 2007, 09:29
|- - ReAl   Цитата(ivainc1789 @ Oct 26 2007, 23:25) A...   Oct 27 2007, 08:03
- - ivainc1789   Так сказать, ура! Действительно, нужно было ме...   Oct 27 2007, 23:56
- - =GM=   Цитата(ivainc1789 @ Oct 27 2007, 23:56) А...   Oct 28 2007, 20:10
- - ivainc1789   Цитата(=GM= @ Oct 28 2007, 23:10) А в общ...   Oct 28 2007, 20:23
- - =GM=   Цитата(ivainc1789 @ Oct 28 2007, 20:23) Я...   Oct 29 2007, 11:54


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 17:38
Рейтинг@Mail.ru


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