Вопрос по реле.

bezzeb
Offline
Зарегистрирован: 02.11.2013

Добрый день

Подскажите пожалуйста с таким вопросом.

нужно переключать с помощью реле каналаы для измерения напряжения на батареях 45-70в.

Возможно ли использовать такие модули как этот?

написано,что до 30вольт и 10а.

но ведь при измерении не будет больших токов.

или есть конструкционные нюансы?

благодарю за ответ

[img]https://a.radikal.ru/a31/2004/34/4edcd1c7e02f.jpg[/img]

bezzeb
Offline
Зарегистрирован: 02.11.2013

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

Если Вы будете использовать для измерения напряжения встроенный АЦП Ардуино УНО (Нано, Леонардо), то там достоверные 8 двоичных разрядов и использование таких реле на точности измерений, на мой взгляд, существенно не скажется. Могу посоветовать со стороны входа(входов) АЦП поставить делитель напряжения, который бы на момент измерения обеспечивал ток через контакты реле примерно 5...10 мА. Это примерно соответствует минимальному коммутируемому току для реле такого класса.

bezzeb
Offline
Зарегистрирован: 02.11.2013

Duino A.R. пишет:

Если Вы будете использовать для измерения напряжения встроенный АЦП Ардуино УНО (Нано, Леонардо), то там достоверные 8 двоичных разрядов и использование таких реле на точности измерений, на мой взгляд, существенно не скажется. Могу посоветовать со стороны входа(входов) АЦП поставить делитель напряжения, который бы на момент измерения обеспечивал ток через контакты реле примерно 5...10 мА. Это примерно соответствует минимальному коммутируемому току для реле такого класса.

да.делитель конечно же будет.

вопрос в том,что выдержат ли 70в реле.

 

-NMi-
Offline
Зарегистрирован: 20.08.2018

ниачкуй, сдюжат!

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

Если 220 выдерживают, то почему 70 не выдержат?

bezzeb
Offline
Зарегистрирован: 02.11.2013

ОК.Спасибо всем.

Тема закрыта

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

bezzeb пишет:

вопрос в том,что выдержат ли 70в реле.

В данном случае - выдержат.

bezzeb
Offline
Зарегистрирован: 02.11.2013

Тогда снова открываю тему,возник такой вопрос.

При считывании напряжений,первый раз показывает правильное напряжение(пока тестирую первый вход) потом все нули

#include <LiquidCrystal_I2C.h>
#include <Wire.h> 
// Определяем пин, используемый для подключения реле
#define PIN_RELAY1 2 
#define PIN_RELAY2 3 
#define PIN_RELAY3 4
#define PIN_RELAY4 5
#define PIN_RELAY5 6
#define PIN_RELAY6 7
#define PIN_RELAY7 8
#define PIN_RELAY8 9
// вход подключен к контакту 
const int potPin1 = 0;
const int potPin2 = 1;
const int potPin3 = 2;
const int potPin4 = 3;
const int potPin5 = 4;
const int potPin6 = 5;
const int potPin7 = 6;
const int potPin8 = 7;
// переменная для хранения данных от входа:
int potValue1 = 0;
int potValue2 = 0;
int potValue3 = 0;
int potValue4 = 0;
int potValue5 = 0;
int potValue6 = 0;
int potValue7 = 0;
int potValue8 = 0;
//адрес дисплея

int analogInput = 0;
float vout1 = 0.0;
float vout2 = 0.0;
float vout3 = 0.0;
float vout4 = 0.0;
float vout5 = 0.0;
float vout6 = 0.0;
float vout7 = 0.0;
float vout8 = 0.0;
float vin1 = 0.0;
float vin2 = 0.0;
float vin3 = 0.0;
float vin4 = 0.0;
float vin5 = 0.0;
float vin6 = 0.0;
float vin7 = 0.0;
float vin8 = 0.0;

