Чем шире открываешь объятия, тем легче тебя распять.
Фридрих Ницше

Меню навигации для мобильных

Показометр на STM32 для блока питания

Автор zenon, 22 Март, 2024, 18:44

« предыдущая - следующая »

zenon

Соберу все-же показометр.
Схема с ОУ из старого проекта. Vref нет, отталкиваться надо от AVDD.
Перенесу из тини кнопку и вентилятор сюда.
↓ спойлер ↓
avf0-01.jpg
[свернуть]

Slabovik

AVDD - это так себе. Для показометра наверное хватит. Основная проблема будет - дрейф показаний в зависимости от температуры. Дрейфовать будет TL431. Способ уменьшения дрейфа - установка более прецизионного регулятора. Например, поискать TL431 с буквой 'B', но на деле там ещё нюансы есть, типа параметра "Load regulation" и подобное...
Также было бы недурно Vcc и Led индикатора (особенно Led) развести от другого регулятора, чтобы на регулятор на U1 была нагрузка поменьше. Но это может быть вторым шагом, сразу не обязательно делать)

Я смотрю, что-то T2 ничего не коммутирует. "Сопротивление бесполезно" :)

А вот L1 я бы не ставил. Рядом за стенкой силовой транс с большими токами и полями, и L1 будет весело ловить от его "на водку". Лучше резистор на несколько Ом. Впрочем, если L1 будет экранированной (с замкнутым магнитным полем), то проблема не возникнет.

Ещё круче на AVDD привинтить какой-нибудь REF, например REF196 (доставаем вроде). Надо только убедиться, что потребление по AVDD не превысит его возможности - тут понадобится что-нибудь помощнее, а я не помню, что там на 3.3 вольта есть...

У операционников коэффициент усиления надо посчитать. Там ещё обязательно надо выдержать R11=R12, R10=R16, R14=R15, R13=R17, при этом сразу надо бы озаботиться, чтобы резисторы эти не хуже 1% были. При этом желательно тонкоплёночные (Thick Film) - у них температурных уход меньше.

Коэффициент усиления надо посчитать, какой необходим. Пока забъём на напряжение питания...

На входе АЦП надо 3,3 вольта при максимальном напряжении/токе. Я смотрю, максимальное определено как 40 вольт. Я бы сделал 40,95 вольта :) для удобства целочисленной математики. При этом один разряд АЦП будет в точности равен 10 мВ.

На выходе подстроечный делитель R18/(0,5*R20+R21)
Значит, на выходе ОУ надо получить: 3,3*(R18+0,5*R20+R21)/(0,5*R20+R21) = 3,64138 вольта

40,96 соотносится с 3,64138 как 11,2457 - именно таков должен быть коэффициент усиления ОУ по напряжению. Надо, чтобы R11 R12 соотносились с R10 R16 на это число. Например 2,4к и 27к (соответственно, 24к и 270к но с высокими сопротивлениями опять надо смотреть, то там с токами на входах ОУ - могут быть сюрпризы).

Не нравится соотношение потому что ничего подобрать нельзя? Ну тогда корректируем делитель на выходе, чтобы соотношение быть слегка другим, но чтобы ещё за допустимые напряжения не выскочило и снова считаем. Можно в ёкселе автоматизировать.

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

Расчёт усилителя с током аналогичен. Надо выбрать предел, желательно чтобы 4096 отсчётов ложились нацело на диапазон. Например, можно 1,5 мА на отсчёт принять - будет предел 6,1 ампера.
И тут уже нужно потщательнее регулировку на выходе посчитать - чтобы отклонения токоизмерительных резисторов можно быть гарантированно компенсировать.

Также надо выбрать ОУ. R2R при таком питании - однозначно. Но надо ещё и минимизировать напряжение смещения. У этих ОУ, что на схеме, оно весьма велико. Целых 3,5 мВ (примерно). Это значит, что это напряжение смещения будет усилено согласно заданного резисторами коэффициента усиления и будет подано на выход. Если для усилителя в канале напряжения это ещё как-то пофиг, то в усилителе канала тока это критично, т.к. коэффициент усиления большой. Щас глянул - какой-нибудь OPA333 наверное неплохо пойдёт.
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

zenon

Да, T2 я круто подключил-с. :)
Тут я не буду добиваться супер точности, из ОУ есть либо тот, что указан, либо 6002 (у него input offset max 4,5), оба заявлены как R2R.
Про OPA333 буду иметь ввиду, но собираю из того, что есть.
Разобрался сейчас с выбором канала АЦП, вот тут есть от чего оттолкнуться, но "из коробки" не заработало, надо переделать немножко.
Тут ещё вот какая штука с резисторами подстроечными, в таком формате (smd мелкие 3х3 мм) есть только 5 кОм, и они уже на плате.

