Сегодня вечером завершил рисование принципиальной схемы и начал разводку печатной платы.
Схема:

Дальше )
Я решил уже выделить наработки по термомониторингу в отдельный проект. Там сейчас: простейшая прошивка для работы с двумя датчиками, даталоггер для нее, схема печатки под термодатчики для ЛУТа, зачатки схемы основных контроллеров и разведение ног в кубе.
На начальном этапе проектирования, кстати, этот куб очень удобен, т.к. наглядно видишь, что на каких ногах висит (а то было у меня уже, когда я на используемые USART'ом ноги пытался I2C вкорячить). Если бы этот куб еще код инициализации нормальный умел генерировать (а не ту бредопортянку, что делает), вообще сильно сократил бы начальный этап разработки. Зато он генерирует удобный отчет, который можно распечатать и иметь перед глазами наглядно все распределение периферии.
Сегодня я отлутил и спаял плату для второго термодатчика. Коллега на работе дал мне кусок стекла для чистоты эксперимента (все-таки, датчики к стеклу будут клеиться, правда, не совсем такому). Я приклеил датчики к стеклу, и стал копить статистику.

Дальше )
Таки дошли у меня наконец-то руки испробовать эти датчики в действии. Набросал код.
Сразу наткнулся на дурость проектирования: если после команды "начать измерение" произвести считывание, датчик вернет 0 вместо того, чтобы сказать NACK. И в дальнейшем тоже будет возвращать 0. Т.е. нужно выдерживать после считывания паузу где-то в 10мс. Поллинг невозможен. Ну, да ладно: буду поочередно всем датчикам грозди слать команду "считай", потом по прошествии 10мс после последней команды поочередно читать. Надо еще подумать, чем коммутировать I2C. Пока думаю это делать дешевым мультиплексором на 8 каналов (не знаю, правда, получится ли).
По ходу работы наткнулся еще и на то, что я отЛУТил платки, не проверив предварительно в кикаде правильность. И прозевал две перемычки! Как ни странно, один датчик работает нормально, невзирая на это (хотя закоротить на +3.3В ногу выбора режима I2C вместо SPI нужно обязательно). Второй шалит в SCL, похоже пытается все-таки SPI делать (или я его спалил, когда паял). Напаять блямбу из припоя не помогло (либо не припаялась она нормально — попробуй к такому корпусу что-нибудь подпаяй; надо даже неиспользуемые ноги выводить подальше дорожками).
На будущее надо заЛУТить и спаять еще хотя бы одну платку, чтобы можно было проанализировать, насколько точны показания датчиков. Плохо только, что измерение температуры при их помощи требует расчетов по полиномам, т.е. STM32F042 стопроцентно этого делать не сможет — придется в начале работы с сервера запрашивать калибровочные коэффициенты всех датчиков, запоминать их, а затем уже преобразовывать.
И еще одна бяка: STM32F042 наглухо блокирует I2C в случае обнаружения другого мастера на шине, спасает только переинициализация. Надо читать мануал, почему такая гадость происходит.
Потихоньку осваиваю F0, все-таки, надо будет разработать систему мониторинга температуры ГЗ БТА. Пока я не спаял платку для термометра, взял первый попавшийся в коробке девайс на I2C — датчик температуры/влажности HTU21-D. Я с ним, кстати, еще ни на STM32, ни на STM8 не работал.
Пару вечеров убил в обнимке с мануалом и даташитом. Позавчера скомпилялось, и я довольный пошел спать. Вчера была ночная экскурсия — не до этого, а сегодня решил прошить.
Делал, кстати, под STM32F030 — у меня две таких макетки и всякие дикие эксперименты стараюсь с ними проводить (хоть STM32F042 у меня с двукратным запасом, не хочется перепаивать на nucleo, когда флеш сдохнет). Прошиваю — и тишина в USART. И тут до меня доходит: у 20-ногого F030 PA9 и PA10 делят функции USART и I2C! Пришлось переделывать под STM32F042, и для начала научиться работать на нем с USART.
Потом решал проблему с зависанием на проверке while(!(I2C1->ISR & I2C_ISR_TXIS)), когда на линии нет ничего (даже подтягивающих резисторов). Оказалось, что в данном случае флаг не появляется вообще! Пришлось везде, где есть такие проверки, внедрить таймаут в 5мс. Ну, а потом я раскомментировал весь код и, как ни странно, все с первой же попытки завелось! Правда, я вместо умножения на 10 в вычислении влажности выполнил операцию деления. Но теперь все ОК, код на гитхабе.
В терминал 1 раз в секунду выдается то значение влажности, то температуры:
Temperature: 259/10 degrC
Humidity: 324/10 %

