Arduino Nano и измерение напряжение с нагрузкой

md750
Offline
Зарегистрирован: 30.03.2017

Проблема в следующем. Измеряю напряжение на аналоговом входе и вывоже результат в консоль. Штатно все достаточно точно измеряет, но стоит подключить нагрузку на цифровые выходы, результаты измерения сильно искажаются. Результаты завышаются. Чем больше нагрузка на цифровых выходах, тем сильнее искажается результ.

Даже при минимальном подключении одного светодиода, результат измерений уже уходит за 5%, пара светодиодов и полевой транистор искажают результат уже процентов на 20 и более. Т.е. ни каких измерений при нагрузке на цифровых выходах практически невозможно произвести.

Это нормально или я делаю что то не так? Проблема в моей ардуине или в руках?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

(Заглянув в хрустальный шар:) искажения происходят в одну и ту же сторону - завышения показаний?

T.Rook
Offline
Зарегистрирован: 05.03.2016

(Глядя в серебрянное зеркало, где видно отражение хрустльного шара) : питания падение предположить возможно.  Но код и схему - не разлядеть никак. Смутны следы силы сегодня.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

I'm one with the Force and the Force is with me.

md750
Offline
Зарегистрирован: 30.03.2017

Ту andriano: Искажения естественно в одну сторону, естественно - заавышение.

Ту T.Rook: Схема уж не знаю рисовать зачем, аналог на вход, цифровые на выход. Ни чего сверх естественного.  Код проще не куда, не знаю чем он может помочь.

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

 

#include <TimerOne.h> 

int led = 9;
int bInPin = A7; 
int bVoltValue = 0;
float bVolt = 0;

int rele1 = 8;
int rele2 = 7;
int b1 = 5;
int b2 = 6;

void setup() {
  pinMode(led, OUTPUT);
  pinMode(rele1, OUTPUT); // Канал реле 1
  pinMode(rele2, OUTPUT); // Канал реле 2
  digitalWrite(rele1,LOW);
  digitalWrite(rele2,LOW);
  pinMode(b1, INPUT); // Кнопка 1
  pinMode(b2, INPUT); // Кнопка 2
  Serial.begin(9600);
  Timer1.initialize(2000000);                  // Initialise timer one per minute 1 sec = 1 000 000 
  Timer1.attachInterrupt( timerIsr );           // attach the ISR routine 
  digitalWrite(led,LOW);
}

// the loop function runs over and over again forever
void loop() {
  if (digitalRead(b1) == HIGH) {
    digitalWrite(rele1,!digitalRead(rele1));
    digitalWrite(led,!digitalRead(led));
    delay(500);
  }
}

void timerIsr()
{
  bVoltValue = analogRead(bInPin);
  bVolt = bVoltValue * 5000./1023000.;
  Serial.println(V*bVolt,3);
}

 

T.Rook
Offline
Зарегистрирован: 05.03.2016

Схема затем, что бы было видно куда Вы нагрузку подвесили. И если это не внешний бп, а 5В ардуиновских , то лечите разделением питания нагрузки и цепей управления

md750
Offline
Зарегистрирован: 30.03.2017

Для примера - имею один светодиод, который питается с цифрового выхода. Светодиод включен через резистор на землю. Питание ардуины от usb порта. С выключенным светодиодом результат измерения напряжения 3.854. Если подать сигнал на цифровой выход и зажечь светодиод получаю результат 4.150, если добавить еще один диод то 4.184. Это не в какие ворота. Я с трудом представляю как изолировать включение диодов =(

Ставить маломощные транзисторы в ключевом режиме и напряжение на светодиоды давать с внешнего источника питания?

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

md750 пишет:

 Схема уж не знаю рисовать зачем, аналог на вход, цифровые на выход. Ни чего сверх естественного.  Код проще не куда, не знаю чем он может помочь.

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

Схема (меня опередили), нужна для того, чтобы понять куда вы шаловливыми ручками реле повесили, на отдельный блок или на бедную-маленькую ардуинку.

Да, у вас просаживается напряжение.

Да, это лечится, Нет так быть не должно.

Причина - ваши кривые руки.

------------------

Лечение:

1 вариант. Питание ардуины - священно и ничего на него не вешать. Все говно питать отдельно. По земле дополнительно поставить фильтрующие конденсаторы.

 

2. Вариант, питать не так строго, но, перед тем, как измерять нужное напряжение, измерить свое напряжение питания (в Гугль!), и умножать не на 5000., а на то к-во милливольт, которое порлучилось.

При этом ОБЯЗАТЕЛЬНО вынуть из прерывания всю херню, которую вы туда понаставили. В прерывании просто поднять флаг, а в loop() постоянно проверять наличие флага и, если он поднят, выполнить то, что вы запихнули, по незнанию, в прерывание. Само собой - убрать из loop() delay()! Заменить его проверкой текущего времени (millis()) и выпеолнять то, что вы там делаете каждые 500 мс.

Все это важно для варианта 2 потому, что измерение станет дольше. И так очень плохо пихать длинные действия в прерывание. Только хороший программист, которые совершенно точно знает, что происходит в коде, может позволить себе длинные действия в прерывании.

T.Rook
Offline
Зарегистрирован: 05.03.2016

Еще можно/нужно  почитать про analogReference

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

T.Rook пишет:

Еще можно/нужно  почитать про analorReference

предположим, что ему нужен диапазон питания, а про делитель напряжения, он нихрена не знает ;)

