avatar_UriBas

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

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

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

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

Alex_N

Логи я пока не снимаю. DB-9 - это связь с ноутбуком по USB. Программа управления пока в стадии разработки. Зарядка будет работать как в автономном режиме, так и под управлением ноутбука. На фото я показал, как из БП от ноутбука и нескольких прибамбасов с али можно соорудить почти лабораторный БП. Для начинающих ( а ветка как раз для начинающих ) это будет полезно в выборе БП. И этот БП гораздо лучше переделанного БП от АТХ.

Dunkel

Цитата: Alex_N от 15 Март 2018 в 08:03На фото я показал, как из БП от ноутбука и нескольких прибамбасов с али можно соорудить почти лабораторный БП.

Каким образом это фото чем-то поможет начинающим?
Для начинающих нужна схема с подробными пояснениями.
Многофункциональная облачная моргалка/логгер:
https://morgalka78.wordpress.com/

Dkin

Цитата: Alex_N от 15 Март 2018 в 08:03
На фото я показал, как из БП от ноутбука и нескольких прибамбасов с али можно соорудить почти лабораторный БП. Для начинающих ( а ветка как раз для начинающих ) это будет полезно в выборе БП. И этот БП гораздо лучше переделанного БП от АТХ.

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

Спойлер

Necromant

#993
поправил алгоритм, немного некорректно работал
стала сильнее заметней разница в паузе для хорошего и плохого аккумулятора и корректней капельница
увеличилась пауза в конце добивки
Спойлер

