I am unable to achieve constant velocity for my application. Here is a chart made in LabView that best describes the problem.
The LabView application plots the value of
motor.shaft_velocity
converted to microns per second every 30ms. We do this by having 2pi radians be equal to the pitch of the permanent magnets on the stage and pole pairs defined as 1.
The motor’s position is stable when not moving. The encoder loop runs ~40,000 times per second with an accuracy and precision of ~100nm.
The motors and encoder are within the stage at this link:
The maximum velocity is set to 2500um/s. An acceptable range would be 2400-2600um/s for my application, so those spikes must go as they are out significantly out of the range. There are also spikes in the negative direction.
When this image was taken, the PID_velocity values were all default, but I had tried tuning these with various methods achieving similar/worse results. Changing the D to any non-zero value made the motor produce a loud noise, which makes it difficult to tune since the noise would also be unacceptable for the application. I also tried changing the downsampling and LPF values, both of which still showed spikes in the velocity graph.
The driver being used is the MP6540 using high side and low side drivers, instantiating the motor with
BLDCDriver6PWM driver = BLDCDriver6PWM(PHASE_A ,PHASE_B ,PHASE_C);
BLDCMotor motor = BLDCMotor(POLE_PAIR, 9, 80, .0015);
motor.controller = MotionControlType::angle;
Drive voltage has been varied between 12V-30V with no effect.
Any help or ideas are appreciated.