АЦП на STM32F302/303

топ 100 блогов eddy_em14.05.2023 Сколько ни работал с АЦП на F103 и F0xx, ругался: очень шумные и, бывает, нелинейные. Ну и, что немаловажно, в мелких корпусах нет входа Vref. А здесь — F302 (честно говоря, я вообще не понял, зачем ST выделило линейку F302, если они полностью аналогичны F303!) в LQFP100 (специально, хоть мне и LQFP64 для "автозаливалки азота" хватило бы, решил взять камушек с Vref). И вот, более-менее закончив со всеми этими менюшками и т.п. (точней, набросал базу, об этом чуть позже — основной функционал уже построить будет совсем несложно), решил проверить АЦП. Честно говоря, с первого раза не поверил результатам и перепроверил, но нет: он действительно такой!

Припаял к подстроечному резистору на 10кОм по 2 проводочка на две ноги. Одна пара - на мультиметр, другая - на вход АЦП. Сначала проверил все 10 каналов терморезисторов: они у меня подключены по простой схеме делителя, где в верхнем плече стоит 0.1% резистор 1кОм, а в нижнем подключается очередной терморезистор. Элементарную схему с делителем я уже не впервые применяю, там только лишь разнится, куда впаять опорный резистор: если хотим измерять более-менее точно сопротивления меньше опорного, впаиваем оный в верхнее плечо, если наоборот — в нижнее. У нас используются килоомные платиновые PTC, поэтому и опорный должен стоять в верхнем плече.
Как оказалось, даже выключенный мультиметр прилично влияет на показания АЦП, поэтому приходилось поочередно вытаскивать контакт подстроечника, потом вставлять щуп мультиметра и измерять сопротивление, затем проводить обратную операцию и измерять ADU с АЦП. АЦП у меня обслуживается по-старинке: DMA постоянно молотит в буфер из 9 измерений, а когда я хочу определить, что там, провожу простейшее вычисление медианы по этому буферу. Здесь для уменьшения подогрева азота я включаю питание на Vref и терморезисторы лишь на время измерений. И сразу после включения сначала считываю данные с BME280 — эти миллисекунды позволяют устаканиться показаниям АЦП, которые считываются далее.
Итак, первый тест провел с шестью номиналами во всем диапазоне. Везде показания одинаковые ±3ADU (т.е. и 300, и 2000 ADU у меня отличались лишь на эту величину! Я аж подохренел малость, т.к. не ожидал от китайских 0.1% резисторов такой точности, да и подозревал, что межканальные показания могут отличаться).
Ну, а дальше измерял все на канале 0, постепенно меняя сопротивление. График просто невероятный:
АЦП на STM32F302/303

здесь кружочками изображены измеренные данные, а ломаной — теоретические. Теоретические получены простой формулой делителя напряжения:
ADU = 4096 / (1 + 1000/Rx),
где Rx — измеряемое напряжение.
Разница между практикой и теорией получилась с разбросом от -6.5 до 0.4 ADU, RMS=2.0 ADU, среднее — -3.8 ADU. То есть вполне себе в шум ±3 ADU укладывается.
Просто превосходно!
Теперь можно со спокойной совестью просто по даташиту на платиновые терморезисторы написать приближенную функцию расчета температуры — а по ней уж можно вычислять уровень азота в дьюаре. Точность TRD значительно хуже точности измерения сопротивления получается. Ну, а что до уровня, нужно мини-НИР проводить с весами и двумя дьюарами, понемногу переливая азот из одного в другой и фиксируя зависимость поля температур от оставшейся массы.
Еще сегодня припаял проводочки к датчику давления MPX5050 и попытался сделать измерения. По даташиту там 90мВ прироста на каждый килопаскаль. Я подключил трубочку и смог надуть лишь на 1.1В — хреновый из меня пловец. Потом взял велосипедный насос и от души накачал, реально, максимальное напряжение как и по даташиту — 4.7В. Не знаю, насколько хреново он будет работать от 3.3В (в даташите гарантируют линейность и однозначность лишь при питании от 5В), но и на 3.3В вполне себе какие-то цифирки бегают туда-сюда. Думаю, лучше его на 3.3В подключить и иметь весь диапазон, чем быть ограниченным 33кПа (у датчика еще 0.15-0.20В нулевое смещение). Датчик думаем использовать для измерения давления внутри дьюара (понятно, есть еще и аварийный клапан на 0.5атм, чтобы "башню не сорвало").
Все это намного интересней, чем чертовы приложения под ПК разрабатывать — меня уже, честно говоря, тошнит от отладки многопоточных приложений!