#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, RelaxPeriod = 1000;
//Функции
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(long(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 dUPeriod)
{
  uint16_t U2;
  do
  {
    U1 = ReadU(VoltmeterPin);
    delay (dUPeriod);
    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(RelaxPeriod);
  Timer = millis() - Timer;
  U1 = ReadU(VoltmeterPin);
  RelaxPeriod = int(pow(2.72, ((U1 - 12300.) / 1000)) * 1000);
  relayON();
  Timer = constrain(Timer, 500, 600000);
  ChargePeriod = int(pow(2.72, ((12300. - U1) / 1000)) * Timer);
  //Serial.println (U1); Serial.println (Timer); Serial.println (ChargePeriod); Serial.println (RelaxPeriod); Serial.println ();
  Timer = millis();
  delay(ChargeTime);
  while ((U1 <= UpLimit) && ((millis() - Timer) <= ChargePeriod) )
  {
    U1 = ReadU(VoltmeterPin);
  }
  //Serial.println (U1);
  relayOFF();
}


bones

Цитата: Alex_N от 11 Март 2018 в 17:46А я пошел по пути увеличения количества измерений. Плюнул так сказать на быстродействие и сейчас усредняю 1000 измерений подряд.
Ниже график НРЦ с ads1115 за сутки без усреднений, сырые данные. Время измрения 64 мс (16Гц), входной мультиплексор каждый раз переключается, т.к. измеряется еще и ток (АЦП там всего 1).


на стм32 при суммировании 10 последовательных измерений показания скачут на +-5, т.е. 0.5 LSB, как и заявлено в даташите.

Не совсем понятно зачем суммировать 1000, возможно есть смысл пересмотреть входные цепи.



Яков93

Цитата: bones от 17 Март 2018 в 01:36
возможно есть смысл пересмотреть входные цепи.
Что конкретно порекомендуете?

Alex_N

Цитата: Dunkel от 15 Март 2018 в 08:24Для начинающих нужна схема с подробными пояснениями.
Схем тут уже выложили полно. Выбирай на вкус.

Добавлено 17 Мар 2018 в 12:58

Цитата: bones от 17 Март 2018 в 01:36Не совсем понятно зачем суммировать 1000
Затем, что цифирьки на экране стоят как вкопанные. Дребалыги нет вообще. Я не суммирую 1000, а делаю 1000 измерений подряд каждого параметра и нахожу среднеарифметическое.

Dunkel

Цитата: Alex_N от 17 Март 2018 в 12:57Затем, что цифирьки на экране стоят как вкопанные.

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

Alex_N

#998
Вы наверное меня не так поняли, или я выразился не так. Когда считываешь скажем 10 раз подряд и усредняешь напряжение ,к примеру 12.4В, то на экране 12 видно хорошо, а в десятых идут беспрерывные мелькания от 1 до 7. И поди разбери, сколько там. А когда считываешь 1000 раз - 12.4 и ничего не моргает. А моргалка у меня ( как я уже писал ) делает несущую частоту 32 Гц, модулированное 2 кГц . 32 Гц заполнено на половину, а заполнение 2кГц при каждой зарядке высчитывается от 0 до нужного тока. Конечно при других частотах наверное это будет не так, но я описываю, как я сделал.
Прикладываю файл. Идёт разряд акб. При заряде тоже самое - дребалыги нет.

Dunkel

Цитата: Alex_N от 18 Март 2018 в 10:42а в десятых идут беспрерывные мелькания от 1 до 7. И поди разбери, сколько там.

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

Из всего этого я понял только одно - вся эта затея с 1000 измерений не имеет никакого отношения к алгоритму работы моргалки.
Многофункциональная облачная моргалка/логгер:
https://morgalka78.wordpress.com/

Dunkel

Специально для любителей 1000 измерений сделал сравнение результатов усреднения 8 и 1024 analogread:



Очевидно, что никакой "дребалыги" в десятых вольта нет и при 8 измерениях.
Правда это на esp, но принципиальной разницы нет, АЦП там такой-же.
Многофункциональная облачная моргалка/логгер:
https://morgalka78.wordpress.com/

Dunkel

Вторую неделю пытаюсь заставить esp поработать моргалкой. Пока что можно сказать только одно - Arduino IDE для esp работает очень криво. Постоянно вылезают какие-то косяки.
Кто-нибудь может рассказать, что это за ерунда?


Многофункциональная облачная моргалка/логгер:
https://morgalka78.wordpress.com/

Alex_N

Цитата: Dunkel от 18 Март 2018 в 12:23Из всего этого я понял только одно - вся эта затея с 1000 измерений не имеет никакого отношения к алгоритму работы моргалки.
Вы можете делать как хотите, я делаю, так как я хочу. Кому и что вы хотите доказать?

UriBas

#1003
Пока подыскивал себе ЛБП на Али", нашел несколько модулей с мосфетами, могут пригодится для сборки моргалки.. по цене иногда лучше взять сразу в модулях, да и наверное брака там меньше.. ведь должны проверять по идее.
Модуль №1  на полевых  транзисторах N канала название AOD4184A  40V N-Channel MOSFET VGS=10V < 7mΩ,    VGS = 4.5V  < 9.5mΩ,     с низким порогом включения на затворе в 3,3В и на низких значениях напряжения сток - исток.   Рабочее напряжение: DC 5 - 36 В.  (можно и от 1,5-2В) рабочий ток 15 А  Модуль без драйвера и подключается напрямую к пину Ардуины.
Спойлер


Восточная мудрость - "Шакал воет - караван идет"  Эл.вел. 350Вт.   Верую в Иисуса Христа, НЛО.  тема "продвинутой моргалки" https://electrotransport.ru/index.php?msg=1669651

Ribbentrop

Да откуда там P-channel?? :) По плате даже видно, что минусовое плечо рвётся.
Да и http://www.aosmd.com/pdfs/datasheet/AOD4184A.pdf .....

Alex_N

Да всё равно плату нужно разводить. Так что смысла нет. А вообще сейчас буду всё переделывать под р-канал. N-канал меня разочаровал. Слишком много заморочек. У р-канала, конечно сопр-е намного выше. Ну и ладно, поставим радиатор побольше, зато корпус общий.

UriBas

#1006
Цитата: Ribbentrop от 01 Апр. 2018 в 10:26Да откуда там P-channel?? :) По плате даже видно, что минусовое плечо рвётся. Да и http://www.aosmd.com/pdfs/datasheet/AOD4184A.pdf ..... 
Да, перепутал.. было открыто несколько страниц с модулями, на вид похожие.   Перепроверил, да, все таки там N мосфеты..  даташит смотрел не тот.
Восточная мудрость - "Шакал воет - караван идет"  Эл.вел. 350Вт.   Верую в Иисуса Христа, НЛО.  тема "продвинутой моргалки" https://electrotransport.ru/index.php?msg=1669651

Ribbentrop

4205 стоит 18,5 грн, плюс драйверTC4420EPA около 20-ки....