vldmr86
Apr 20 2018, 19:27
Есть устройство на том самом STM32F407VGT6. К устройству подключены: USB порт для FLASH накопителя, Ethernet PHY, SPI память, SPI дисплей, SPI АЦП, изолированные интерфейсы (с изоляторами типа ISO7721), часовая батарейка 2032 и прочая мелочь. Замечено что неожиданное выключение питания приводит к сбою записи в SPI память. Кроме лога там телеметрия и для ее нормальной записи нужны несколько секунд. Еще одну батарейку ставить категорически не хочется по нескольким причинам. Нравится суперконденсатор. Вопросов два.
Первый - что нужно сделать на аппаратном уровне чтобы при минимальном номинале суперконденсатора продержаться максимальное время. Есть опасения что через подключенных к портам потребителей энергия суперконденсатора будет утекать бесполезно. Пока на ум пришло увеличить номиналы подтяжек на землю и питание с обычных 10 к до например 47...100 к руководствуясь конечно по каждому пункту здравым смыслом. Понятно что надо тушить дисплей, или завести его в RESETное состояние, как-то программно потушить USB и Ethernet PHY (LAN8720 если он это позволяет?) . Что еще не забыть?
Второй вопрос по типу суперконденсатора. Мне встретились 2 типа (а может их и больше в природе) отличающиеся отдаваемой мощностью. Первый тип в нашей литературе называют ионистором. Он может отдавать небольшой ток но длительное время. Например такой экземпляр от Panasonic емкостью 1 фарад стоит около 3...4 баксов. Выглядит как литиевая батарейка таблетка. Этого можно зарядить до трех вольт и уверенно рассасывать энергию до 1.8 вольта
Второй тип может отдавать большой ток но недолго. Его обычно зовут EDLC. Он выглядит как электролитический конденсатор вроде отечественных K50-6. Их много кто делает. По разумным ценам в России можно купить Nesscap, Samwha и пр. Например 3 фарада за 60 центов. Этот вариант мне нравится больше, потому что дешевле. Этого можно зарядить максимум до 2.7 а лучше не больше 2.5 ну и как-то дотянуть до тех же 1.8.
Поискал но сходу не нашел готовых апнот по этой тематике. Наверное плохо искал. Очень надеюсь на помощь.
HardEgor
Apr 20 2018, 19:57
Вначале замерить ток потребления при записи и рассчитать время которое можно получить с ионистором.
У STM32 повыключать тактирование всех блоков, кроме необходимых для записи флэш, а также все лишние выходы перевести во входы.
Можно поставить power switch на питание всех микросхем не нужных для записи и просто выключать им питание.
AlexandrY
Apr 20 2018, 20:40
Цитата(vldmr86 @ Apr 20 2018, 22:27)

Кроме лога там телеметрия и для ее нормальной записи нужны несколько секунд.
Несколько секунд?
Что-то подозрительно долго. С этим надо разбираться.
А работать от ионистора на границе brownout-а дело довольно рискованное.
amiller
Apr 22 2018, 08:49
Ионисторы, батарейки и т.п. обычно используют, чтобы длительное время поддерживать работоспособность в дежурном режиме, т.е. с малым потреблением.
Вам же нужно обеспечить несколько секунд в активном режиме.
Предлагаю использовать обычный электролит емкостью в несколько миллифарад.
Обычно этого вполне достаточно.
Только конденсатор надо перенести подальше от питания контроллера.
Напоминаю, что накопленная энергия равна С * U * U. Чем больше напряжение, тем больше энергия.
При понижении напряжения ниже порога - прерывание - безопасное завершение.
А вообще конечно, несколько секунд - это много.
Оптимизируйте и будет достаточно вполне себе маленького конденсатора.
Егоров
Apr 22 2018, 20:28
Цитата(vldmr86 @ Apr 20 2018, 22:27)

