Управление электронной нагрузкой с помощью энкодера из мышки
Захотел сделать управление с помощью энкодера для своей простой самодельной нагрузки. Подумал, что «мышиное» колесико будет интереснее обычной поворотной «крутилки». Вроде бы для такого есть простые решения, но как обычно, для начинающего, реальность оказывается интереснее ожиданий. Что из этого вышло — под cut.
Раньше в качестве нагрузки обходился или переменным или мощным подобранным постоянным резистором. Когда надоело подбирать, да и мощность потребовалась побольше, заказал китайский набор для сборки нагрузки на lm324, собрал её и даже в корпус поместил. Хотя вышло и неказисто, но неожиданно оказалось, что это довольно востребованная штука. С ней тесты модулей с разными напряжениями и токами становятся проще.
А некоторые тесты и вовсе в вариантах с резисторами не кажутся доступными — нужно удержание тока в нагрузке.
Понимаю, что такая востребованность, в немалой степени вызвана написанием обзоров. Но полезности электронной нагрузки для меня, этот факт ни разу не умаляет ;)
Схема этой нагрузки довольно простая. Не знаю,у кого где её взяли китайцы, но она вполне рабочая «искаропки». Очень подробно и доходчиво, работа этой схемы описана вот в этом обзоре kirich.
Коротко: нагрузкой, переводящей ватты в тепло, в этой схеме являются мощные полевые транзисторы, работающие в линейном режиме. Для удержания заданного тока в нагрузке, используется операционный усилитель, который «сравнивает» падение напряжения на шунте от протекающего в нагрузке тока, с напряжением, заданным регулирующим переменным резистором. И в зависимости от результатов сравнения, выдает нужную коррекцию на затвор транзистора. Для увеличения мощности, несколько таких «каналов» включены параллельно, а управляются одним переменным резистором. Количество каналов можно увеличивать, пробовал с 4 до 8 — работает.
В целом, такое управление удобно, но есть и свои особенности. Чтобы не втыкать постоянно разъём для подключения и отключения нагрузки, сразу сделал коммутацию входа через реле. И довольно часто, тестируемые устройства, особенно мощные, такое «резкое» подключение нагрузки воспринимают как КЗ и уходят в защиту. В результате, при тестировании различных БП в разных режимах, постоянно приходится «накручивать» и «откручивать» резистор для плавного увеличения тока нагрузки после подключения. Вот для таких (но не только) случаев удобно было бы сделать программное управление нагрузкой.
С программированием контроллеров сталкивался очень давно по работе, но там всё «было другое». Позже пробовал и Arduino, поморгал светодиодом, но достойных вариантов применения ему у меня так и не нашлось. Поэтому забросил на некоторое время. А тут в нагрузке применил МК, по сути, для индикации тока и напряжения. Использовал «связку» из микроконтроллера ESP32-C3 Super Mini, модуля вольтамперметра INA226 и 1,8'' TFT дисплея.