На фото один канал в воздухе, другой замкнул на землю, "сырые" данные с АЦП.
↓ спойлер ↓
1711442942749.jpg
[свернуть]

Slabovik

Да, делитель у TL431 тоже как-то неправильно номиналы стоят.
Отношение верхнего к нижнему должно быть

R4=(3,3*R5/2,495)-R5

Хорошо подходит пара R5=62кОм, R4=20 кОм. Естетственно, точность должна быть.
Конденсатор C1 надо подобрать минимальной ёмкости при гарантированном отсутствии возбуждения TL431
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

zenon

На выходе БП, перед вольтметром ставлю обычно нагрузочный резистор 2-х ваттный, тут такое решение не очень подходит, может на транзисторе источник тока сообразить?

Slabovik

Это хорошее решение - разряжать конденсаторы по-любому надо. Включить его "мимо" токоизмерительного шунта, чтобы показания не портил.
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

zenon

А как ты считаешь, если напряжение питания 3,3 но учитываешь на выходе 3,6 с копейками вольт?
Или верх "срежется" делителем?
Так-то с натяжкой и 100k/9,1k тоже подходит 10,99 кус получается, вполне можно попасть в диапазон, или делитель 8,6k поставить, на выходе подстроить.

Slabovik

#7
Питание ОУ должно быть от входящих 5 вольт. Тут без вариантов. Можно пофильтровать через RC, потребление маленькое. Качество питания, в отличие от опорника АЦП,тут второстепенно.

По-хорошему, надо бы для ОУ и отрицательное питание, вольта в полтора. Тогда проблемы с R2R снимаются и выбор ОУ становится много шире. Проблемы в том, что у R2R "притягиваение" выходов к шинам питания у них в любом случае идёт неохотно на последних милливольтах и это тоже будет искажать показания.

А напряжение на выходе ОУ =\= напряжению на входе АЦП - ты же сам туда делитель поставил  ;)

Если хочешь оставить Ку 100/9.1 - пожалуйста, но надо уточнить делитель на выходе ОУ. При расчёте учитывать половину сопротивления подстроечника, а пределы регулировки по нулевому и полному его сопротивлению. Регулировка должна перекрывать возможные отклонения опорника (2%) и коэффициента усиления ОУ (та же пара процентов). В итоге +/- процентов пять должно быть. Более 10 тоже не рекомендовал бы, ибо а) подстроечники не стабильны б) будет чрезмерной острота настройки.

зы: для приведения коэффициента усиления, параллельно 9,1 кОм можно подпаять 390 кОм - будет тютя-в-тютю.
Также можно слегка пересчитать делитель на выходе. Я бы предпочёл делитель, т.к. я его не считал - взял твои данные. Мне видится сопротивление на выходе ОУ в 1,5 кОм слишком маленьким. Хотя... надо ещё частотку прикинуть... А R24 R25 зачем?

зызы: цены на SMD подстроечники какие-то запредельные...

Вот, что получается с имеющимися номиналами

table.png

В регулировку попал, но с 100/9.1 кОм, полагаю, будет мимо. Проверим

Табля.png

Ну, да, мимо. Чтобы было нормально, надо R18 1,8 кОм ставить, с 1,5 кОм получается завышено.
А глянь первый вариант. Фишка такая, что при увеличении R18 увеличивается диапазон регулировки. Плюс-минус три процента должно с лихвой перекрывать неточности и ещё не быть слишком большим. Правда, там получается верхнее напряжение на выходе ОУ опять близко к верхнему рейлу, но десятая вольта для R2R ещё нормально.

Вот прикольно

Табля-оптима.png

Но тут R11 R12 из двух последовательно составлены. Чувствуешь, какая необходимость в точности? Резисторы с допуском 5% однозначно не проходят, не вырулить с ними...

Да, кстати, ICL7660 легко сделает из +5 минус 5 - будет двуполярка для питания ОУ.
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

zenon

Резисторы 1% есть, много, но китайские :)
Сейчас на напряжение поставил 27/2,4 - без делителя на выходе, вывожу сырые данные, без пересчёта, питание ОУ пока не перекидывал на 5 вольт, линейность какая-то должна быть? Те, примерно поставил 10 вольт, отнял от показаний АЦП X, чтобы 10 = 1000 было, так вот внизу уплывает вниз, вверху вверх...
ы. Да, smd подстроечники у нас продают по каким-то странным ценам, на али брал за недорого.

Slabovik

Отнимаешь константу? А зачем? Отнимать не надо. Надо умножать/делить. Просто выводи чистые показания.
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

zenon