float R1 = 10000.0; // резистор R1 (100K)
float R2 = 680.0; // резистор R2 (10K)
int value = 0;
void setup() {
  Serial.begin(115200);
  pinMode(PIN_RELAY1, OUTPUT);
  pinMode(PIN_RELAY2, OUTPUT);
  pinMode(PIN_RELAY3, OUTPUT);
  pinMode(PIN_RELAY4, OUTPUT);
  pinMode(PIN_RELAY5, OUTPUT);
  pinMode(PIN_RELAY6, OUTPUT);
  pinMode(PIN_RELAY7, OUTPUT);
  pinMode(PIN_RELAY8, OUTPUT);
  digitalWrite(PIN_RELAY1, LOW); 
  digitalWrite(PIN_RELAY2, LOW); 
  digitalWrite(PIN_RELAY3, LOW); 
  digitalWrite(PIN_RELAY4, LOW); 
  digitalWrite(PIN_RELAY5, LOW); 
  digitalWrite(PIN_RELAY6, LOW); 
  digitalWrite(PIN_RELAY7, LOW); 
  digitalWrite(PIN_RELAY8, LOW); 
  
}

void loop() {
  // считываем данные :
  
  //1
  digitalWrite(PIN_RELAY1, HIGH);
  digitalWrite(PIN_RELAY2, LOW);
  digitalWrite(PIN_RELAY3, LOW);
  digitalWrite(PIN_RELAY4, LOW);
  digitalWrite(PIN_RELAY5, LOW);
  digitalWrite(PIN_RELAY6, LOW);
  digitalWrite(PIN_RELAY7, LOW);
  digitalWrite(PIN_RELAY8, LOW);
  potValue1 = analogRead(potPin1);
  delay(500);
  
 //2
  digitalWrite(PIN_RELAY1, LOW);
  digitalWrite(PIN_RELAY2, HIGH);
  digitalWrite(PIN_RELAY3, LOW);
  digitalWrite(PIN_RELAY4, LOW);
  digitalWrite(PIN_RELAY5, LOW);
  digitalWrite(PIN_RELAY6, LOW);
  digitalWrite(PIN_RELAY7, LOW);
  digitalWrite(PIN_RELAY8, LOW);
  potValue2 = analogRead(potPin2);
  delay(500);
  //3
  digitalWrite(PIN_RELAY1, LOW);
  digitalWrite(PIN_RELAY2, LOW);
  digitalWrite(PIN_RELAY3, HIGH);
  digitalWrite(PIN_RELAY4, LOW);
  digitalWrite(PIN_RELAY5, LOW);
  digitalWrite(PIN_RELAY6, LOW);
  digitalWrite(PIN_RELAY7, LOW);
  digitalWrite(PIN_RELAY8, LOW);
  potValue3 = analogRead(potPin3);
  delay(500);
  //4
  digitalWrite(PIN_RELAY1, LOW);
  digitalWrite(PIN_RELAY2, LOW);
  digitalWrite(PIN_RELAY3, LOW);
  digitalWrite(PIN_RELAY4, HIGH);
  digitalWrite(PIN_RELAY5, LOW);
  digitalWrite(PIN_RELAY6, LOW);
  digitalWrite(PIN_RELAY7, LOW);
  digitalWrite(PIN_RELAY8, LOW);
  potValue4 = analogRead(potPin4);
  delay(500);
  //5
  digitalWrite(PIN_RELAY1, LOW);
  digitalWrite(PIN_RELAY2, LOW);
  digitalWrite(PIN_RELAY3, LOW);
  digitalWrite(PIN_RELAY4, LOW);
  digitalWrite(PIN_RELAY5, HIGH);
  digitalWrite(PIN_RELAY6, LOW);
  digitalWrite(PIN_RELAY7, LOW);
  digitalWrite(PIN_RELAY8, LOW);
  potValue5 = analogRead(potPin5);
  delay(500);
  //6
  digitalWrite(PIN_RELAY1, LOW);
  digitalWrite(PIN_RELAY2, LOW);
  digitalWrite(PIN_RELAY3, LOW);
  digitalWrite(PIN_RELAY4, LOW);
  digitalWrite(PIN_RELAY5, LOW);
  digitalWrite(PIN_RELAY6, HIGH);
  digitalWrite(PIN_RELAY7, LOW);
  digitalWrite(PIN_RELAY8, LOW);
  potValue6 = analogRead(potPin6);
  delay(500);
  //7
  digitalWrite(PIN_RELAY1, LOW);
  digitalWrite(PIN_RELAY2, LOW);
  digitalWrite(PIN_RELAY3, LOW);
  digitalWrite(PIN_RELAY4, LOW);
  digitalWrite(PIN_RELAY5, LOW);
  digitalWrite(PIN_RELAY6, LOW);
  digitalWrite(PIN_RELAY7, HIGH);
  digitalWrite(PIN_RELAY8, LOW);
  potValue7 = analogRead(potPin7);
  delay(500);
  //8
  digitalWrite(PIN_RELAY1, LOW);
  digitalWrite(PIN_RELAY2, LOW);
  digitalWrite(PIN_RELAY3, LOW);
  digitalWrite(PIN_RELAY4, LOW);
  digitalWrite(PIN_RELAY5, LOW);
  digitalWrite(PIN_RELAY6, LOW);
  digitalWrite(PIN_RELAY7, LOW);
  digitalWrite(PIN_RELAY8, HIGH);
  potValue8 = analogRead(potPin8);
  delay(500);
  //рассчет
  //1 канал
  vout1 = (potValue1 * 5) / 1024.0; //опорное напряжение на разрешение ацп
  vin1 = (vout1 / (R2/(R1+R2)))*1; //d конце коэф для приведения к оригиналу
  if (vin1<0.1) {
  vin1=0.0;//statement to quash undesired reading !
  }
  //2 канал
  vout2 = (potValue2 * 5) / 1024.0; //опорное напряжение на разрешение ацп
  vin2 = (vout2 / (R2/(R1+R2)))*1; //d конце коэф для приведения к оригиналу
  if (vin2<0.1) {
  vin2=0.0;//statement to quash undesired reading !
  }
  //3 канал
  vout3 = (potValue3 * 5) / 1024.0; //опорное напряжение на разрешение ацп
  vin3 = (vout3 / (R2/(R1+R2)))*1; //d конце коэф для приведения к оригиналу
  if (vin3<0.1) {
  vin3=0.0;//statement to quash undesired reading !
  }
  //4 канал
  vout4 = (potValue4 * 5) / 1024.0; //опорное напряжение на разрешение ацп
  vin4 = (vout4 / (R2/(R1+R2)))*1; //d конце коэф для приведения к оригиналу
  if (vin4<0.1) {
  vin4=0.0;//statement to quash undesired reading !
  }
  //5 канал
  vout5 = (potValue5 * 5) / 1024.0; //опорное напряжение на разрешение ацп
  vin5 = (vout5 / (R2/(R1+R2)))*1; //d конце коэф для приведения к оригиналу
  if (vin5<0.1) {
  vin5=0.0;//statement to quash undesired reading !
  }
  //6 канал
  vout6 = (potValue6 * 5) / 1024; //опорное напряжение на разрешение ацп
  vin6 = (vout6 / (R2/(R1+R2)))*1; //d конце коэф для приведения к оригиналу
  if (vin6<0.1) {
  vin6=0.0;//statement to quash undesired reading !
  }
  //7 канал
  vout7 = (potValue7 * 5) / 1024.0; //опорное напряжение на разрешение ацп
  vin7 = (vout7 / (R2/(R1+R2)))*1; //d конце коэф для приведения к оригиналу
  if (vin7<0.1) {
  vin7=0.0;//statement to quash undesired reading !
  }//8 канал
  vout8 = (potValue8 * 5) / 1024.0; //опорное напряжение на разрешение ацп
  vin8 = (vout8 / (R2/(R1+R2)))*1; //d конце коэф для приведения к оригиналу
  if (vin8<0.1) {
  vin8=0.0;//statement to quash undesired reading !
  }

//вывод 
Serial.println("Voltage of Battery");
//1

Serial.println("Voltage1=");
Serial.print(vout1);
//2

Serial.println("Voltage2=");
Serial.print(vout2);
//3

Serial.println("Voltage3=");
Serial.print(vout3);
//4

Serial.println("Voltage4=");
Serial.print(vout4);
//5

Serial.println("Voltage5=");
Serial.print(vout5);
//6

Serial.println("Voltage6=");
Serial.print(vout6);
//7

Serial.println("Voltage7=");
Serial.print(vout7);
//8
Serial.println("Voltage8=");
Serial.print(vout8);

  
  
 
}

