|
Прошу совета по питанию STM32F407 от суперконденсатора |
|
|
|
Apr 20 2018, 19:27
|
Частый гость
 
Группа: Участник
Сообщений: 77
Регистрация: 12-12-16
Пользователь №: 94 599

|
Есть устройство на том самом 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.
Поискал но сходу не нашел готовых апнот по этой тематике. Наверное плохо искал. Очень надеюсь на помощь.
|
|
|
|
|
Apr 23 2018, 14:36
|

Частый гость
 
Группа: Участник
Сообщений: 101
Регистрация: 2-05-15
Из: Россия, Омск
Пользователь №: 86 474

|
Наверное, у меня странный вариант решения вопроса, но.... Если сделать свой буфер записи в BackUP домене? Выделяется блок памяти, скажем, чуть больше сектора. В него пишется будущий сектор, добавляется пара флагов типа "Запись пошла", "Запись прошла", "Проверка успешна", ну и адрес записи. Соответственно, перед записью - взводим первый флаг. Обязательно БАЙТ-флаг. После записи - сразу же взводим второй флаг. После этого ПРОВЕРЯЕМ записаные данные. Если успешно - обнуляем адрес и очищаем память. В случае потери питания и после перезапуска кристалла, нужно проверить: 1. Ненулевой адрес записываемого блока данных. 2. Соответствие флагов - "Начали писать", "Закончили писать", "Проверили". 3. Выполнить соответствующие действия - стереть сектор, повторить запись.
Понимаю, это не решает вопрос отказоустойчивости самого Flash накопителя, но хотя бы снижает потерю данных во время работы. Ну и разбиение данных на блоки для удобства.
|
|
|
|
|
Apr 23 2018, 15:43
|
Местный
  
Группа: Участник
Сообщений: 352
Регистрация: 10-08-06
Из: Санкт-Петербург
Пользователь №: 19 471

|
Цитата(scifi @ Apr 23 2018, 17:46)  Всю жизнь проектировал формат дынных, пишущихся во флеш, так, чтобы он был устойчивым к отключениям питания. Да, это гораздо сложнее, чем тупо записать открытым текстом и надеяться, что никто ничего отключать не будет. Зато работает без всяких конденсаторов. Вы используете только свои собственные форматы или уже есть вменяемые библиотеки? Вы разрабатывали дополнительные прослойки для использования, скажем, FAT?
|
|
|
|
|
Apr 23 2018, 16:55
|
Частый гость
 
Группа: Участник
Сообщений: 182
Регистрация: 16-10-15
Пользователь №: 88 894

|
Цитата(AlanDrakes @ Apr 23 2018, 20:36)  Наверное, у меня странный вариант решения вопроса, но.... Если сделать свой буфер записи в BackUP домене? Размер BKRAM 4к. Размер сектора флеша может быть 32к-128к-256к-512к-1м - зависит от жирности и параллельности архитектуры чипа. Оно туда не влезет. Хотя для внешней памяти 25-той серии - весь сектор стирать не обязательно, и такой вариант защиты вполне приемлем.
|
|
|
|
|
Apr 24 2018, 07:19
|
Гуру
     
Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925

|
Цитата(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
|
|
|
|
|
Apr 24 2018, 13:11
|

Частый гость
 
Группа: Участник
Сообщений: 101
Регистрация: 2-05-15
Из: Россия, Омск
Пользователь №: 86 474

|
Цитата(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; Про размеры сектора - согласен, но я имел в виду хранение сектора перед записью. Вроди бы, большинство чипов позволяет записывать иногда даже по байту в сектор (хотя и не все), подавляющее большинство - пол килобайта. Хотя, могу быть неправ. Очень большие микросхемы пока не трогал - не приходилось.
|
|
|
|
|
Apr 24 2018, 13:48
|
Частый гость
 
Группа: Участник
Сообщений: 77
Регистрация: 12-12-16
Пользователь №: 94 599

|
На всякий случай скажу что проблема с записью у нас в 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
|
|
|
|
|
Apr 24 2018, 15:07
|

Частый гость
 
Группа: Участник
Сообщений: 101
Регистрация: 2-05-15
Из: Россия, Омск
Пользователь №: 86 474

|
Кстати, у меня в одном типе плат стоит контроллер (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).
А вот запуск с таким конденсатором будет довольно тяжёлым.
|
|
|
|
|
Apr 24 2018, 18:37
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(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 этого драйвера.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|