Welcome! Log In Create A New Profile

Advanced

Algoritmo PID M303

Posted by Frankq 
Algoritmo PID M303
February 16, 2021 05:20AM
Ciao a tutti
Sto ricercando l'algoritmo PID che si calcola i 3 coefficienti K. In rete si trova l'algoritmo PID ma prevede la taratura manuale dei K mentre in MKDuo l'M303 calcola i coefficienti che poi vengono salvati su eeprom.
Qualcuno mi può aiutare?
Ho dato un'occhiata a MKDuo ma il codice C++ è troppo compatto per le mie capacità e i commenti servivano solo al Mago.

Grazie per l'attenzione
Franco


CoreXY HyperCube , MKDuo, HotEnd 0,4 Repetier Host Cura engine
Mostly CNC con MKDuo
Re: Algoritmo PID M303
February 16, 2021 11:55AM
A cosa ti serve, M303 fa l'autotune dei parametri Pid,

il calcolo lo trovi in /src/core/temperature.cpp

Da una breve analisi tento di spiegare il codice, (non fidarti troppo , ma magari ci azzecco)

qundo vedi una cosa del genere:

 act->pid.Max

vuol dire che ti stai riferendo al valore pid.Max del riscaldatore "act"

per >> vedi [en.wikipedia.org]

se non capisco male in pratica >>1 equivale più o meno a dividere un intero per 2.

i numeri seguiti da f (f miuscolo) dicono semplicemente che il valore è floating point.


parti con questi valori; lascia perdere il millis è il tempo

            t1      = millis(),
            t2      = t1;
            t_high  = 0.0,
            t_low   = 0.0;

            maxTemp = 0.0,
            minTemp = 1000.0;


in pratica t_low e t_high è il tempo in cui il riscaldatore è acceso o spento, dipende dal pwm di pilotaggio

il d è un fattore che poi serve nella formula di calcolo che semplificata è



              Ku = (4.0f * d) / (float(M_PI) * (maxTemp - minTemp) * 0.5f),
              Tu = ((float)(t_low + t_high) * 0.001f);

              tune_pid.Kp = 0.6f * Ku;
              tune_pid.Ki = 1.2f * Ku / Tu;
              tune_pid.Kd = 0.075f * Ku * Tu;

in soldoni moltiplica il d per 4.0 e lo divide per pigreco moltiplicato per (maxTemp - minTemp ) presa per metà

poi applica dei correttivi ai fattori a seconda del tipo di PID che vuoi ottenere.

Il problema è che devi calcolare i tempi di acceso e spento nell'intervallo di tempo che ti prefiggi di analizzare, per calcolare il fattore d che è dato da:

          bias += (d * (t_high - t_low)) / (t_low + t_high);
          bias = constrain(bias, 20, pid.Max - 20);
          d = (bias > pid.Max/2) ? pid.Max - 1 - bias : bias;

l'ultima riga è una condizione scritta in modo umano:

if(bias > pid.Max / 2) {
   pid.Max - 1 - bias;
} else {
   bias;
}


sembrerebbe che all'inizio i valori di bias e di d siano posti uguali a pid.Max diviso 2

bias  = act->pid.Max >> 1,
d     = act->pid.Max >> 1;

quindi uguali.

e sembra che il calcolo venga limitato dalla linea:

bias = constrain(bias, 20, pid.Max - 20);

vedi [www.arduino.cc]


il punto cruciale è la differenza di tempo tra acceso e spento (t_high - t_low) che si collega al range di temperatura di oscillazione (maxTemp e minTemp)


alla fine il sistema setta il calcolo:

pwm_value = (bias + d);

come valore del pwm del riscaldatore.


Vedi se ti ritrovi con il codice non semplificato e con gli eventuali calcoli del PID che trovi in rete.

Se non sbaglio il calcolo dovrebbe essere lo stesso che c'è in Marlin il mago ha semplicemente introdotto dei nuovi pesi usando le scelte