подскажите где может быть ошибка?

b707
Offline
Зарегистрирован: 26.05.2017

пипец какой-то, а не код. Вы о функциях и массивах ничего не слыхали?

-NMi-
Offline
Зарегистрирован: 20.08.2018

b707 пишет:

пипец какой-то, а не код.

Этт сматря с какой стараны сматрэть - если оплата идёт "построчно" -> код просто гениален!!!

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

bezzeb пишет:

подскажите где может быть ошибка?

Так Вы отладочный вывод на разные переменные вставляйте в разные части программы и смотрите, что изменяется не так, как Вы того ожидали.

Bruzzer
Offline
Зарегистрирован: 17.03.2020

В зависимости от времени срабатывания реле надо вставить задержку.

Но может быть дело не только в этом, подробно не смотрел.

И в зависимости от схемотехники может иметь значение порядок включения - отключения. Может быть правильнее сначала отключить подключенное реле, а потом подключать новое, чтобы не было одновременных подключений.

b707
Offline
Зарегистрирован: 26.05.2017

В первую очередь надо переписать код, чтобы не было повторов, этот никуда не годится

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

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

Calmness
Offline
Зарегистрирован: 29.10.2019

 Все повторяющиеся блоки надо вынести в функции, и почему умножаем на 1024  ,а не на 1023 ? ( Мелочь ,но...)

