АЦП дифференциальное подключение аналоговых входов

mikazakov@mail.ru
Offline
Зарегистрирован: 29.10.2016

Люди добрые, подсобите немножко.

Сделал резисторный мост для измерения для Pt 1000 для ардуины меги.

Немного не хватает точности, раза в 2-3 бы поточнее. Почитал интернен, вроде как можно сделать дифиринциально подключение на аналоговые входа. Нашел похожую ссылку:

http://arduino.ru/forum/programmirovanie/voltmetr-i-millivoltmetr-odnovr...

Почитал даташит. Но, такое с непревычки сразу не переваришь, со всеми этими битовыми сдвигами.

Если не затруднит, можно простенький пример как это реализовать и коментарий бы к каждой строчки, чтобы прояснение наступило.

И если не сложно, то и пример бы с использованием встроенного в ардуину усилителя (с коментами).

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

mikazakov,  Вы в каком месте даташит читали? Видимо не в том. Вот вам нужный кусок. Почитайте, подумайте почему никто не использует дифф режим на мк.

The device also supports 16/32 differential voltage input co
mbinations. Four of the differential inputs (ADC1 &
ADC0, ADC3 & ADC2, ADC9 & ADC8 and ADC11 & ADC
10) are equipped with a programmable gain stage, pro-
viding amplification steps of 0 dB (1x), 20 dB (10x) or 46
dB (200x) on the differential input voltage before the ADC
conversion. The 16 channels are split in two sections of 8 channels where in each section seven differential analog
input channels share a common negative terminal (ADC1/ADC9), while any other ADC input in that section can be
selected as the positive input terminal. If 1x or 10x gain
is used, 8 bit resolution can be expected. If 200x gain is
used, 7 bit resolution can be expected

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Ну я вот использовал, в чем проблема в этом абзаце? Что в диф. режиме как отрицательную ногу можно использовать только 2 ноги, по одной на секцию? То есть, диф.режим, по сути ограничивается только 2-я парами сигналов .. хотя бы так. В иных "продвинутых камнях и этого нет.

Или то, что предусилитель "жрет" разрядность? 10х - не жрет. А когда требуется предусилитель в 200х .. то хоть что-то снять уже кайф. Это же программное управление! Хороший сигнал - оцифровываем как есть 1:1, слабый - усиливаем 10х и снова оцифровываем. Что-то там вроде как есть? Ну давай попробуем на 200х .. авось чего и поймаем.

Вот совсем непонятно почему "никто не использует", поясните плиз..

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Arhat109-2,   If 1x or 10x gain  is used, 8 bit resolution can be expected

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Ну, маловато будет .. и что? Подключал микрофон к диф. режиму .. 7 там или 8 бит .. мне было вот не сильно существенно, а то что имелась возможность усиливать сигнал - было полезно. Также подключал 2 микрофонных шилда в диф. режиме .. "уши робота". Мне было крайне полезно что сигнал выходит знаковый и можно быстро понять "с какой стороны прилетело". Это даже удобнее и быстрее, чем крутить сервой узв. датчик и выяснять "хде препятствие" в программном плане. Ваще хочу сделать "командоаппарат" с управлением голосом, типа "ко мне!". :)

Не знаю .. у каждой железяки есть свои аппаратные ограничения. Разве это повод "не использовать"? Можно конечно ставить навесные детальки и получать лучше, но это всегда и везде можно. Нет? :)

P.S. 10х не жрет, было в том плане, что там практически и так точность оцифровки 8-9 бит, а тут ещё один бит уходит под знак.

mikazakov@mail.ru
Offline
Зарегистрирован: 29.10.2016

dimax, собственно, я почитал ваши посты на этом форуме на эту тему. И мысль была такая, запитать мост +5 В, а при снятии показаний использовать диффиренциальный режим с опорным напряжением +2.56 от самой меги. И получить как бы точность почти в два раза большую, может меня бы это и устроило бы. А усилитель встроенный поюзать просто любопытно.

dimax, Arhat109-2: если не трудно,таки небольшой код на мою тему с комментариями, а то без комментариев у меня мысли с мертвой точки не сдвинутся. А то как то примеров для работы через регистры в интернете не особо много. И даташит, все таки больше справочник, там уже какое то понимание нужно иметь, а понимания пока нет.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Не, увольте. С кодом сейчас "не ко мне", ибо заняты подготовкой к соревнованиям.

