eddy_em: (Default)
[personal profile] eddy_em
Сколько ни работал с АЦП на 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, постепенно меняя сопротивление. График просто невероятный:

здесь кружочками изображены измеренные данные, а ломаной — теоретические. Теоретические получены простой формулой делителя напряжения:
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).
Где-нибудь со вторника-среды нужно будет все обратно собрать и провести испытания в дьюаре (только весы сначала надо свои вернуть, а то они уже несколько лет в другой лаборатории находятся).
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org

May 2025

S M T W T F S
    123
45678910
11121314151617
1819202122 2324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated May. 28th, 2025 01:53 pm
Powered by Dreamwidth Studios