И снова про омметр на Ардуино

dimiork
Offline
Зарегистрирован: 23.05.2018

Здравствуйте, уважаемые форумчане.

Цель: В старенький отечественный автомобиль вкорячить свою платформу для сбора и передачи по каналу bluetooth данных с резистивных датчиков(давления, температуры).

Имеются пять датчиков, изменяющих свое сопротивление в диапазоне 50 - 1500 Ом, китайская Arduino Nano и такой же Bluetooth HC-06 модуль.

Изучив вопрос и столкнувшись с непредсказуемым напряжением на пине +5V придумался следующий план:

Задействовать внутреннее опорное напряжение 1,1V и собрать делитель 10:1, чтобы расчитывать напряжение на +5V пине ардуины, после чего использовать еще один делитель для измерения непосредственно сопротивления с датчика, опираясь на расчитанное напряжение +5V пина.

Примерно так - картинка.

Теперь вопросы:

1. Правильно ли я все придумал? Быть может есть более элегантное решение, НЕ требующее покупки каких-то дорогих источников опорного напряжения?

2. R3 = 10 Ом. При таком номинале получаемые результаты имеют достаточную для всего этого дела точность. Однако, понять как 10 Ом отразятся на работе в целом не хватает знаний матчасти. Слишком уж маленькое, как-бы чего не сгорело?

3. Если по данному принципу подключить все 5 датчиков(благо на Nano аналоговых портов хватает, а вот возможности пятивольтового пина мной пока не исследованы) не сгорит ли все это к чертям, а если нет то не повлияет ли это на надежность работы устройства?

4. Вытекает из предыдущего вопроса: быть может на один измерительный делитель повесить все датчики и опрашивать их попеременно, включая/выключая каким-нибудь мосфетом(каким?) в роли управляемого выключателя.

5. Как все это уживется с модулем bluetooth, не будет ли помех или большой нагрузки по току на сам контроллер?

6. Питание Ардуины предполагается от бортовых 11-15V автомобиля через DC-DC понижающий  стабилизатор типа LM2596. Насколько удачно это решение? Любые советы приветствуются.

Прототип собрал пока в онлайн песочнице и там все работает отлично.

P.S.: Я инженер по образованию и призванию души, и гуманитарий по трудовой книжке, поэтому прошу делать на это скидку и по возможности давать подробные ответы или хотя бы не кидаться помидорами :)

Благодарю.

Focus
Offline
Зарегистрирован: 05.04.2015

А если не ставить преобразователь, а просто кренку на 9в, потом 9 вольт подать на Vin ? ну и фильтр перед кренкой обязательно.

"столкнувшись с непредсказуемым напряжением на пине +5V" - что в нем не предсказуемого? Предпологаю, что при питании НАНО от УСБ там нет 5в? Если подавать на Vin от 7в и выше, помоему с 5в всё нормально.

И ещё для измерения Vcc есть программный метод, вроде даже работает, делал пару лет назад, описан тут

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Напряжение питания, а это и есть ваши +5 Вольт,
легко измеряется безо всяких внешних навесных компонентов.
Ищите "секретный вольтметр" на Ардуино.

svm
Offline
Зарегистрирован: 06.11.2016

dimiork пишет:

Теперь вопросы:

1. Правильно ли я все придумал? Быть может есть более элегантное решение, НЕ требующее покупки каких-то дорогих источников опорного напряжения?

2. R3 = 10 Ом. При таком номинале получаемые результаты имеют достаточную для всего этого дела точность. Однако, понять как 10 Ом отразятся на работе в целом не хватает знаний матчасти. Слишком уж маленькое, как-бы чего не сгорело?

3. Если по данному принципу подключить все 5 датчиков(благо на Nano аналоговых портов хватает, а вот возможности пятивольтового пина мной пока не исследованы) не сгорит ли все это к чертям, а если нет то не повлияет ли это на надежность работы устройства?

4. Вытекает из предыдущего вопроса: быть может на один измерительный делитель повесить все датчики и опрашивать их попеременно, включая/выключая каким-нибудь мосфетом(каким?) в роли управляемого выключателя.

5. Как все это уживется с модулем bluetooth, не будет ли помех или большой нагрузки по току на сам контроллер?

6. Питание Ардуины предполагается от бортовых 11-15V автомобиля через DC-DC понижающий  стабилизатор типа LM2596. Насколько удачно это решение? Любые советы приветствуются.

