РадиоКот >Схемы >Цифровые устройства >Измерительная техника >
Регистратор температуры за «3 копейки» на CH32V003J4M6
Блюпилл для габаритов вместо коробка спичек.
Время непрерывной записи (каждые 8 секунд) 54 ч 36 м = 2 дня 6 ч 36 м
Диапазон температуры записи +30°C - +60°C
Микроконтроллер:CH32V003J4M6
Интерфейс: UART 115200 бод
Питание: от 3.0В до 5В
Пример измерений:
Назначение устройства
Регистрирует температуру сразрешением 1°C в диапазоне +30…+60°C и сохраняет измерения во встроенной флэш-памяти микроконтроллера. Запись производится каждые ~8 секунд. При заполнении памяти хранится 54 ч 36 м = 2 дня 6 ч 36 м
Аппаратная часть
• CH32V003J4M6 — 32-разрядный RISC-V МК с 16 КБ флэш и 2 КБ ОЗУ.
• Датчик температуры — внутренний кремниевый датчик (используется через встроенный АЦП).
• Кнопка «Очистка» на PA2 (при удержании при включении стирает лог).
• Светодиод на PC1 — мигает при измерениях.
• UART на PD6 (TX) и PD5 (RX) — вывод данных в ПК.
Схема элементарна: МК, аккумулятор Li-ion 3.6В, кнопка, светодиод, датчик NTC=10k.
Архитектура памяти CH32V003J4M6
есть два независимых блока флэш:
1. Boot Flash (область загрузчика) — 1920 байт
Адресуется отдельно.
Именно сюда загружается весь код программы (он маленький и помещается).
2. Main Flash — 16 КБ
Это основная флэш для кода и данных в обычных проектах.
У нас она полностью свободна для хранения журнала, потому что код в Boot Flash.
Используется как энергонезависимая память для лога температур.
Преимущество такого подхода
• Код находится в изолированной Boot Flash — при стирании Main Flash мы не трогаем исполняемую программу.
• Можно полностью очистить журнал без риска «убить» прошивку.
• Main Flash используется целиком и эффективно, что увеличивает максимальное время автономной работы регистратора.
Принцип работы
1. После включения устройство проверяет кнопку:
Если нажата — флэш очищается. Если не нажата — выводится весь накопленный лог в UART.
2. Каждые 8 секунд:
Выполняется 4 194 304 измерений АЦП для усреднения и подавления шумов.
Полученное значение переводится в °C. Температура кодируется в 5-битный формат и записывается в свободное место флэш-памяти.
3. Вывод в UART позволяет сразу записывать данные на ПК (например, в Excel).
Особенности ПО
• Запись флэш без стирания всей страницы — каждая запись только «обнуляет» нужные биты, пока страница не заполнена.
• Экономия памяти: каждая температура хранится в 5 битах.
• Флэш очищается только по команде (кнопкой).
• Простая структура данных — чтение возможно даже без МК, напрямую через программатор.
Как использовать
1. Скомпилировать проект в MounRiver Studio.
2. Прошить МК.
3. Подключить USB-UART адаптер к PD6/PD5 (115200 бод).
4. Для очистки — при включении питания удерживать кнопку на PA2.
5. Для выгрузки данных — просто включить питание без кнопки, лог выведется в UART.
Формат хранения данных во флэш
В CH32V003 страница флэш = 1 КБ (256 слов по 32 бита).
В нашем случае данные хранятся с конца флэш-памяти вниз.
Каждое слово (32 бита) разбито на 6 ячеек по 5 бит для хранения температуры, плюс 2 бита служебные:
Srv — служебные биты (метка конца блока)
T0..T5 — температура, закодированная в 5 бит (0…31)
Первые 5 бит первого свободного места обнуляются для записи нового значения. До стирания можно только менять 1 - 0.
Как кодируется температура:
В памяти хранится val = температура - 30 (диапазон +30…+60°C).
val упакован в 5 бит.
При чтении обратно — темп = val + 30.
Как это работает при записи
Пустая страница (после стирания)
11111111111111111111111111111111 (все биты = 1)
Слово № Биты: [S1][S0][ T5 ][ T4 ][ T3 ][ T2 ][ T1 ][ T0 ]
---------------------------------------------------------------------------
0000 [ 1 ][ 1 ][11111][11111][11111][11111][11111][11111]
0001 [ 1 ][ 1 ][11111][11111][11111][11111][11111][11111]
0002 [ 1 ][ 1 ][11111][11111][11111][11111][11111][11111]
...
— все 6 ячеек T0…T5 пустые, S0=1, S1=1.
1. Запись нового значения:
Алгоритм ищет слово, где оба служебных бита S1 и S0 = 1.
Внутри слова ищет первую 5-битную группу, где все биты = 1.
Записывает новое значение, обнуляя соответствующие биты.
2. Если записывается 6-я ячейка (T5):
После записи она обнуляется по значению.
Бит S1 (31) также сбрасывается в 0.
Это значит: «слово заполнено, переходи к следующему».
Обозначения:
• 1 — бит в исходном стёртом состоянии (лог.1).
• 0 — бит, сброшенный при записи (лог.0).
• S1 — бит 31 (метка конца слова).
• S0 — бит 30 (признак слова, в котором ещё есть свободные ячейки).
• Tn — группа из 5 бит, одно измерение температуры (T0 = младшие 5 бит, T5 = старшие 5 бит).
Биты: [S1][S0] [ T5 ][ T4 ][ T3 ] [ T2 ][ T1 ][ T0 ]
[ 1 ][ 1 ][11111][11111][11111][11111][11111][11111]
Пустое слово. Все 6 ячеек T0…T5 свободны.
Биты: [ 1 ][ 1 ][11111][11111][11111][11111][11111][10110]
Записано одно измерение в T0, остальные ячейки пусты.
Биты: [ 1 ][ 1 ][11111][11111][11111][11001][11100][10110]
Заполнены T0, T1, T2. Оставшиеся T3..T5 свободны.
Биты: [ 1 ][ 1 ][11111][11010][00111][11001][11100][10110]
Заполнены T0…T4. Свободна только T5.
Биты: [ 0 ][ 1 ][01001][11010][00111][11001][11100][10110]
- T0…T5 содержат данные температур.
- S1 сброшен в 0 — слово полностью занято, переход на следующее.
- S0 остаётся = 1 (в коде он не меняется, только S1 служит сигналом конца слова).
После первых 8 измерений (1 слово заполнено, второе начато)
Слово № Биты
---------------------------------------------------------------------------
0000 [ 0 ][ 1 ][01001][11010][00111][11001][11100][10110] ← Полное
0001 [ 1 ][ 1 ][11111][11111][11111][11111][11001][10100] ← T0, T1 заполнены
0002 [ 1 ][ 1 ][11111][11111][11111][11111][11111][11111]
...
После 15 измерений (2 слова полные, третье начато)
Слово № Биты
---------------------------------------------------------------------------
0000 [ 0 ][ 1 ][01001][11010][00111][11001][11100][10110]
0001 [ 0 ][ 1 ][01100][10110][00111][00010][10011][00101]
0002 [ 1 ][ 1 ][11111][11111][11111][00010][01100][10101]
0003 [ 1 ][ 1 ][11111][11111][11111][11111][11111][11111]
...
После заполнения страницы (все слова полные)
Слово № Биты
---------------------------------------------------------------------------
0000 [ 0 ][ 1 ][01001][11010][00111][11001][11100][10110]
0001 [ 0 ][ 1 ][01100][10110][00111][00010][10011][00101]
0002 [ 0 ][ 1 ][11101][10101][00001][11110][00011][11001]
...
00FF [ 0 ][ 1 ][01001][11000][00110][00011][10110][11100]
Как это читается
1. При выгрузке через UART программа идёт от слова №0 вверх по адресам.
2. В каждом слове проверяет группы T0…T5:
Если все биты в группе = 1 ячейка пуста.
Если хотя бы один бит = 0 ячейка содержит закодированную температуру.
3. Когда встречается слово, у которого S1=1 и есть пустая ячейка — туда будет следующая запись.
4. Если S1=0 слово полное, сразу переходим к следующему.
Такой формат позволяет:
• Хранить до 1536 измерений на одну 1КБ страницу (256 слов × 6 ячеек).
• Избегать стирания страницы при каждой записи (ресурс флэш экономится).
• Быстро определять свободное место по S1.
• Объём флэш = 16 КБ = 16 * 1024 = 16384 байт.
• 1 слово = 4 байта → число слов = 16384 / 4 = 4096 слов.
• В одном слове — 6 измерений (T0…T5 по 5 бит).
измерений на страницу (1 КБ = 1024 B):
words_per_page = 1024 / 4 = 256
measurements_per_page = words_per_page * 6 = 256 * 6 = 1536
• Всего измерений в 16 КБ:
measurements_total = measurements_per_page * 16 = 1536 * 16 = 24576
• Интервал записи = 8 секунд.
Время заполнения всей доступной флэш один раз:
seconds_per_full_fill = measurements_total * 8 = 24576 * 8 = 196608 секунд
Это = 54 ч 36 м 48 с = 2 дня 6 ч 36 м 48 с (один полный проход).
• Слов всего: 256 × 16 = 4096 слов.
• Измерений на страницу: 1536.
• Измерений всего (16 КБ): 24 576.
При упаковке и 16 КБ — задействуются все 16 страниц, и каждый полный цикл записи заполняет все 4096 слов (24 576 измерений).
Сколько циклов записи получим при ресурсе страницы 10 000 циклов
Под «ресурсом страницы» обычно понимают endurance — сколько циклов стирание/запись выдерживает каждая страница флэш. Если endurance = E (циклов), то каждая страница можно полностью стереть и заново заполнить E раз.
• Один полный проход (заполнение всех страниц) — это один «full-cycle», после которого обычно требуется стирание страниц, чтобы снова писать.
• Следовательно, число полных проходов до износа = E (если вы стираете все страницы и снова используете весь объём).
• Общее число измерений за жизнь флэш = measurements_total × E.
расчёт для типичных значений = 10 000
• E = 10 000
Всего измерений: 245 760 000.
Время: 1 966 080 000 с = 22 755 дн 13 ч 20 м 0 с ≈ 62.34 года.
При программировании в WCH-LinkUtility выбрать адрес загрузчика!!!
Перед установкой на регистрацию очистить память. Зажать кнопку и включить питание. Через пару секунд нужно отключить питание и включить для регистрации. Только так, иначе после стирания если не снять питание регистратор не запустится.
Когда идет регистрация то светодиод на PC1 весело мигает. Если конечно установлен.
Файлы:
Фотография
Фотография
Архив RAR
Изображение
Все вопросы в
Форум.
Как вам эта статья?
|
Заработало ли это устройство у вас?
|
|
|