|
AVR и дифф сигналы, как правильно измерить? |
|
|
|
 |
Ответов
|
Oct 26 2007, 21:25
|

Профессионал
    
Группа: Свой
Сообщений: 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. Верно ли?
|
|
|
|
|
Oct 27 2007, 14:04
|

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, заодно учесть смещение. А смещение, кстати, лучше мерять непосредственно перед измерением диффсигнала.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 27 2007, 17:16
|

Профессионал
    
Группа: Свой
Сообщений: 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 результат подтверждает показания мультиметра, что доказывает исправность входных цепей.... Цитата А смещение, кстати, лучше мерять непосредственно перед измерением диффсигнала. Согласен, но помимо смещения есть еще погрешность резисторов в делителях. Например, у меня в зарядном устройстве измеряется сигнал на токоизмерительном резисторе, делители подключены к нему. Для учета этой ошибки нужно подать одинаковое напряжение на сами делители, и это требует "откл" тока токоизмерительного резистора, а это может быть недопустимо. Поэтому такая ошибка измеряется только на старте программы один раз...
|
|
|
|
|
Oct 27 2007, 18:46
|

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

|
Цитата(ivainc1789 @ Oct 27 2007, 17:16)  Согласен, но помимо смещения есть еще погрешность резисторов в делителях. Например, у меня в зарядном устройстве измеряется сигнал на токоизмерительном резисторе, делители подключены к нему. Для учета этой ошибки нужно подать одинаковое напряжение на сами делители, и это требует "откл" тока токоизмерительного резистора, а это может быть недопустимо. Поэтому такая ошибка измеряется только на старте программы один раз... Погрешность резисторов это отдельная песня, не надо бежать впереди паровоза. Начинать надо с ошибки смещения. Для её учёта при измерении диффсигналов надо измерить смещение, выбрав один и тот же канал, и непосредственно после этого измерить диффсигнал, затем вычесть смещение из полученного значения. Вообще, снимите график зависимости кода АЦП от диффсигнала, и всё увидите.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|