Полезная информация


avatar_Паяка

Универсальный модуль разрядной моргалки для Ардуино и не только

Автор Паяка, 17 Сен. 2018 в 15:11

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

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

Паяка

Цитата: serggio от 23 Нояб. 2018 в 23:04Паяка, ну что, спалил уже пару фетов?
Уже включается и ничего не сгорает, но нужно налаживать, в части индикации и управления. Завтра продолжу. При подсоединении клеммы, искра как у хорошей CDI, что для работы вблизи СА неприемлемо. Недостаток легко лечится, установкой слаботочного тумблера в разрыв перемычки между R20 и затвором защитного ключа.
GT TF1 60V 20Ah Chilwee DZF

Паяка

В продолжение дискуссии. Бывает целесообразно хранить и обрабатывать данные с фиксированной запятой в квантах (units на англоязычных сайтах), а переводить в кратные единицам измерения для отображения, и то если требуется. Можно и в файл или по протоколу вывести в квантах, а затем уже перевести в единицы измерения.

Числа с фиксированной запятой - это просто целые числа. О расположении запятой знает только программист и читающий комментарии к коду, если они есть. Чтобы адекватно разделить, например, 8-разрядное на 8-разрядное, надо делимое умножить на 256, т.е. просто скопировать в старший байт временной 16-бит переменной, младший байт которой будет 0. Если у нас идёт накопительное суммирование, можно это тоже учитывать и использовать по усмотрению.

Например, 26=64  10-разрядных измерения после накопительного сложения дадут 16-разрядное число. Как им распорядиться, решаем уже исходя из характера сигнала, помех и задачи. Можно применять разные алгоритмы фильтрации, например, с отбраковкой недостоверных значений, скользящее среднее.

Скользящее среднее делается так. Когда заполнили буфер-аккумулятор, проведя 64 измерения, (и выставив соответствующий флаг конечного автомата), перед прибавлением текущего значения отнимаем от аккумулятора 1/64 часть. Деление на 64 - всего-навсего 6 сдвигов вправо. Таким образом, имеем сглаженное значение в момент каждого измерения, а не в 64 раза реже!

Для поиска сигнатур процессов в ХИТ целесообразно, кроме скользящего среднего, фиксировать дельту текущего измерения от скользящего среднего, это будет первая производная. Если точно такой же алгоритм провернуть с этими дельтами, заполняя ими буфер, отнимая от него 1/64 и прибавляя текущую, получим вторую производную.

Причём памяти для такого алгоритма нужно всего ничего: 2 двухбайтовых аккумулятора и 2 бита в программном регистре флагов, (под который выделяем просто нужное число байт в ОЗУ). Такты процессора и память подпрограмм экономятся тоже: ведь используются только сложения-вычитания и сдвиги, без умножений и делений!

Не забываем сбросить флаги и обнулить аккумуляторы при переходах между импульсом и паузой, иначе получим ложные сигнатуры, процессов не в АКБ, а нашей собственной моргалки!
GT TF1 60V 20Ah Chilwee DZF

SapienzSPB

Цитата: Паяка от 24 Нояб. 2018 в 23:38Скользящее среднее делается так. Когда заполнили буфер-аккумулятор, проведя 64 измерения, (и выставив соответствующий флаг конечного автомата), перед прибавлением текущего значения отнимаем от аккумулятора 1/64 часть. Деление на 64 - всего-навсего 6 сдвигов вправо. Таким образом, имеем сглаженное значение в момент каждого измерения, а не в 64 раза реже!
О, я оказывается скользящее среднее понапридумывал. Теперь буду знать как оно называется..

Цитата: Паяка от 24 Нояб. 2018 в 23:38Для поиска сигнатур процессов в ХИТ целесообразно, кроме скользящего среднего, фиксировать дельту текущего измерения от скользящего среднего, это будет первая производная. Если точно такой же алгоритм провернуть с этими дельтами, заполняя ими буфер, отнимая от него 1/64 и прибавляя текущую, получим вторую производную.
А вот за это доступное объяснение огромная благодарность. Я столько времени потратил пытаясь понять что такое вторая производная, а оказывается все очень просто.
Еще хотел спросить может ли ПИД алгоритм отслеживать и регулировать два параметра, ограничивая по логическому или. То есть реализовать CCCV. Я это в принципе сделал, но далеко от ПИД. Скорее всего очередной велосипед(который впрочем работает).

S_Kov

