РадиоКот :: Регистратор температуры за «3 копейки» на CH32V003J4M6
Например TDA7294

РадиоКот >Схемы >Цифровые устройства >Измерительная техника >

Теги статьи: Добавить тег

Регистратор температуры за «3 копейки» на CH32V003J4M6

Автор: Simurg
Опубликовано 09.10.2025
Создано при помощи КотоРед.

Просто, дёшево и без единой микросхемы памяти.
Пишет в память каждые 8 секунд — и хранит всё, пока не нажмёшь «стереть».


Блюпилл для габаритов вместо коробка спичек.

Время непрерывной записи (каждые 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
Изображение


Все вопросы в Форум.




Как вам эта статья?

Заработало ли это устройство у вас?

1 0 1