С прицелом на перспективу и дальше расширять функциональность. И это оказалось довольно интересное развлечение: открыл для себя много моментов и с подключением, и с отображением и с настройками. Поначалу, добился только того, что было нужно для измерения и индикации, причём самым примитивным способом: подключил требующиеся для работы с дисплеем и ампервольтметром библиотеки, добился их работы. Добавил ещё замер и отображение температуры на одном из MOSFET-ов с помощью DS18B20, для наблюдения. И отсчет времени с момента подключения нагрузки. Да так всё и оставил: дальше просто пользовался.
И вот «дозрел», решил добавить больше функций для повышения удобства. Начать решил с управления энкодером и с возможности выставления заданного тока, который нагрузка «сама» будет поддерживать, и «сама» же плавно повышать ток нагрузки при подключении.
Т.е. просто нужно в точку J1.1#2 (или J3#2) подать напряжение ~0..500 мВ для управления. Для этого можно использовать какой-либо цифро-аналоговый преобразователь для программного задания нужного уровня напряжения. В ESP32-C3 нет встроенного ЦАП (DAC). Получение аналога из ШИМ посмотрел, но показалось, что мне будет сложно бороться с помехами.
После недолгих поисков, выбор пал на готовый Arduino-модуль с MCP4725, он устроил и по заявленным возможностям и по цене. Это 12-ти битный ЦАП, с I2C подключением. Заказывал его на Али, сразу несколько штук, с перспективой воткнуть еще и в ЛБП.
Для управления решил использовать обычный поворотный энкодер, с кучей кнопок связываться не хотелось. Заказал таких несколько с «ручкой-крутилкой» и с осевым нажатием на кнопку.
Попробовал, с точки зрения удобства управления он показался так себе, не очень понравился. И захотелось странного возникла идея прикрутить «мышиный» энкодер, подумалось, что он будет удобнее. Вы тоже не выбрасываете старые мышки? Так вот, оказывается, зачем их хранил ;)
Нашёл какую-то старую мышь с подходящим колёсиком и «выпилил» оттуда кусок платы с энкодером. Для контактов пришлось допаять резисторы для «подтяжки» к "+" питания. И прям на остатках мыши подключил энкодер, и всё заработало.

Раз заработало, то с помощью бормашины, надфиля и термоклея прикрепил этот энкодер с колесиком и куском её корпуса на переднюю панель нагрузки для дальнейших экспериментов.
Прикрепил всю конструкцию вместо переменного резистора, резистор поначалу снял. И хотя места на панели уже по сути и не осталось, однако, резистор этот пришлось всё же воткнуть в другое место на панели. Потому что нагрузкой пользуюсь, а эксперименты как обычно подзатянулись: энкодер-то у меня «завёлся» сразу, а вот с MCP4725 пришлось изрядно повозиться. Хорошо, что ранее делал разъём для управления «ведомой» нагрузки (J3 на схеме), тут он очень пригодился: задающий сигнал от него уже подключен к входам ОУ (через резисторы 1к). Так можно руками через разъёмы коммутировать управление или с резистора или с ЦАП.

Дальше дело встало за MCP4725. Как вообще, начинающему вроде меня, видится вся эта история? Да всё просто же: прочитал несколько статей тут и там, нигде ни про какие подводные камни вроде не говорится, даже наоборот — купи, подключи и работай. Хочешь синусоиду выдавай, хочешь треугольники на выход. 12 бит, больше 4000 отсчётов, на ~8 А, получается где-то по 2 мА дискретность. Всё отлично, мне подходит, вперёд :) А как всё это это выглядит на практике? Да всё как обычно: при реализации «есть нюансы» (ц).
Для начала, у MCP4725 нет своего встроенного источника опорного напряжения и он использует в качестве ИОН напряжение питания. Максимальное собственное потребление заявлено в 400 мкА, а работает он по ДШ от 2.7 до 5.5В. Были мысли использовать какие-то стабилизаторы напряжения в качестве ИОН, попробовал на LM317 и с ним даже всё стабильно работало от аккумулятора. Но в случае питания от схемы (трансформатор 50Гц, диодный мост, конденсатор и LM7812) напряжение у него плавает заметно даже для моего мультиметра, для ИОН это как-то не очень точно. Попытался сделать стабилизатор на базе TL431, но у меня не получилось с ним добиться стабильной работы. Балластный резистор сначала использовал 10 кОм, как в оригинальной схеме, но «стабилизированное» напряжение сильно плавало, а вместе с ним и на выходе ЦАП не было никакой стабильности. Попробовал уменьшить балластное сопротивление сначала до 5 кОм, потом до 1 кОм и всё равно добиться чёткой стабилизации не получилось. Пробовал и саму 431 менять но улучшений не случилось. Видимо чего-то не понимаю. Поэтому, в результате взял Ref195, он тут, наверное, немного «перебор», но под рукой был только он. С ним, напряжение с MCP4725 уже не плавало: по крайней мере у моего мультиметра, при замере напряжения на входе, колеблется только последний разряд 0-1 мВ.
Дальше подключил выход со стабилизатора на вход ЦАП. Выход MCP4725 через многооборотный подстроечный резистор на 100 кОм — на задающий вход ОУ LM324 через 1 кОм. Выставил максимальное напряжение 500 мВ для 4096 отсчётов (замерил максимум с переменного резистора до модернизации — 485 мВ).
Обнаружил на выходе смещение в ~1.6 мВ, погуглил, оказывается «это нормально» и по ДШ в худшем случае может вообще 37.5 мВ достигать (0.75% of FSR или Vdd).
А есть ещё и ошибка усиления, там вообще от -2% до +2% может оказаться, тоже на смещение влияет.
К этому моменту, уже удосужился немного почитать ДШ чуть дальше характеристик. И оптимизма у меня несколько поубавилось. 0.5В и 4096 отсчётов дает LSB что-то около 0.12 мВ. Что в теории, дает на нагрузке ~2.5 мА. Но там есть ещё и

