Приветствую! Ранее я уже рассказывал в статье о своем проекте контроллера заряда для небольшой СЭС с алгоритмом поиска ТММ. Сей проект вялотекущий из-за нехватки времени и порой отcутствия настроения, но все же он развивается. С момент последней статьи я сделал еще 2 ревизии железа, проверил разные схемотехнические решения, например, способы измерения тока и как итог — пришел к финальной версии аппаратной части о которой сегодня и пойдет рассказ.
Все исходники на железную часть проекта открыты и доступны на github — тут.
Концепция
Если вы решили просмотреть предыдущую статью о старой версии железа, то заметили, что концепция устройства изменилась радикально. Изначально хотелось сделать довольно универсальный отладочный комплекс, но в процессе работы с ним понял, что на практике он не такой удобный, довольно дорогой и использовать как готовое устройство тоже проблематично. Наверное к этому приходят все попытки сделать что-то "универсальное" и "хорошее" разом. Как итог решено было пересмотреть реализацию в пользу полноценного завершенного устройства, которое не будет валяться на полке, как 146% оталдочных плат, а займет свое место в небольшой СЭС в доме, на даче или где-то еще.
На момент старта проекта у меня не было цели сделать дешевое устройство, хотя мне некоторые люди писали в качестве претензии, использование "редких" компонентов. Сейчас у меня цели делать дешево так же нет, но в результате ухода от универсального модуля MotorControlBoard цена компонентов в цифровой части резко уменьшилась и решено было "перекачать" деньги в силовую часть, поставив более интересные силовые ключи, токовые шунты от Bourns, твердотельные кондеры от Panasonic и Wi-Fi модуль. В итоге при той же себестоимости немного улучшились ТТХ преобразователя и снизилась температура устройства в целом.
Интерфейсы
В первой версии контроллера у меня был реализован RS-485 и USB через преобразователь CP2102, так же был предусмотрен разъем с UART-ом и питанием для подключения Nextion или самодельной HMI панели. Все это было интересно, но как в итоге оказалось, слишком избыточно и не логично. Сейчас объясню почему...
Во-первых, RS-485 это очень хорошо, пока еще популярно, но на фоне CAN как-то и не очень. Сейчас во многих современных железках начинают применять CAN, там конечно же идет и RS-485 (а иногда и RS-232) для совместимости, но прогресс не остановить. Мне совмещаться особо не с чем, поэтому решил заменить RS-485 на CAN и сделать его единственным проводным интерфейсом.
Во-вторых, решил отказаться от использования дисплея как такогово и "герлянды" из светодиодов. Вешать дисплей на тот же контроллер, что управляет преобразователем не хотелось, а делать отдельную плату с еще одним МК, дисплеем, кнопками и светодиодами оказалось довольно дорого. К тому же стоит задаться вопросом — "а как часто вы будете ходить в условный сарай смотреть на этот дисплей?" За 4 месяца эксплуатации контроллера первой ревизии я этого не сделал ни разу, что как бы намекает на его бесполезность. Однако, хочется знать что происходит с системой, сколько энергии выработано и всякое такое. Для реализации удаленного монтиринга есть CAN и...
В-третьих, для реализации удаленного монтиронга решил поставить ESP32. Данный чип я как-то обходил стороной всегда, но наткнулся на статью, которая рассказывала про ESP32-PICO-D4. Это SiP в корпусе QFN-48 7х7 мм, в который разработчики уместили и саму ESP32, флеш память, кварц и дискретные элементы — остается накинуть питание и антенну. Это очень компактное решение, сильно меньше любого модуля (из тех, что видел), что важно, т.к. модули у меня на плату уже просто не влезали.
В конечном счете я пришел к варианту, когда дисплей и индикация на самом устройстве отсутствуют почти полностью, а вывод информации осуществляется в web-морду или в приложение. Вернее будет осуществляться, т.к. с ESP я ни разу не работал и еще не реализовал эту часть. Одно радует — в сети много информации и примеров работы, а значит в скором времени реализую мониторинг по воздуху.
Измерение тока
Во всех ревизиях у меня были разные способы измерения тока, т.к. это пет-проект и можно было городить что захочется, решил попробовать все. Сейчас поделюсь своими соображениями об этом. В первой ревизии (она в предыдущей статье) я использовал датчики на эффекте Холла — ACS713ELCTR-30A. В принципе они справились со своей задачей, но есть ряд минусов:
Чувствительны к металлическим элементам рядом с ними. В процессе экспериментов я попробовал сделать корпус из стали (резка, гибка, сварка, порошковая покраска), получилось дешево и вполне симпатично, но вот эти ACS начинали сходить с ума как только плата оказывалась внутри корпуса, напряжение на выходе датчика начинало плавать на 200-300 мВ в обе стороны и никакими цифровыми фильтрами "полечить" это не получилось. Если на него поставить болт типа М10, то тоже весело становится;
На номинальном токе 20А датчик начинал греться до 80-90 Co, что очень расстраивало. Согласно ДШ попробовал добавить параллельно к нему резистор, но точность начала существенно плавать. Вместо ±1% я получил уже ±3%, что несколько огорчило;
Датчики ACS не продаются на Mouser! Все закупаю там, т.к. удобно получить все желаемые компоненты в одной посылке, но вот почему-то данный производитель (и некоторые другие) отсутствует.
Следующими в бой пошли шунты и датчики INA196. Работать с ними одно удовольствие, они позволяют измерять ток в "плюсе" питания, а это удобно, т.к. потенциал земли (GND) остается равным на всей плате. Ведь если мы включим шунты в разрыв земли, то получится, что на земле у нас будет 3 разных потенциала, которые будут зависеть от падения напряжения на шунтах, то есть от тока.
Случай №1 — у нас шунты в "плюсе" нам надо измерять ток на одном шунте, ток на втором и напряжение на входе и выходе:
Это эквивалентная схема МРРТ контроллера, сильно упрощена, но суть понятна. Для удобства ток задан 25А, шунты как в контроллере на 4 мОм. Если вспомнить закон Ома, то на шунте будет падать I * R = 25А * 0.004 Ом = 0.1В, что мы и наблюдаем. В данном случае очень удобно измерять напряжение и на входе (на солнечной панели) и на выходе (на АКБ), т.к. земля "сплошная", АЦП сидит на ней и без всяких трудностей можно измерить напряжение в любой точки схемы через обычный делитель. Теперь перенесем шунты в "землю", земля цифровой части окажется между двумя шунтами, посмотрим что покажут вольтметры:
Так как земля АЦП расположена между шунтами, то есть все измерения идут относительно этой точки, получается ситуация, что мы не знаем реального напряжения на входе и реального напряжения на выходе, т.к. шунты вносят свой вклад в 0.1В. Много это или мало? Для свинца в принципе терпимо, а вот Li-ion или LiFePo4 аккумуляторы эта "десятка" очень быстро убьет, если на самих банка не установлена плата защиты или полноценный bms. Да и на определение ТММ это тоже скажется. В этом случае можно выкрутиться, например, измерение тока сводится к обычному измерению падения напряжения, а значит мы пожем посчитать входное напряжение как Uизмерено + Uпадение1. Соответственно для получения выходного напряжения: Uизмерено + Uпадение2. Итог такой:
Процесс измерения напряжения даст нам значение Uизмерено, а процесс измерения тока даст значения Uпадение1 и Uпадение2, после этого можно считать. Сложно? Я бы сказал излишне и точность теряется дополнительно. Еще одним решением могло быть измерение напряжение на входе и выходе с помощью операционного усилителя (ОУ), включенного в дифферинциальном режиме, но это потребует 2 лишний ОУ. Поэтому очень удобно было использовать INA и Холлы, включенные в "плюсе". Однако и у INA196 есть минусы — цена, 10$ за пару датчиков меня не очень радовали.
Так же еще стоит отнести к минусам подобных датчиков — ограниченность масштабирования. Дело в том, что у них есть ограничение по напряжению в измеряемой цепи, обычно это значение в пределах 80В. В дальнейшем у меня есть планы сделать МРРТ на 150В 40А, то есть измерять подобным методом уже не получится, а мне хочется получить железку, которая довольно легко масштабируется по напряжению и току без глобальных переделок.
Исходя из этого решил поискать альтернативу, чтобы не хуже и дешевле. Решил обратиться к опыту других open source проектов и различных промышленных контроллеров. В некоторых стояли датчики ACS, в основном у китайцев, но в остальных случаях все было сделано примитивнейше — шунт в "минусе" и усиление на ОУ, а дальше АЦП. Почитав форумы и различные статьи о данном варианте наткнулся на очередной холивар. Если кратко, то есть проблема с разными потенциалами и их надо измерять, но как плюс — цена, простота, надежность. К тому же я все равно измеряю ток и мне известно падение на шунте, поэтому решил на макетке собрать данный вариант. Все работало и работало с хорошей точностью, я было обрадовался, но оказалось, что есть и ложка дегтя (хотя и предсказуемая) — земля контроллера довольно "грязная" и при длинной цепи от шунта до ОУ появлялся шум и сказывалось различие потенциалов в разных точках полигона (оно мизерное, но на фоне пары мВ существенное). Чтобы победить это аппаратно решил поступить просто — использовать ОУ в дифферинциальном режиме, поставив сам ОУ ближе к МК, а сигнал от шунта до ОУ (примерно 60 мм) тянуть уже "дифферинциальной парой". В результате получил очень приличный результат в совокупностью с цифровым фильтром.
Данное решение оказалось самым дешевым, это позволило поставить нормальный шунт от Bourns и ОУ с приличной полосой (TSV991ILT), при этом измерять напряжение решил относительно земли АЦП, не применяя еще 2 ОУ и диф. режим для этого. В принципе для моей задачи получилось измерять довольно точно, т.к. сама система инертна (ток и напряжение на панели или АКБ не изменяется быстро) и можно накапливать большой массив данных с АЦП для последующей фильтрации. Да и панель с АКБ не генерируют какой либо шум, а значит практически все помехи идут от самого buck преобразователя. Чтобы с ними побороться я синхронизировал старт АЦП с HRPWM так, чтобы измерение никогда не попадало в переходный процесс (момент закрытия и открытия транзисторов). Все это дало свои результаты и позволило применить наиболее простое и дешевое решение.
Корпус
Кто бы что не говорил, а корпус устройства это один из ключевых элементов, особенно если вы планируете это продавать. В моем случае продавать не надо, но люблю чтобы железка по мимо того, что работает еще и выглядела так, чтобы не стыдно знакомым показать. Как итог — озадачился с изготовлением корпуса. Пробовал разные варианты… и печатал на 3D принтерах разного качества, и заказывал из листового металла коробку, все или выглядело как говно крайне убого или не переживало стресс-теста в виде падения с метра на бетон, да и при этом цены не сказал что дешевые были на изготовление.
Вспомнил прекрасные статьи от anvos, решил посмтотреть как делают нормальные люди, глянул примеры работ, оценил свой бюджет и пришел к выводу, что мне нужна или фрезеровка или экструзия алюминия. Сломать почти нереально, выглядит "дорага-багата" симпатично и при этом механически прочный, в перспективе можно рассеивать на корпус тепло (изготовив плату из алюминия) и вроде как прототип изготовить не очень дорого. Литье пластиков мне тоже понравилось, но ценник не для хобби-проекта, экструзия алюминия тоже. Последний метод, как я понял, дешевый на серии, но изготовить 1-5 штук стоит слишком дорого или я не тем китайцам писал. Осталась фрезеровка! Вооружился SolidWorks-ом и нарисовал вот такое:
Первый корпус решил заказать у обладателя ЧПУ станка, а не у компании, т.к. сроки были самые интересные и цена адекватная — за работу, материал и доставку отдал 55$. В итоге изготовили корпус очень быстро и качество меня устроило. Все собралось идеально, резьбы нарезаны качественно, точность обработки хорошая:
В дальнейшем нужно еще обработать пескоструем, в идеале анодировать, этим займусь в ближайшее время, а пока так. Показал знакомым и первая реакция была в стиле: "Выглядит круто, но он наверное тяжеленный?", да я и сам ожидал получить увесистый кирпич, но на практике оказалось, что вес корпуса примерно как у платы в сборе (по ощущениям как плитка шоколада):
В итоге устройство собралось с минимальными зазорами, я на все размеры вырезов давал запас 0.1 мм и разъемы встали без всяких усилий и пристукивания молотком. Хотя были опасения, что взятые с 3dcontent модели окажутся не достаточно точные или с ошибками, но все обошлось. Вообще, если берете 3D модели с внешнего источника, то настоятельно рекомендую проверять хотя бы внешние габариты для элементов, которые задают габариты и под которые выполняются вырезы, тогда проблем быть не должно.
Реализация аппаратных защит
Данная тема заслуживает полноценного холивара, но я лишь опишу свой опыт, а там думайте. "Классическим" способом реализации защиты по току (OCP) и по напряжению (UVLO, OVP) является прямое использование компаратора, подключенного к шунту или делителю напряжения, сигнал ошибки с которого подается на D-триггер, обрывающий ШИМ-сигналы. Когда каналов защиты много, то логично заменить большое количество дискретной логики на CPLD. Все это работает и работает хорошо, но занимает место на плате и добавляет к себестоимости.
Благо в современных контроллерах, которые заточены под работу в преобразователях (TMS320F28, STM32F334/G474, XMC4200 и другие) все эти компоненты имеются внутри контроллера. Например, в используемом мною STM32F334C есть 3 быстрых компаратора, сигналы с которых заведены на входы аппаратной защиты FAULT от HRTIM (HRPWM). Так же внутри МК имеется ЦАП, которым можно регулировать опорный сигнал компаратора и тем самым задавать порог срабатывания защиты. Все это внутри выглядит примерно так:
Как видите все, что нужно для реализации защиты уже есть в МК и можно значительно упростить внешнюю обвязку, сократив количество примененных компонентов. Изначально я "не верил" в надежность данной реализации защиты, но применив в качестве эксперимента его в парочке проектов проблем не выявил. Время срабатывания защиты всегда примерно 3-4 мкс, чего достаточно во многих задачах. Так же стоит отметить гибкость решения и наличие аппаратных фильтров на сигналах ошибки. В итоге я остановился именно на такой реализации защиты в МРРТ контроллере.
Так же стоит отметить, что в F334/G474 уже есть встроенные ОУ и возможность включить входы АЦП в дифферинциальном режиме, например, их можно было бы применить для измерения напряжения и избавиться от необходимости вычислять входное и выходное напряжение. Однако в цепь измерения тока их я не стал применять, т.к. усиление достаточно высокое, а полоса у них так себе, на единичном же усиление пожалуйста.
Итоги
На данном этапе я получил финальный вариант аппаратной части контроллера, в будущем возможно и будут какие-то исправления или переделки, но совсем незначительные. Дальше все усилия будут брошены на написание софта и реализации аппаратно заложенного функционала, пока что работает лишь CC/CV режим для AGM и GEL батарей в паре со сканирующим алгоритмом ТММ, теперь необходимо будет поднять CAN open, добавить популярные алгоритмы поиска ТММ и изобрести web-морду для мониторинга. Так же в планах есть перенос проекта из Altium Designer в открытый KiCAD.
Все исходники на железную часть проекта открыты и доступны на github — тут.