Пионер
Offline
Зарегистрирован: 04.02.2019

Calmness пишет:

 Все повторяющиеся блоки надо вынести в функции, и почему умножаем (????) на 1024  ,а не на 1023 ? ( Мелочь ,но...)

10-bit ADC has 210 , or 1,024 possible output codes.

b707
Offline
Зарегистрирован: 26.05.2017

Пионер пишет:

10-bit ADC has 210 , or 1,024 possible output codes.

Максимальное значение ADC (2**10 -1) = 1023. поэтому при вычислении напряжения и умножать надо на 1023. а не на 1024. При умножении на 1024 формула даст неверное значение

Для проверки рассмотрите случай с однобитным ADC

bezzeb
Offline
Зарегистрирован: 02.11.2013

b707 пишет:

пипец какой-то, а не код. Вы о функциях и массивах ничего не слыхали?

слышал.

сделал массив.

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

bezzeb
Offline
Зарегистрирован: 02.11.2013

Bruzzer пишет:

В зависимости от времени срабатывания реле надо вставить задержку.

Но может быть дело не только в этом, подробно не смотрел.

И в зависимости от схемотехники может иметь значение порядок включения - отключения. Может быть правильнее сначала отключить подключенное реле, а потом подключать новое, чтобы не было одновременных подключений.

делаю так.

выключаю все реле в настройках.

потом идет включение 1-го канала,считывание.

итак 8 раз.

 

как показала практика при тесте на 1 канале все работает нормально.

как пытаюсь уже 2 проверить таким образом пишет нули

bezzeb
Offline
Зарегистрирован: 02.11.2013

b707 пишет:

Пионер пишет:

10-bit ADC has 210 , or 1,024 possible output codes.

Максимальное значение ADC (2**10 -1) = 1023. поэтому при вычислении напряжения и умножать надо на 1023. а не на 1024. При умножении на 1024 формула даст неверное значение

Для проверки рассмотрите случай с однобитным ADC

спасибо учту

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

bezzeb пишет:

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

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

bezzeb
Offline
Зарегистрирован: 02.11.2013

изначально вольтметр планировался для измерения последовательно подключенных батарей с напряжением 70вольт.

поэтому сделано 8 каналов измерений,каждый со своим делителем и парой реле

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

bezzeb, я прошу Вас привести не картинку нескольких модулей, а именно полную схему Вашего устройства, которая должна содержать все элементы и их соединения, а также ссылки на внешние подключения. Можно не мгновенно, но именно схему и именно Вашего конкретного устройства. Я по фотографии не лечу. :))

bezzeb пишет:
поэтому сделано 8 каналов измерений,каждый со своим делителем и парой реле