1 опорный источник в ардуино встроен, посмотрите тему http://arduino.ru/forum/proekty/universalnyi-arduino-probnik там про него достаточно написано

2 10 ом мало. При случайном замыкании щупов сгорит или этот резистор, дорожки ардуино или стабилизатор. Т.К. ток будет около 0,5 А. Минимум Ом 500. Их достаточно чтобы измерять от 1 ома. Можете посмотреть в той-же теме.

3 Если дактчики отдельные, то в принципе можно, а если они работают в автомобиле, то на них скорее всего будет какое-то напряжение, и мерять сопротивление бессмысленно.

По остальным вопросам будет зависеть от решения первых.

dimiork
Offline
Зарегистрирован: 23.05.2018
Благодарю всех отписавшихся!
 
Статью про "точный и секретный вольтметр" находил, но т.к. не понял, что за магия :) происходит в функции readVcc() проигнорировал, а зря.
Теперь определять величину Vcc могу без доп. обвески, на Vin подал 9,5V через инверторный стабилизатор и теперь напряжение на Vcc достаточно стабильно, однако, analogRead гуляет в пределах +/-3 единиц, что при расчете сопротивления дает погрешность в пределах нескольких Ом.
 
Пример:
Rx = 117.76; Vcc = 5.11; analogRead = 937
Rx = 119.25 Vcc = 5.11; analogRead = 936
Rx = 120.75 Vcc = 5.11; analogRead = 935
 
 
Vcc и analogRead снимается 5 раз и выводятся усредненные значения.
Полагаю, что причина разбежек в том, что получение значений не синхронизировано: в момент расчета Vcc - напряжение на аналоговом пине одно, в момент чтения аналогового пина, уже скакнуло Vcc. Погрешность допустимая(мне достаточна точность в 10 Ом), но если оно вздумает скакать в более широком диапазоне, то будут достаточно искаженные значения. Других мыслей пока нет.
Прошу подтолкнуть в нужном направлении или устранения причины или сглаживания показаний.
 
Тестовая функция для расчета Vcc и искомого сопротивления на делителе(Rx):
float readVcc() {
  byte i;
  float result = 0.0;
  float tmp = 0.0;
  int analog = 0;
  int Rref = 1283;

  for (i = 0; i < 5; i++) {
    // Read 1.1V reference against AVcc
    // set the reference to Vcc and the measurement to the internal 1.1V reference
    ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
    delay(3); // Wait for Vref to settle
    ADCSRA |= _BV(ADSC); // Start conversion
    while (bit_is_set(ADCSRA,ADSC)); // measuring

    uint8_t low  = ADCL; // must read ADCL first - it then locks ADCH
    uint8_t high = ADCH; // unlocks both

    tmp = (high<<8) | low;
    analog = analog  + analogRead(0);
    tmp = (1.1 * 1023.0) / tmp;
    result = result + tmp;
    
    delay(20);
  }
  result = result / 5;
  analog = analog / 5;
  float Rx = Rref * ((result / (analog * result / 1023)) - 1);

  Serial.print(Rx);
  Serial.print("\t");
  Serial.print(result);
  Serial.print("\t");
  Serial.println(analog);
  
  return result;
}

 

 
svm
Offline
Зарегистрирован: 06.11.2016

В принципе для измерения сопротивлений не нужно знать точное значение напряжение, достаточно знать сооотношение напряжений в двух точках измерительной цепи. Значение (в попугаях) на верхнем  и нижнем резисторе измерительной цепи.  За  время измерений вероятность изменения напряжения питания достаточно невелика.   В ссылках на пробник измерения с использованием значения напряжения источника питания учитываются только в 5 режиме (сопротивления < 10 Ом). Т.к. там для увеличения точности (разрешения АЦП) используетя опорное 1.1 В., при котором невозможно измерить значение напряжения (около 5 В) на верхнем резисторе. Поэтому напряжение на верхнем резисторе измеряется при опорном 5 В, а на нижнем при опорном 1,1 В. (реально для конкретной атмеги 168 оказалосьоколо 1.034 В). В этом режиме повторяемость измерений самая плохая. Далее до 100 кОм все достаточно стабильно. При дальнйшем увеличении сопротивления начинается болтанка связанная с наводками. При питании от атономного источника можно мерять до 1 МОм. Болтанка показаний +- 2 еденицы младшего разряда- это в принципе нормально и лучше их на индикацию не выводить.