реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Сохранение калибровочных данных во внутренней флеши, получится ли такое?
kt368
сообщение Jun 14 2014, 18:25
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 454
Регистрация: 13-10-10
Из: Киев
Пользователь №: 60 135



Здравствуйте!
В разрабатываемом устройстве требуется проводить калибровку, при которой образовывается большой объём калибровочных данных, около 100 кБ. Я хочу их сохранять по определённым адресам во внутреннюю флеш память микроконтроллера LPC1758, а потом во время работы обращаться к ним по указателю на адрес во флеш-памяти. Получиться ли такое реализовать, или в моих соображениях есть принципиальная ошибка?
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jun 14 2014, 19:59
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Я бы начал с сокращения объёма калибровочных данных .


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 15 2014, 07:26
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(kt368 @ Jun 14 2014, 21:25) *
Получиться ли такое реализовать, или в моих соображениях есть принципиальная ошибка?
Да, получится. Ошибки в соображениях нет.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
toweroff
сообщение Jun 15 2014, 07:47
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



А прикрутить внешнюю eeprom?
Если сами калибровочные данные секрета не представляют, зачем использовать внутреннюю флеш? Это же, как-никак, большой кусок для программы, да и количество перезаписей для нее значительно меньше, чем у EEPROM
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 15 2014, 16:09
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(toweroff @ Jun 15 2014, 10:47) *
Если сами калибровочные данные секрета не представляют, зачем использовать внутреннюю флеш?
А зачем использовать внешнюю, если свободное место во внутренней позволяет?
Цитата(toweroff @ Jun 15 2014, 10:47) *
Это же, как-никак, большой кусок для программы,
Программа может быть и маленькой.
Цитата(toweroff @ Jun 15 2014, 10:47) *
да и количество перезаписей для нее значительно меньше, чем у EEPROM
Калибровка часто выполняется один раз при изготовлении и потом иногда один раз после ремонта. Циклов перезаписи там много не требуется. Даже если она делется раз в день, то ресурса внутреннего флеша с головой хватит на гарантийный срок.




--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
kt368
сообщение Jun 15 2014, 17:43
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 454
Регистрация: 13-10-10
Из: Киев
Пользователь №: 60 135



Памяти в камне с лихвой - 512 кБ, программа пока занимает 50 кБ, не думаю, что её раздует сильнее, чем до 100-200 кБ. Т.е. 100 кБ для калибровочных данных точно найдётся.
Буду пробовать, потом расскажу что получилось.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Jun 15 2014, 18:43
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Сергей Борщ, мое предложение, скорее, как еще один вариант sm.gif
kt368, все там будет нормально, для IAP есть куча примеров под это семейство
Go to the top of the page
 
+Quote Post
Леонид Иванович
сообщение Jun 16 2014, 21:27
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 318
Регистрация: 21-07-06
Из: Минск
Пользователь №: 18 986



Цитата(kt368 @ Jun 14 2014, 21:25) *
большой объём калибровочных данных, около 100 кБ


Можно кратко рассказать, что это за калибровочные данные? Ничего личного, пацаны интересуются.


--------------------
Go to the top of the page
 
+Quote Post
kt368
сообщение Jun 17 2014, 08:37
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 454
Регистрация: 13-10-10
Из: Киев
Пользователь №: 60 135



Разрабатывается прибор для измерения полного импеданса (как модуля, так и фазы) биологического объекта по тетраполярной методике со следущими характеристиками:

диапазон модулей имзмеряемого импеданса 100...1500 Ом;
диапазон фаз имзмеряемого импеданса 0...-60°;
амплитуде зондируемого тока 0.5...1 мА;
диапазон измерительных частот 1 кГц...5 МГц.