Как это, нелинейность? Разве не идеальная прямая линия на выходе? Оказывается — нет. В ДШ для этой INL Error указано значение Typ ±2 LSB, Max ±14.5 LSB. Ещё там же пишут, что на концах диапазона от 0 до 100 отсчётов и от 4000 до 4096 отсчётов нелинейность может быть даже больше, рекомендуют использовать от 100 до 4000 отсчётов. Всё таки там хоть и R2R ОУ, но и они не идеальны. Т.е в моём случае надо ожидать ±0.25 мВ (после делителя ~1:10), или не более ±5 мА для 3900 отсчётов. Хотя это уже сильно больше «идеальных» 2 мА, но да ладно, подумал, что так тоже сойдет :)
В ходе программирования и тестоввдруг выяснилось, что для напряжения на выходе моего экземпляра MCP4725 наблюдается какая-то уж слишком не линейная зависимость от заданного цифрового значения и даже «нелинейнее» чем должно быть по ДШ. Отклонения от ожидаемых (линейных) значений превышают 2 мВ после делителя, причем в разную сторону и на разных концах диапазона.
А это прям совсем не мало: ±2 мВ после делителя — это уже почти ±40 мА на нагрузке. Подумал, может экземпляр такой попался, поменял — однако лучше не стало. Тогда заказал другой вариант модуля MCP4725, дороже, но уже с локальной доставкой с Озона. С ним оказалось тоже не идеально, но у него эта INL Error получается хоть и далековато от Typ (±2 LSB) по ДШ. Но всё же меньше 1 мВ после делителя, или ±4 LSB. У модуля же с Али ±16 LSB, что существенно больше даже Max ±14.5 LSB (±20 мВ >> ±18 мВ). Т.е., с этим модулем на Али история очень похожая на «плохие» INA226 оттуда же — дёшево, но работает совсем не так как ожидается. Штош, с новым экземпляром хотя бы на ±10 мА в нагрузке можно надеяться.
Собрал модуль, плату с ИОН и подстроечный резистор в единую конструкцию на кусочке макетной платы.
Туда же припаял JST разъем и подключил всё это в гнездо зависимой нагрузки.