if (method == 0) {

ecc.


Probabilmente ha modificato il "nome delle variabili" e il nome delle chiamate alle funzioni.

Quando ha analizzato le due sorgenti mi sembra di aver capito lo stile del Mago, ovviamente modificava i sorgenti a suo uso e consumo per facilitarsi il compito di vedere ad occhio quello che fanno le cose, a volte nel tentativo di formalizzare meglio il codice scritto a molte mani presente in Marlin.

Ha fatto decisamente un bel lavoro, peccato che poi il progetto si sia scontrato con l'enorme lavoro richiesto ad una sola persona per inseguire molte esigenze e ovviamente fatto "gratis e amore dei".

Tanto di cappello al Mago che ho sempre apprezzato anche se alcune volte sembrava di no, ma a volte è questione semplicemente di dfferenti "caratteri" e "punti di vista".



Sperando di a) non aver complcato la vita e b) non aver detto cavolate

Saluti

Carlo D.

Edited 1 time(s). Last edit at 02/16/2021 11:58AM by onekk.


P3Steel - MKS GEN v1.2 e REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + Gen 7 MOSFET (HotBed) + alimentatore step-down 12V -> 5V
Firmware MK4duo 4.3.6 con ABL induttivo con LJ18A3 - Slic3R (Originale) ed ESP3D per controllare la stampante da remoto.
HotEnd Cinese V6 clone con ugello da 0.4mm.

[My Building Log]
Re: Algoritmo PID M303
February 17, 2021 04:34AM
Grazie Carlo per le tue spiegazioni. Adesso mi stampo il tutto e cerco di venirne a capo.

Io ho adibito una stanza a "pasticceria" e sono diventato esperto in tutto quello che riguarda i dolci al cucchiaio.
Purtroppo il forno casalingo che ho installato mi sballa tutte le temperature sia come origine del calore che come isteresi di temperatura.
E naturalmente d'inverno si preferisce le torte lievitate a quelle gelate.

Ho recuperato un forno dismesso, sempre livello familiare, e voglio modificarne il controllo da on-off a parzializzazione con un regolatore PID e in più comandare una ventola in PWM.

Grazie di nuovo

Franco

P.S. Esiste qualche modo per avere il listato del sorgente dopo il preprocessor e prima della compilazione? Questo sgombrerebbe la strada eliminando tutti i #if e #ndef
che mi fanno diventare matto.

Edited 1 time(s). Last edit at 02/17/2021 04:44AM by Frankq.
Re: Algoritmo PID M303
February 19, 2021 01:17PM
Te li devi togliere a mano, pero se cerchi qualcosa di giù fatto, con un Arduino e un sensore NTC.

Termostato forno arduino, ce ne sono in giro con arduino uno per modificare i fornetti del mulino bianco o simili cinesate per scaldare i circuti stampati prima di fare saldature a reflow (riflusso),

In pratica accendono e spengono direttamente con un relais a stato solido il forno.

L'algoritmo PID in PWM per quel lavoro non andrebbe bene, perché poi lo comandi in BANG-BANG, è complicato comandare una relais allo stato solido per controllare un carico a 220V in PWM, anche perché potresti avere problemi di disturbi di rete indotti dal pilotaggio.


Gli spikes dell'accendi, spegni in genere li elimini con un paio di condensatori di filtro o un filtro di rete, in giro ne trovi di abbastanza potenti per filtrare tutta la casa.


Questo è per un forno per ceramica.

[programmaora.altervista.org]

Questo per un forno reflow

[www.rocketscream.com]

Saluti

Carlo D.

Edited 1 time(s). Last edit at 02/19/2021 01:25PM by onekk.


P3Steel - MKS GEN v1.2 e REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + Gen 7 MOSFET (HotBed) + alimentatore step-down 12V -> 5V
Firmware MK4duo 4.3.6 con ABL induttivo con LJ18A3 - Slic3R (Originale) ed ESP3D per controllare la stampante da remoto.
HotEnd Cinese V6 clone con ugello da 0.4mm.

[My Building Log]
Sorry, only registered users may post in this forum.

Click here to login