Давненько я не писал занудных статей. Но то, что я хочу высказать сегодня - коротко не сформулируешь. В общем, началось всё с того, что забросил Гугль меня на один ресурс, на одну очень замечательную статью. Ресурс я тот уже много лет не посещаю из-за несогласия с действиями администрации в мой адрес, но когда поисковик меня туда забрасывает (читаем: счётчик посещений всё равно увеличился), статьи читаю. Статья была очень и очень замечательная. Там автор победил скачки температуры, запитав дисплей своего принтера от отдельного стабилизатора +5 вольт. Сразу скажу, вторая часть моей статьи полностью подтвердит методику того автора, но рассказ я буду вести в той последовательности, в которой шли мои проверки.

Итак. У меня есть два принтера. Первый - MZ3D, в который я пару лет назад засунул плату на базе микроконтроллера ARM, самостоятельно "доточив" штатный исходный код от Arduino. Тогда у меня тоже были большие проблемы со стабильностью температуры. Я отнёс их к тому, что не совсем корректно реализовал поддержку АЦП. Будучи человеком ленивым, я тогда просто изменил алгоритм усреднения, благо в STM32F4 АЦП работает быстрее, чем в AtMega. Я просто набирал большую выборку, далее - усреднял, после чего - откидывал все результаты, которые сильно отличались от среднего значения, затем - усреднял, что осталось. Тогда это позволило принтеру не тормозить по 5-10 минут перед запуском печати, ожидая стабильных показаний термодатчика (при том, что вообще-то принтер уже прогрет).

Но второй мой принтер - китайская Дельта. И у него тоже есть проблемы. Он может начать печатать сразу, а может - долго и вдумчиво "тупить", считая, что температура не стабильна. Поэтому я решил проверить доводы автора оригинальной статьи. Мне очень не нравится ждать начала печати по 7-10 минут.

Скажем так, когда я оторвал дисплей, стабильность всё равно была такая, что принтер тупил. Тут-то я и вспомнил события пятнадцатилетней давности. Тогда наша контора делала поддержку USB для одного контроллера, при помощи внешнего моста PDIUSBD12. У ребят всё было написано верно, но ничего не работало, и мы начали разбираться в деталях. Выяснилось, что фронты сильно шумят. Сначала мы просто вносили задержки при анализе. Но потом стало ясно, что длительность шумов - штука непостоянная, а если сделать задержки гарантированно большими, то быстродействие системы станет неприемлемым. Поэтому пришлось разбираться с физикой процесса.

Времена были дикими, мы выживали как могли, но через три дня один из сотрудников сумел по очень серьёзному знакомству выпросить во временное пользование жутко дорогую и дефицитную вещь - осциллограф. Ещё аналоговый. Ладно, долой ностальгию, даёшь только суть! А суть была следующей: Все сигналы были промодулированы синусоидой. Поэтому фронты на осциллограмме выглядели примерно так:

И оцифровывалось это примерно так:

Реально частота была чуть иной, поэтому дребезг на фронтах был жуткий. А всё потому, что Заказчики дали нам две платы. На одной был контроллер, на другой - тот самый PDIUSBD12. И соединены они были метровым кабелем. Одна плата передавала на другую тактовые импульсы (несколько мегагерц). А длинный провод - это же как конденсатор. Есть обкладки (токоведущие жилы), есть - диэлектрик. Провод длинный - площадь обкладок велика. Посему переменный ток тактовой частоты создавал емкостные наводки на все остальные линии.

Выкинули провод - фронты стали идеальными. Почему я вспомнил о том проекте? А вот почему:

Перед нами - длинный кабель, в котором тоже есть импульсы - ШИМ контроллер, питающий нагреватель. В MZ3D кабель короче, но зато в нём ещё две обмотки шагового двигателя получают импульсы (правда, в них фронты не прямоугольные, да и во время прогрева головки, там нет импульсов, но всё же).

Ну что ж. Подключаемся к выходу этого кабеля осциллографом и смотрим. Пока идёт равномерный прогрев хотэнда - там всё чистенько. Но когда включается ШИМ (а PID контроллер начинает играть им за 10 градусов до требуемой температуры) - начинается веселуха

Правда, мнения разделились. Мой знакомый уверял, что такой импульс не может влиять на АЦП. Тем не менее, я решил попытаться его задавить.

Я вижу два варианта. Первый - заэкранировать провод, идущий к термистору. Так получилось, что я играл в это дело на новогодних каникулах, поэтому сходить в магазин за проводом МГТФ-Э было невозможно, так что этот вариант был отброшен. Второй типовой вариант - отделить АЦП от шумящего кабеля проходным низкоомным резистором. Здесь только важна точка его включения. Вот так выглядит схема нашего узла

Резистор R и термистор образуют делитель напряжения. В зависимости от температуры, сопротивление термистора изменяется, в результате - изменяется коэффициент деления. Ну, а значит - напряжение на линии, уходящей к АЦП. Ну, а конденсатор C фильтрует это напряжение. А молния бьёт по проводам. И конденсатор не справляется с этой фильтрацией. Причём в MZ3D у меня с момента переделки стоит керамика, это не помогает.