Начал тестировать и словил неприятный недостаток — для некоторых отсчётов, ток держится довольно стабильно, а для некоторых может «гулять» в пределах даже ±25 мА. Причём стабильность лучше при больших токах.
Продолжил тестировать и дальше выяснилось, что напряжение на выходе DAC после делителя, вовсе не линейно влияет на нагрузку. Т.е и тут присутствует нелинейность, причём, очень сильно она проявляется в начале диапазона, до ~60 мВ (~620 мА). Дальше немного «выравнивается». Поначалу удивился, потом вспомнил, что хоть режим работы транзисторов и называют линейным. Но в ДШ зависимость тока через сток-исток от напряжения на затворе, на графике обычно в виде линий не очень то и прямых.
Подумал, и сначала начал читать про кусочно-линейную апроксимацию. А потом подумал ещё раз и решил, что раз уже есть INA226 и замеры тока, то нужно попросту сделать простой итерационный поиск нужного количества отсчетов, для достижения нужного значения с заданной погрешностью. В итоге на тестах всё заработало. Почти так, как хотел, но, с учётом того самого «есть нюансы» :)
Период чтения и установки значений ограничил 200 миллисекунд, т.к. после установки значения в MCP4725 есть некоторый период ~100 мс. пока результаты появятся на выходе. В результате, плавное подключение нагрузки получилось само собой и тестируемый БП теперь в защиту не уходит.

Точность установки зависит от заданной окрестности поиска. Если задать ±5 мА, то нагрузка «ближе» к заданному, но дольше скачет вокруг, больше итераций. Если задать ±10 мА, то ловится чуть быстрее. Оставил ±5 пока, для моих задач скорость не критична.
Ещё в текущем алгоритме, иногда на короткое время получаются установленные значения несколько больше чем задано. Для меня это приемлемо, но буду дальше настраивать.
Пока что получилось более менее:
С переменным резистором, точность установки получается повыше, особенно это важно при токах меньше 200 мА.
Микроконтроллеры для меня развлечение новое. И хотя некоторый «смежный» опыт имеется, но именно тут — пока всё внове. Поэтому в коде пока что полный сумбур. Поначалу, всё работало вообще в одном скетче, позже, когда запутался окончательно, решил разбить всё на модули. Так мне легче будет его развивать. Выделил блок модели нагрузки с её состоянием и блок отображения этого состояния. В модели нагрузки — текущие измеренные значения и различные настроечные параметры. В блоке отображения пока что отображаются измеренные значения, заданный ток, температура и отсчет времени.
совсем не так не совсем так, как хотелось. Но для начала и так сойдет )
Зато мне теперь предстоит развлечение с программированием и основных функций и меню с настройками — калибровками и с оптимизацией поиска заданного значения.
Многооборотный резистор пока так и оставлю с возможностью подключения к схеме и на том же самом месте. Для страховки, и возможно он ещё потребуется, у него «LSB» пока получше, с ним подстроить нагрузку на 2-5 мА получается без проблем :)
Ещё, «для выводов» отмечу «побочный эффект»: сейчас, после вовлечения в этот процесс, цены на полнофункциональные нагрузки в 10-30т.р. уже стали казаться вполне обоснованными ;) А 5-6 т.р. за EL15 — довольно демократичная стоимость. Ну и 2-3 т.р. за DL24 — вообще «аттракцион невиданной щедрости», даже без корпуса. Потому что у всех у них есть экран и управление, трудоемкость создания, отладки и сопровождения-развития которого, тоже стоит немалых усилий.
Посомневался, стоит ли на данной стадии, но всё-же выложил исходники в облако: ссылка. Хоть и нечем пока гордиться, возможно мои потуги ещё кому-то из таких же начинающих, могут пригодиться. Мне интересно было с этим разбираться, решил поделиться. Буду рад конструктивным советам.
В моем же случае, речь об экономии уже давно не идет: мне попросту интересно. Тем более, что результатами уже даже получается пользоваться. Думаю и дальше продолжить, появляются новые идеи :)
Зачем? Идея
Раньше в качестве нагрузки обходился или переменным или мощным подобранным постоянным резистором. Когда надоело подбирать, да и мощность потребовалась побольше, заказал китайский набор для сборки нагрузки на lm324, собрал её и даже в корпус поместил. Хотя вышло и неказисто, но неожиданно оказалось, что это довольно востребованная штука. С ней тесты модулей с разными напряжениями и токами становятся проще.
А некоторые тесты и вовсе в вариантах с резисторами не кажутся доступными — нужно удержание тока в нагрузке.
Понимаю, что такая востребованность, в немалой степени вызвана написанием обзоров. Но полезности электронной нагрузки для меня, этот факт ни разу не умаляет ;)Схема этой нагрузки довольно простая. Не знаю,
Коротко: нагрузкой, переводящей ватты в тепло, в этой схеме являются мощные полевые транзисторы, работающие в линейном режиме. Для удержания заданного тока в нагрузке, используется операционный усилитель, который «сравнивает» падение напряжения на шунте от протекающего в нагрузке тока, с напряжением, заданным регулирующим переменным резистором. И в зависимости от результатов сравнения, выдает нужную коррекцию на затвор транзистора. Для увеличения мощности, несколько таких «каналов» включены параллельно, а управляются одним переменным резистором. Количество каналов можно увеличивать, пробовал с 4 до 8 — работает.В целом, такое управление удобно, но есть и свои особенности. Чтобы не втыкать постоянно разъём для подключения и отключения нагрузки, сразу сделал коммутацию входа через реле. И довольно часто, тестируемые устройства, особенно мощные, такое «резкое» подключение нагрузки воспринимают как КЗ и уходят в защиту. В результате, при тестировании различных БП в разных режимах, постоянно приходится «накручивать» и «откручивать» резистор для плавного увеличения тока нагрузки после подключения. Вот для таких (но не только) случаев удобно было бы сделать программное управление нагрузкой.
С программированием контроллеров сталкивался очень давно по работе, но там всё «было другое». Позже пробовал и Arduino, поморгал светодиодом, но достойных вариантов применения ему у меня так и не нашлось. Поэтому забросил на некоторое время. А тут в нагрузке применил МК, по сути, для индикации тока и напряжения. Использовал «связку» из микроконтроллера ESP32-C3 Super Mini, модуля вольтамперметра INA226 и 1,8'' TFT дисплея.

