Domanda:
Dalla funzione di trasferimento ad arduino
MechAvia
2014-09-23 18:16:00 UTC
view on stackexchange narkive permalink

Questa domanda potrebbe sembrare stupida, ma ne sono stato curioso per molto tempo.

Quindi sono un nuovo studente di ingegneria e abbiamo imparato molto sulla "progettazione di un controller". Ad esempio, controller di progettazione per un sistema di sterzo di un'auto e così via. Tutti i "controller" che abbiamo progettato sono nel dominio di Laplace, noto anche come dominio s. E la maggior parte delle volte sarà solo una funzione di trasferimento. Quindi, come fanno i veri ingegneri del sistema di controllo a utilizzare queste funzioni di trasferimento in arduino e altri microcontrollori? Voglio dire, non puoi semplicemente mettere la funzione lì dentro?

Devi convertire la funzione di trasferimento in qualche altra forma e scrivere il codice per il microcontrollore o c'è un modo più semplice per farlo?

Grazie per il tuo tempo!

Una risposta:
akellyirl
2014-09-24 14:02:49 UTC
view on stackexchange narkive permalink

Supponiamo che tu abbia un Arduino che hai predisposto per campionare un segnale con una frequenza di campionamento di 1 / T che viene poi elaborato dal tuo controller. Supponiamo inoltre che il tempo di elaborazione per il controller sia ridotto rispetto a T, ad es. 0.1 / T

In primo luogo, è necessario convertire la funzione di trasferimento del controller in tempo discreto. Ci sono molti modi per farlo. Matlab ha una comoda funzione c2d (). Un modo per farlo su carta (non il modo migliore) è utilizzare il metodo di Eulero.

s = (z-1) / T dove T è il periodo di campionamento .

Convertire una funzione di trasferimento quindi: (s + a) / (s + b) => (z- (1-aT)) / (z- (1-bT))

Quindi ora hai un TF in z come: Y (z) / X (z) = (zc) / (zd) dove Y è l'output e X è l'input.

Per implementarlo in un controller è necessario questo come equazione di differenza in termini di ritardi. Quindi converti l'equazione in una funzione di (z ^ -1) che è un ritardo:

Y (z) / X (z) = (1-cz ^ -1) / (1 -dz ^ -1)

e riscrivi come: Y (Z) (1-dz ^ -1) = X (z) (1-cz ^ -1 )

Y (Z) -dY (z) .z ^ -1 = X (z) -cX (z) .z ^ -1

e passa al tempo di campionamento trattando z ^ -1 come un ritardo: y (n) - dy (n-1) = x (n) - cx (n-1)

riorganizzazione: y (n) = dy (n-1) + x (n) - cx (n-1)

Puoi implementarlo facilmente in Arduino rendendosi conto che y (n-1) è il valore precedente di y (n) e similmente per x (n), e x (n) è il valore in ingresso al controller; cioè il riferimento meno l'uscita dall'ADC.

Ti dispiacerebbe fornirci qualche esempio di codice per implementare questo tipo di esercizi? Ti sarei davvero grato. Nel mio caso a have a transfer function a / s + a, "a" è un valore da inserire tramite una tastiera collegata ad arduino mega, ho calcolato le operazioni in questo modo, usando il metodo tustin: a1Z + a2 / b1Z + b2 dove ogni valore è: a1 = a2 = (aT / aT + 2); b1: è sempre 1; e b2: aT-2 / aT + 2. T è il tempo di esempio Come puoi vedere ho calcolato tutto ma ho difficoltà nel codice di programmazione in arduino mega, se puoi aiutarmi te ne sarei davvero grato.


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...