Цитата: Паяка от 24 Нояб. 2018 в 23:38Скользящее среднее делается так. Когда заполнили буфер-аккумулятор, проведя 64 измерения, (и выставив соответствующий флаг конечного автомата), перед прибавлением текущего значения отнимаем от аккумулятора 1/64 часть. Деление на 64 - всего-навсего 6 сдвигов вправо. Таким образом, имеем сглаженное значение в момент каждого измерения, а не в 64 раза реже!
Скользящее среднее можно делать десятками способов.
Обычно скользящее среднее связывается с понятием скользящего окна, в котором появляются некоторые данные (например, выход АЦП). Если размер окна слишком велик для того, чтобы хранить все данные окна в массиве, то используют упрощенные методы, как тот, что вы описываете. Это частный случай взвешенного скользящего среднего.  (см. например, Википедию.)
Хотел только заметить, что при вычислении среднего значения методом сдвига, всегда полезно прибавить перед сдвигом половину размера окна. Например, у вас окно на 64 отсчета. В этом окне вы видите 63 единицы и одну двойку. Т.е. сумма равна 65. Сдвигаете на 6 двоичных разрядов это число и получаете единицу. В данном случае это неполохое приближение к истинному среднему. Второй пример. В окне 63 двойки и одна единица. Сумма равна 63*2+1 = 127. Сдвигаете на 6, получаете опять единицу, что в данном случае почти вдвое меньше истинного среднего. Чтобы улучшить оценку надо перед сдвигом прибавлять к сумме число 32 (в данном примере).

serggio

Цитата: Паяка от 24 Нояб. 2018 в 23:16клеммы, искра как у хорошей CDI, что для работы вблизи СА неприемлемо. Недостаток легко лечится, установкой слаботочного тумблера
Главное не забыть в каком положении тумблер перед подключением к только что заряженному АКБ :)

Цитата: Паяка от 24 Нояб. 2018 в 23:16Уже включается и ничего не сгорает
На полном токе проверено?

Паяка

Цитата: serggio от 25 Нояб. 2018 в 10:55Главное не забыть в каком положении тумблер перед подключением к только что заряженному АКБ
Радикально решается триггерной защёлкой, (по принципу магнитного пускателя).

Цитата: serggio от 25 Нояб. 2018 в 10:55На полном токе проверено?
Сначала надо наладить управление-индикацию. Как раз занимаюсь.
GT TF1 60V 20Ah Chilwee DZF

serggio

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

Паяка

[user]serggio[/user], гирлянда находится после защитного ключа. Триггер должен запитываться напрямую с АКБ.
GT TF1 60V 20Ah Chilwee DZF


Паяка

[user]serggio[/user], спортивный интерес - тоже интерес. Питать от разряжаемого ХИТ с любым напряжением можно через SEPIC. Но не от всякого напряжения сработает защитный триггер, и для разряда в 0 с целью переполюсовки такое не сгодится, (если не предусмотреть в приборе аккумулятора или батареек).

Мне хочется показать в теме разные варианты, процесс разработки, возникающие трудности и ошибки, их преодоление. Если разрядное устройство только для КТЦ 12В АКБ, уместнее от АКБ его и питать. Если универсальное, внешнее питание лучше.
GT TF1 60V 20Ah Chilwee DZF

S_Kov

Цитата: Яков93 от 25 Нояб. 2018 в 07:07выбираю 16 штук только тех, что сидят в середине, 8 самых высоких и 8 самых низких отбрасываю. Потом эти 16 штук складываю и делю на 16.
Если вы хотите, чтобы ваша программа работала так, как вы ее описываете,
рекомендую заменить строчку
for(t=7; t<23; t++)
на строчку
for(t=7,l=0; t<23; t++)
Я бы еще кое-что поправил в программе, но это уже чистая косметика.
Например сортировку методом "пузырька" можно еще больше ускорить, если
проверять после каждого прохода, а были ли перестановки? Да и перестановки
элементов настоящие эстеты уже давно не делают через третью ячейку ;)
Вот примерно так:

   for(a=1; a<size_nums; a++)
{
     for(FLAG=1, d=size_nums-1; d>=a; d--)
       {
        if(nums[d-1] > nums[d])
         { FLAG=0;
         nums[d-1] ^= nums[d];
         nums[d]    ^= nums[d-1];
         nums[d-1] ^= nums[d];
         }
       }
if (FLAG) break;
}

Яков93

[user]S_Kov[/user], вау!
О сколько нам открытий чудных...
А что такое в строчке for(t=7,l=0; t<23; t++)   означает l=0?

Про эстетский вариант "пузырей" даже уж и не спрашиваю, все равно не запомню.

S_Kov

Цитата: Яков93 от 25 Нояб. 2018 в 13:27О сколько нам открытий чудных...
А что такое в строчке for(t=7,l=0; t<23; t++)   означает l=0?