А вот по точности и разрядности, дополню: разрядность АЦП в 8 бит, это ваще-то как-бы точность в районе 0.5%, что уже относится к "прецезионному" классу приборов в метрологии и соответственно требует регулярной поверки, калибровки и т.д и т.п. А ещё замечу, что точность радиодеталей в 1% тоже УЖЕ считается прецезионной. а обыкновенные детальки имеют типовой разброс значений в 5-20%, что без соответствующих ужимок и прыжков как-бы и вовсе исключает изготовление приборов с погрешностью ниже 5-10% в "домашних условиях" (бытовая техника).

И вот расскажите мне, "на кой ляд" вам надо 10 бит и более в АЦП-хах? :) А про между протчим, на 8-и битах, Мега могет делать замеры чуть ли не на мегагерце..

ТС-у: мостовая схема измерений, конечно же позволяет изготовить прецезионный приборчик .. но, Вам для него потребуются не менее прецезионные деталюшки, подстройки и т.д. А также регулярные поверки прибора .. у Вас есть "хде" делать это?

mikazakov@mail.ru
Offline
Зарегистрирован: 29.10.2016

Arhat109-2:

"на кой ляд" вам надо 10 бит и более в АЦП-хах? :)"

Да не в разрядности, дело в том что нужно с датчика получить точность хотя бы в полградуса. Сейчас на делителе напряжения расчетная точность 1,5 градуса на единицу АЦП, но с учетом что последней цифре при измерениях верить никогда нельзя, то получается еще грубее. Дело не в разрядности 8, 10, 16 или 125, а  втом что бы измеряемый диапазон немного растянуть по дискретному интервалу. Простое решение я вижу именно в дифферинциальном измерение с более низким опорным напряжением.

К сожалению упрощающих библиотек-оберток для этой цели я не нашел. А биты сдвигать это тяжко с непревычки.

Поэтому речь не идет о прецезионных вещах, датчик у меня категории В, т.е. точность 0,3 градуса. Ну а резисторный мост поди как нибуть настрою :)

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

mikazakov@mai, точность измерений и встроенный АЦП  в мегах -вещи взаимоисключающие.  Сейчас очень много вариантов недорогих и хороших внешних ацп буквально на любой вкус. Я даже обозревал тут как-то один из таких.

Волшебник
Offline
Зарегистрирован: 22.12.2016

ТС;   Как, решили ваш вопрос?

Я тут в поиске обнаружил https://www.arduino.ru/forum/programmirovanie/nashel-eto-kto-polzuet

в ответе 46 то что вы спрашивали

evgta
Offline
Зарегистрирован: 02.09.2016

 в начале дорого и точно, в конце с 55 поста дешево и менее точно

http://arduino.ru/forum/apparatnye-voprosy/podklyuchenie-datchika-temperatury-pt-100-k-arduino?page=1

Упс. Незаметил что pt1000

mikazakov@mail.ru
Offline
Зарегистрирован: 29.10.2016

Волшебник пишет:

ТС;   Как, решили ваш вопрос?

Я тут в поиске обнаружил https://www.arduino.ru/forum/programmirovanie/nashel-eto-kto-polzuet

в ответе 46 то что вы спрашивали

Да нормально решился, через диференцианый АЦП. Мне ведь только температуру воды мерить +/- 0,5 градусов, поэтому вполне потянет. Включается диференциальный АЦП через регистры.

Вот ардуиновский пример с 10-ти кратным усилением при работе на пинах A0 и A1 может кому пригодится:

void setup()
{ 
  Serial.begin(9600);
}

void loop()
{
  
    //Первым должен быть регистр ADCSRA
  ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
  ADCSRB = 0 << MUX5;
  ADMUX = (1<<REFS1)|(1<<REFS0)|(1<<MUX3)|(1<<MUX0);
  delay(200);
  //Запуск преобразования
  ADCSRA=ADCSRA|(1<<ADSC);
  
  while (ADCSRA & (1 << ADSC));
  
  uint16_t V = ADC;

  Serial.println("-------------");
  Serial.println(V);
  Serial.println("-------------");
  
  delay(2000);
}

Для настройки измерения без усилителя регистр ADMUX должен быть таким (при этом нужно пины A0 и A1 местами поменять):

ADMUX = (1<<REFS1)|(1<<REFS0)|(1<<MUX4);

 

Волшебник
Offline
Зарегистрирован: 22.12.2016

