{"id":1499,"date":"2022-02-08T16:48:57","date_gmt":"2022-02-08T16:48:57","guid":{"rendered":"https:\/\/garikoitz.info\/blog\/?p=1499"},"modified":"2023-08-02T09:08:43","modified_gmt":"2023-08-02T09:08:43","slug":"pid-autotune-del-firmware-marlin","status":"publish","type":"post","link":"https:\/\/garikoitz.info\/blog\/2022\/02\/pid-autotune-del-firmware-marlin\/","title":{"rendered":"PID AutoTune del Firmware Marlin"},"content":{"rendered":"\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u00cdndice<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Alternar tabla de contenidos\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 eztoc-toggle-hide-by-default' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/garikoitz.info\/blog\/2022\/02\/pid-autotune-del-firmware-marlin\/#Introduccion\" >Introducci\u00f3n<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/garikoitz.info\/blog\/2022\/02\/pid-autotune-del-firmware-marlin\/#El_Autotune\" >El Autotune<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/garikoitz.info\/blog\/2022\/02\/pid-autotune-del-firmware-marlin\/#Funcionamiento\" >Funcionamiento<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/garikoitz.info\/blog\/2022\/02\/pid-autotune-del-firmware-marlin\/#Tabla_de_sintonias\" >Tabla de sinton\u00edas<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/garikoitz.info\/blog\/2022\/02\/pid-autotune-del-firmware-marlin\/#Futuras_mejoras\" >Futuras mejoras<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/garikoitz.info\/blog\/2022\/02\/pid-autotune-del-firmware-marlin\/#Conclusiones\" >Conclusiones<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/garikoitz.info\/blog\/2022\/02\/pid-autotune-del-firmware-marlin\/#Referencias\" >Referencias<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\" id=\"introduccion\"><span class=\"ez-toc-section\" id=\"Introduccion\"><\/span>Introducci\u00f3n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Como apasionado del algoritmo PID enseguida me llam\u00f3 la atenci\u00f3n el control de temperatura de las impresoras 3D. Indagando en el c\u00f3digo enseguida encuentras tanto la implementaci\u00f3n del algoritmo PID como el m\u00e9todo de auto sinton\u00eda utilizado. El objetivo de \u00e9sta entrada es entender el funcionamiento del autotune y ver como podemos jugar con el.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"el-autotune\"><span class=\"ez-toc-section\" id=\"El_Autotune\"><\/span>El Autotune<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Los m\u00e9todos de auto sinton\u00eda son algoritmos ampliamente utilizados cuando lo que se busca es obtener una sintonizaci\u00f3n r\u00e1pida y funcional al margen de los conocimientos del usuario final. En el firmware de <strong>Marlin <\/strong>es tan sencillo como hacerlo desde el display de la impresora si tenemos las opciones activadas, o usando el comando gcode <strong>M303 Ea Cb Sc<\/strong>, donde <strong>a<\/strong> hace referencia al hotend o cama caliente, <strong>b<\/strong> a los ciclos y <strong>c<\/strong> a la temperatura del test. Si por ejemplo queremos hacer el autotune de la cama caliente mediante comandos, basta con introducir mediante <a rel=\"noreferrer noopener\" href=\"https:\/\/www.pronterface.com\/\" target=\"_blank\">Pronterface<\/a>, <a rel=\"noreferrer noopener\" href=\"https:\/\/octoprint.org\/\" target=\"_blank\">Octoprint <\/a>o similar el comando:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">M303 E-1 C3 S60<\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/02\/ACP_08_02_2022_01_00_16.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"308\" src=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/02\/ACP_08_02_2022_01_00_16-1024x308.png\" alt=\"\" class=\"wp-image-1508\" srcset=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/02\/ACP_08_02_2022_01_00_16-1024x308.png 1024w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/02\/ACP_08_02_2022_01_00_16-300x90.png 300w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/02\/ACP_08_02_2022_01_00_16-768x231.png 768w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/02\/ACP_08_02_2022_01_00_16-1536x462.png 1536w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/02\/ACP_08_02_2022_01_00_16-604x182.png 604w, https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2022\/02\/ACP_08_02_2022_01_00_16.avif 1549w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Gr\u00e1fica resultante del autotune<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Esto nos dar\u00eda un resultado del tipo:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"> bias: 127 d: 127 min: 59.77 max: 60.14\n bias: 127 d: 127 min: 59.74 max: 60.10\n bias: 127 <strong>d: 127 min: 59.74 max: 60.16 Ku: 770.50 Tu: 10.10<\/strong>\n <strong>No overshoot<\/strong>\n <strong>Kp: 154.10 Ki: 30.51 Kd: 518.80<\/strong>\nPID Autotune finished! Put the last Kp, Ki and Kd constants from below into Configuration.h\n#define DEFAULT_bedKp 154.10\n#define DEFAULT_bedKi 30.51\n#define DEFAULT_bedKd 518.80\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Con \u00e9ste resultado podemos modificar el archivo <em><a href=\"https:\/\/github.com\/MarlinFirmware\/Marlin\/blob\/2.0.x\/Marlin\/Configuration.h\" target=\"_blank\" rel=\"noreferrer noopener\">Configuration.h<\/a><\/em> y recompilar como se nos propone o introducir los nuevos par\u00e1metros de sinton\u00eda mediante el comando <a href=\"https:\/\/marlinfw.org\/docs\/gcode\/M304.html\" target=\"_blank\" rel=\"noreferrer noopener\">M304<\/a>. Pero no solo estamos obteniendo la sinton\u00eda, adem\u00e1s nos da toda esta informaci\u00f3n:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>La ganancia \u00faltima <strong>Ku<\/strong>.<\/li>\n\n\n\n<li>El periodo de oscilaci\u00f3n <strong>Tu<\/strong>.<\/li>\n\n\n\n<li>La delta de la salida <strong>d<\/strong>. El 127 que vemos es la salida PWM (0-255) enviada al cartucho calefactor de la cama caliente durante la prueba, es decir, 127 = ~255\/2 = ~50% = ~12V. Al menos en mi caso veo que la salida est\u00e1 limitada (BANG_MAX) siempre a 127.<\/li>\n\n\n\n<li>Las <strong>temperaturas m\u00ednima<\/strong> y <strong>m\u00e1xima<\/strong> alcanzadas durante el test.<\/li>\n\n\n\n<li>Al indicar <strong>No overshoot<\/strong> podemos prever que se ha seleccionado una sinton\u00eda conservadora para evitar el sobrepasamiento.<\/li>\n\n\n\n<li>Las constantes de sinton\u00eda <strong>Kp<\/strong>, <strong>Ki <\/strong>y <strong>Kd<\/strong>.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"> Lo veremos m\u00e1s adelante pero en resumen, Ku y Tu nos van a permitir calcular m\u00e1s sinton\u00edas seg\u00fan nuestras necesidades.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"funcionamiento\"><span class=\"ez-toc-section\" id=\"Funcionamiento\"><\/span>Funcionamiento<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">El c\u00f3digo se encuentra en el archivo \u00ab<em><a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/MarlinFirmware\/Marlin\/blob\/2.0.x\/Marlin\/src\/module\/temperature.cpp\" target=\"_blank\">Marlin\\src\\module\\<strong>Temperature.cpp<\/strong><\/a><\/em>\u00bb a partir de la l\u00ednea 649 y no se trata ni m\u00e1s ni menos que de una identificaci\u00f3n mediante el <strong>m\u00e9todo del rel\u00e9<\/strong>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2023\/08\/RELE.png\"><img decoding=\"async\" src=\"https:\/\/garikoitz.info\/blog\/wp-content\/uploads\/2023\/08\/RELE.png\" alt=\"\" class=\"wp-image-2076\"\/><\/a><figcaption class=\"wp-element-caption\">Par\u00e1metros del m\u00e9todo del rel\u00e9<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">A simple vista se puede apreciar como los ciclos son de 5 segundos y el detalle del c\u00e1lculo de Ku, Tu y de Kp, Ki y Kd. Tambi\u00e9n nos volvemos a encontrar con la expresi\u00f3n \u00ab<em>No overshoot<\/em>\u00bb cuando hace referencia a la cama caliente y a una string \u00ab<em>STR_CLASSIC_PID<\/em>\u00bb cuando no se refiere a la cama caliente.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"689,690,694-696,700,702\" data-enlighter-linenumbers=\"true\" data-enlighter-lineoffset=\"655\" data-enlighter-title=\"\" data-enlighter-group=\"\">...     \n      if (updateTemperaturesIfReady()) { \/\/ temp sample ready\n\n        \/\/ Get the current temperature and constrain it\n        current_temp = GHV(degChamber(), degBed(), degHotend(heater_id));\n        NOLESS(maxT, current_temp);\n        NOMORE(minT, current_temp);\n\n        #if ENABLED(PRINTER_EVENT_LEDS)\n          ONHEATING(start_temp, current_temp, target);\n        #endif\n\n        TERN_(HAS_FAN_LOGIC, manage_extruder_fans(ms));\n\n        if (heating &amp;&amp; current_temp > target &amp;&amp; ELAPSED(ms, t2 + 5000UL)) {\n          heating = false;\n          SHV((bias - d) >> 1);\n          t1 = ms;\n          t_high = t1 - t2;\n          maxT = target;\n        }\n\n        if (!heating &amp;&amp; current_temp &lt; target &amp;&amp; ELAPSED(ms, t1 + 5000UL)) {\n          heating = true;\n          t2 = ms;\n          t_low = t2 - t1;\n          if (cycles > 0) {\n            const long max_pow = GHV(MAX_CHAMBER_POWER, MAX_BED_POWER, PID_MAX);\n            bias += (d * (t_high - t_low)) \/ (t_low + t_high);\n            LIMIT(bias, 20, max_pow - 20);\n            d = (bias > max_pow >> 1) ? max_pow - 1 - bias : bias;\n\n            SERIAL_ECHOPGM(STR_BIAS, bias, STR_D_COLON, d, STR_T_MIN, minT, STR_T_MAX, maxT);\n            if (cycles > 2) {\n              const float Ku = (4.0f * d) \/ (float(M_PI) * (maxT - minT) * 0.5f),\n                          Tu = float(t_low + t_high) * 0.001f,\n                          pf = (ischamber || isbed) ? 0.2f : 0.6f,\n                          df = (ischamber || isbed) ? 1.0f \/ 3.0f : 1.0f \/ 8.0f;\n\n              tune_pid.Kp = Ku * pf;\n              tune_pid.Ki = tune_pid.Kp * 2.0f \/ Tu;\n              tune_pid.Kd = tune_pid.Kp * Tu * df;\n\n              SERIAL_ECHOLNPGM(STR_KU, Ku, STR_TU, Tu);\n              if (ischamber || isbed)\n                SERIAL_ECHOLNPGM(\" No overshoot\");\n              else\n                SERIAL_ECHOLNPGM(STR_CLASSIC_PID);\n              SERIAL_ECHOLNPGM(STR_KP, tune_pid.Kp, STR_KI, tune_pid.Ki, STR_KD, tune_pid.Kd);\n            }\n          }\n          SHV((bias + d) >> 1);\n          TERN_(HAS_STATUS_MESSAGE, ui.status_printf(0, F(S_FMT \" %i\/%i\"), GET_TEXT(MSG_PID_CYCLE), cycles, ncycles));\n          cycles++;\n          minT = target;\n        }\n      }\n...<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Si nos fijamos en el c\u00e1lculo de Ku, el denominador lo multiplica por 0.5 (lo divide por 2) porque en realidad est\u00e1 usando la mitad de d (127 = 255\/2).<\/p>\n\n\n\n<div class=\"wp-block-katex-display-block katex-eq\" data-katex-display=\"true\"><pre>\\begin{equation}\n\\begin{split}\n&amp; Ku = \\frac{4\\times d}{\\pi\\times a}=\\frac{4\\times d\\times 0.5}{\\pi\\times (maxT-minT)\\times 0.5}=\\\\\n&amp; \\\\\n&amp; =\\frac{4\\times 255\\times 0.5}{\\pi\\times (60.16-59.74)\\times 0.5}\\approx770.5\n\\end{split}\n\\end{equation}<\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"tabla-de-sintonias\"><span class=\"ez-toc-section\" id=\"Tabla_de_sintonias\"><\/span>Tabla de sinton\u00edas<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Como os adelantaba anteriormente, el disponer de Ku y Tu nos permite poder calcular m\u00e1s sinton\u00edas. Si os fij\u00e1is en las sinton\u00edas de <a href=\"https:\/\/en.wikipedia.org\/wiki\/Ziegler%E2%80%93Nichols_method\" target=\"_blank\" rel=\"noreferrer noopener\">Ziegler-Nichols<\/a> pod\u00e9is ver el c\u00e1lculo de las sinton\u00edas \u00ab<em>no overshoot<\/em>\u00bb y \u00ab<em>classic PID<\/em>\u00bb que usa el firmware de Marlin. Os dejo tambi\u00e9n otras sinton\u00edas menos conocidas pero no por ello menos \u00fatiles.<\/p>\n\n\n\n<div class=\"wp-block-wpdatatables-wpdatatables-gutenberg-block\">[wpdatatable id=1]<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">En mi caso con los valores de Ku = 770,5 y Tu = 10,1 obtenidos quedar\u00eda de la siguiente manera.<\/p>\n\n\n\n<div class=\"wp-block-wpdatatables-wpdatatables-gutenberg-block\">[wpdatatable id=2]<\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"futuras-mejoras\"><span class=\"ez-toc-section\" id=\"Futuras_mejoras\"><\/span>Futuras mejoras<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Una forma de conseguir mejores sinton\u00edas sin tener que recurrir al m\u00e9todo de prueba y error ser\u00eda realizando una <strong>identificaci\u00f3n en lazo abierto<\/strong>. Para ello necesitamos poder mover nosotros la salida PWM de los cartuchos para posteriormente analizar la respuesta escal\u00f3n del sistema y hallar sus constantes. Una vez modelado el sistema podemos calcular nuevas sinton\u00edas y simularlas hasta encontrar la respuesta deseada. Si ten\u00e9is curiosidad sobre como se realiza esta identificaci\u00f3n y los beneficios que aporta, os recomiendo la lectura de la entrada \u00ab<a rel=\"noreferrer noopener\" href=\"https:\/\/garikoitz.info\/blog\/2020\/06\/sintonizar-pid-con-arduino-ii-balancin-simple\/\" data-type=\"post\" data-id=\"890\" target=\"_blank\">Sintonizar PID con Arduino &#8211; Balanc\u00edn Simple<\/a>\u00bb en especial los apartados 3.2 y 3.4 que abordan la identificaci\u00f3n en lazo abierto y la simulaci\u00f3n en lazo cerrado.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El firmware de Marlin parece preparado para \u00e9sta posibilidad como se puede apreciar en el archivo \u00ab<a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/MarlinFirmware\/Marlin\/blob\/2.0.x\/Marlin\/Configuration.h\" target=\"_blank\">Configuration.h<\/a>\u00bb en la l\u00ednea 697<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\/\/#define PID_OPENLOOP          \/\/ Puts PID in open loop. M104\/M140 sets the output power from 0 to PID_MAX<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Lamentablemente es una opci\u00f3n que no he visto nunca activada en ning\u00fan firmware de los que he probado y por lo que he visto en el c\u00f3digo, puede que sea debido a que si compilas con la variable \u00ab<em>PID_OPENLOOP<\/em>\u00bb descomentada anulas el funcionamiento del PID. Ser\u00eda interesante que se pudiera activar\/desactivar \u00e9sta opci\u00f3n desde la pantalla de la impresora para poder realizar la identificaci\u00f3n en lazo abierto (lazo en manual) y una vez terminada la identificaci\u00f3n poder activar el funcionamiento normal del PID (lazo en autom\u00e1tico).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"conclusiones\"><span class=\"ez-toc-section\" id=\"Conclusiones\"><\/span>Conclusiones<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La implementaci\u00f3n del autotune en el firmware de Marlin es sencillo pero efectivo y salvo que tengamos problemas en los cartuchos o en los termistores podemos resintonizar de forma r\u00e1pida y segura. No lo he mencionado pero es totalmente recomendable lanzar el autotune al menos cuando montamos nuestra impresora por primera vez y cada vez que actualizamos el firmware.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si nos fijamos un momento en las sinton\u00edas calculadas se puede ver claramente que se usa la sinton\u00eda m\u00e1s conservadora (<em>no overshoot<\/em>) para la cama caliente y una algo m\u00e1s agresiva (<em>classic PID<\/em>) para el hotend. En este aspecto la estrategia tiene sentido ya que la cama caliente sufre menos perturbaciones de temperatura, sin embargo el hotend est\u00e1 expuesto a un flujo de aire en ocasiones oscilante sumado al paso continuo del filamento, y una sinton\u00eda m\u00e1s agresiva nos ayuda a mantenernos en el punto de consigna de temperatura que necesite nuestro filamento. Ahora bien, si con la sinton\u00eda que nos propone autotune vemos que la temperatura oscila m\u00e1s de lo deseado siempre podemos tener a mano la tabla para buscar una opci\u00f3n m\u00e1s adecuada.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"referencias\"><span class=\"ez-toc-section\" id=\"Referencias\"><\/span>Referencias<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a rel=\"noreferrer noopener\" href=\"https:\/\/marlinfw.org\/\" target=\"_blank\">Firmware Marlin<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/reprap.org\/wiki\/PID_Tuning\" target=\"_blank\" rel=\"noreferrer noopener\">PID Tuning<\/a> [RepRap]<\/li>\n\n\n\n<li><a rel=\"noreferrer noopener\" href=\"https:\/\/www.eii.uva.es\/~prada\/Pid.pdf\" target=\"_blank\">Sinton\u00eda de reguladores PID<\/a> [Cesar Prada] [M\u00e9todo del rel\u00e9 en P\u00e1g. 140]<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Introducci&oacute;n Como apasionado del algoritmo PID enseguida me llam&oacute; la atenci&oacute;n el control de temperatura de las impresoras 3D. Indagando en el c&oacute;digo enseguida encuentras tanto la implementaci&oacute;n del algoritmo PID como el m&eacute;todo de auto sinton&iacute;a utilizado. El objetivo de &eacute;sta entrada es entender el funcionamiento del autotune y ver como podemos jugar con el. El Autotune Los m&eacute;todos de auto sinton&iacute;a son algoritmos ampliamente utilizados cuando lo que se busca es obtener una sintonizaci&oacute;n r&aacute;pida y funcional al&#8230;<\/p>\n<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/garikoitz.info\/blog\/2022\/02\/pid-autotune-del-firmware-marlin\/\"> Leer m\u00e1s<span class=\"screen-reader-text\">  Leer m\u00e1s<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":2078,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","wpupg_custom_link":[],"wpupg_custom_link_behaviour":[],"wpupg_custom_link_nofollow":[],"wpupg_custom_image":[],"wpupg_custom_image_id":[],"footnotes":""},"categories":[74,128],"tags":[136,135,133,132,134,131,141,140,139,137,129,130,120,17,138],"class_list":["post-1499","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-curiosidades","category-impresion-3d","tag-autotune","tag-creality","tag-ender","tag-ender-3","tag-ender-3-pro","tag-firmware","tag-kd","tag-ki","tag-kp","tag-ku","tag-marlin","tag-marlin-2-0-x","tag-metodo-del-rele","tag-pid","tag-tu"],"_links":{"self":[{"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/posts\/1499","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/comments?post=1499"}],"version-history":[{"count":34,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/posts\/1499\/revisions"}],"predecessor-version":[{"id":2077,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/posts\/1499\/revisions\/2077"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/media\/2078"}],"wp:attachment":[{"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/media?parent=1499"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/categories?post=1499"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/tags?post=1499"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}