Про эстетский вариант "пузырей" даже уж и не спрашиваю, все равно не запомню.
Это обнуление ячейки, в которой вы накапливаете сумму. В программе вы ее обнуляете только один раз при объявлении типа. А хорошо бы обнулять перед каждым подсчетом суммы ;)
По поводу пузырька - если вы прошли по массиву и ни разу ничего не переставили, то нет никакого смысла по нему дальше "елозить" - он уже упорядочен.
По поводу перестановки элементов - то вообще- то  самая компактная запись перестановки:  a ^= b ^ (b = a);  Но мой компилятор для PIC-ов некорректно обрабатывает эту строчку почему-то. Да, и эти форкусы проходят только для целочисленных типов.
И еще раз посоветую не делать усреднение простым сдигом.
Строчка     I=I>>4;  выполняет вычисление среднего с отбрасыванием дробной части.
А строчка  l = (l+8)>>4;  выполняет вычисление среднего с округлением результата в сторону ближайшего целого.

Кобольд

Цитата: Паяка от 25 Нояб. 2018 в 13:08спортивный интерес - тоже интерес. Питать от разряжаемого ХИТ с любым напряжением можно через SEPIC.
Правильно! Комсомолец не может без трудностей! В порядке усиления накала трудностей предлагаю SEPIC делать сугубо самостоятельно (никаких покупных китайских плат) с совмещённым дросселем (два на одном сердечнике). Результат не гарантирован, но затрахаетесь по самое немогу (спортивный интерес будет удовлетворён)

P.S. Извините, это была ирония и сарказм.

Паяка

[user]Кобольд[/user], лично в моих планах варианта с SEPIC нет, но возможность озвучиваю, вдруг кому пригодится. Мне сейчас важно доделать этот 20А экземпляр с нихромом для коллеги, затем разрабатывать 14.5А ЗУ. Потом зарядно-разрядный комбайн и параллельно посекционный 6*4В стенд. И о методике переделки ATX не забыть, люди уже ждут, а я не успеваю.

Если кто-то заинтересуется вариантом с SEPIC, либо, что проще, стабилизированным Boost c линейным стабилизатором после него, тогда помогу.

Для питания МК достаточно 5 или даже 3.3В. Для ОУ, если он rail-to-rail, тоже. Но затворам MOSFET в ключевом режиме необходимо никак не меньше 10. А раз так, можно и ОУ простые ставить.

По моему скромному мнению, прибор, обходящийся двумя крокодилами и не нуждающийся в питании от сети, весьма симпатичен и удобен. Если он должен уметь разряжать до нуля, можно снабдить его встроенным аккумулятором, заряжающимся от разряжаемого, или отсеком для марганцево-цинковых батареек. Которые тоже можно заряжать, но это уже другая история. Схема ЗУ для них мной выкладывалась, никто пока не заинтересовался.

Использование солевых и щелочных элементов в качестве аккумуляторов для питания приборов - ещё один спортивный интерес, но прежде этого баловства надо завершить более актуальные вещи.
GT TF1 60V 20Ah Chilwee DZF

serggio

#159
Интересно, как вы собираетесь вместить диапазон 0-20 А в ШИМ 1 кГц, так чтобы ваш транзистор был в linear region, да еще не грелся? Даже при 50% заполнении (500 мкс) у вас при 20А будет все «хорошо» с температурой, далее курите графики.
Даже если предположить, что шаг регулировки 100 мА, что весьма неинтересно, нужно 200 шагов регулировки ШИМ, плюс подстройка по ОС в процессе работы.
А что если делать по уму с шагом 10 мА?
20А, это я так на пальцах прикинул, не нужно забывать что нас интересует RMS, так что токи в открытом режиме будут больше

Паяка

[user]serggio[/user], если рассеивает тепло нихром, а транзистор служит ключом, как в текущем варианте, он не в линейном режиме, а в режиме насыщения.

Шаг подстройки 14-разрядного ШИМ 0..20А 1.22 мА. В скетче она предусмотрена. В линейном режиме, всё так же будет работать, только планарный мосфет вместе с ОС на ОУ образует ИТУН, управляющее напряжение на который поступает с интегратора ШИМ. ИТУН имеет шунт, сигнал с которого усиливается и поступает на АЦП МК, для измерения тока и необходимых расчётов на его основе, а также автоподстройки тока.
GT TF1 60V 20Ah Chilwee DZF

serggio

Цитата: Паяка от 25 Нояб. 2018 в 16:54он не в линейном режиме
Linear region это не линейный режим. Или вы думаете, что он в режиме коммутации не греется? Какова будет максимальная повторяющаяся длительность импульса импульс при 20А?
Цитата: Паяка от 25 Нояб. 2018 в 16:54а в режиме насыщения
Вот как раз таки в режиме насыщения -  режим линейной нагрузки - мосфет работает как управляемое сопротивление, т.е. не полностью открыт.