С прицелом на перспективу и дальше расширять функциональность. И это оказалось довольно интересное развлечение: открыл для себя много моментов и с подключением, и с отображением и с настройками. Поначалу, добился только того, что было нужно для измерения и индикации, причём самым примитивным способом: подключил требующиеся для работы с дисплеем и ампервольтметром библиотеки, добился их работы. Добавил ещё замер и отображение температуры на одном из MOSFET-ов с помощью DS18B20, для наблюдения. И отсчет времени с момента подключения нагрузки. Да так всё и оставил: дальше просто пользовался.
И вот «дозрел», решил добавить больше функций для повышения удобства. Начать решил с управления энкодером и с возможности выставления заданного тока, который нагрузка «сама» будет поддерживать, и «сама» же плавно повышать ток нагрузки при подключении.
Реализация
Варианты с моторизованными резисторами рассматривать не стал :) Решил, что проще чем-то заменить весь узел с управляющим переменным резистором R23. В схеме он выполняет функцию делителя опорного напряжения на TL431, которое подается в качестве задающего на вход операционных усилителей каналов.
Т.е. просто нужно в точку J1.1#2 (или J3#2) подать напряжение ~0..500 мВ для управления. Для этого можно использовать какой-либо цифро-аналоговый преобразователь для программного задания нужного уровня напряжения. В ESP32-C3 нет встроенного ЦАП (DAC). Получение аналога из ШИМ посмотрел, но показалось, что мне будет сложно бороться с помехами.После недолгих поисков, выбор пал на готовый Arduino-модуль с MCP4725, он устроил и по заявленным возможностям и по цене. Это 12-ти битный ЦАП, с I2C подключением. Заказывал его на Али, сразу несколько штук, с перспективой воткнуть еще и в ЛБП.
Для управления решил использовать обычный поворотный энкодер, с кучей кнопок связываться не хотелось. Заказал таких несколько с «ручкой-крутилкой» и с осевым нажатием на кнопку.
Попробовал, с точки зрения удобства управления он показался так себе, не очень понравился. И Нашёл какую-то старую мышь с подходящим колёсиком и «выпилил» оттуда кусок платы с энкодером. Для контактов пришлось допаять резисторы для «подтяжки» к "+" питания. И прям на остатках мыши подключил энкодер, и всё заработало.

