avatar_UriBas

Моргалка на Arduino. Этюды для начинающих.

Автор UriBas, 08 Март 2017 в 16:08

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

UriBas

Цитата: Dunkel от 27 Фев. 2018 в 14:30Тогда давайте различать "простоту алгоритма" и "простоту интерфейса". Одно с другим совершенно не связано.
Если алгоритм подразумевает хоть какое-то вмешательство пользователя, то это уже связано с интерфейсом! Пусть даже если надо просто нажать кнопку "стоп".   Вот когда будет готов (проверенный практикой) алгоритм, который абсолютно исключает всякие настройки и прочее, тогда можно и без интерфейса и тогда они не будут связаны между собой.   
Цитата: Dunkel от 27 Фев. 2018 в 14:30Для меня перспективный интерфейс это ESP8266 или ESP32.   
Тут уж, что для кого более привычно или доступно, или необходимо.  Кто-то постоянно сидит дома за компом, и ему лучше чтобы по USB управлять.. кто-то в разъездах и ему лучше на смартфоне наблюдать, а кто-то сидит на работе за компом и ему лучше по интернету.. а у кого-то нет компа и смартфона,  ему лучше прямо на ЗУ смотреть, в гараже..  поэтому без дисплея не обойтись.   Поэтому пусть каждый развивает свое направление по своим силам и возможностям.
Восточная мудрость - "Шакал воет - караван идет"  Эл.вел. 350Вт.   Верую в Иисуса Христа, НЛО.  тема "продвинутой моргалки" https://electrotransport.ru/index.php?msg=1669651

Magic David

Мне кажется, что на этапе поиска и отладки оптимального алгоритма (как в нашем случае) и возможность точных измерений по нескольким каналам и наглядное представление информации и возможность при необходимости писать логи - все это довольно важно.  Тем более, что с использованием STM это не должно вызвать проблем с недостатком ресурсов.  А по стоимости и сам контроллер (если говорить о "стартовом" варианте) и простой дисплей вроде 1620 стоят неприлично дешево.

UriBas

Цитата: UstAlexei от 27 Фев. 2018 в 14:36Тем не менее arduino была и остается детским конструктором, при помощи которого осваиваются азы и быстро проверяются какие либо теории. Для серьезных проектов и подходить надо серьезно продумывая не только алгоритм, но в том числе построение самого устройства с его печатными платами и взаимном влиянии дорожек. С ардуинкой к сожалению с его модулями это невозможно. 
А если использовать гальваническую развязку..  например модуль АЦП типа INA219 - связь через I2C c Ардуиной и оптодрайверы силовых ключей типа TLP250?   Сделать отдельно силовой, управляющий,  и измерительный модули. 
Восточная мудрость - "Шакал воет - караван идет"  Эл.вел. 350Вт.   Верую в Иисуса Христа, НЛО.  тема "продвинутой моргалки" https://electrotransport.ru/index.php?msg=1669651

Alex_N

Цитата: UriBas от 27 Фев. 2018 в 12:31Т.е. надо еще полученные значения Х.. сложить и усреднить?  Слишком много вычислений и думается, что это мало что дает..  без графиков, без сравнительных данных трудно делать вывод.
Этот фильтр применялся ещё на компах слабее ардуино. Просто четвертое значение равно сумме ( по формуле ) трёх предыдущих. Проще не бывает. И время особо не жрёт. Я думаю массив из 100 чисел он осилит быстрее чем одна операция считывания из порта. Ну а вообще кому что нравится.

Добавлено 27 Фев. 2018 в 17:58

Цитата: UriBas от 27 Фев. 2018 в 15:49А если использовать гальваническую развязку..  например модуль АЦП типа INA219 - связь через I2C c Ардуиной и оптодрайверы силовых ключей типа TLP250?   Сделать отдельно силовой, управляющий,  и измерительный модули. 
Так можно и до космического корабля доконструироваться. Познание бесконечности требует бесконечно много времени.

Alex_Soroka

Цитата: UriBas от 27 Фев. 2018 в 15:49
связь через I2C c Ардуиной
и забудете сразу про реалтайм и быстрое управление  :hello:
никаких последовательных обменов на ОДНОМ процессоре не должно быть в реалтайме.

Serg

