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

 
 
> 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   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   Цитата(=GM= @ Oct 27 2007, 18:04) Операто...   Oct 27 2007, 17:16
|- - =GM=   Цитата(ivainc1789 @ Oct 27 2007, 17:16) С...   Oct 27 2007, 18:46
- - 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 Текстовая версия Сейчас: 19th July 2025 - 13:30
Рейтинг@Mail.ru


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