Мы тут чистыми показаниями почти попали в занчения  напряжения, вопрос в линейности их, а так да, конечно умножать/делить.

Slabovik

Они не почти. Они - ровно то, что надо.
Не, конечно если надо другой диапазон - тогда будет неровно, а сейчас 10 мв на отсчёт - это очень удобно.

Погрешность дают:
отклонение Uref внутри TL431 - 1%
отклонения резисторов делителя TL431 - сам посчитай :)
отклонения резисторов обвязки ОУ - даже при 1% резисторах всё грустно
напряжение смещения и входные токи (ну тут славненько - они микроскопические) ОУ

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

Ну и плюсом - отклонения твоего измерительного прибора. Надеюсь, ты не думаешь, что при показаниях 10.00 на приборе реальное значение именно такое  ;)  Увы. Для настройки измериловки надо иметь ещё более точную измериловку... замкнутый круг...

Повысить точность можно применением прецизионных компонент, например инструментальных ОУ с "Zero Drift", прецизионного источника опорного напряжения. Инструментальные ОУ удобны тем, что по факту там три ОУ внутри, но все нужные резисторы внутри и очень точны, токи же по обоим входам минимальные (нет торчащего наружу делителя ООС). Коэф усиления задаётся тоже одним резистором. Минусы - коэф усиления меньше 1 не получается - надо делить входной сигнал снаружи резисторами, следовательно, точность падает из-за них.
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

zenon

Цитата: SlabovikНадеюсь, ты не думаешь, что при показаниях 10.00
Вроде не первый год знакомы, а так плохо думаешь обо мне... :(
Всё хотел какую-нибудь точную опору в хозяйство взять, да что-то никак, ну или аппу какую-нибудь, но дорогие они...
Цитата: SlabovikОни - ровно то, что надо.
Воот, а у меня в середине попали, а внизу и вверху уехали очень сильно.

Slabovik

#13
Это я не думаю плохо, а пользы для на всякий случай (нас читают и уверенные обязательно есть, к бабке можно не ходить  :-\ ). Бывает, что и сам попадаюсь. Никому верить нельзя  ;)

Уехали - это потому что отнимал. Если у тебя показывает 120, а надо 100 и ты вдруг от 100 отнимешь 20, чтобы было 100, то когда будет ожидаться 50 вдруг окажется, что показывает 40 (60-20), а когда будет ожидаться 200, покажет 220 (240-20). По-моему так.

Очень сильно - это сколько? При установке на входе нужного напряжения надо проконтролировать, что там на выходе ОУ согласно его коэффициента усиления. Вдруг там что-то не правильно?

Настраивать надо по двум точкам, по верху и по нулю. По верху даём строго выверенное напряжение, не обязательно 40,95, но в районе 35-40 и выставляем подстроечником показания на АЦП. По низу убеждаемся, что при нуле показывает ноль или рядом. Никакой нелинейности у ОУ нет, если туда в цепи не введены нелинейные элементы. А они не введены.

А что со стабилизатором? Выдаёт стабильно то, что надо (3,30), не возбуждается? ОУ таки переключи на питание от 5 вольт.

Пересчитал с уточнением обвязку для TL431. В общем, десятки кОм наверное не стоит ставить. Из-за тока в вывод Ref слегка начинает повышать. Получается, что оптимальны 2,0 кОм и 6,2 кОм
Табля-расчёт-TL431.png

И для такого расклада наиболее примемлемой (покрывающей разброс возможностью регулировки) получается вот такая обвязка ОУ
Табля-расчёт-ОУ_по_V.png
105,6 - это два последовательно включенных 100к и 5,6к
Осталось посчитать усилитель для показаний тока. Диапазон какой брать? 10 ампер не слишком ли?  Будет 2,5 мА на отсчёт. Если взять 2 мА на отсчёт, будет 8 ампер.
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

zenon

#14
Так, запутаюсь сейчас, схема от которой дальше отталкиваюсь.
↓ спойлер ↓
avf0-02.jpg
[свернуть]
Переделал ещё немного плату, не айс конечно, но более-менее, четыре кнопки, две из них на коннекторы, I2C наружу, датчик температуры и PWM тоже, вывод пина на вкл/выкл БП, сведодиодов пару, чтобы были.
Думал пинов много, на самом деле остались свободными только два...
↓ спойлер ↓
avf0-03.jpg
[свернуть]
Вчера прицепил делитель на 431 20k/62k, конденсатор 1 нан, на транзиторе показывает 3,302, а на AVCC чуть-чуть меньше, 3,298 увидел.
Мне тоже показались великоваты резисторы.
Припаял делитель на выход ОУ напряжения (такой как сейчас на схеме) 680/(5k+2k), вот после этого почти точные показания стали, вверху немного уплыли, я думаю из-за питания 3,3, на новой плате питание уже от 5 вольт будет.
ы. Ток пусть 8 ампер будет, а файликами расчетов не поделишься?

