Stai visualizzando 2 post - dal 1 a 2 (di 2 totali)
  • Autore
    Post
  • #9943
    Picmicro675
    Moderatore

    Ciao Forum,
    Sto cercando di ficcare un algoritmo per un PID in poche centinaia di istruzioni. Del resto lo scopo sarebbe di farlo con un PIc16F628A.
    Ho cercato in diversi siti e ho trovato qui e anche qui.
    Il mio progetto serve a controllare un forno con una certa affidabilità sulla temperatura da mantenere. Infatti se scelgo 150 non significa arrivare oltre i 160.

    Quello che faccio fatica a realizzare è la conversione della scala di risoluzione. In fondo il risultato dovrebbe avere una scala da 0 a 100, che sono le semi-onde per pilotare un TRIAC. Il fatto che se supero la soglia allora non esiste altro che aspettare che il riscaldamento cominci a raffreddare. Quindi ho un valore in ingresso che si può valutare con un byte, come dire temperatura ambiente + 255 sarebbe ben oltre i 280°. Poi l’uscita deve determinare quante semionde saltare. Non posso affinare con valori di sottomultipli di 100, altrimenti non mi sta il programma.

    Senza il PID ci sono oscillazione di circa +/- 15° e per questo che vorrei poter dosare la potenza quando si avvicina alla misura voluta. Magari non è necessario usare anche la parte derivative e per i valori frazionari penso di usare un moltiplicatore e un divisore per ottenere le costanti Kp, Ki, Kd. Come dire che con un divisore 1024 si ottiene calcoli facili e una risoluzione al millesimo, calcolo binario permettendo.
    Ho scelto di programmare in Proton Basic, ma se ci sono esempi in altri linguaggi potrei anche trovare il modo di convertire. Basta che si possano trovare.

    #9958
    Picmicro675
    Moderatore

    Bene, forum
    Penso che ho trovato una via da seguire. Infatti le letture non sono state approfondite, visto la completa difficoltà a capire quelle strane formule. Ma del resto la cosa più semplice è quella a pié pagina di Wikipedia.

    previous_error = 0
     integral = 0 
     start:
       error = setpoint - measured_value
       integral = integral + error*dt
       derivative = (error - previous_error)/dt
       output = Kp*error + Ki*integral + Kd*derivative
       previous_error = error
       wait(dt)
       goto start

    Al primo colpo non capivo cosa servisse dt (Delta Time). Ma in fondo non serve, se i periodi di verifica sono costanti, per questo si riduce a 1 e si esclude. Infine è importante tenere conto il periodo di dt, che deve essere circa un decimo del periodo che una misura varia (come si spiega nel primo link sopra) altrimenti si ha l’effetto che l’accumulo di integral va oltre i limiti e non può recuperare. Per esempio se per un grado centigrado ci volesse 10 secondi per aumentare o diminuire, non si deve attuare il calcolo di controllo in meno di un secondo.

    Ora col Proton Basic è pressappoco come quello qui sopra, basta dimensionare le variabili in funzione alla grandezza da controllare e limitarne il campo al quantitativo voluto.

Stai visualizzando 2 post - dal 1 a 2 (di 2 totali)
  • Devi essere connesso per rispondere a questo topic.