Цитата: Alex_Soroka от 28 Фев. 2018 в 10:27
и забудете сразу про реалтайм и быстрое управление  :hello:
никаких последовательных обменов на ОДНОМ процессоре не должно быть в реалтайме.
Реалтайм понятие растя-ж-и-м-о-е. А последовательный обмен оо-оочень медленный. При реализации на прерываниях  реалтайм тяжело затронуть.

UstAlexei

Для получения одного измерения с ina надо затратить 40 тактов scl. При частоте scl 100 кГц это время 0.4 мс - не быстро однако! При этом мы еще входы не переключали.

Dunkel

На самом деле большая длительность измерений не так критична, как кажется, и легко может быть компенсирована правильным алгоритмом.
При использовании беспорогового алгоритма длительность и погрешность измерений вообще не имеют значения, главное чтобы они были одинаковые, т.к. измеряется не порог, а дельта.
Многофункциональная облачная моргалка/логгер:
https://morgalka78.wordpress.com/

aniserg

 Добрый всем день!
Вот и мне пришлось окунуться в этот мир зарядок :-D
поменял машину - поменяй зарядку :-)
хочу сам сделать на базе Ардуины. но возник вопрос блока питания. есть транс ОСМ1, 630 ватт. но вторичка меня не устраивает, хочу перемотать.
но хотелось бы использовать его по максимуму - лабораторный блок питания, зарядка, возможно пусковое и т.д..
здесь везде используется БП с выходом 19 вольт. это критично?
какой диапазон возможен в сторону увеличения?
Пока думаю так - U2 -*-5-16 - 20-24 вольт  переменка 30 ампер.
U3 - * - 50 вольт переменка 5 ампер.
если поместится.
ваше мнение?

Dunkel

[user]aniserg[/user],  применительно к данной теме - моргалке без разницы чем моргать, TLP-250 до 35В.
А если интересуют последствия для АКБ, то это надо искать в других темах.
Многофункциональная облачная моргалка/логгер:
https://morgalka78.wordpress.com/

Alex_N

#946
Возьмите от ноутбука на 6.5А - то что надо.  добавите xl4016e1 на али 180р., электронный вольтметр/амперметр на том же али, и получите прекрасный регулируемый БП. Фото я здесь выкладывал. Я еще к нему добавлю параллельный ограничитель тока на LM317 для зарядки всяких мелких аккумуляторов, где нужно точно выставлять ток. Придёт амперметр с али и добавлю.
Вот фото :
https://electrotransport.ru/index.php?topic=44520.msg1280347#msg1280347

bones

Цитата: Alex_Soroka от 28 Фев. 2018 в 10:27и забудете сразу про реалтайм и быстрое управление
Часто говорите про реалтайм, не могли бы привести гарантированную скорость реакции на внешнее воздействие в секундах (мили, микро, нано, ...) ваших ЗУ?
Насколько я понимаю, "реалтайм" характеризуется именно этой величиной.

bones

Цитата: aniserg от 06 Март 2018 в 12:0920-24 вольт  переменка 30 ампер.
Это отличный вариант, если не пугает размер сглаживающих конденсаторов. При 10 000 мкФ будет примерно такое

На графике, так назывемый, худший случай, можно не брать в расчет, но желательно знать об этом.
Схема




Добавлено 08 Март 2018 в 03:18

Цитата: Alex_N от 06 Март 2018 в 16:49Возьмите от ноутбука на 6.5А - то что надо.
Сильно дороже чем б/у ATX, а раз уж взяли в руки паяльник - извольте :)

bones

Цитата: UstAlexei от 28 Фев. 2018 в 11:46Для получения одного измерения с ina надо затратить 40 тактов scl. При частоте scl 100 кГц это время 0.4 мс - не быстро однако!
не пойму, куда спешить.

bones

Цитата: Dunkel от 28 Фев. 2018 в 12:19погрешность измерений вообще не имеют значения
Мне с самого начала не понятно, каким образом можно выставить 14.4В, если у тебя хороший вольтметр с погрешностью 1%, то получится 14,256 - 14,544В при показаниях на вольтметре 14.400
У каждого свои 14 с половиной вольта :)

Necromant

для CV это критично, для адаптивного алгоритма ничтожно
разница между истинными 14,400 и 14,500 в добивке будет миллисекунды

Necromant

