Официальный сайт компании Arduino по адресу arduino.cc
Хранение в памяти быстро меняющихся переменных
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Пт, 24/05/2013 - 10:16
Всем доброго времени суток!
Возникла такая задача: нужно хранить в памяти контроллера переменную int, но вся проблема в том, что она очень быстро меняет свои значения. То есть ресурс перезаписи памяти EEPROM иссякнет через час роботы. Есть ли какие то варианты? Или только запись в EEPROM на постоянно, а через некий интервал времени?
а откуда эта переменная возникает и меняется с дикой частотой ( представил себе некую хрень, которую ветром болтает в разные стороны) ? и какой смысл ее сохранять с такой подробностью?
если в проекте есть часы ds1307, то они самый идеальный вариант для хранения таких данных.
а откуда эта переменная возникает и меняется с дикой частотой ( представил себе некую хрень, которую ветром болтает в разные стороны) ? и какой смысл ее сохранять с такой подробностью?
Есть расходомер жидкости, сигнал от которого поступает на контроллер. Он считает мгновенный расход и общий расход. Вот этот общий расход и надо сохранять все время, то есть если случайно пропадет питание, я знал сколько жидкости уже прошло.
UPS поставить ) Шутка.
Тогда нужно посчитать, с какой погрешностью можно жить. Т.е. если потерян один отсчет, насколько это критично. Зависит от скорости движения жидкости. Грубо, если +- литр, а литр протекает за 10 минут, то можно раз в 10 минут сохранять.
Если нужно очень точно, то может быть шутка с UPS не такая уж и шутка, тогда аварийный аккумулятор.
Ставим на питание внешнюю резервную батарейку. Пока питание есть - ничего в eeprom не пишем, как только основное питание пропало в аварийном порядке записываем данные в eeprom.
Альтернатива - пишем данные, допустим, раз в час, подобрав батарейку таким образом, чтобы при пропадании внешнено питания схема гарантировано проработала минимум до следующей записи данных.
UPS поставить ) Шутка.
Тогда нужно посчитать, с какой погрешностью можно жить. Т.е. если потерян один отсчет, насколько это критично. Зависит от скорости движения жидкости. Грубо, если +- литр, а литр протекает за 10 минут, то можно раз в 10 минут сохранять.
Если нужно очень точно, то может быть шутка с UPS не такая уж и шутка, тогда аварийный аккумулятор.
Значит другого выхода нет. Или организовать бесперебойное питание, или записывать значения с неким промежутком во времени.
Ну или на SD карту писать
У СД карт тоже 10000-30000 перезаписей на 1 ячейку.
Так что если только лог последовательно писать. На 16 гиг например поместится не мало (17179869184 байт, если флоат на 4 байта 1 раз в секунду, то примерно на 136 лет :) последовательной записи данных )
Говорят в дорогих СД стоит контроллер управляющий износом ячек - не проверял. Простую убил перезаписью одной и той же ячейки за пару дней.
Ну а устройстово проживет 136 лет ?)
Делали свою стойку ЧПУ на замену НЦ-31, использовали в модуле ОЗУ микросхемы FRAM. М/б сейчас есть еще более продивнутые микрухи.
FRAM - сегнетоэлектрическое ОЗУ
Делали свою стойку ЧПУ на замену НЦ-31, использовали в модуле ОЗУ микросхемы FRAM. М/б сейчас есть еще более продивнутые микрухи.
FRAM - сегнетоэлектрическое ОЗУ
А цена вопроса?
дорого. лучше часы. )
http://www.wulfden.org/downloads/datasheets/DS2423.pdf
Если думать не хочется, то NVRAM (или подешевле) - вполне себе решение...
Если думать не хочется, то NVRAM (или подешевле) - вполне себе решение...
я уже предлогал... дорого им :)
Можно сделать вот так
Пока есть внешнее питание - нормально все. Как только его нет, генерится прерывание на INT0 или INT1 (переход с высокого на низкий уровень). По этому прерыванию сохраняем переменную в ЕЕПРОМ. Конденсатор на 1000 мкФ продолжает питать ардуину после пропадания внешнего питания где-то 1-2 секунды. Диод не дает конденсатору разрядиться "налево".
Для быстрого лога успешно подключил FRAM по SPI. Цена чипа (FM25CL64B-GTR) на 64 килобита у нашего местного поставщика 2.5$ в розницу. Если кому-то интересно могу выложить схему и код.
Интересно! И схему, и код! Правда, я пытаюсь завести I2C версию...