Раз заработало, то с помощью бормашины, надфиля и термоклея прикрепил этот энкодер с колесиком и куском её корпуса на переднюю панель нагрузки для дальнейших экспериментов.
Прикрепил всю конструкцию вместо переменного резистора, резистор поначалу снял. И хотя места на панели уже по сути и не осталось, однако, резистор этот пришлось всё же воткнуть в другое место на панели. Потому что нагрузкой пользуюсь, а эксперименты как обычно подзатянулись: энкодер-то у меня «завёлся» сразу, а вот с MCP4725 пришлось изрядно повозиться. Хорошо, что ранее делал разъём для управления «ведомой» нагрузки (J3 на схеме), тут он очень пригодился: задающий сигнал от него уже подключен к входам ОУ (через резисторы 1к). Так можно руками через разъёмы коммутировать управление или с резистора или с ЦАП.
Дальше дело встало за MCP4725. Как вообще, начинающему вроде меня, видится вся эта история? Да всё просто же: прочитал несколько статей тут и там, нигде ни про какие подводные камни вроде не говорится, даже наоборот — купи, подключи и работай. Хочешь синусоиду выдавай, хочешь треугольники на выход. 12 бит, больше 4000 отсчётов, на ~8 А, получается где-то по 2 мА дискретность. Всё отлично, мне подходит, вперёд :) А как всё это это выглядит на практике? Да всё как обычно: при реализации «есть нюансы» (ц).
Для начала, у MCP4725 нет своего встроенного источника опорного напряжения и он использует в качестве ИОН напряжение питания. Максимальное собственное потребление заявлено в 400 мкА, а работает он по ДШ от 2.7 до 5.5В. Были мысли использовать какие-то стабилизаторы напряжения в качестве ИОН, попробовал на LM317 и с ним даже всё стабильно работало от аккумулятора. Но в случае питания от схемы (трансформатор 50Гц, диодный мост, конденсатор и LM7812) напряжение у него плавает заметно даже для моего мультиметра, для ИОН это как-то не очень точно. Попытался сделать стабилизатор на базе TL431, но у меня не получилось с ним добиться стабильной работы. Балластный резистор сначала использовал 10 кОм, как в оригинальной схеме, но «стабилизированное» напряжение сильно плавало, а вместе с ним и на выходе ЦАП не было никакой стабильности. Попробовал уменьшить балластное сопротивление сначала до 5 кОм, потом до 1 кОм и всё равно добиться чёткой стабилизации не получилось. Пробовал и саму 431 менять но улучшений не случилось. Видимо чего-то не понимаю. Поэтому, в результате взял Ref195, он тут, наверное, немного «перебор», но под рукой был только он. С ним, напряжение с MCP4725 уже не плавало: по крайней мере у моего мультиметра, при замере напряжения на входе, колеблется только последний разряд 0-1 мВ.
Дальше подключил выход со стабилизатора на вход ЦАП. Выход MCP4725 через многооборотный подстроечный резистор на 100 кОм — на задающий вход ОУ LM324 через 1 кОм. Выставил максимальное напряжение 500 мВ для 4096 отсчётов (замерил максимум с переменного резистора до модернизации — 485 мВ).
Обнаружил на выходе смещение в ~1.6 мВ, погуглил, оказывается «это нормально» и по ДШ в худшем случае может вообще 37.5 мВ достигать (0.75% of FSR или Vdd).
А есть ещё и ошибка усиления, там вообще от -2% до +2% может оказаться, тоже на смещение влияет.К этому моменту, уже удосужился немного почитать ДШ чуть дальше характеристик. И оптимизма у меня несколько поубавилось. 0.5В и 4096 отсчётов дает LSB что-то около 0.12 мВ. Что в теории, дает на нагрузке ~2.5 мА. Но там есть ещё и
INL Error (Integral Nonlinearity Error) — интегральная нелинейность, которая показывает максимальное отклонение реальной передаточной характеристики микросхемы от идеальной прямой линии.

