In un apparato meccanico mosso da motori elettrici in CC, quale potrebbe essere un braccio robotico, il solo PID non basta per controllarne la posizione.
Il controllo PID applicato in closed-loop ad un motore permette il solo controllo della velocità di rotazione anche se questa è zero.
Noi impostiamo una velocità e il sistema cerca di mantenerla costante anche al variare del carico o della tensione di alimentazione.
Se lo applicassimo per controllarne la posizione avremmo movimenti veloci, bruschi senza smoothing.... e questo può andare bene nei servo rc perchè devono essere veloci nella risposta e i movimenti devono essere privi di oscillazioni.
Invece, quando si controlla il movimento di un robot o di qualsiasi apparato meccanico, anche implementando l'algo PID, abbiamo bisogno di un controllore molto più sofisticato.
Per far muovere e posizionare un joint/link di un braccio robotico o di un asse cartesiano, impiegando ad es motori DC, abbiamo la necessità di modificare profili di accelerazione, di velocità, di decelerazione .... e tanti altri parametri. Inoltre bisogna calcolare tutto questo prima ancora che il motore si metta in movimento una volta stabilita la posizione che il joint dovrà raggiungere.
Con molta facilità si dice: usiamo un controllo PID ed il gioco è fatto..... purtroppo non è cosi o quantomeno non è così semplice nel caso dei robotic arm.
QUI:
http://mcselec.com/index.php?option=com ... &Itemid=57 una sempice application note AN#150 "PID Motion Control" scritta in Bascom-avr per ATmega32 per il controllo dei parametri di cui vi ho parlato prima.
ecco i parametri che è in grado di gestire il sistema:
- Code: Select all
' Skp [mot] [kp Value] SET PROPORZIONAL PID 0-1000 MAX
' Ski [mot] [ki Value] SET INTEGRAL PID 0-100 MAX
' Skd [mot] [kd Value] SET DERIVATIVE PID 0-1000 MAX
' Vmax [mot] [vmax Value] SET MAX VELOCITY IN PROPORZIONAL VELOCITY PROFILE 0-255
' Svm [mot] [svm Value] SET MAX VELOCITY IN TRAPEZOIDAL MODE 0-255
' Spid [mot] [kp] [ki] [kd] SET PID MOTOR KP KI KD
' Stime[stime Value] SET PID EXECUTION TIME 0-10
' Smode[mot] [mode] SET SINGLE MODE FOR ONE MOTOR
' Svel [mot] [svel Value] SET MOTOR_ON WITH INTEGRAL VELOCITY PROFILE AND MOVE 0-255
' Velo [vel 1] [vel 2] SET TWO INDIPENDENT SPEED FOR MOTORS 0-255 0-255
' Spwm [mot] [spwm Value] SET MAX PWM OUT FOR TORQUE LIMIT 0-255
' Sacc [mot] [acc Value] SET ACCELERATION DEGREE 1-89 DEGREES
' Sang [mot] [angular Factor] SET ANGULAR FACTOR FOR VELOCITY PROFILE 1-100
' Go [mot] [position Value] GO TO POSITION IN POSITION MODE CONTROL +- 23 BITS
' Pos [mot] [position Value] [speed] SET POSITION IN TRAPEZOIDAL PROFILE 0-255
' Move [position 1] [position 2] MOVE MOTORS TO POS 1 POS 2 +-23 BITS TRAPEZOIDAL MODE
' Velp [position 1] [position 2] MOVE CONTINUOS POSITION WITH VARIBLE PROPORZIONAL VELOCITY
' Start START MOVE IF START_MOVE = FALSE
' Stop STOP MOVE AND MOTORS POWER DOWN
' Gmax [mot] GET MAX VELOCITY IN VELOCITY PROFILE MODE
' Gvm [mot] GET MAX VELOCITY IN TRAPEZOIDAL MODE
' Gve [mot] GET ABSOLUTE SPEED FROM ENCODER
' Enc [mot] READ ABSOLUTE ENCODER POSITION
' Gpid [mot] GET PID MOTOR VALUES
' Gtime GET PID EXECUTION TIME
' Szp [mot] SET ZERO POSITION
' Idle [mot] POWER OFF MOTOR
' Gsm [mot] GET MOTOR STATE 0=STOP 1=MOVE
' Mode [mode] SET MODE PROFILE FOR 2 MOTOR 0,1,2,3,4
' Gmode GET PROFILE MODE SETTING
' Gpwm [mot] GET MAX PWM OUT
' Rpwm [mot] READ REAL PWM OUT TO CONTROL MAX CURRENT
' Gacc [mot] GET ACCELERATION PROFILE IN DEGREE 1-89
' Gang [mot] GET ANGULAR FACTOR
' Rst [mot] RESET ENCODER
Ciao