Что до работы с экранчиком, то я разделил функционал на 2 уровня отображения: "окно" и "меню". У всех менюшек одинаковая функция-обработчик, т.к. там все полностью одинаково. Сама менюшка — структура, где указано родительское меню (или NULL, если это меню — корневое), количество элементов, текущий выбранный пункт и массив структур-пунктов. Структура-пункт содержит текст-название и два указателя: подменю (если есть) или функцию-обработчик. Если выбираем пункт, то вызывается функция-обработчик (если есть) и выполняется переход в подменю (если есть). А функция-обработчик может, в свою очередь, активировать окно (при выходе из которого произойдет возврат в это или другое меню) или выполнить какие-то другие действия. Окна могут быть "особенными" (скажем, основное окно, где отображаются базовые вещи, или окно демонстрации показаний АЦП в ADU, потом еще можно добавить туда же температуры) и серийными (пока их два: окно ввода int32_t и окно ввода Yes/No; первое — для изменения каких-то целочисленных параметров, второе — для сохранения настроек и т.п.).
За CAN пока не брался, т.к., учитывая наработки, это совсем недолго. Для начала нужно определиться с базовым набором команд. В отладочном режиме у меня их уже 39 штук, но в release-сборке будет куда меньше. Плюс нужно добавить сохранение параметров (пока не знаю, каких) во flash-память.
Еще у меня есть вариант управления по RS-485, но вряд ли до него вообще дойдет.
Картинку морды я уже публиковал. Сверху 4 светодиода: для крайнего левого я еще не придумал функционала, второй и третий слева показывают уровень ШИМ-заполнения (чем выше, тем дольше у них заполнение мигания вплоть до непрерывного свечения при 100% — визуально это намного проще отождествляется, чем изменение яркости), крайний справа мигает 1 раз в условную секунду, показывая, что прибор жив. Чтобы экранчик и светодиоды не мешали работе светоприемной аппаратуры, я отключаю их через ~5 минут бездействия кнопок.
Кнопок используется четыре (а вообще, их может быть семь штук): refresh/escape, left/up, right/down и menu/select. Большинство обработчиков использует лишь событие PRESS, но некоторые и на HOLD реагируют, чтобы быстрей менять те же параметры (замучаешься иначе выставлять 100% заполнения, нажимая кнопку каждый раз для изменения на 1).

Где-нибудь со вторника-среды нужно будет все обратно собрать и провести испытания в дьюаре (только весы сначала надо свои вернуть, а то они уже несколько лет в другой лаборатории находятся).

Оставить комментарий

Предыдущие записи блогера :
Архив записей в блогах:
- Кто там? -Это я, скворченок Тим-Тим. Нахохлился по деловому, лапками семенит, подпрыгивает с грозным щебетаньем. -Кто не скачет тот шпачок, Кто не скачет, тот шпачок. Дай пожрать, а то заклюю. Угомони, попробуй, такого. -Ты, блин Тим-Тим, тормозни малехо, а то с утра раз ...
На этих выходных решил сходить в Пятерочку за продуктами. Купил много, но слава Бобырю, грыжа не пострадала: Сначала сидели на площадке с малым, потом Анка отправила в Пятерочку по соседству: Продуктовый заказ она заранее надиктовала, а я записал своим программистским по ...
В начале 20 века среди интеллегенции было принято ругать власть. Потом была война, февральский переворот, затем Ленин. Ленин приехав в Петроград сначала не выступал. Он раскрыл паруса и ловил ветер. Он присматривался... Сейчас правило хорошего ...
Вы наверное уже все знакомы с этим величественным сооружением древности. Пусть не «лично», но в интернете многое смотрели и читали. Давайте освежим свою память самыми эффектными видами этого памятника архитектуры. Город Петра в Иордании находится в сердце пустыни. Это место ...
Европа не скоро откроется россиянам, а российская вакцина вряд ли привьется в ЕС. Европейский союз в лице Брюсселя и стран-членов признал тяжесть ситуации с COVID-19. Лидеры 27 государств, наступив на горло песне о суверенитетах, согласовали единую политику борьбы с болезнью. Для ...