Как это, нелинейность? Разве не идеальная прямая линия на выходе? Оказывается — нет. В ДШ для этой INL Error указано значение Typ ±2 LSB, Max ±14.5 LSB. Ещё там же пишут, что на концах диапазона от 0 до 100 отсчётов и от 4000 до 4096 отсчётов нелинейность может быть даже больше, рекомендуют использовать от 100 до 4000 отсчётов. Всё таки там хоть и R2R ОУ, но и они не идеальны. Т.е в моём случае надо ожидать ±0.25 мВ (после делителя ~1:10), или не более ±5 мА для 3900 отсчётов. Хотя это уже сильно больше «идеальных» 2 мА, но да ладно, подумал, что так тоже сойдет :)
В ходе программирования и тестов
А это прям совсем не мало: ±2 мВ после делителя — это уже почти ±40 мА на нагрузке. Подумал, может экземпляр такой попался, поменял — однако лучше не стало. Тогда заказал другой вариант модуля MCP4725, дороже, но уже с локальной доставкой с Озона. С ним оказалось тоже не идеально, но у него эта INL Error получается хоть и далековато от Typ (±2 LSB) по ДШ. Но всё же меньше 1 мВ после делителя, или ±4 LSB. У модуля же с Али ±16 LSB, что существенно больше даже Max ±14.5 LSB (±20 мВ >> ±18 мВ). Т.е., с этим модулем на Али история очень похожая на «плохие» INA226 оттуда же — дёшево, но работает совсем не так как ожидается. Штош, с новым экземпляром хотя бы на ±10 мА в нагрузке можно надеяться. Собрал модуль, плату с ИОН и подстроечный резистор в единую конструкцию на кусочке макетной платы.
Туда же припаял JST разъем и подключил всё это в гнездо зависимой нагрузки. 
Начал тестировать и словил неприятный недостаток — для некоторых отсчётов, ток держится довольно стабильно, а для некоторых может «гулять» в пределах даже ±25 мА. Причём стабильность лучше при больших токах.
Продолжил тестировать и дальше выяснилось, что напряжение на выходе DAC после делителя, вовсе не линейно влияет на нагрузку. Т.е и тут присутствует нелинейность, причём, очень сильно она проявляется в начале диапазона, до ~60 мВ (~620 мА). Дальше немного «выравнивается». Поначалу удивился, потом вспомнил, что хоть режим работы транзисторов и называют линейным. Но в ДШ зависимость тока через сток-исток от напряжения на затворе, на графике обычно в виде линий не очень то и прямых.
Подумал, и сначала начал читать про кусочно-линейную апроксимацию. А потом подумал ещё раз и решил, что раз уже есть INA226 и замеры тока, то нужно попросту сделать простой итерационный поиск нужного количества отсчетов, для достижения нужного значения с заданной погрешностью. В итоге на тестах всё заработало. Почти так, как хотел, но, с учётом того самого «есть нюансы» :)
Период чтения и установки значений ограничил 200 миллисекунд, т.к. после установки значения в MCP4725 есть некоторый период ~100 мс. пока результаты появятся на выходе. В результате, плавное подключение нагрузки получилось само собой и тестируемый БП теперь в защиту не уходит.