T.Rook
Offline
Зарегистрирован: 05.03.2016

хм.... ну тогда может перепаять 1117 на на ардуинке на более мощный? А? угадал?

md750
Offline
Зарегистрирован: 30.03.2017

Можно и поглумиться =)

T.Rook/wdrakula - Про analogReference, опорное напряжение и "правильное" измерение напряжения я в курсе. В моем контексте на данном этапе не принципиально.

wdrakula я не хороший программист, но знаю что происходит в коде. Каждые 500 секунд ни чего не делается, задержка дребезга контактов кнопки при нажатии. Измерение напряжения раз в 2 секунды, при любом методе расчета, ни чем не навредит, хотя совет по флагу в прерывании имеет смысл.

Раз теоретически лечится,  подскажите как лечить. Для примера я привел 2 светодиода на цифровых выходах. Как их по правильному подключить, чтобы они не влияли на результат измерения?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

еще один упоротый!

Я написал - "КАК".

Измерять сперва напряжение питания. И я,  и евгенийП и еще куча народа выкладывали тут функцию измерения напряжения питания.

Не найдете - ищите в гугле. Она зависит от применяемого контроллера.

А ПОТОМ, измеряете свое напряжение, используя напряжение питания, как опорное.

Или используйте внутренний источник, если понимаете как.

--------------------

Вы не можете даже вообразить, как задалбывают ОДНИ И ТЕЖЕ вопросы из месяца в месяц.

Потому старожилы и становятся злыми и циничными.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

md750 пишет:

 Для примера я привел 2 светодиода на цифровых выходах. Как их по правильному подключить, чтобы они не влияли на результат измерения?

это ПИТАНИЕ, хрустального шара у меня нет. Возьмите мультиметр и посмотрите, что происходит на шине питания, при включении диодов.

Если просадка большая - у Вас кабель USB - говно. и т.д. вариантов может быть много.

Работайте головой, собственной! Форум - это не справочная.

Сюда приходят ПОСЛЕ самостоятельного поиска ответов в гугле и книгах.

T.Rook
Offline
Зарегистрирован: 05.03.2016

md750 пишет:

Раз теоретически лечится,  подскажите как лечить.

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

T.Rook
Offline
Зарегистрирован: 05.03.2016

md750 пишет:

 Про analogReference, опорное напряжение и "правильное" измерение напряжения я в курсе. В моем контексте на данном этапе не принципиально.

Для восстановления нити беседы: Первичный вопрос был почему плавают результаты при измерениях. Объяснили почему, рассказали как мерять.  Оказывается это не принципиально. Ладно. В чем сейчас вопрос?

 

 

 

md750
Offline
Зарегистрирован: 30.03.2017

Вопрос остался в общем один, озвученный выше. 

Так как пара светодиодов цифровых выходах дает "просадку" напряжения и влияет на результат измерения я с трудом представляю как изолировать включение диодов.

Ставить маломощные транзисторы в ключевом режиме и напряжение на светодиоды подавать с внешнего источника питания? Или еще какой то вариант стоит рассмотреть?

T.Rook
Offline
Зарегистрирован: 05.03.2016

md750 пишет:

Ставить маломощные транзисторы в ключевом режиме и напряжение на светодиоды подавать с внешнего источника питания?

Да. Вы же в курсе про нагрузочную способность выходов ардуинки?

Но зачем оставлять зависимость качества измерения от стабильности питающего?! Может таки проще по хорошоему организовать измерение?

 

md750
Offline
Зарегистрирован: 30.03.2017

T.Rook пишет:

md750 пишет:

Раз теоретически лечится,  подскажите как лечить.

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

Если я правильно понимаю, без внешнего источника опорного напряжения невозможно получить стабильный результат измерения при нагрузке на цифровых портах ардуино?

md750
Offline
Зарегистрирован: 30.03.2017

T.Rook пишет:

Да. Вы же в курсе про нагрузочную способность выходов ардуинки?

Но зачем оставлять зависимость качества измерения от стабильности питающего?! Может таки проще по хорошоему организовать измерение?

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

Ок. Понял вас. Спасибо.

T.Rook
Offline
Зарегистрирован: 05.03.2016

md750 пишет:

Если я правильно понимаю, без внешнего источника опорного напряжения невозможно получить стабильный результат измерения при нагрузке на цифровых портах ардуино?

Есть внутренний 1.1В. Но величина опорного это максимальная величина измерения. Если нужно больше ( через делитель точность не устаивает), то вешаем простейший стаб (стабилитрон + резистор) на нужное напряжение. Но, конечно, все равно это меньше питающего. Вариантов масса :)

md750
Offline
Зарегистрирован: 30.03.2017

В общем, по результатам экспериментов. При "правильном" измрении напряжения и минимизации нагрузки до 9мА (реле через мосфет, питается реле от внешнего источника) завышается результат измерения на 0.098, при использовании встроенного опорного напряжения завышается на 0.161. Остановился на первом варианте.