К устройству подключены: USB порт для FLASH накопителя, Ethernet PHY, SPI память, SPI дисплей, SPI АЦП, изолированные интерфейсы (с изоляторами типа ISO7721), часовая батарейка 2032 и прочая мелочь.
Вот вы просчитайте все это, "мелочь" тоже не забудьте и огласите в виде миллиамперов или милливатт. А также внятно назовите время автономной работы.
Чтобы можно было вести какие-то расчеты потребной запасаемой энергии.
vladec
Apr 23 2018, 06:43
Использую такой режим аварийной запитки по 5В, суперконденсаторы -- 5Ф - 10Ф на 2,7В пара последовательно включенных, заряд через одноватный резистор 24 Ом, разряд (на цепь +5В) через большой, "медленный" диод Шоттке (либо какой нибудь идеальный SBR диод) параллельно резистору. Питает в том числе GSM модем. В зависимости от потребления работает от нескольких секунд до пяти минут. Если с 5В на 3,3В или другое используется импульсный, а не линейный источник аккуратно выбирайте микросхему преобразователя в плане ее выживания на низких напряжениях в процессе разряда -- приходилось сталкиваться с проблемами.
AlanDrakes
Apr 23 2018, 14:36
Наверное, у меня странный вариант решения вопроса, но....
Если сделать свой буфер записи в BackUP домене?
Выделяется блок памяти, скажем, чуть больше сектора. В него пишется будущий сектор, добавляется пара флагов типа "Запись пошла", "Запись прошла", "Проверка успешна", ну и адрес записи.
Соответственно, перед записью - взводим первый флаг. Обязательно БАЙТ-флаг.
После записи - сразу же взводим второй флаг. После этого ПРОВЕРЯЕМ записаные данные. Если успешно - обнуляем адрес и очищаем память.
В случае потери питания и после перезапуска кристалла, нужно проверить:
1. Ненулевой адрес записываемого блока данных.
2. Соответствие флагов - "Начали писать", "Закончили писать", "Проверили".
3. Выполнить соответствующие действия - стереть сектор, повторить запись.
Понимаю, это не решает вопрос отказоустойчивости самого Flash накопителя, но хотя бы снижает потерю данных во время работы.
Ну и разбиение данных на блоки для удобства.
Всю жизнь проектировал формат дынных, пишущихся во флеш, так, чтобы он был устойчивым к отключениям питания. Да, это гораздо сложнее, чем тупо записать открытым текстом и надеяться, что никто ничего отключать не будет. Зато работает без всяких конденсаторов.
segment
Apr 23 2018, 15:43
Цитата(scifi @ Apr 23 2018, 17:46)

Всю жизнь проектировал формат дынных, пишущихся во флеш, так, чтобы он был устойчивым к отключениям питания. Да, это гораздо сложнее, чем тупо записать открытым текстом и надеяться, что никто ничего отключать не будет. Зато работает без всяких конденсаторов.
Вы используете только свои собственные форматы или уже есть вменяемые библиотеки? Вы разрабатывали дополнительные прослойки для использования, скажем, FAT?
AVI-crak
Apr 23 2018, 16:55
Цитата(AlanDrakes @ Apr 23 2018, 20:36)

Наверное, у меня странный вариант решения вопроса, но....
Если сделать свой буфер записи в BackUP домене?
Размер BKRAM 4к. Размер сектора флеша может быть 32к-128к-256к-512к-1м - зависит от жирности и параллельности архитектуры чипа. Оно туда не влезет.
Хотя для внешней памяти 25-той серии - весь сектор стирать не обязательно, и такой вариант защиты вполне приемлем.
У меня вопрос немного не в тему, ионисторы у них же большой ток саморазряда, как на нем строить ждущий режим, если он сам себя без нагрузки посадит максимум неделя.
Цитата(segment @ Apr 23 2018, 18:43)

Вы используете только свои собственные форматы или уже есть вменяемые библиотеки? Вы разрабатывали дополнительные прослойки для использования, скажем, FAT?
Изобретал свой велосипед. Файловая система никогда не была нужна, тем более FAT. Доморощенный велосипед чреват доморощенными глюками, конечно. Впрочем, в чужом - чужие глюки. Что касается логов, есть вот такой велосипед:
тут.
HardEgor
Apr 24 2018, 07:19
Цитата(twix @ Apr 24 2018, 13:03)

У меня вопрос немного не в тему, ионисторы у них же большой ток саморазряда, как на нем строить ждущий режим, если он сам себя без нагрузки посадит максимум неделя.
Никак.
Цитата(scifi @ Apr 24 2018, 14:15)

Что касается логов, есть вот такой велосипед:
тут.
Forbidden
You don't have permission to access /fwlib/group___l_o_g___f_s.html on this server.
наверное имелась ввиду вот эта ссылка:
https://piconomix.com/fwlib/#EXAMPLE_DATA_LOGGING
arhiv6
Apr 24 2018, 07:44
Цитата(HardEgor @ Apr 24 2018, 10:19)

Forbidden
You don't have permission to access /fwlib/group___l_o_g___f_s.html on this server.
наверное имелась ввиду вот эта ссылка:
https://piconomix.com/fwlib/#EXAMPLE_DATA_LOGGINGЦитата(arhiv6 @ Apr 24 2018, 10:44)

Все ссылки приблизительно одинаковой степени несвежести. Они как-то интересно настроили свой веб сервер, снаружи ссылаться не очень получается. В любом случае, кто ищет, тот всегда найдёт
AlanDrakes
Apr 24 2018, 13:11
Цитата(AVI-crak @ Apr 23 2018, 22:55)