Точность установки зависит от заданной окрестности поиска. Если задать ±5 мА, то нагрузка «ближе» к заданному, но дольше скачет вокруг, больше итераций. Если задать ±10 мА, то ловится чуть быстрее. Оставил ±5 пока, для моих задач скорость не критична.
Ещё в текущем алгоритме, иногда на короткое время получаются установленные значения несколько больше чем задано. Для меня это приемлемо, но буду дальше настраивать.Пока что получилось более менее:
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
С переменным резистором, точность установки получается повыше, особенно это важно при токах меньше 200 мА.
Микроконтроллеры для меня развлечение новое. И хотя некоторый «смежный» опыт имеется, но именно тут — пока всё внове. Поэтому в коде пока что полный сумбур. Поначалу, всё работало вообще в одном скетче, позже, когда запутался окончательно, решил разбить всё на модули. Так мне легче будет его развивать. Выделил блок модели нагрузки с её состоянием и блок отображения этого состояния. В модели нагрузки — текущие измеренные значения и различные настроечные параметры. В блоке отображения пока что отображаются измеренные значения, заданный ток, температура и отсчет времени.
Выводы
В итоге, управление нагрузкой «мышиным» энкодером реализовал «в первом чтении». Работает
Зато мне теперь предстоит развлечение с программированием и основных функций и меню с настройками — калибровками и с оптимизацией поиска заданного значения. Многооборотный резистор пока так и оставлю с возможностью подключения к схеме и на том же самом месте. Для страховки, и возможно он ещё потребуется, у него «LSB» пока получше, с ним подстроить нагрузку на 2-5 мА получается без проблем :)
Ещё, «для выводов» отмечу «побочный эффект»: сейчас, после вовлечения в этот процесс, цены на полнофункциональные нагрузки в 10-30т.р. уже стали казаться вполне обоснованными ;) А 5-6 т.р. за EL15 — довольно демократичная стоимость. Ну и 2-3 т.р. за DL24 — вообще «аттракцион невиданной щедрости», даже без корпуса. Потому что у всех у них есть экран и управление, трудоемкость создания, отладки и сопровождения-развития которого, тоже стоит немалых усилий.
Посомневался, стоит ли на данной стадии, но всё-же выложил исходники в облако: ссылка. Хоть и нечем пока гордиться, возможно мои потуги ещё кому-то из таких же начинающих, могут пригодиться. Мне интересно было с этим разбираться, решил поделиться. Буду рад конструктивным советам.
В моем же случае, речь об экономии уже давно не идет: мне попросту интересно. Тем более, что результатами уже даже получается пользоваться. Думаю и дальше продолжить, появляются новые идеи :)
Самые обсуждаемые обзоры
+21








Вот это странно. Тут получалась двойная стабилизация (7812 + 317), ничего плавать не должно.
MCP4725 — это очень дешевый ЦАП с INL до 14.5 LSB, от него не приходится ждать чудес. Есть более дорогие ЦАП, у 12-разрядных бывает максимальная INL меньше 1 LSB.
В данном случае это не имеет никакого значения, транзистор находится внутри петли обратной связи по току. Почему наблюдалась нелинейность — надо разбираться. Не надо забывать и напряжение смещения ОУ, а он тут выбран плохой.
Вообще, калибровка систем с однополярными ЦАП/АЦП — отдельная тема. Обычно искусственно смещают условной ноль на величину, заведомо больше возможного смещения ЦАП/АЦП и ОУ. Чтобы получить запас на калибровку. Вверху шкалы тоже нужно иметь запас на погрешность коэффициента передачи (неточность резисторов). К тому же, у ЦАП с выходным диапазоном, равным напряжению питания, по краям будет нелинейность из-за неидеальности R-R ОУ. Потом в софте надо написать процедуру калибровки по двум точкам, которая будет вычислять два калибровочных коэффициента — смещение и наклон шкалы. Их потом надо использовать при задании тока.
Есть мысли больше двух точек использовать для калибровки, нужно только выбрать алгоритм, чтобы было более-менее удобно калибровку делать.