Slabovik

Показания поверху конечно уплывут - выход ОУ просто упрётся в шину своего питания.

Давай сразу покрутим косяки.
R1 3кОм - это многовато. 5,1-(3,3+0,6)=1,2 вольта. Миллиампера полтора в базу транзистора и чтоб TL ещё осталось... Надо Ом так 470 поставить.

R6 R7 - да, наверное стоит уменьшить на порядок. Там дело ещё в том, что ток Ref слегка зависит, а на R6 он вызывает лишнее падение, которое суммируется с выходным напряжением. Пусть будет меньше. Поэтому 2,0к и 6,2к. Напряжение маленькое, ток небольшой - нормально.

Кстати, измеряя падение на R36 (лучше осциллографом, чтобы колебания видеть), можно узнать, сколько АЦП потребляет. Это на перспективу поставить туда REF196.

Уменьшение R28 R31 повышает частоту среза фильтра с C16. Она получается в районе 1 кГц. imho высоковато. Мне кажется, был метод тыка, не? Фиг с ней, типа нелинейностью АЦП, а ручками сам выход ОУ напрямую промерял?

Есть предположение. Проверь конфигурацию выводов АЦП. Не осталось ли там к ним подключено чего не надо? Я имею в виду настройки внутри чипа. И да, напомни, каково входное сопротивление АЦП?

R15 R16 R17 - это местные резисторы? В блоке же есть нужное. Или это из блока?
Я к тому, что местные ставить не надо, это плохо. Надо использовать те, которые уже в блоке есть. По схеме я смотрел, там их 10 шт параллельно. Какое там сопротивление?

Таки предусмотри либо параллельное включение из двух резисторов на места R19 R26 либо последовательное на места R20 R21. То же самое можно сделать для канала по току.

Вот расчёт усилителя для тока

Табля-расчёт-ОУ_по_I.png

Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

zenon

Сопротивление входное у него указано 50 кОм.
И вот такая картинка есть, которую пока не совсем понял. :)
↓ спойлер ↓
avf0-03_stm32f030_Rain.jpg
[свернуть]
Шунты местные, в блоке не всё так просто, там навесом всё, я ж плату делал шунтов таких ещё не было, и настройка тока там по месту, надо думать... :)
ЦитатаМне кажется, был метод тыка, не?
Да, он самый.
Цитатавыход ОУ напрямую промерял?
:-\
Цитатапредусмотри либо параллельное включение из двух резисторов на места R19 R26
Уже только бутербродом.

Slabovik