Сам решил померить, а то в дата шитах каждый пераметр трусливо обставляют десятью оговорками, а в сети не нашёл для меги, есть для Уно http://www.openmusiclabs.com/learning/digital/atmega-adc/

Короче, всё мерял по науке, ENOB. Результаты;

 Input 600 Hz,  
  
Single Ended A-9:
 
  Peak number:  64  magnitude:  244062.48 Total:  249.3945312500  SINAD:  59.812  ENOB: 9.643
  Peak number:  64  magnitude:  244093.71 Total:  246.1113433837  SINAD:  59.929  ENOB: 9.663
  Peak number:  64  magnitude:  244035.78 Total:  249.6024322509  SINAD:  59.804  ENOB: 9.642
  Peak number:  64  magnitude:  244027.65 Total:  248.9250946044  SINAD:  59.827  ENOB: 9.646
  Peak number:  64  magnitude:  244030.12 Total:  238.3863677978  SINAD:  60.203  ENOB: 9.708
 
Diff 8<->9 Gain = 1
  
  Peak number:  69  magnitude:  244342.28 Total:  485.8945617675  SINAD:  54.029  ENOB: 8.683
  Peak number:  69  magnitude:  244323.76 Total:  477.1437072753  SINAD:  54.186  ENOB: 8.709
  Peak number:  69  magnitude:  244328.17 Total:  450.0516052246  SINAD:  54.694  ENOB: 8.793
  Peak number:  69  magnitude:  244431.87 Total:  452.5044250488  SINAD:  54.651  ENOB: 8.786
  Peak number:  69  magnitude:  244435.12 Total:  456.3534851074  SINAD:  54.577  ENOB: 8.774
 
Diff 8<->9 Gain = 10
 
  Peak number:  69  magnitude:  236741.43 Total:  521.3273925781  SINAD:  53.143  ENOB: 8.535
  Peak number:  69  magnitude:  236790.56 Total:  560.4769287109  SINAD:  52.516  ENOB: 8.431
  Peak number:  69  magnitude:  236701.00 Total:  516.1995849609  SINAD:  53.228  ENOB: 8.549
  Peak number:  69  magnitude:  236685.28 Total:  529.0664672851  SINAD:  53.013  ENOB: 8.514
  Peak number:  69  magnitude:  236622.92 Total:  542.5798950195  SINAD:  52.792  ENOB: 8.477
 
Diff 8<->9 Gain = 200
 
  Peak number:  69  magnitude:  250006.87 Total:  1831.2778320312 SINAD:  42.704  ENOB: 6.801
  Peak number:  69  magnitude:  250346.70 Total:  1823.5153808593 SINAD:  42.753  ENOB: 6.809
  Peak number:  69  magnitude:  250336.73 Total:  1723.9614257812 SINAD:  43.240  ENOB: 6.890
  Peak number:  69  magnitude:  250240.62 Total:  1747.2711181640 SINAD:  43.120  ENOB: 6.870
  Peak number:  69  magnitude:  250557.64 Total:  1814.7357177734 SINAD:  42.802  ENOB: 6.818
  
Пардон за англонизмы,  ардуина руский пока не понимает, а настраивать не охота время терять.
БПФ = 1024, схема измерения 
 
 При дифф. входе данные надо корректировать;
    for( uint16_t i = 0; i < INBUF; i++) {
      int16_t tempr = inp[i];
      if(singl_dif) {  
        if ( tempr & 0x0200) tempr += 0xFE00; // Convert to negative 16-bit word (2's comp)
        else tempr += 0x200;
        }
        f_r[i] = tempr -512;
        }

 Синус с ослиграфа Хантек, 5В пик-пик, ацп конфигурировалось с референсом 2.56 для дифа и 5 для сингл эндед. 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Пасибки, а то меня тут пытались сколько раз с дерьмом мешать .. все норамльно там с точностью. А иметь программное усиление в диф. режиме - оказалось очень даже удобно в свое время..

Волшебник
Offline
Зарегистрирован: 22.12.2016

Я не совсем уверен, что у меня х200 правильно намеряно, там 25 мкВ на бит (!) а никаких мер по экранировке, очень может быть сетевая наводка пролезла.

В софте вроде правильно, мне не удалось получить в том же скетче на Дуе результат личше чем 9.3 бита, ни в сингл ни дифф, а усиление там чисто символическое 2... Вот те и 12-бит.  Как закончу, может отдельный топик по Дуе и маплу (stm32) закину