piątek, 29 maja 2020

Kalibracja czujnika temperatury w drukarce 3D


Będzie to kontynuacja ostatniego wpisu na temat wymiany kontrolera w Monoprice Maker Ultimate / Wanhao D6.

Niestety temat kalibracji drukarek 3D jest bardzo często pomijany, a bez poprawnej kalibracji, można zapomnieć o ładnych wydrukach. Wielu nowych użytkowników drukarek, nie wie nawet jak taką operacje przeprowadzić, bo w podręcznikach użytkownika zazwyczaj nie ma nawet o tym słowa.




Zaczniemy od temperatury na głowicy, po zmianie kontrolera okazało się że skacze o około 3 stopnie, a do tego wskazanie na zimnej drukarce jest inne jak termistora na łóżku.

Octoprint

By zrozumieć z czym mam do czynienia, pierwszy krok to włączenie w Marlin opcji która pokaże nam jakie wartości są faktycznie odczytywane na czujce temperatury:

 // Enable for M105 to include ADC values read from temperature sensors.  
 #define SHOW_TEMP_ADC_VALUES  

ADC to skrót od Analog to Digital Converter, czyli układ który w zależności od wykrytego napięcia, pokazuje odpowiednią wartość binarna. Po wgraniu nowego firmwareu w zakładce Terminal widać coś takiego:

Recv:  T:28.12 /0.00 (93.00) B:25.91 /0.00 (3900.00) @:0 B@:0
Recv:  T:31.25 /0.00 (94.00) B:26.02 /0.00 (3899.00) @:0 B@:0
Recv:  T:28.12 /0.00 (93.00) B:25.91 /0.00 (3900.00) @:0 B@:0
Recv:  T:28.12 /0.00 (93.00) B:25.91 /0.00 (3900.00) @:0 B@:0
Recv:  T:31.25 /0.00 (94.00) B:25.91 /0.00 (3900.00) @:0 B@:0  

Można tutaj wyczytać, że wartość z ADC trzyma się w okolicach 93-94, a pomimo to temperatura pływa o kilka stopni. O co chodzi? W tym miejscu musiałem zasięgnąć rady eksperta (pozdrawiam Kuchatka).

Okazuje się, że układ LPC1769 na którym zbudowana jest płytka, posiada przetwornik 12-bitowy i zasilany jest na napięcie 3.3V. Na schemacie płytki SKR, widać że nie posiada ona wzmacniacza. Mamy więc sytuacje gdy sprzęt jest w stanie wykrywać zmiany napięcia rzędu 0.8mV (3.3V / 2^12), natomiast czujnik PT100 posiada rezystancje 100ohm w temperaturze 0°C i około 138.5 w 100°C. Wychodzi zatem ~0.385ohm na stopień Celsjusza. Podstawiając to do dzielnika napięcia, jaki tworzy termo rezystor wraz z rezystorem 4.7k,  daje to zmianę napięcia w okolicach ~0.2mV na C.

Electronics Assistant

Inaczej mówiąc, skoro jest to cztery razy poniżej rozdzielczości ADC, to w tym momencie mój czujnik działa z dokładnością do 4°C! To dlatego przy niewielkiej zmianie odczytu, temperatura pływa aż o kilka stopni.

Teraz opcje są dwie, albo dołożyć wzmacniacz który z tych 0.2mV zrobi mierzalną wartość (0.8mV), albo zmienić czujnik. Dla mnie najprostszym i najtańszym rozwiązaniem była zmiana czujnika na termistor NTC100K B3950. Dołożenie wzmacniacza tylko spotęgowałoby bałagan w skrzynce :)

Termistory kupiłem dwa, jeden w obudowie identycznej jak PT100, a drugi "szklany":




Czemu tak? By ułatwić sobie kalibrację czujnika temperatury. Pierwszy termistor, ten w obudowie PT100 trafił w swoje docelowe miejsce, czyli do bloku grzewczego. Drugi jest tymczasowy. Po odkręceniu tylko samej głowicy, został wsadzony w miejsce gdzie normalnie powinien znaleźć się roztapiany filament. Przed montażem czujników, warto jeszcze sprawdzić czy wskazują zbliżoną temperaturę, pokojową oraz podobnie po równomiernym podgrzaniu obu.

  #define TEMP_SENSOR_0 11
  
  #define TEMP_SENSOR_CHAMBER 11
  #define TEMP_CHAMBER_PIN P0_23_A0

Jak widać po tej konfiguracji, po kalibracji, drugi czujnik zostanie już jako czujnik temperatury w obudowie. Wpięty jest w złącze TH1, normalnie zarezerwowane dla drugiej głowicy.

Teraz jak kalibrować temperaturę na głowicy? Najpierw łączymy się do drukarki i otwieramy terminal gdzie widać temperaturę raportowaną przez drukarkę wraz z wartościami ADC. Następnie otwieramy plik "Marlin\src\module\thermistor\thermistor_11.h". Jego zawartość wygląda mniej więcej tak:

// R25 = 100 kOhm, beta25 = 3950 K, 4.7 kOhm pull-up, QU-BD silicone bed QWG-104F-3950 thermistor
const short temptable_11[][2] PROGMEM = {
  { OV(   1), 938 },
  { OV(  31), 314 },
  { OV(  41), 290 },
  { OV(  51), 272 },
...

Po prawej stronie mamy temperaturę a po lewej w kolumnie OV, wartość ADC,  odpowiadającą danej temperaturze.

Kalibrację wykonujemy w taki sposób, że ustawiamy jakąś temperaturę, najlepiej taką jak widzimy po prawej stronie tablicy. Potem czekamy chwilę aż temperatura się ustabilizuje i poprawiamy tabele wstawiając temperaturę odczytaną z termistora będącego w środku głowicy oraz wartość ADC (podzieloną przez 4) odczytaną z termistora znajdującego się w bloku grzewczym. Czemu dzielimy wartość ADC przez 4? Nie wiem dokładnie, po prostu dla mojej drukarki tak to oblicza Marlin. Jak kogoś takie wytłumaczenie nie zadowala, to może sprawdzić kod makra OV w pliku "Marlin\src\module\thermistor\thermistors.h"

Na dzisiaj to tyle, do zrobienia jest jeszcze charakterystyka bloku grzewczego (tzw. tuning PID) oraz dostosowanie liczby kroków ekstrudera, tak byśmy otrzymywali poprawną dawkę filamentu.