@$%  :-[

Ну её нафиг, эту STM... Дурацкие регистры, дурацкие частоты. Гоняем те же 8 бит только в 32-разрядных регистрах и 32-разрядными командами. Сказать "неудобно" - это как ничего не сказать. Забиваем те же гвозди, но микроскопом...

MCP320x - и вперёд! Да-здравствует отвязка от проца!

Давай копнём на тему АЦП. Надо документ поднять, как он устроен. Во-первых, его входное, получается, зависит от частоты выборок. Чем чаще - тем меньше. Можно думать, что это он разряжает конденсатор выборки-хранения перед взятием очередного значения. Метод борьбы - снизить количество выборок в секунду. Даже 1000 выборок в секунду для измерителя вполне достаточно и ещё останется. Это позволит ёмкость на выходе ОУ полностью восстанавливать. Но не ясно, эти 50 кОм всё время подключены, или только на время выборки для хранения - вот в чём вопрос.
Во-вторых, если выясняются плохие новости, то схему с ОУ надо выкидывать и ставить нормальный инструментальный без всякого делителя - выход прямо на АЦП. Либо просто повторитель на ещё одном ОУ (который добавит ещё и своё смещение). Иначе такое входное низкое никак не побороть.

Теперь контрольный вопрос: каков режим работы АЦП сейчас?

А вот местные шунты - моветон. Падение на них вычитается из напряжения на нагрузке и сам блок это уже не отслеживает.
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

zenon

Ну, я уже свыкся с стм-ками, да бесит многое, но что есть - то есть, брать в руки avr уже нет почему-то желания.
ЦитатаMCP320x - и вперёд! Да-здравствует отвязка от проца!
Вот, лежит уже очень давно, руки никак не дойдут, даже не распечатал:
↓ спойлер ↓
1711533812758.jpg
[свернуть]
Сейчас опрашиваю АЦП медленно, раз в 50 мсек выбрал канал, получил значение...

Slabovik

#19
Мне пока что неясно такое
ЦитатаТут есть один (или не один?) весьма странный и не очевидный момент: Калибровку надо запускать до включения АЦП установкой бита ADC_CR2_ADON. Почему так сделано не совсем понятно. Кстати калибровка должна производиться всякий раз когда АЦП включается.
Документы по STM разбросаны, пока найдёшь нужное...

Получается, это "время выборки" - время, на которое подключается входное 'устройство выборки-хранения', которое считывает уровень с физической ноги и хранит его на время преобразования. Значит, надо поставить побольше. Чисто логически могу предположить, что когда выборка не производится, потребления по ноге тоже нет. Значит, мысль об ограничении количества преобразований правильная. И низкое сопротивление (получается, по переменному току) обеспечивает конденсатор на ноге.

Вот здесь годные уроки на русском: http://mypractic.ru/urok-26-acp-stm32-obshhie-svedeniya-rezhimy-ustanovka-konfiguracii-cherez-registry-cmsis.html

Всё-таки, зачем R34 R35? Мы такое как-то ставили для введения дизера (imho успешно, по крайней мере у меня было так). Здесь это лишнее. С16 и С17 должны быть подключены непосредственно между своими входами и выводом аналоговой земли (если есть), либо Gnd. Не "где-то там на землю", а прямо вот рядышком, кратчайшим путём.

зы: мне тоже импонирует Segger, но работа с железом через Си и абстракции - это какое-то издевательство...

А во ещё: MCP3221 : интерфейс i2c (отвязан от питания процессора), питается от Reference, потребление микроскопическое, пятивыводный SOT23... А то мне вот реально неприятно, когда аналоговая земля там же, где и цифровая...
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

zenon

Да, R34 R35 рудементом подтянулись.
Уроки эти видел, хорошие, надо повникать, да ещё и примеры на cmsis, hal терпеть не могу, код превращается в такую непотребщену... ужас.
Проблема только в том, что всё в основном для F1, а у меня F0, но многое одинаково, ну почти.
Про I2C АЦП я выше писал, INA226 пара модулей приехать скоро должны, для возможности их подключения и вывел квадратную шину наружу. Сам модуль на плату БП по хорошему поставить.
https://aliexpi.com/1yIU

ы. Сделал другую платку...

Slabovik

Даже пока не знаю.
Вообще, порядок действий должен быть таков.
Первое - расчёт. Делается в любой табличке (Ёкселе или Кальке). Тот, что я показывал - он спонтанный, там нет ничего, что надо было бы сохранять. Формулы униерсальны - из забиваешь, располагая как считаешь удобным. И, подставляя значения и ориентируясь на результаты, получаешь желаемое.

Второе - поузловое тестирование. Умалчивается обычно, но самое первое, что надо тестировать - это питание. Далее - узлы по отдельности. Обычно начинают с тех, которые "ближе" к выходу, но на деле не обязательно. Здесь фактически три узла. Узел ЦП-Индикатор считаем протестированным, остаются два: узел приведения измеряемой величины (это наши ОУ) и узел АЦП.

Узел приведения - подаём на вход напряжени - смотрим напряжение на выходе, сопоставляем, проверяем соответствие расчёту.

Узел АЦП - также подаём на вход - смотрим, что он там напреобразовывал. Проверяем.

После всего соединяем вместе и проверяем в комплексе.

INA226 - хорошее решение. Но... на данном этапе как-то не спортивно :) Всё-равно, что на гору не забраться самому, а заплатить за вертолёт  ::) Но имеет место быть  :)
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

zenon

#22
Вчера вечером добрался до новой платки, SPI отказался работать, хоть тресни, пришлось решить кардинально, перепаял процик. :)
Вообще феном он был гретый уже раза четыре точно...
Последовательно резисторы в усилители я точно не поставлю, только параллельно. 105,6 кОм подобрать не получается.
Оставил пока 27k/2k4.
Для тока ставлю 47k/1k. (хотя мне кажется лучше 33k/1k с делителем на выходе 1k/5k+10k.
В твоих считалках первые R1 R2(1/2) R3 что это, не пойму?

Slabovik

Это делитель на выходе. Номера просто по порядку сверху вниз. Первый - верхнее плечо, второй и третий - постоянный и подстроечный.

Мда.... торопишься ты платки делать...  ::)
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

zenon

Цитататоропишься ты платки делать
Я работаю над этим, сейчас уже лучше. :)

zenon