Третья версия прошивки
Теперь не только адаптивная пауза (и подача по паузе), но и адаптивная скорость dU/dt, что позволило отказаться от этапов зарядки.
На сильно разряженном короткие подачи и небольшие паузы
В середине зарядки паузы и подачи равны
В конце заряда пауза удлиняется, подача сокращается
Ограничение подачи до 14,4 всю зарядку

Спойлер
#define maxV 18650   //  R1=10.00 kOhm  R2=1.52 kOhm
#define U0 1033
#define UpLimit 14400
#define dU 1
#define ChargeTime 250
#define MeasureCount 4
#define VoltmeterPin A7
#define ChargeRelayPin 2
#define InternalLedPin 13

// Переменные
uint16_t U1;
//Функции
uint16_t ReadU (uint8_t Pin)
{
  uint32_t S = 0,
           SumU = 0;
  uint8_t j = 0;
  struct MeasuredValue
  {
    uint16_t Value;
    int16_t Delta;
  } U[MeasureCount];
  for (uint8_t i = 0; i <= (MeasureCount - 1); i++)// Считаем среднее арифметическое
  {
    U[i].Value = analogRead_16bits(Pin);
    SumU += U[i].Value;
  }
  SumU = SumU / MeasureCount;
  for (uint8_t i = 0; i <= (MeasureCount - 1); i++)// Считаем среднеквадратическую погрешность
  {
    U[i].Delta = SumU - U[i].Value;
    S +=  sq(U[i].Delta);
  }
  S = sqrt( S / (MeasureCount - 1));
  SumU = 0;
  for (uint8_t i = 0; i <= (MeasureCount - 1); i++)// Отсеиваем промахи
  {
    if (abs(U[i].Delta) <=  3 * S)
    {
      SumU += U[i].Value;
      j++;
    }
  }
  SumU = SumU / j;
  SumU = map(SumU, U0, 65535, 0, maxV);
  return SumU;
}
//Процедуры
void relax()
{
  uint16_t U2;
  do
  {
    U1 = ReadU(VoltmeterPin);
    delay (int(pow(2.72, ((U1 - 12300.) / 1000)))*1000);
    //Serial.println (int(pow(2.72, ((U1 - 12300.) / 1000))));
    U2 = ReadU(VoltmeterPin);
  }
  while ((U1 - U2) >= dU);
  //Serial.println (U1);Serial.println (U2);Serial.println (U1-U2);Serial.println ();
}
void relayON()
{
  digitalWrite(ChargeRelayPin, HIGH);
  digitalWrite(InternalLedPin, LOW);
}
void relayOFF()
{
  digitalWrite(ChargeRelayPin, LOW);
  digitalWrite(InternalLedPin, HIGH);
}
//Инициализация
void setup()
{
  analogReference(INTERNAL2V56);
  pinMode(ChargeRelayPin, OUTPUT);   //SSR-10DA
  pinMode(InternalLedPin, OUTPUT);  //LED
  pinMode(VoltmeterPin, INPUT);    //Voltmeter
  do                //защита от обратной полярности
  {
    U1 = analogRead_16bits(VoltmeterPin);
    digitalToggle(InternalLedPin);
    delay(250);
  }
  while (U1 == 0);

  delay(500);

// Serial.begin(9600);
}
//Цикл
void loop()
{
  uint32_t Timer, ChargePeriod;
  Timer = millis();
  relax();
  Timer = millis() - Timer;
  relayON();
  Timer = constrain(Timer, 500, 600000);
  ChargePeriod = int(pow(2.72, (12300. - U1) / 1000) * Timer);
  //Serial.println (Timer); Serial.println (ChargePeriod); Serial.println ();
  Timer = millis();
  delay(ChargeTime);
  while ((U1 <= UpLimit) && ((millis() - Timer) <= ChargePeriod) )
  {
    U1 = ReadU(VoltmeterPin);
  }
//Serial.println (U1);
  relayOFF();
}


Dunkel

[user]Necromant[/user], по своему небольшому опыту написания постов в эту тему, могу посоветовать - дайте график, осциллограмму или что-нибудь в графическом виде.
Ваш скетч никто, кроме Юрия, не будет смотреть.
Многофункциональная облачная моргалка/логгер:
https://morgalka78.wordpress.com/