Какие делители и как они включены? На картинке их совсем нет. Почему на каждый канал именно 2 реле?

bezzeb
Offline
Зарегистрирован: 02.11.2013

Извиняюсь,хотел побыстрей ответить.

Вот два канала .

Делитель состоящий из резисторов 10к и 680 ,чтобы уменьшить напряжение до диапазона 0-5вольт

уже проверен и работает правильно

Чтобы отсечь и землю и АЦП т.к земля общая.

и при изменении в месте соединения батарей получили бы замыкание

 

по одному каждый канал работает нормально.

а вот ,когда два.уже пишет значения 0.1 или 0

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

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

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

1. У Вас что, не электромагнитные реле, а оптронные развязки? Или это тоже результат спешки?

2. А зачем здесь вообще много каналов на МК, если напряжения батарей одно и то же и все каналы гальванически развязаны реле? Делайте один канал, один входной делитель и подключайте его куда надо с помощью реле.

bezzeb
Offline
Зарегистрирован: 02.11.2013

 

1)электромагнитные,шилд из 8 реле .

в программе просто не нашел обычных реле.

2)да,вы совершенно правы,почему-то про это не подумал.

Но пока схема уже собрана и хотелось бы ее запустить.

Сейчас порпобовал открыть все реле-показывают правильное напряжение

 

p.s сервер вроде тоже ухудшил изображение

 

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

bezzeb пишет:

1)электромагнитные,шилд из 8 реле . в программе просто не нашел обычных реле.

Понятно. Пару контактов и светодиод внутри прямоугольника можно было самому нарисовать за несколько минут. Это лучше, чем несоответствующий элемент на схеме и словесное объяснение, что там на самом деле. Всё-таки смотрят схему, она для этого и служит, а электромагнитное реле и твердотельное - большая разница.

bezzeb пишет:
2)да,вы совершенно правы,почему-то про это не подумал. Но пока схема уже собрана и хотелось бы ее запустить.

Обычно такая позиция у госзаказчика: "Да, не спросили, да не то, но менять ничего не будем, переподписывать полгода, сделайте что-нибудь рабочее из того, что заказали."

Я бы схему перемонтировал. Объём не велик. Вы этим уйдёте от разных делителей и дополнительных сложностей.

bezzeb пишет:
Сейчас порпобовал открыть все реле-показывают правильное напряжение

Не понял. Всё ОК? Тему можно закрывать?

bezzeb пишет:
p.s сервер вроде тоже ухудшил изображение

Лучше чем было, но номера выводов, например, не читаются совсем.

 

 

bezzeb
Offline
Зарегистрирован: 02.11.2013

да,согласен,неправильно сделал

 

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

а в дальнейшем уже подумываю всю схему заменить на мультиплексор т.к в идеале нужно 16 батарей мерять.

 

нет,не все ок.

изначально я хотел включать первую пару реле и измерять результат.

После прохода 8 каналов выводить результат.

сейчас результат выводится либо если все реле включены,либо если беру 1 канал(включение/выключение пары реле,показывает либо 12в либо 0).

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

 

ну оригинал изображения четкий и все видно.

странно

 

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

bezzeb пишет:

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

Хозяин-барин. Вам виднее.

bezzeb пишет:
а в дальнейшем уже подумываю всю схему заменить на мультиплексор т.к в идеале нужно 16 батарей мерять.

Электромагнитные реле - нормальное решение для измерительных коммутаторов, если измерения не спешные и схема аккуратная. Вы хотите заменить их аналоговыми микросхемами? С такими уровнями входных напряжений и "плавающей землёй"? Не ищете Вы лёгких путей...

bezzeb пишет:
сейчас результат выводится либо если все реле включены,...

Если все реле включены, то нижняя (нижние) по схеме батарея (батареи) будет замкнута накоротко на общий провод и на входе нижнего канала тоже будет аппаратный 0. 

 

bezzeb
Offline
Зарегистрирован: 02.11.2013

спасибо за советы.действительно очень дельные.

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

 

да.измерения очень неспешные будут.

побаиваюсь того,что реле имеют ограниченое количество срабатываний.

микросхемы вроде надежней.

 