Код для прерывания сообразил.
Код: text
void adc_init_42(void)
{
  RCC->APB2ENR |= RCC_APB2RSTR_ADCRST; // Enable ADC clock 
  ADC1->CR &= ~ADC_CR_ADEN;            // turn off ADC: 0
  
  ADC1->CR |= ADC_CR_ADCAL;             // start ADC calibration
  while (ADC1->CR & ADC_CR_ADCAL)   {}; // ждем когда откалибруется
  ADC1->CR |= ADC_CR_ADEN;              // power up ADC
  while (ADC1->ISR & ADC_ISR_ADRDY) {}; // wait until ADC ready
  
  ADC1->CFGR1 |= ADC_CFGR1_CONT; // Continuous conversion ADC_CFGR1_SCANDIR;

  ADC1->SMPR |= ADC_SMPR_SMP_0 | ADC_SMPR_SMP_1 | ADC_SMPR_SMP_2; // Время выборки (Select a sampling mode of 111 i.e. 239.5 ADC clk to be greater than 17.1us)  

  ADC1->CHSELR = ADC_CHSELR_CHSEL5 | ADC_CHSELR_CHSEL6;
 
  ADC1->IER |= ADC_IER_EOCIE;     // Enable ADC interrupts
  NVIC_EnableIRQ(ADC1_COMP_IRQn); // Enable IRQ on NVIC
  ADC1->CR |= ADC_CR_ADSTART;
}
И само прерывание (если отселектили два канала, то поочереди в прерывании появляются значения);
Код: text
uint8_t curr_adc_channel = 0;
// ADC1_IRQHandler
extern void ADC1_COMP_IRQHandler(void)
{
 if(((ADC1->ISR) & ADC_ISR_EOC) != 0)
 {
 ADC1->ISR |= ADC_ISR_EOC;
 if (curr_adc_channel == 0) current = (uint16_t) ADC1->DR;
 if (curr_adc_channel == 1) voltage = (uint16_t) ADC1->DR;
 curr_adc_channel++;
 if (curr_adc_channel > 1) curr_adc_channel = 0; 
 }
}

Slabovik

Цитата: Slabovik от 28 Март, 2024, 10:31INA226 - хорошее решение. Но...
'но' - оно очень толстое. Не может INA226 стоить столько, сколько по той ссылке на Aliexpress: https://www.findchips.com/search/ina226
Вывод: на Ali продаётся подделка. Какого она качества - вопрос открытый...
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

zenon

Тут я согласен...
//офф: недавно разглядывал IGBT "толстые" и дорогие, пришли в закупке, взгляд упал на ноги, каково же было удивление, что ноги приварены контактное сваркой, а сами транзисторы были с распая... Приварены были кстати плохо - у некоторых отваливались при первом сгибе.

zenon

Забросил эту тему, но наткнулся на:
https://leoniv.livejournal.com/194681.html
вот оно как, надо на деле посмотреть, я куда-то проект этот засунул, найти бы... :)

Slabovik

Надо проверить, но что-то мне видится, что Леонид Иванович рассматривал крайний случай, как то большой конденсатор, питаемый через большой резистор - тут всё логично - изменение напряжения на большом конденсаторе не успеет скомпенсироваться через резистор большого сопротивления, поскольку часть заряда из него забирается в УВХ. И другой случай - подсоединение выхода ОУ напрямую и воздействие на него возмущением от работу УВХ АЦП. Ну... кто бы сомневался, что и то и другое несколько нехорошо. Только вот мелкая оговорка - он там сетует на частоту выборок 100 кГц, а это таки занятно много. заряжать 8 пФ 100 тыщ раз в секунду - это какой ток? Вот то-то и оно :) Меньше выборок - точнее напряжение на большом конденсаторе. А во втором случае выход ОУ действительно надо демпфировать, и от RC цепочки тут никуда не деться - это второй конец этой палки.
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

zenon

Нашёл я эту плату.
Кусок схемы с номиналами на входе АЦП:

↓ спойлер ↓
оу+ацп1.jpg
[свернуть]
ОУ только сейчас стоит 6002.
Вход АЦП:
↓ спойлер ↓
DS1Z_QuickPrint2.pngDS1Z_QuickPrint3.png
[свернуть]
Вход АЦП жёлтый, синий V+:
↓ спойлер ↓
DS1Z_QuickPrint4.png
[свернуть]
Вход АЦП жёлтый, синий AVDD (питание контроллера для аналоговой части):
↓ спойлер ↓
DS1Z_QuickPrint5.png
[свернуть]

Slabovik

Порядка 70-80 милливольт. Много. Восстановление 400 нс...

А это вольтметр/амперметр ведь? Imho для этого применения выборки часто слишком - аж 26 кГц...
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

zenon

