Chopper drive circuits
Chopper drive circuits are also referred to as constant current drives because they generate a somewhat constant current in each winding rather than applying a constant voltage. On each new step, a very high voltage is applied to the winding initially. This causes the current in the winding to rise quickly since dI/dt = V/L where V is very large.
When the current exceeds a specified current limit, the voltage is turned off or “chopped” and when the winding current drops below the specified limit, the voltage is turned on again. In this way, the current is held relatively constant for a particular step position.
This allows driving stepper motors with higher torque and higher speed.
Steps:
- Measure Inductance and resistance of motor coil.
- Get time constant.
- Choose voltage value and desired calculation for program variables.
- Write chopping program.
Can be done using oscilloscope and step response equation on LR circuit or from stepper motor datasheet:
Put I= maximum coil current from stepper datasheet (different from Imax)
R=Rc = internal resistance of the stepper coil from stepper datasheet
L =Lc = inductance of stepper coil from stepper datasheet
Time constant ( T ) = L/R.
Put t which is the desired time to reach the step level (start of chopping)
From above we can get Imax then by multiplying it with Rc we can get the desired Applied voltage Vs to reach the maximum current in time t.
Case Study:
Stepper motor has the following specifications
Max current per phase = 1A, voltage = 5.7V, Resistance per phase = 5.7
Inductance = 6.5 mH/phase
So its time constant = 1.14 msec
We put desired t=.5 msec to reach its max current instead of taking 1.14 msec It will give us Imax = 2.8164 and Vs=16 V so we will need to apply a 16 V to reach our max current per Phase in .5 msec.
Program for Chopping driver
#include <16f628.h> #use delay ( clock=4M ) // GLOBAL VARIABLES ///////////// int steps[] = {1,2,4,8}; // motor steps int step_ptr = 0; int step = 0; int desiredt = 500; // desired time to reach max current at start of every step 0.5 msec int choppingt = 50; // chopping time = 0.1 desired time = 50 usec // FUNCTIONS //////////////////// // INTERRUPTS /////////////////// #INT_TIMER0 void change_step () { if ((++step_ptr) > 3) step_ptr=0; step = steps[step_ptr]; output_b(step); delay_us(desiredt); output_b(0); delay_us(choppingt); } // MAIN ///////////////////////// void main() { // Motor terminals are connected to Port B (Unipolar Stepper Motor) // setup interrupt timer0 to desired stepping speed let motor change step every 2msec // if step angle = 1.8 degree, steps per revolution = 360/1.8 = 200 steps // time per revolution = 200 * 2 msec = 0.4 sec // rpm = 60/0.4 = 150 rpm setup_timer_0(RTCC_INTERNAL | RTCC_DIV_16); // put first step// step = steps[step_ptr]; output_b(step); delay_us(desiredt); output_b(0); delay_us(choppingt); // enable interrupt///// enable_interrupts(GLOBAL); enable_interrupts(INT_TIMER0); // chopping loop// while (1) { // put step (apply voltage) // output_b(step); // wait chopping time // delay_us(choppingt); // clear step //// output_b(0); // wait chopping time// delay_us(choppingt); } } |
References:
– Wikipedia.org
– Microchip Co. application notes.
Article by – Amr Ayoub
hi