пока тестирую все от лабораторного блока питания с выходом 12вольт.

так,что на все входы ацп подается все от 1 источника.

т.к нужно быть уверенным в правильной работе реле.

и лишь потом планирую подключать к батарее 

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

bezzeb пишет:
но пока хочется запустить все и потом уже по результатам модернизирую так,чтоб было лучше и надежно

Желание понятно, только и схема (какая она, да и есть ли она?), и программа (кстати, то же с вырезками, а не полная)... Комментировать не буду, но "с этим надо что-то делать".

bezzeb пишет:
  да.измерения очень неспешные будут. побаиваюсь того,что реле имеют ограниченое количество срабатываний.

Механический ресурс при ненагруженной контактной группе обычно от 10(5) до 10(6) срабатываний.

bezzeb пишет:
микросхемы вроде надежней.

Говорить можно о надежности всего схемотехнического решения. Микросхему можно убить быстрее, чем реле. Если уметь. :))

bezzeb пишет:
пока тестирую все от лабораторного блока питания с выходом 12вольт. так,что на все входы ацп подается все от 1 источника.

Стоп! Но это принципиальное несоответствие исходным требованиям. У Вас 2 (две) батареи, включенные последовательно. Вы никак не сможете имитировать их работы одним однополярным источником! Это вот когда полной нормальной схемы нет, начинается... Причем, как выясняется, схема рабочая и схема эксперимента - по сути разные. Как тут можно косяки отловить?

bezzeb пишет:
т.к нужно быть уверенным в правильной работе реле.

Немного о реле. Реле срабатывает не мгновенно. Для таких реле, как у Вас время срабатывания и отпускания (они разные) составляют единицы миллисекунд. Вы в программе подаете все команды одним блоком на все реле сразу. На выводах контроллера сигналы появятся с интервалом в микросекунды, т.е. с точки зрения реле - одновременно. Реле начнут, кто замыкать контакты, кто размыкать. Они еще не успеют сменить свои состояния, а Вы уже считываете значение АЦП и тоже быстрее, чем сработают реле. Дальше по схеме проанализируйте, что поступает на вход каких каналов в этом случае, а какие каналы (батареи!) остаются с КЗ на время измерения.

У Вас в системе есть совершенно однозначное запрещенное состояние - нельзя одновременно включать разные пары реле. Иначе - КЗ нижней батареи. Поэтому при вЫключении любой пары реле нужно выдержать паузу на её физическое выключение и только потом включать следующую пару.

bezzeb пишет:
и лишь потом планирую подключать к батарее

Не торопитесь с этим.

 

bezzeb
Offline
Зарегистрирован: 02.11.2013

Duino A.R. пишет:

bezzeb пишет:
пока тестирую все от лабораторного блока питания с выходом 12вольт. так,что на все входы ацп подается все от 1 источника.

Стоп! Но это принципиальное несоответствие исходным требованиям. У Вас 2 (две) батареи, включенные последовательно. Вы никак не сможете имитировать их работы одним однополярным источником! Это вот когда полной нормальной схемы нет, начинается... Причем, как выясняется, схема рабочая и схема эксперимента - по сути разные. Как тут можно косяки отловить?

bezzeb пишет:
т.к нужно быть уверенным в правильной работе реле.

Немного о реле. Реле срабатывает не мгновенно. Для таких реле, как у Вас время срабатывания и отпускания (они разные) составляют единицы миллисекунд. Вы в программе подаете все команды одним блоком на все реле сразу. На выводах контроллера сигналы появятся с интервалом в микросекунды, т.е. с точки зрения реле - одновременно. Реле начнут, кто замыкать контакты, кто размыкать. Они еще не успеют сменить свои состояния, а Вы уже считываете значение АЦП и тоже быстрее, чем сработают реле. Дальше по схеме проанализируйте, что поступает на вход каких каналов в этом случае, а какие каналы (батареи!) остаются с КЗ на время измерения.

У Вас в системе есть совершенно однозначное запрещенное состояние - нельзя одновременно включать разные пары реле. Иначе - КЗ нижней батареи. Поэтому при вЫключении любой пары реле нужно выдержать паузу на её физическое выключение и только потом включать следующую пару.