#32
Это канал вольтметра. Преобразование по прерыванию настроено, те как готово новое.
Надо по другому инит попробовать.
Вот ещё в дш посмотрел что у нас, исходя из этого R30R31 нам противопоказаны, ну или бувер повторителя после них? Какую всё таки схему лучше сделать для измерительных усилителей?
Тут есть два варианта инит, один continuous mode (ADC_CFGR1_CONT) другой (ADC_CFGR1_WAIT)...
Хотя конечно там чуть больше, но с другими пока не понял, они в stm32f030x6.h
https://github.com/STMicroelectronics/cmsis-device-f0/blob/master/Include/stm32f030x6.h

↓ спойлер ↓
adc-input1-stm32f030.jpg
adc-input2-stm32f030.jpg
[свернуть]
Даташит https://static.chipdip.ru/lib/889/DOC011889162.pdf

Slabovik

Тут ответом на вопрос будет ts - Sampling Time - время (выборки), в которое ёмкость устройства выборки-хранения (УВХ) подключена к источнику сигнала. Вот к концу этого времени конденсатор УВХ ёмкостью 8 пФ должен успеть выравнять своё напряжение с напряжением источника сигнала с достоверностью не хуже 1/4 уровня LSB

Если его подключать к конденсатору, подключенному к входу ADC, ёмкость подключенного конденсатора должна быть не менее такой ёмкости, чтобы подключенный к ней во время выборки конденсатор УВХ изменил напряжение на этом конденсаторе на величину не более 1/4 уровня LSB

И третье условие - активное сопротивление (резистор) на пути тока до конденсатора, подключенного ко входу ADC должно быть не более такого, чтобы средний ток, потребляемый УВХ (а он зависит о частоты запуска ADC !), вызывал падение напряжения на этом сопротивлении также не более 1/4 LSB (1/4 LSB на резисторе + 1/4 LSB на конденсаторе - это всяко уже 1/2 LSB, что является предельным, если мы хотим не промазать с разрядом).

Таким образом,  на схеме, что чуть выше, резистор R34 совершенно лишний, С16 имеет либо слишком маленькую ёмкость (подключение УВХ значительно изменит напряжение на нём), либо вообще не нужен - выходное сопротивление цепи примерно 600_Ом. Это слегка многовато, если УВХ работает на полной скорости (1,5 такта частоты тактирования ADC), но можно увеличить количество тактов, в течение которых УВХ подключен к входу. Это касается максимальной частоты выборок (запусков ADC).

Если максимальная частота выборок нам не нужна (а это наш случай - можно снизить раз в 10-16 без потери информативности - один фиг потом накладываешь жесточайший софтверный фильтр, чтобы показания "не скакали"), то, убрав R34, я бы увеличил C16 до 0,47~1 мкФ легко. 8пФ отнимет от 0,8 мкФ (значение для лёгкости счёта) одну миллионную заряда, что вполне приемлемо, а сниженное количество запусков ADC позволит через 600 Ом с достаточной долей достоверности восстанавливать напряжение на C16 (частота среза где-то 0,5~0,6 мс)

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

p.s. Надо найти, где в управляющих регистрах Ts регулируется...
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

zenon

Попробовал я запуск в ручную, с интервалами примерно 2ms.
Добавил фильтр с изи, вроде говорили раньше про него, такой
↓ спойлер ↓
#define Na 15
#define Nb 1
#define k 4
int filter(int x){
  static int y1 = 0;
  return y1 = (Na * y1 + Nb * x) >> k;
};
[свернуть]
Вольтметр нормально, ноль есть.
Амперметр ну никак не хочет от ноля, из чистых данных ацп примерно 40 при нулевом токе, не пойму откуда на шунте падение берётся...
Потом начал экспериментировать с инитом и опросом, доигрался до зависов камня, откатился до прерывания :)
Выкрою время переразведу плату, выведу i2c на всякий, есть в дип корпусе mcp3204 (тут идея её разместить на плате питальника).
В схему для питания стмк-ки и усилителей тока\напряжения предложишь поправки?

Slabovik

Ну вот, а мне говорили "всё и так работает". Упс...  ;)

В общем, измериловка - дело тонкое. Тут для начала два жирных момента.
Первый

R2R-o.png

Неожиданно, но несколько мВ на выходе вполне могут быть. Чтобы их было меньше, нужна нагрузка с меньшим сопротивлением, но нуля не будет, хоть убейся. Выхода два. Первый - инвертировать ноль. Т.е. ноль сделать условно с максимальным напряжением (на котором АЦП даёт FFF), а при росте парамера напряжение на выходе будет снижаться (хотя в принципе ноля не достигнет, но в диапазоне показания будут адекватные).
Второй - сделать небольшое отрицательное питания для усилителей. Полвольта вполне хватит.

Второй тонкий момент

IOV.png

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