В комнате один термометр с гигрометром (тоже, наверное, на подобном чипе) и часы с термометром. Первый показывает 24°C и 37%, второй показывает 23°. Подогрев чипа по умолчанию отключен — похоже, либо саморазогрев у него такой, либо нагло врут в даташите про точность в 0.3°C!

Теперь надо будет спаять минимальную платку для TSYS01 и заняться им.

DS18S20

Jun. 18th, 2016 10:38 pm
Итак, вчера вечером я закинул горсть платиновых терморезисторов и DS18S20 в банку с кипятком. Не дождался, пока они остынут до комнатной, поэтому оставил мониторинг. Сегодня вечером (кстати, наконец-то появилось небо; хоть и в дымке, но я таки смогу провести техническую ночь!) выключил мониторинг и в ожидании неба занялся обработкой данных.
Сейчас телескоп на автомате снимает поля для коэффициентов СКН, а я, посматривая на all-sky камеру, могу написать, что же получилось по термодатчикам.
Дальше )
Наконец-то дошли руки допилить "псевдоаппаратный" 1-wire (сосфорж,
гитхаб).
Реализация довольно простая: через таймер TIM2 и DMA, разве что сброс происходит через прерывание (но эта процедура выполняется один раз перед отправкой пакета данных, так что не страшно). Канал 4 таймера TIM2 используется одновременно как выход и вход: TIM2_CH4 работает в режиме ШИМ-выхода, а TIM2_CH3 — в режиме ШИМ-захвата. Соответственно, используются два буфера DMA: канал 7 DMA1 последовательно заполняет из буфера передачи регистр TIM2_CCR4 (этот регистр буферизуется, чтобы его содержимое обновлялось лишь по окончанию передачи предыдущего байта); канал 1 DMA1 по событию захвата CCR3 считывает содержимое TIM2_CCR3 в другой буфер.
По истечению захвата DMA генерирует прерывание, внутри обработчика которого отключается все ненужное и устанавливается флаг готовности принятых данных. Дальше уже обработчик анализирует буфер и выдает нужную информацию (использую простейший конечный автомат, который по завершению приема запускает функцию-обработчик, для нее выделена отдельная глобальная переменная).
Еще немного текста )
Сейчас закончил преобразование "термометра", позволяющего подключить до 14 DS18x20 к трехразрядному китайскому "вольтметру" на STM8. Код можно посмотреть здесь.
Переделка совсем несложная (выпаиваются несколько деталюшек, а один резистор перепаивается с одного места в другое, если под рукой нет 0603 на 4.7кОм — с 10-килоомным при коротких проводах все тоже вполне работает):
15.04.23_22:01:26
Схемка переделки

Чуть текста )
Итак, 16 декабря я сделал последнюю заливку "до пузырей" и стал ждать, пока все нагреется. Суммарно я залил 170 литров.

