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]