PID autotune a řízení teploty

Dobrý den, zdravím vás u dalšího článku z dílny malé továrny na velké věci. V dnešní části si ukážeme, jak zefektivnit regulaci teploty 3D tiskárny pomocí PID regulace. Standardní nastavení výrobce není špatné, může však svou jednoduchostí negativně ovlivnit výslednou kvalitu tisku. Řízení teploty se provádí pouze jako dvoustupňová regulace (vyp. / zap.) v rozmezí kolem +/- 5°C.

dvoustupňová regulace
jednoduchá dvoustupňová regulace

Jako tiskaři se často snažíme pro svůj filament najít vhodnou teplotu k tisku, a proměnlivé kolísání až o 10°C se může objevit na vnějším povrchu výtisku jako různé vlny, pruhy nebo jiné “komplikace”.

Pokud jste se rozhodli pro přechod své tiskárny na open source firmware jehož základem je Marlin, máte k dispozici mnoho vylepšení a mezi nimi také PID regulaci. Ta při řízení teploty propočítává tři druhy regulace – Proporcionílní, Integrační a Derivační.

Proporcionální složka reaguje lineárně, to znamená “čím víc, tím víc”.
Integrální reaguje na množství změny. Měří plochu křivky (integrál je obsah plochy vymezený osou x a křivkou nad ní v mezích od-do). Tedy “Čím významnější změna v čase, tím víc”. Typické pro klimatizaci.
Derivační složka reaguje na prudkost změny. Neboli na úhel tečny ke křivce (derivace je tangenta tečny v daném bodě křivky). Typické pro brzdy u novějších aut. Tedy “Čím prudší změna, tím víc”.