Про погрешность измерения пока говорить рановато, понимаю что 5% не достичь, т.к. очень много паразитных параметров - например, по ТЗ на частоте 5 МГц придётся измерять фазу RC-цепочки, составленной из параллельно соединённых сопротивления в 200 Ом и конденсатора в 5 пФ, при этом модуль этой цепочки будет равен 199.9 Ом, а фаза -1.8°, аналоговой части устройства будет сложновато это адекватно засечь, при том что измерительные электроды подключаются к прибору коаксиальными кабелями длинной около 1м каждый, очень много паразитной гадости набегает. Ясное дело, что кабели согласованы как по входу, так и по выходу, но всё-же.
Прибор основан на измерителе отношения амплитуд и сдвига фаз AD8302. Для оцифровки его выходного сигнала применён 24-х битный АЦП PCM4202. Результаты преобразования усредняются по 2^10 измерениям, но более 16 реальных разрядов извлечь не получается, хотя и питание хорошо отфильтровано малошумящими LDO, и согласование выхода AD8302 со входом АЦП выполнено на качественных ОУ LM833 и THS4531. В общем 16 бит достаточно, но из-за широкой полосы измерительных частот и параметров измеряемых нагрузок, производится калибровка на 20-и частотах, логарифмически распределённых в измерительном диапазоне. Калибровка выполняется для 200 нагрузок, представляющих собой комбинацию одного из 10-и резисторов в диапазоне от 100 до 1500 Ом и 20-и конденсаторов в диапазоне от 10 пФ до 20 нФ.

Также, возможно ошибочно для канала измерения падения напряжения на объекте был выбран разностный усилитель AD8274, т.к. он имеет заметный подъём АЧХ на частотах выше 500 кГц, и запаздывание фазы сигнала, для измерительных целей приходится их компенсировать соответствующими корректировками АЧХ и ФЧХ в канали измерения тока через объект.

В общем, кому интересно, вот изначальные схемы и платы, но на обе платы (цифровая и аналоговая) дополнительно допаяно несколько дополнительных RC-цепочек и электролитических конденсаторов по питанию, что не обозначено в схеме. Здесь нет только схем и плат выносных активных электродов, если кому очень нужно, могу выслать.

З.Ы. прошу сильно не критиковать, было бы больше время - многие моменты поменял бы, наловил уже с некоторыми узлами багов.
Прикрепленные файлы
Прикрепленный файл  AD8302.7z ( 1.64 мегабайт ) Кол-во скачиваний: 15
 
Go to the top of the page
 
+Quote Post
kt368
сообщение Jun 18 2014, 22:05
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 454
Регистрация: 13-10-10
Из: Киев
Пользователь №: 60 135



У меня возник вопрос относительно использования сохранённых во флеши калибровочных данных.
Допустим, у меня сохранена переменная по заранее (при компиляции) неизвестному адресу, который рассчитывается при калибровке и сохраняется по заранее известному адресу 0xabcd. Теперь я перезапитал МК и хочу использовать эту переменную в расчётах (ясное дело, эта область памяти будет read-only). Сначала я считываю адрес, по которому она расположена (он сохранён во флеши по адресу 0xabcd), сохраняю его в регистр adress. Теперь я хочу чтоб в функции объявлялась эта переменная, и указывалось что она расположена по адресу, сохранённому в регистре adress. Как (если можно) такое сделать?
Go to the top of the page
 
+Quote Post
smalcom
сообщение Jun 18 2014, 22:40
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718




Код
const uint32_t& cal_data = reinterpret_cast<uint32_t*>address;

можно и проще
*address или address[0]
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 19 2014, 06:12
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(kt368 @ Jun 19 2014, 01:05) *
Как (если можно) такое сделать?
Какой язык программирования вы используете? Если C, то вам стоит почитать про указатели. Эти знания вам пригодятся еще очень много-много раз. Информации по указателям в интернете - море, но пересказывать ее здесь - дело неблагодарное.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
kt368
сообщение Jun 19 2014, 06:42
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 454
Регистрация: 13-10-10
Из: Киев
Пользователь №: 60 135



Язык С, указатели в программе использую довольно часто.
Точно, по-идее просто объявить указатель и в программе инициализировать его адресом моей переменной, находящейся во флеш. И обращаться к переменной по указателю. Что-то я ночью тупил.

Спасибо!
Go to the top of the page
 
+Quote Post
toweroff
сообщение Jun 20 2014, 13:24
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Проще создать тип-стркутуру, в которой будут собраны вместе все ваши переменные
Потом создать указатель на эту структуру и инициализировать его адресом начала расположения во флеш
Обращаться примерно так:
Код
typedef struct {
    int var1;
    int var2;
} my_struct;

my_struct *pS = 0xXXXXXXXX;

pS->var1 = 1;
pS->var2 = 2;
Go to the top of the page
 
+Quote Post
kt368
сообщение Jun 20 2014, 20:56
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 454
Регистрация: 13-10-10
Из: Киев
Пользователь №: 60 135



Да, именно так я и сделал. Всё работает, вроде-бы.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th July 2025 - 22:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01479 секунд с 7
ELECTRONIX ©2004-2016