Емкости банки хватило на 39.6 часов. Т.е. вполне реально заливать азот 1 раз в сутки, как раз одного 20-литрового дьюара хватит, а в 25-литровом даже немного останется ☺
Продолжение )
Итак, на прошлой неделе был проведен эксперимент по исследованию температурных режимов криостата.
Как обычно, в ходе эксперимента выяснилась простая истина: приматывать терморезисторы проволочками нельзя. Логично. В итоге самый интересный датчик (№8), расположенный на медном стержне донышка азотной емкости (к нему будут подключаться гибкие хладопроводы для охлаждения светоприемника) показывал "погоду на Марсе", установившись на значении в районе -105°C. Когда его пинали, он немного лучше/хуже прижимался к стержню и резко менял показания (прямо как подследственный какой-то).
All
График хода температур в течение всего времени заливки/нагрева

Подробности )
На днях должны подвезти спирт, и я смогу наконец-то подготовить криостат к тестовой откачке и, если течей не будет, испытанию холодом в наших условиях.
А для этого нужно иметь надежную систему сбора температур. Я уже писал о тестировании системы в жидком азоте. Теперь же решил откалибровать при помощи точного омметра и посмотреть, как датчики себя в комнатной температуре будут вести.
Подробности )
В документации на датчики Холла (A1101), которые я буду использовать для определения текущей позиции турелей в спектрометре, сказано, что гарантированно они работают при температурах выше -40°C. Мне стало интересно: а при какой же температуре реально эти датчики будут отключаться? А также я решил проверить, не сдохнут ли они совсем, если их совершенно заморозить в жидком азоте.
Ну, а чтобы уж зафиксировать это "для истории" (да и рук не хватало, чтобы сопротивление записывать), я снял видео:



Заодно, пока весь азот не выкипел, я решил проверить, насколько врут разные терморезисторы:



Подробности )
Сегодня у меня, наконец-то, получилось «скрестить ужа с ежом»: использовать «вольтметр» на STM8S003 для измерения температуры по протоколу ZacWire с термометров TSic-506. Видео раз, видео два.

Read more... )
Наконец-то добрался я и до АЦП. Обновил репозиторий (тарболы готовые качать не рекомендую, т.к. они обычно поросшие мхом). Схему соединения мне пока лень рисовать, попытаюсь это сделать завтра (если не забуду — добавлю сюда). А пока расскажу, что у меня с точностями получилось.

Картинки и много букв )

В принципе, для измерения температуры некритичных областей криостата (где даже ±1К хватит) точности в 0.1% более чем достаточно. Однако, хочется все-таки еще и выжать из этого АЦП по крайней мере 20 значащих бит! В общем, нужно обращаться за консультацией к электронщикам: может, чего дельного посоветуют.
Итак, с подключением датчиков я более-менее разобрался: подал всем на "+" питание +3.3В; "минусы" подключил к ногам МК (пока что использовал ноги для аналогового мультиплексора), работающим в пушпульном режиме; ноги "data" термодатчиков через диоды (Шоттки у меня пока нет, поэтому воткнул какие-то советские с неплохим прямым падением) — к общей шине. В итоге, если сразу же после команды задания адреса на мультиплексор дать команду чтения шины ZacWire, как раз успеваешь считать первую порцию данных (потом уже читать бесполезно: вероятность наткнуться на начало пакета == процентов 10).

Текст, графики )

Сегодня, ценой одного 500-рублевого датчика, я добавил в свой ircontroller поддержку термодатчиков TSic по ZacWire.
Подробности )
Сегодня получилось (третий день уже над этой проблемой корпел) сделать управление N термодатчиками, сидящими на шине 1-wire. Вот — архив с прошивкой.
Подробности )
В принципе, нужно, наверное "причесать" функции для работы с 1-wire (чтобы не нужно было писать простыней вида OW_Send(0, (uint8_t*)"\xbe\xff\xff\xff\xff\xff\xff\xff\xff\xff", 10, buf, 9, 1), а просто OW_SendFN + OW_Read. Ну и конечно же добавить проверку CRC.

July 2017

S M T W T F S
      1
23 4 5 6 78
9 101112 131415
16171819 202122
23242526272829
3031     

Syndicate

RSS Atom

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 20th, 2017 02:42 pm
Powered by Dreamwidth Studios