Dmitry Muravyev

Dmitry Muravyev 

Электроника, программирование и многое другое!

21subscribers

13posts

PC Fan Controller: предварительный отчёт по работам с прошивкой.

Коллеги, скажу честно, я крепко завис с этой прошивкой! Работы идут, сделано уже довольно много и, кажется, самое основное и самое сложное уже готово и вроде бы даже (скажу пока аккуратно) неплохо работает. Но, хочется сделать красиво, функционально и с прицелом на следующую версию, а это, как выяснилось, требует времени.
Собственно, этот пост как раз и призван ответить на главный вопрос жизни, вселенной и всего такого:
ПОЧЕМУ ТАК ДОЛГО???
А потому, что тестирование на реальных вентиляторах занимает гигантское количество времени. Ниже будет понятно о чём речь, но просто для примера: поначалу, пока я ещё не определился с алгоритмами сканирования вентиляторов и не подобрал для них приемлемые параметры, на каждый вентилятор (а я тестирую сразу 6 разных) у меня уходило до 20 минут и более. Очень надеюсь, что по крайней мере с первой версией платы мне не придётся возвращаться к этой задаче. Во всяком случае, MVP я совершенно точно выложу на том, что уже сделано.
По той же причине некоторые работы мне пришлось отложить. В частности, аппроксимацией буду заниматься уже когда дело дойдёт до второй версии и её прошивки (там как раз планируется STM32G431, а в нём есть FPU)
Итак, перечислю без избыточных подробностей,
ЧТО УЖЕ СДЕЛАНО (кое-что из этого уже упоминалось ранее):
• Весь код переписан на C++ и переделан в иерархическую структуру классов для упрощения перехода на другой состав железа с другими драйверами. Т.е. чтобы не надо было под следующую версию платы переписывать вообще всё, а можно было обойтись только адаптацией под другие аппаратные ресурсы и незначительными переделками.
• Обновлены "драйверы" для всей периферии: дисплей ST7789 (про него я уже писал), DS18B20, DS1841, MAX31790. Выложил их тут, на случай если кому-то пригодятся.
• Сделано поканальное определение состава оборудования и рабочего диапазона DC-DC (если он есть). Это надо делать, поскольку в зависимости от номиналов компонентов, в начале и в конце диапазона регулировки дигипота могут быть участки, на которых выходное напряжение не меняется с изменением сопротивления дигипота. Это же относится и к варианту управления DC-DC через ЦАП. Для определения регулируемого диапазона я использовал последовательное исключение интервалов (или чёрт его знает как этот метод называется): сначала движемся крупными интервалами и как только точка найдена - уменьшаем ширину интервала. Повторяемость получилась идеальная.
• Определение подключенных вентиляторов, доступных вариантов управления и рабочего диапазона оборотов. Тут для поиска минимально возможных оборотов я использую обычный бинарный (двоичный) поиск. Тоже очень хорошая повторяемость. С прицелом на следующую версию сделал ещё и косвенное определение размера вентилятора через время разгона и время остаточного "выбега" винта после сброса ШИМ до минимума. Функция экспериментальная, работает не всегда, поэтому оставил её в качестве опциональной. Возможно, есть смысл подумать над измерением тока потребления, например, измеряя падение на открытых каналах полевиков. Это позволило бы более надёжно угадывать физические параметры вентилятора. А главное, можно было бы детектировать подключение двухпроводных вентиляторов у которых нет датчика оборотов. В общем, задачка со звёздочкой на вторую версию девайса.
• Алгоритмы настраиваемого плавного изменения управляющих сигналов: и ШИМ и выходное напряжение DC-DC изменяются плавно без каких-либо резких скачков (на осциллографе выглядит дико круто). Это должно благоприятно сказаться на долговечности работы как системы питания, так и самих вентиляторов/подшипников. При необходимости это дело можно отключать или настраивать скорость нарастания/спада. Единственное место где происходит резкое изменение управляющего значения, это как раз определение массы винта (можно отключить).
• Хитровымученный регулятор оборотов с обратной связью. Использовал классический ПИД со всеми тремя компонентами, с тем отличием, что его вход нормализуется относительно рабочего диапазона оборотов вентилятора, а выход - относительно диапазона управления, чтобы регулятор мог нормально работать с разными моделями кулеров. Регулятор не быстрый и в пограничных случаях может выходить на режим до 10-15 секунд, но иначе слишком велик риск возникновения автоколебаний, как это происходит в MAX31790 (об этом ниже). А поскольку, например, для процессорных вентиляторов хорошо бы иметь быструю реакцию на изменение температуры, то пришлось снабдить это дело дополнительной логикой, которая при резких изменениях сразу выставляет нужный уровень управляющего сигнала, а дальше уже включается автокорректировка ПИДом. Задержка, связанная со временем плавного нарастания/снижения управляющего сигнала тоже учитывается.
• Сделана логика остановки/запуска вентиляторов, в т.ч. "тихий пуск". Это когда вентилятор в зависимости от результатов тестирования будет для первоначального старта запускаться не сразу на 100%, а сначала на 25/50/75% и только если это не привело к успешному запуску, то тогда уже он кратковременно запустится на 100%. Для тех, которые сразу начинают вращаться при коэфф. заполнения ШИМ = 0, никаких дополнительных действий выполняться не будет.
• Доделал и протестил разные режимы работы. Независимо от того, управляется вентилятор через ШИМ или через DC-DC, он может:
    ◦ быть полностью выключен, если, к примеру, и так слишком холодно и дополнительное охлаждение не требуется;
    ◦ поддерживать минимально возможные обороты (Silent Mode): очень тихо, но при этом обеспечивается минимальная циркуляция;
    ◦ работать на максимальных оборотах (режим Turbo);
    ◦ поддерживать конкретные обороты, установленные юзером вручную при помощи приложения (которое ещё только предстоит сделать);
    ◦ работать под автоматическим управлением на основе показаний датчиков температуры (Normal Mode).
