programmazione loop PID in C

10

Sono un ingegnere elettrico che è stato una specie di spinta nel mondo digitale e l'apprendimento mentre andavo. Sto programmando un processore TI per fare un ciclo PID (proporzionale-integrale-derivativo) , illustrato da questo diagramma:

Lo descriverò anche io:

Amplificatore operazionale con retroazione negativa, con terminale non invertente collegato a massa. Ingresso tramite terminale negativo. Il circuito di feedback è un circuito della serie RE in parallelo con un resistore e tutto ciò in parallelo con un cappuccio.

Qualcuno ha qualche idea su come convertire questo circuito in codice C? Sono un po 'fuori dal mio elemento e posso usare l'aiuto.

    
posta Jedi Engineer 06.02.2013 - 17:06
fonte

1 risposta

16

Il circuito

Ok ho appena creato un account qui quando ho visto questa domanda. Non sono in grado di modificare la tua domanda in modo da poter correggere l'errore che hai fatto. Credo che intendessi il circuito della serie RC in parallelo invece di RE (se lo è, non ho un solo indizio su cosa significhi)

Sembra che il circuito analogico che vuoi simulare usando C assomigli a questo

                         Ci
                  |------| |--------------|
                  |           Rp          |
                  |----/\/\/\/\-----------|
                  |          Rd    Cd     |
           Rf     |----/\/\/\---| |-------|
Vin o----/\/\/\---|                       |
                  |    |\                 |
                  |    | \                |
                  |----|- \               | 
                       |   \              |
                       |    \-------------|---------o  Vout
                       |    /
                       |   /
                       |+ /
                   ----| /
                  |    |/
                  |
                  |
               ___|___ GND
                _____
                 ___
                  _

LEGEND:
  Vin is the input signal.
  Vout is the Output.
  Rp controls the propotional term ( P in PID) 
  Ci controls the Integral term ( I id PID)
  Rd and Cd controls the differential term ( D in PID)
  Rf is the gain control, which is common to all of the above controllers.

(Non potevo resistere alla mia voglia di disegnare questo dato che volevo dirti come gli ingegneri elettrici / elettronici usavano comunicare nei forum ed e-mail senza immagini ... e perché amiamo il carattere di larghezza fissa, corriere )

Devo confessare che il circuito che stai usando è semplice da configurare ma è matematicamente molto complesso, quando si tratta di sintonizzare le costanti Propositivo, Integrale e Derivato del sistema con un valore desiderato individualmente non è possibile.

Ti consiglio caldamente di utilizzare il circuito da questa fonte per lo studio.

Anche se un po 'noioso da configurare, matematicamente è molto più semplice da analizzare in quanto puoi direttamente correlarlo alla forma matematica standard invece che a quella ideale.

Infine, la Vout va a controllare un motore o qualsiasi altra cosa debba essere controllata. E Vin è la tensione variabile di processo.

Prima di bagnare i piedi in C (mare?)

Suppongo tu stia leggendo i segnali da qualche tipo di convertitore da analogico a digitale. In caso contrario, dovresti simulare il segnale come input.

Se utilizzi il modulo Standard,

Supponendo che il tempo di esecuzione del loop sia abbastanza piccolo (un processo lento), possiamo usare la seguente funzione per calcolare l'output,

output = Kp * err + (Ki * int * dt) + (Kd * der /dt);

dove

Kp = Proptional Constant.
Ki = Integral Constant.
Kd = Derivative Constant.
err = Expected Output - Actual Output ie. error;
int  = int from previous loop + err; ( i.e. integral error )
der  = err - err from previous loop; ( i.e. differential error)
dt = execution time of loop.

dove inizialmente "der" e "int" sarebbero zero. Se utilizzi una funzione di ritardo nel codice per sintonizzare la frequenza del loop per dire 1 KHz, il tuo dt sarebbe 0.001 secondi.

Disegnando in C

Ho trovato questo ottimo codice per PID in C, anche se non coprire ogni aspetto di esso, è comunque buono.

//get value of setpoint from user
while(1){
  // reset Timer
  // write code to escape loop on receiving a keyboard interrupt.
  // read the value of Vin from ADC ( Analogue to digital converter).
  // Calculate the output using the formula discussed previously.
  // Apply the calculated outpout to DAC ( digital to analogue converter).
  // wait till the Timer reach 'dt' seconds.
}

Se prendiamo un processo lento, allora possiamo usare una frequenza più bassa come quella che dt > > > tempo di esecuzione del codice per loop singolo (molto più grande di). In questi casi possiamo eliminare il timer e utilizzare invece una funzione di ritardo.

    
risposta data 06.02.2013 - 20:19
fonte

Leggi altre domande sui tag