Друг мой, вспомни, что молчать хорошо, безопасно и красиво.
Фёдор Михайлович Достоевский

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

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

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

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

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.