Для последнего режима предусмотрена возможность настройки смещения активного диапазона оборотов в сторону более тихой работы, либо наоборот, в сторону большего охлаждения. Т.е. может использоваться весь рабочий диапазон вентилятора, а может, к примеру, только нижняя четверть или верхние 3/4 и т.д. Настраивается это при помощи задания средней точки активного диапазона. КМК, получилось довольно удачное решение.
• Кроме того, сделана runtime-коррекция минимального управляющего сигнала: если вентилятор замедляется до некоторого порогового значения (75% от минимально стабильных оборотов), то минимально возможный коэфф. ШИМ или минимальное напряжение питания в случае управления через DC-DC, будут постепенно корректироваться в сторону увеличения. Т.е. если принудительно руками останавливать вентилятор, то с каждым разом он будет работать на всё бОльших оборотах. И так до следующего сброса, обновления конфигурации или изменения режима управления.
• Поскольку прошивка изрядно разрослась и с удовольствием кушает ОЗУ, пришлось немного пересмотреть алгоритм работы с настройками. Раньше я хотел держать всю текущую конфигурацию в ОЗУ и сохранять её в ПЗУ только по команде, либо после сканирования оборудования. Но теперь бОльшая часть настроек хранится в ПЗУ, и перемещаются в ОЗУ только на время сканирования и только для текущего канала/вентилятора.
КАКИЕ ЕСТЬ/БЫЛИ ПРОБЛЕМЫ:
Оказалось, что вентиляторы в зависимости от модели и типа управления ведут себя настолько по-разному, что это довольно сложно уложить в единую логику работы с ними. К примеру:
• На низком напряжении питания некоторые модели могут выдавать всякие бяки по линии тахо-датчика, например такие ложные импульсы перед основным фронтом:
Или вот, вполне приличный Zalman делает вот так:
И как это понимать? Форменное безобразие! MAX'у от таких выкрутасов предсказуемо сносит крышу. Но теоретически, я думаю если в следующей версии измерять обороты микроконтроллером, то можно будет такие штуки отфильтровать. В любом случае, это надо иметь в виду.
• Несмотря на то, что чип MAX31790 довольно крутой и много чего умеет, я всё-таки решил его возможностями не пользоваться и всё сделать программно. Потому как чип редкий и дорогущий, а стало быть, в следующей версии платы от него лучше будет отказаться. И кроме того, всякие плюшки типа раскручивания вентиляторов при старте или плавного изменения коэффициента заполнения ШИМ (см. выше) логично было бы использовать не только для ШИМ, но и для управления через DC-DC. Как вариант, можно было бы транслировать управление из MAX на дигипот (почему нет?), но мне не понравилось как в MAX сделан алгоритм поддержания заданной скорости вращения. Он совсем примитивный и либо очень медленно реагирует на изменение целевых оборотов, либо моментально входит в режим автоколебаний. Эту проблему всё равно надо было бы решать программно, так что, нет смысла скрещивать ужа с ежом и лучше тогда уж всё сделать программно и независимо от наличия MAX (что, опять же, полезно для следующей версии).
• Ещё одна проблемка MAX31790 в том, что он измеряет обороты всего 1 раз в секунду. Потому-то и пришлось делать ПИД таким медленным. Думаю, в следующей версии это всё можно будет заметно ускорить. Правда, в этом случае может возникнуть ещё одна засада - конфликт моего ПИДа с аналогичным регулятором в профессиональных серверных кулерах. И тогда они вполне могут входить друг с другом резонанс. Но я уже предусмотрел возможность выбора более "медленных" коэффициентов или даже полного отключения ПИДа в контроллере, чтобы в будущем такие проблемы можно было обходить.
• Выяснилось, что вентиляторы нуждаются в "прогреве" перед замером их характеристик. Т.е. рабочий диапазон оборотов на прогретом вентиляторе отличается от рабочего диапазона на холодном. А холодный вентилятор вполне может останавливаться на том рабочем напряжении (или коэфф. ШИМ), на котором прогретый будет нормально работать. Причём некоторые модели могут останавливаться через несколько минут после запуска. Или иногда даже в прогретом состоянии могут стартовать "не с той ноги" (ну или не с того положения ротора) и плохо держать минимальные обороты. Такое случается очень редко и мне трудно предположить с чем это может быть связано. И, ясное дело, отловить такие ситуации тестированием не представляется возможным, поскольку это займёт огромное количество времени. Даже сейчас, в самом быстром варианте и с учётом времени прогрева, на тестирование одного вентилятора уходит 3-6 минут. Хотя в сложных случаях может быть и больше. Там у меня хитрая система: тестируемый вентилятор прогревается на 100% от 1-й до 3-х минут, в то время как остальные прогреваются на 50%. Чем дольше они будут крутиться на половине ШИМ (или напряжения питания), тем меньше они будут потом крутиться на 100% непосредственно перед тестированием. Возможно я что-то ещё скорректирую, но вообще, такая схема показала себя достаточно хорошо. Разумеется, тут речь идёт о первоначальном тестировании/сканировании вентиляторов, которое выполняется один раз, результаты запоминаются и дальше всё работает без всяких дополнительных задержек.
• Отдельный квест - определить что установились стабильные обороты. Как уже писал выше - некоторые модели могут на низких оборотах в зависимости от степени прогрева постепенно замедляться до полной остановки. И занимать этот процесс может несколько минут. Ну и в принципе, сама физическая природа работы вентилятора не подразумевает супер-стабильных оборотов. А определять что он стабилизировался и не останавливается как-то надо... Пока я сделал через анализ суммы нескольких последовательных дельт между соседними измерениями оборотов. Но в следующей версии хочу попробовать аппроксимировать замеры полиномом 1-й степени, т.е. прямой линией и анализировать угол наклона этой прямой относительно оси X. Думаю, это может быть чуть более надёжно и надеюсь, что как минимум не дольше, а может и немного побыстрее.
• Многие вентиляторы отключаются при низком коэффициенте заполнения ШИМ. Но это бы ещё ладно... гораздо хуже, что некоторые из них ещё и отключают сигнал по линии тахометра. Т.е. он может вращаться по инерции ещё секунд 20, но на жёлтом проводе будет тишина. Этот момент для меня был самым неожиданным.
• Ещё довольно странная история: некоторые могут начинать вращаться при коэфф. ШИМ хорошо за 50%. Т.е. рабочий диапазон ШИМ у них довольно узкий.
• Профессиональные серверные модели (например, Delta или AVC) сами отслеживают стабильность и линейность своих оборотов, а кроме того, сами сглаживают резкие изменения управляющего ШИМ-сигнала. Для этого в них установлен дополнительный микроконтроллер, который этим всем и занимается. Мне доводилось немного пореверсить один такой от HP/Delta и там стоял чип NXP MC9S08SF4. В целом, про них можно сказать что это самые порядочные "клиенты". С ними не возникает проблем и неожиданностей, они предсказуемо работают и достаточно быстро проходят тестирование.
И так далее и так далее... И это у меня ещё очень ограниченный тестовый стенд. В связи с чем, возможно, я объявлю в телеге благотворительный сбор интересных моделей вентиляторов для тестирования.
Что ещё для этой версии
ПРЕДСТОИТ СДЕЛАТЬ:
• Дописать и протестировать логику контроля и обработки ошибок. Кое-что уже сделано, много всяких черновиков, но есть и отсутствующие куски.
• Переделать процедуры работы с памятью (сохранение во Flash, поиск и инициализация датчиков и т.д.) Тут никаких сложностей не ожидается, просто надо сделать "по красоте".
• Переезд написанного кода с тестового проекта (он сильно урезан, для простоты и скорости тестирования я убрал из него всё, что связано с меню, дисплеем и обменом по USB).
• Подправить и проверить логику датчиков, в том числе, добавить возможность полного отключения вентиляторов в случае, когда температура опускается ниже заданного предела. В целом, этот пункт сделан, но он нуждается в дополнительных тестах. Может быть что-то усовершенствую.
• Проработать протокол общения с хостом.
• Выпустить MVP (Minimum Viable Product) прошивки.
• Переписать USB HID-драйвер, чтобы обойти проблемы с лицензией. Это в последнюю очередь. И, скорее всего, я сначала выложу MVP на какой-нибудь Google Drive без этого.
• Много всякой мелкой возни относительно настроек, режимов работы и всевозможного тестирования.
• А дальше надо будет набросать какую-то управляющую софтину, которую, скорее всего, для начала я сделаю под Винду.
ВМЕСТО ЗАКЛЮЧЕНИЯ И ВЫВОДОВ
В целом, мне очень нравится как оно получается. Изначально я хотел сделать какой-то минималистичный вариант, выложить его и дальше уже действовать исходя из интереса к проекту. Но, как всегда, увлёкся и теперь уже действительно имеет смысл масштабировать проект до второй, более бюджетной, но при этом и более мощной версии... И до всяких шариков-фонариков типа управления светодиодными лентами, использования PWM Capture в качестве одного или двух датчиков, автоматического анализа степени влияния вентиляторов на каждый из датчиков и т.д. и т.п.
Думаю что в ближайшее время я в телеге сделаю закреплённый пост с чек-листом по предстоящим работам и там буду отражать текущий прогресс, чтобы было видно что что-то происходит.
На этом пока всё. Хоть и медленно, но работы идут и я полон решимости довести их до конца!
Subscription levels3

Ассистент

$2.73 per month
Помогите мне развивать канал, закупать необходимое оборудование, расходники, инструменты и компоненты.

Доцент

$6.9 per month

Зав. Каф.

$13.7 per month
Go up