Если включить проходной резистор где-то левее точки подключения резистора R, то изменится коэффициент деления. Поэтому проходной резистор следует включать уже после делителя, но до конденсатора. Этот новый резистор в паре с конденсатором, образуют RC фильтр

Сопротивление резистора я выбрал 56 Ом. Ну, потому что мне в куче резисторов первыми попались низкоомные именно этого номинала. Возможно, имеет смысл задуматься насчёт 100 Ом. Но я уже подслеповат, поэтому лишний раз перепаивать резисторы 0805 для проверки не очень хочется. Так что у меня стоят на 56 Ом.

После указанной доработки, поведение принтеров стало различаться. MZ3D стал работать идеально. Все шевеления температуры ушли. А вот Дельта - хоть и стала стабильно стартовать, но всё равно температура продолжала плясать. Просто получается, она стала плясать в пределах трёх градусов, заложенных в "прошивке" на допустимую погрешность. В целом, можно было бы так и оставить, но раз уж маховик доработок раскручен, я решил попытаться довести дело до конца.

И вот тут выяснилось, что в некоторых местах платы MKS Gen v1.4, напряжение питания выглядит вот так:

Как минимум 0.3 вольта пульсаций! А если мы внимательно посмотрим на схему выше, то увидим, что питающее напряжение крайне важно. Именно относительно него АЦП проводит замеры (так уж заложено в "прошивке"). Причём повторю, в разных местах платы пульсации разные, поэтому контроллер берёт одно опорное, а делитель из резистора R и термистора - делит совсем другое. Если дисплей отключён, то напряжение становится таким:

Уже лучше. Именно этого добился автор статьи, сподвигнувшей меня на возню. Но всё-таки пульсации есть. Теперь смотрим, что частота пульсаций - примерно 230 КГц

наверняка это частота работы импульсного стабилизатора. Но давайте докажем это от противного. Поставим вот такой здоровенный электролит на плату дисплея.

Осциллограмма напряжения на основной плате не изменилась. Что и требовалось доказать. Это не помеха от внешнего дисплея. Просто ёмкость установленных на ней конденсаторов так мала, что её не хватает для удержания напряжения на более-менее постоянном уровне. Добавим этой ёмкости.

Вообще-то то, что я сделал - делать не стоит. Конденсаторы на плату следовало бы напаять. У разъёмов имеется условно высокое сопротивление, плюс - от вибрации они могут начать дребезжать. Но мне так уже надоело собирать и разбирать принтеры, что я бы не вынес ещё одного полного отключения платы, а затем - её подключения. Поэтому пока что сделал временный вариант. Напаял конденсаторы на разъёмы и подключил их к плате вот так:

Я насадил их на разъём программирования SPI (так как он расположен рядом с контроллером) и на тот же разъём, к которому подключён дисплей (потому что это - самый большой потребитель).

Осциллограмма питающего напряжения стала просто-таки замечательной. Остались какие-то ВЧ помехи, а частота импульсного преобразователя - ушла.

Нестабильность температуры стала не случайная, а периодическая. Было ясно, что просто PID регулятор не выходит на стабильный участок. Поэтому я его быстренько перекалибровал командой

M303 S220

Затем - вбил получившиеся значения. У меня это было

M301 P19.17 I1.81 D50.64

и сохранил их в EEPROM

M500

После этого, график температуры стал вот таким:

Его почти не видно за красной линией, такой он прямой.

Собственно, всё. Мои проблемы - решены. Теперь делаем выводы:

Заключение

Китайские схемотехники делают достаточно большое количество оплошностей. Часть оплошностей автор уже описывал в предыдущих статьях, часть - описана в настоящей статье.

Иногда проблема имеет сразу несколько причин. В частности, у модифицированного MZ3D причина была одна, а у Дельты - сразу две.

Пляски температуры - это никакие не пляски. Это галлюцинации, которые возникают у "прошивки" на основе неверных показаний, считываемых с АЦП. Но попытки компенсации кажущихся плясок температуры, приводят к реальным пляскам.

Одна из возможных причин галлюцинаций - емкостные наводки в длинном кабеле, вызванные двенадцати или даже двадцатичетврёхвольтовыми импульсами, подаваемыми ШИМ-контроллером в нагреватель. Для их устранения можно попытаться применять экранированный кабель к термистору (не проверено), а можно - добавить проходной резистор, заменив чисто емкостной фильтр на RC-фильтр. Важно только не изменить коэффициент деления в делителе напряжения. У автора это решило проблемы галлюцинаций на модифицированном MZ3D и уменьшило уровень галлюцинаций на Дельте, но не устранило их полностью.

Плата MKS Gen v1.4 хоть и содержит импульсный стабилизатор (который в теории даёт больший ток, чем линейный), но суммарная ёмкость установленных на ней конденсаторов такова, что при потреблении, заложенном производителем DIY-комплекта, получаются большие пульсации по питанию, приводящие к галлюцинациям скачков температуры. Таким образом, совершенно не обязательно питать дисплей от отдельного источника, можно просто добавить конденсаторов на основную плату MKS Gen v1.4.

После устранения всех помех, следует произвести повторную калибровку PID-регулятора