bezzeb пишет:
и лишь потом планирую подключать к батарее

Не торопитесь с этим.

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

 

для того,чтобы не было кз я между включением /выключением ставлю delay(500).

Этого же должно хватить?

 

тестером проверил правильность работы(включение пар реле,замыкание контактов,напряжение на ацп)-все в норме.

Получается проблема в коде.

Понимаю,что код очень примитивен и так не делают

Поэтому поэтапно переделываю

Уже записал все в массив.

Хотел закинуть просчет делителя в 1 функцию,но не знаю,что с коэфициентами т.к получилась разница у них (1,01 , 0,98 , 0,99),а при создании функции везде будет коэф 1.

Что еще можно улучшить на ваш взгляд?

 

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

bezzeb пишет:
да задание одно,но перед подключением хотел бы от стандартного источника проверить срабатывание групп реле и к этому высчитать коэфициенты делителя и если есть несоответствия,то подкорректировать это,поэтому и тестирую пока на обычном блоке питания с точным напряжение 12вольт.

Здесь дело не в точности Вашего источника, а в том, что источник при отладке - однополярный, а в работе будет - двуполярный, с "плавающей (подвешенной) землёй." И Вы КЗ (возможно короткое) нижней батареи при такой отладке никогда не поймаете.

bezzeb пишет:
для того,чтобы не было кз я между включением /выключением ставлю delay(500). Этого же должно хватить?

Разберём по Вашей программе блок №1 и блок №2. Один(!) раз я это сделаю. Дальше - сами.

Итак. Блок 1. Программный цикл начался. Реле в неизвестном для меня состоянии. На реле 1 - 1, дальше через 6-8 мкс(!) на реле 2 - 0, дальше через 6-8 мкс(!) на реле 3 - 0, ..., на реле 8 - 0. 6-8 мкс - время исполнения команды ditalWrite. Т.е. на весь командный блок №1 ушло примерно 50 мкс. Ни одно из реле даже вздрогнуть не успело, а не то, чтобы изменить свое состояние (У реле на это уходят миллисекунды). Через 50 мкс от начала выставления команд на переключение реле запускается АЦП и примерно через 100 мкс (analogRead) запоминает некий результат. Ни одно реле еще не пошевелилось. А тут им пауза в 500 мс. Все реле одновременно, в первый десяток миллисекунд, на перегонки с друг другом занимают предписанные состояния. Какие контакты раньше отпустят, а какие раньше замкнут - ХЗ. Будет короткое КЗ или нет - ХЗ. Оставшиеся 490 мс реле ждут начала программного блока №2.

И вот он начался. По сути ровно также, как и блок №1. С той лишь разницей, что к его началу реле 1 точно включено, а реле 2 - 8 - выключены. Через 150 (50 + 100) мкс от начала блока №2 АЦП получит некий результат. Результат этот, скорее всего, будет соответствовать состоянию реле блока №1, а не блока №2, но считываться он будет с канала №2, который по факту ни к чему не подключен. Потом снова гонки между реле за смену состояний с возможностью коротнуть по ходу дела нижнюю батарею. Ну хоть на немного. Затем пауза в полсекунды и т.д.

bezzeb пишет:
Что еще можно улучшить на ваш взгляд?

В старом коде улучшать нечего. Его надо выкидывать и писать новый. :)) Не обижайтесь. :))

Поскольку старый код обсуждать не зачем, а нового пока нет, то я сделаю замечание "общего вида". Вы используете для расчета напряжений формат плавающей запятой. Зачем? Он и время жрёт и память. Реальная точность АЦП Ардуино - 8 двоичных разрядов, хотя считываются 10. На мой взгляд целочисленной арифметики будет совершенно достаточно. Просто с масштабами и выводом на экран нужно будет аккуратно всё сделать.

 

 

Пионер
Offline
Зарегистрирован: 04.02.2019

b707 пишет:

Максимальное значение ADC (2**10 -1) = 1023. поэтому при вычислении напряжения и умножать надо на 1023. а не на 1024. При умножении на 1024 формула даст неверное значение

Для проверки рассмотрите случай с однобитным ADC

Спасибо!