Размер BKRAM 4к. Размер сектора флеша может быть 32к-128к-256к-512к-1м - зависит от жирности и параллельности архитектуры чипа. Оно туда не влезет.
Хотя для внешней памяти 25-той серии - весь сектор стирать не обязательно, и такой вариант защиты вполне приемлем.
Согласен, но хотя бы иметь буфер для тех данных, которые собираемся записывать. Как вариант подобной структуры:
typedef struct {
uint64_t StartAddress;
uint8_t WriteStarted;
uint8_t WriteDone;
uint8_t WerifyOK;
uint16_t DataSize;
uint8_t DataArray[512];
} WriteBuffer;
Про размеры сектора - согласен, но я имел в виду хранение сектора перед записью.
Вроди бы, большинство чипов позволяет записывать иногда даже по байту в сектор (хотя и не все), подавляющее большинство - пол килобайта.
Хотя, могу быть неправ. Очень большие микросхемы пока не трогал - не приходилось.
vldmr86
Apr 24 2018, 13:48
На всякий случай скажу что проблема с записью у нас в MX25L6406EM2I-12G. Но программные способы решения я не рассматриваю - это не мое. Я аппаратное решение должен предложить подешевле.
Цитата(amiller @ Apr 22 2018, 08:49)

Предлагаю использовать обычный электролит емкостью в несколько миллифарад.
Так и решили поступить. То что предложили сделать во втором сообщении, сделают программисты. Электролит такого номинала сопоставим по размерам с суперкапом например на 3 фарада. Цена суперкапа конечно повыше, но не фатально
http://amsi.ru/catalog/index.php?categoryI...productID=24360. Решили оставить возможность -вдруг пригодится для чего.
Решил сделать отдельную цепь питания процессора - 3.3 вольт - отдельно от периферии. Сначала с 5 вольт понижаю до 2.7 с помощью LD1117STR а потом с помощью TPS61070 буду поднимать до 3.3 пока емкость не разрядится до 0.9. Если действительно хватит миллифарадной емкости вместо суперкапа то просто выкинем LD1117STR
AlanDrakes
Apr 24 2018, 15:07
Кстати, у меня в одном типе плат стоит контроллер (STM32F103). В цепи питания стоит обычный электролит на, кажется, 4700uF. Настроен PVD на уровень 2.9V (номинальное - около 3.2). Когда внешнее питание пропадает - контроллер ловит прерывание от PWD и быстро отправляет в консоль ругань, что его обесточили.
Согласен, не Ваш вариант. Но в это же время можно отключить всю мощную нагрузку (хотя велик риск не успеть) и быстро доделать какие-то вещи, пока ёмкость не истощилась.
Могу ещё предложить контролировать входное напряжение и при его пропадании - так же всё отключать, пока не разрядились ёмкости.
Но две секунды на запись - это минимум сам контроллер + память... память - не более 25мА, судя по даташиту.
Контроллер, если сбросить частоту - можно получить около 10-20мА.
Берём наихудшие значения (20+25), накидываем разные утечки и всё, что нельзя обесточить (+50мА).
Необходимо: 45+50 = 95мА суммарно на 2 секунды.
При этом нельзя ронять напряжение ниже 2.7V для памяти.
При начальном питании в 3.3 получаем разницу в (3.3 - 2.7) = 0.6V. Негусто.
Теперь считаем заряд 2.7 * 0.095 * 4(с) (снова берём худший вариант и накидываем ещё резерв времени) = 1.026J
Неслабо так.
Минимум, который у меня получается, без использования преобразователей, просто на шине питания - 0.6F
Это при токе почти в 100мА. После разряда от 3.3 до 2.7, в конденсаторе останется ещё ~1.8J. Если использовать дополнительный преобразователь:
IN -> BoostCap -> Main_3.3, то можно вытянуть из него порядка 2.5J, а это около 8-10 секунд работы. Естественно, минимум потребителей и высокий КПД.
Ёмкость на 3F можно просто оставить на питании и мониторить вход.
Начальная энергия - 16J, Конечная - 11J (3.3 -> 2.7).
А вот запуск с таким конденсатором будет довольно тяжёлым.
Цитата(AlexandrY @ Apr 20 2018, 23:40)

Несколько секунд?
Что-то подозрительно долго. С этим надо разбираться.
Сейчас отлаживаю проект на отладке. Пара отладочных плат соединённых вместе + ещё кой-какие мелочи на проводах -
всё это питалось от батареи кондёров 5 шт. * 10000мкФ * 24В (после коих - DC-DC понижающий).
Так мне надоело то, что после нажатия тумблера на БП, до останова работы программы надо ждать примерно 15 секунд. Убрал 4 кондёра, оставил один.
И это при том, что никаких действий по энергосбережению в программе нет. и работает CPU на 120МГц.
Цитата(segment @ Apr 23 2018, 18:43)

Вы используете только свои собственные форматы или уже есть вменяемые библиотеки?
Зачем тут опять какие-то "библиотеки"? Достаточно только следовать правилу "Никогда не писать поверх старого" - и будет гарантия от сбоев питания в любой момент.
Цитата(segment @ Apr 23 2018, 18:43)

Вы разрабатывали дополнительные прослойки для использования, скажем, FAT?
Если уж очень хочется FAT или ещё какую систему хранения с готовым драйвером (типа FatFS Chan-а), то ставим дополнительный чип FRAM (или подобной памяти) и пишем низкоуровневый доступ к FLASH через журналирующую запись во FRAM. С фиксацией всех манипуляций с FLASH. А Chan-а пускаем через API этого драйвера.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.