Выход - применить ОУ с минимальным допустимым напряжением смещения. Например, OPA340, либо ещё кучка каких-нибудь... А отрицательное напряжение сделать через Charge Pump, можно рядом на втором ОУ в этом же кузове (это если от балансировки отказываешься, а если нет - для измерения надо одинарный ОУ брать с выводами балансировки) генератор сделать.

Ещё круче взять инструментальный усилитель с Zero Drift. Правда, дороговато.

Ещё круче взять инструментальный усилитель с АЦП в одном кузове. INA какой-нибудь (есть там такие, если надо - названия поискать можно)...
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

zenon

Ну тут получается что опора у нас внутренняя и усложнять бесполезно, надо только правильно организовать питание самого контроллера.
Поэтому либо отрицательное на той же 7660, или софтово принять эти 40 за условный нолик.
Про INA мы говорили, китайские модули у меня есть, руки не доходят.
Вот, на хабре их немного препарировали:
https://habr.com/ru/companies/timeweb/articles/855472/

Slabovik

1. Добавляешь один ОУ. Делаешь на нём генератор треугольника (получится скорее пила, ну да ладно).
2. Выпрямляешь эту пилу в отрицательное напряжение по схеме удвоителя напряжения (как в приёмниках детекторы на двух диодах).
3. Стабилизируешь полученное на переходе диода, подаёшь на Vss микросхем-измерителей.
4. Положительное питание микросхем лучше сделать порядка 3,5~3,6 вольта, применив low-dropout стабилизатор. Правда, это для случая, если опора АЦП от 3,3 вольта. Если опора на низком напряжении (1 с чем-то там), то можно оставить 3,3 на + питания.
5. Микросхемы берёшь одинарные, у которых есть выводы для подключения балансировочного резистора. Собираешь схему с ним.
6. Микросхемы лучше выбрать с низким напряжением смещения. Дёшево и сердито - OPA340, правда, балансировки у них нет, но зато смещение не более 0,5 мВ - на порядок лучше, чем то, что у тебя сейчас. Но зато есть в кузовах SOT23-5.
Круче и удобнее для установки Ку - INA333. Отрицательное небольшое напряжение им также нужно. Ref подключить прямо к AGND процессора.
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

zenon

#38
Кхм, если я всё правильно понял на счёт отрицательного, ты предлагаешь что-то типа вот этого (верхняя схема):
(но у нас ног полно и шимить мы умеем - это нижняя).
Хотя 7660 не редкость, а можно и на 555.
↓ спойлер ↓
vss-011.jpg
[свернуть]

Slabovik

Нижний работать не будет т.к. нужно два такта, несмотря на то, что один из тактов холостой. Надо так

Minusupp.png

Диоды эффективнее поставить BAT54S - сборка в SOT-23. SAW сделан так, чтобы нагнетание было растянуто по времени - чуть ровнее риппл получается. На деле риппл не особо важен, но хорошо, если меньше.

При таких номиналах на выходе порядка 5 мА - их хватит на работу пары измерительных OPA340. Сам же преобразователь можно сделать на какой-нибудь недорогой MCP. Частота по схеме в районе 50 кГц.
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

zenon

А, ну да, конденсатор то надо зарядить и разрядить, тогда в варианте с шимом от мк можно использовать схему простого драйвера на двух транзисторах.
Ну что же, будем пилить, заказал несколько штучек OPA340 от TI, норм цена - 100р.
В ЧиДе лежат какие-то от UMW по 43р, но у тех, кого заказал сказали лучше не брать эти...

Slabovik

Можно копнуть глубже. Взять REF193 и запитать от него АЦП, определив опору как питание. Но есть слегка нюанс - эти REF на 3.00 вольта, это значит, питание процу тоже хорошо бы 3.00 сделать, но от другого стабилизатора, обычного.
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

zenon


Slabovik

Так-то кажется вкусно, но offset error аж до 8 мВ заставляет задуматься. И скорость не очень - 240 выборок в секунду максимум для 12 бит, а для 16 всего 15.  Напряжение на аккумуляторах замерять - норм :) Собственно, потому и дешёвый. Пробовать конечно можно, тут даже вопроса нет :)
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.

zenon

#44
Ну вот и славненько, заказал на пробу, всяко мне кажется MS1100 будут лучше возможностей F030, и главное проще, тут я размерами ограничен, а ещё хотелось бы отключать уметь нагрузку...
Основное же назначение - плюс-минус лапоть показать, и посчитать в случае надобности сколько, например, влил в аккумулятор.
У меня ещё LM4040 вроде остались кстати, 2,5В вроде, не помню точно...
+++
Заказал и самое главное забыл проверить, какой у них адрес, а оказывается он прибит к мелкосхеме...
↓ спойлер ↓
ms1100-i2c-addr.jpg
[свернуть]
Наверное что-то типа Ax будет на ней, где x = 0...7.