A proportional–integral–derivative controller (PID controller) is a control loop feedback mechanism widely used in industrial control systems and a variety of other applications requiring continuously modulated control. A PID controller continuously calculates an error value E(t) as the difference between the desired setpoint position (POS) and a real position measured by encoders (ENC) and applies a correction based on proportional, integral, and derivative terms (denoted P, I, and D respectively).
PID controller formula implemented in myCNC is
where
Digital-Analogue Converter (DAC) output voltage is the sum of the PID and a DAC offset volage
Enable/Disable PID control does not affect the DAC voltage offset.
If PID control is disabled for selected channel, output voltage is equal to DAC Offset
U_out = U_offset
To setup Closed-loop analogue PID
Multiplicator and divider ratio needed for pulse-dir closed loop system to adjust encoder resolution (encoder lines-per-rotation) to motor driver pulse-dir resolution. For Analogue closed loop system this ratio should be "1"
Depends on machine configuration you may want
Both options can be implemented with myCNC control software.
There are few ways to Enable/Disable Servo PID loops in myCNC software
1. On-Screen button. To enable/disable Servo PID control button should have actions:
action="servo-pid-on" (enable pid) action="servo-pid-off" (disable pid)
For example
Buttons for Servo-ON and Servo-OFF
<gitem where="toolbar-servo" image="motor/motor-start" action="servo-pid-on" height="80" event="pressed-delay-1000" type="button"/> <gitem where="toolbar-servo" image="motor/motor-stop" action="servo-pid-off" height="80" type="button"/>
Popup widget container for Servo Pid On/Off buttons
<quick-popup-layout> <current>popup-servo</current> <layout stretch="0" name="popup-servo" wa="80;160;right" orientation="vertical" skin="skin/metal-01"> <widget stretch="1" spacing="0" name="toolbar-servo" orientation="vertical">myitems</widget> </layout> </quick-popup-layout>
Button to show containner with 2 buttons for servo-on/servo-off buttons and led to show current servo pid state
<gitem where="magic" position="960;0" width="80" height="80" image="motor/servo-driver" action="mypopup-toggle:popup-servo" xattr="56;4;20;20;led;green;round" address="outputs" number="47" type="xbutton" />
2. Using Global Variables API. Global variables 60000 and 60001 are mapped to turning On and Off Servo PID control.
Reading this registers has no effect and return zero value. Read more about Servo ON/Servo OFF commands in this short manual: Servo ON/OFF.
3. Automatic Servo ON/OFF. There are 2 handler procedures in Software PLC can be used to automatic PID ON/OFF.
To handle automatic Servo ON/OFF writing to registers 60000, 60001 should be added to handler procedures. Example is below
main() { gvarset(60000,1); //turn Servo PIDs On exit(99); };
main() { gvarset(60001,1); //turn Servo PIDs Off exit(99); };
To test DAC outputs voltage range, rising/falling edges timings DAC Test mode is used. DAC Test mode is activated if in Hardware→Encoders configuration dialog, /(2^Div) line for Encoder#11 column set “99” value and press “Save” button.
In DAC Test mode all DAC outputs generate Zero » MAX » Zero » MIN sequence with frequency about 700Hz. Scope screen example is shown below.
Value "99" should be used for DAC test mode ONLY! For working mode any other value from "1" to "90" should be used in "/(2^Div)" line for "Encoder#11".
Example: Let's use Motor output #2 (configured as axis X) and Encoder #1 to build closed-loop PID control.
Servo driver with 2500 pulses per revolution, Electronic gears "1" and ball screw 5mm are used. Linear encoder with 1um resolution used as a feedback. =>((A)) Pulses per unit value is (2500*4)/5=2000 pulses per mm Original Linear encoder resolution (1um) is 1000 pulses per mm, need to set multiplier to "4" and divider to "1" to get result ratio 4/(2^1)=4/2=2 and => result Encoder resolution is 1000* 4/(2^1)=2000 pulses per mm (which is equal to ((A))