To by bylo “stručně a jasně” k funkci, nyní jak tuto regulaci nastavit ve firmware Marlin. Všechny distribuce tohoto firmware mají PID tuning nebo PID autotune již defaultně nastavený pro řízení teploty extruderu. Chcete-li řídit i teplotu vyhřívané podložky, musíte před flashováním firmware do atmega čipu na základní desce, upravit soubor configuration.h a to odkomentováním (smazat znaky //, které tento řádek “přehlédnou”) řádku #define PIDTEMPBED, který tuto funkcí spouští. A zároveň je potřeba zakomentovat řádek  //#define BED_LIMIT_SWITCHING, výsledkem tedy bude vypnutí stávající funkce a povolení nové funkce.

configuration.h
configuration.h

Po nahrání souboru do řídící desky tiskárny již můžeme přejít k nastavení tří klíčových hodnot Kp, Ki a Kd. Získáme je spuštěním funkce přes terminál. Okno “terminál”, kterým můžeme tiskárně posílat příkazy, mají mnohé slicery dostupné po připojení tiskárny k počítači. Protože mám osobně nejraději octoprint (návod k instalaci najdete v článku jak nainstalovat tiskový server octoprint) ukážu vám postup právě na tomto terminálu.

Získání hodnot

Protože se měření provádí se zapnutým větrákem, nezapomeňte si jej před zahájením měření zapnout na 100% výkonu. Obvyklým způsobem přes tlačítka a menu na tiskárně, nebo pohodlněji příkazem M106. Abychom získali správné korekční hodnoty pro všechny tři regulátory, musíme spustit příkaz M303, ten spustí test jehož výsledkem budou hodnoty Kp, Ki a Kd. Dále přidáme parametr E0 (E0 pro extruder, E-1 pro podložku), S200 (teplota 200°C), C8 (osm cyklů zahřívání a chladnutí). Protože se měření provádí se zapnutým větrákem, nezapomeňte si jej před zahájením měření zapnout na 100% výkonu. Obvyklým způsobem přes tlačítka a menu na tiskárně, nebo pohodlněji Příkazem M106.

zadání kódu + odpověď od serveru
zadání kódu + odpověď od serveru

Tiskárna začne zahřívat extruder v osmi cyklech na teplotu kterou jsme si zvolili v odeslaném příkazu. Teplotní graf z tohoto testu vypadá takto:

výsledek testu + graf
výsledek testu + graf

Po dokončení testu, se extruder začne samovolně ochlazovat a v terminálu kam jsme zadávali příkaz se vypíše odpověď v podobě naměřených výsledků:

výsledek testu + hodnoty Ki, Kp, Kd
výsledek testu + hodnoty Ki, Kp, Kd

Zápis hodnot

Možností, jak zapsat nově změřené hodnoty do EEPROM paměti je opět několik. Tou nejkomplikovanější je zapsání hodnot do souboru configuration.h a nové flashování celého firmware tiskárny. Jednodušší možností je doplněk tiskového serveru octoprint, který tyto uložené parametry umí načíst a po změně opět jednoduše uložit.

zápis hodnot v Marlin editoru
zápis hodnot v Marlin editoru

Ukázali jsme si postup pro PID tuning extruderu ale pro podložku je postup úplně stejný. Teploty a počty cyklů si zvolte podle svého rozhodnutí. Nyní se vaše tiskárna bude zahřívat daleko efektivněji a přesněji.

23 thoughts on “PID autotune a řízení teploty

  1. Určitě se má to #define BED_LIMIT_SWITCHING zakomentovat? Protože když jsem to udělal, tak se mi teď heatbed nezahřeje vůbec a po chvíli hodí Bed heating failed. Když jsem to teda nechal odkomentované, tak to funguje, ale reguluje se to teď přes to PID?

    1. Určitě musí být zakomentovaný protože jinak to funguje v základním režimu. Chybu kterou popisujete se objevovala u starší verze Marlina. Nyní, v 1.1.9. je to již opraveno.
      Ve starších verzích stačilo na kartě configuration.adv.h najít řádek WATCH_BED_TEMP_PERIOD a změnit jej na méně než 127s.

      1. Zkouším Marlin 1.1.9 i bugfix-1.1.9 ale prostě to nejde. Pokud povolím PIDTEMPBED, tak se heatbed vůbec ani nesnaží ohřívat (nesvítí ani dioda). Nefunguje to ani při tisku, ani ručně přes gcode, ani přes menu tiskárny. Zajímavé ale je, že pokud spustím tuhle kalibraci přes M303 E-1 S60 C8, tak to funguje, heatbed se normálně zahřeje.
        Ten parametr WATCH_BED_TEMP_PERIOD jsem snížil na 120 (bylo tam 180) ale nepomohlo to.

      2. Vlastně už asi vím, kde bude problém. Mám heatbed zapojený přes MOSFET, který asi logicky takové možnosti reguace nemá, když je s deskou spojen dvěma drátky, které jej můžou akorát sepnout nebo vypnout, je to tak?

        1. Kdepak, tím to určitě není. Dvouvodičové zapojení je standardní ať už s mosfetem nebo bez…

          1. To ano, ale předpokládám, že deska si umí regulovat i proud, který těma dvěma vodiči prochází, kdežto když je to zapojeno přes MOSFET, tak jej může jenom zapnout / vypnout. Máte to ověřeno i se zapojením přes MOSFET?

          2. Taky špatně, na základní desce je taky mosfet, který bed ovládá. PID má na základě kalibračních dat přesně změřené histereze takže ví, kdy vyhřívání vypnout a počítá s tím, že po vypnutí se bed ještě kousek nahřeje. Stejně tak ví, kdy je třeba zapnout vyhřívání ještě před tím, než teplota klesne pod stanovený limit. Stále to tedy funguje jako on/off ale s takovým jako inteligentním předvídáním.

          3. Tak nakonec to tím asi opravdu nebude. Provedl jsem Initialize EEPROM a zdá se, že už to funguje 🙂

  2. Zdravim Vas. Vcera som vykonal PID autotune pre hotend a zapisal hodnoty cez terminal a ulozil prikazom M500. Ak vsak teraz budem nieco menit v subore configuration.h a nahram nanovo firmware, tak sa mi hodnoty opat prepisu, je to tak ? Je preto lepsie, ked viem ze budem nieco menit v tomto subore, aby som rovno vsetky hodnoty zapisoval v subore configuration.h a ten si nasledne ulozil v PC ?

    Dakujem

    1. Dobrý den, přesně jak píšete. Měl by jste mít v počítači uložený soubor, který bude přesnou kopií toho co máte v EEPROM tiskárny. Takže buď zapíšete hodnoty jak do tiskárny tak do souboru anebo rovnou hodnoty vepište do souboru a pokaždé jen uploadujte.

  3. Má na PID kalibraci vliv, když po jejím provedení zapojím hotend i bed na přes externí mosfety? Tedy, budu muset provádět kalibraci PID znovu?

    1. Připojení přes MOSFET může hodnoty PID ovlivnit avšak maximálně v řádech desetinných míst. Nemusíte si tím vůbec dělat těžkosti. Klidně připojte MOSFETy do obvodu a ponechejte si původní PID nastavení.

  4. Dobry den, moja tlaciaren nema moznost menit zdrojaky a flashovat, aj ked je zalozena na marline (Anycubic i3 mega). Bude stacit ked prikazy M301 a M500 na nastavenie dam do start scriptu priamo do *. gcode suboru?
    A druha otazka: ak sa prikazy predsa len ulozia a zistim ze sa to zhorsili a nie zlepsili, ako to vratim spat?

    dakujem

    1. Určitě by se to nemělo zhoršit ale kdyby přeci, nemáte možnost se vrátit zpět, pouze znova zadat předešlé hodnoty. Pokud použijete nějaký terminál, třeba symplify 3D nebo octoprint nebo repetier, po zadání příkazu M503 se můžete podívat na hodnoty, které máte v tiskárně teď.
      A samozřejmě můžete hodnoty zadat do start gcode. Nebo si je jednoduše zadejte do textového souboru a ten uložte jako *.gcode a ten spusťte jako tisk.

  5. Dobrý den,
    u PIDTEMPBED nemám zapsané řádky jak u vás, Marlin 1.1.8, musím je tedy dopsat předpokládám, přikládám výpis z Marlinu, jinak super články díky moc,

    #define PIDTEMPBED

    //#define BED_LIMIT_SWITCHING

    // This sets the max power delivered to the bed, and replaces the HEATER_BED_DUTY_CYCLE_DIVIDER option.
    // all forms of bed control obey this (PID, bang-bang, bang-bang with hysteresis)
    // setting this to anything other than 255 enables a form of PWM to the bed just like HEATER_BED_DUTY_CYCLE_DIVIDER did,
    // so you shouldn’t use it unless you are OK with PWM on your bed. (see the comment on enabling PIDTEMPBED)
    #define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current

    #if ENABLED(PIDTEMPBED)

    //#define PID_BED_DEBUG // Sends debug data to the serial port.

    //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+)
    //from FOPDT model – kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10)
    #define DEFAULT_bedKp 554.41
    #define DEFAULT_bedKi 80.57
    #define DEFAULT_bedKd 953.80

    //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+)
    //from pidautotune
    //#define DEFAULT_bedKp 97.1
    //#define DEFAULT_bedKi 1.41
    //#define DEFAULT_bedKd 1675.16

    // FIND YOUR OWN: “M303 E-1 C8 S90” to run autotune on the bed at 90 degreesC for 8 cycles.
    #endif // PIDTEMPBED

    1. Dobrý den, jestli jsem nic nepřehlédl, nastavení tak jak jste jej poslal by mělo fungovat, tedy pidbedtemp by měl být zapnutý a můžete přejít k jeho kalibraci.
      Mezi Marlinem 1.1.8. a 1.1.9. je dost rozdílů, vývojáři nějak změnili koncept. Možná bych vám doporučil přejít na novější verzi. Usnadníte si tak další úpravy a změny.

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *