This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Jittery zero speed startup of BLDC using DRV8301-69m-KIT

Other Parts Discussed in Thread: DRV8301-69M-KIT, MOTORWARE, CONTROLSUITE

Hi there,

I have been using two DRV8301-69m-KIT evaluation boards as motor controllers for two Maxon EC 60 400W motors. However, I cannot achieve smooth zero speed startup of this system under load. I am using two motors to drive a car that weighs around 200 pounds without the driver. The code that I am running now is based on proj_lab04.c from motorware. I am running both controllers in parallel from a single 36V battery. Throttle signal is modified from the original speed control potentiometer tutorial described in motorware_hal_tutorial.pdf. I am feeding the throttle signal to both boards. I understand that this is definitely a very bad way to control both boards. I think have a CAN controller would be better, but I believe it would be useful to provide the information to help solve the two problems that I am encountering:

1. Jittery zero speed startup: the wheel connected to the motor jitters around and makes a very unpleasant vibration noise instead of smoothly push the car forward. I am suspecting this to be an artifact of sensorless drive. However, I would like the know if there is any way to fix this problem in the source code instead of installing a quadrature encoder.

2. The two controllers ignore the throttle signals: Once both of the boards are programmed, engaging the throttle would instantly send both motors spinning at full speed. However, releasing the throttle does not stop the spinning. They seem to get stuck in the spinning speed unless I cut off the power from the battery.

Below is my motor identified characteristics:

#define USER_MOTOR_TYPE MOTOR_Type_Pm
#define USER_MOTOR_NUM_POLE_PAIRS (1)
#define USER_MOTOR_Rr (NULL)
#define USER_MOTOR_Rs (0.5733238)
#define USER_MOTOR_Ls_d  (0.0003260411)
#define USER_MOTOR_Ls_q  (0.0003260411)
#define USER_MOTOR_RATED_FLUX (0.559845)
#define USER_MOTOR_MAGNETIZING_CURRENT (NULL)
#define USER_MOTOR_RES_EST_CURRENT (3.0)
#define USER_MOTOR_IND_EST_CURRENT (-3.0)
#define USER_MOTOR_MAX_CURRENT (5.85)
#define USER_MOTOR_FLUX_EST_FREQ_Hz (20.0)

Let me know if I need to provide any more information about this problem. Thank you!

Zihe Huang

  • there are several threads on this topic on the forum you can search through.
    you have two separate challenges:
    1. start-up of sensorless control under load, and what is acceptable/unacceptable in relation to jitter/smoothness
    2. complete speed synchronization of two wheels


    starting with #1

    you can certainly improve your performance, but you will always have some limitations/trade-offs with the existing solution.
    - you need to insure your control system can produce enough torque for the load. If you are using a speed controller I am very doubtful that this is set high enough for this motor USER_MOTOR_MAX_CURRENT (5.85). This sets the maximum output of the speed controller, which is the input to the Iq_Ref_A, which is the instantaneous peak current. But this is not the total current or the bus current, so even if 10A peak is requested that doesn't mean you will see 10A through the Vbus. Testing at higher speeds with a rated load can help you insure this value is set high enough. If you are just using torque mode (like proj_lab04 or 05a) then disregard as this variable will have no effect. You are setting your Iq_Ref_A directly.

    - in user.h you want to pay attention to the following variables
    #define USER_ZEROSPEEDLIMIT (1.0 / USER_IQ_FULL_SCALE_FREQ_Hz) // 0.002 pu, 1-5 Hz typical; Hz = USER_ZEROSPEEDLIMIT * USER_IQ_FULL_SCALE_FREQ_Hz


    #define USER_FORCE_ANGLE_FREQ_Hz (2.0 * USER_ZEROSPEEDLIMIT * USER_IQ_FULL_SCALE_FREQ_Hz)


    In the first, the "1.0" sets the frequency (+/-) where - if the flag is enabled - the angle being used for FOC will transition from the angle generated by ForceAngle to the one produced by FAST. It is important to do some testing to see where FAST is giving good enough feedback for your motor. It may be 1 Hz, it may be higher. Your FLUX value is relatively high so somewhere in the 1 to 4 Hz should work.

    In the second, make sure you update to exactly as I have. This will guarantee that the frequency of rotation being used is always twice the transition frequency. This helps with repeatability and stability of start-up transition.

    The next thing that really helps start-up is to avoid step inputs in the initial torque command. So if using a speed controller you would set a slower acceleration and make sure the speed controller isn't overly aggressive and saturating the output. If you are just using a torque controller you need to put a ramp/trajectory input into your software control. So instead of taking a torque/throttle request and just setting say 5A, the Iq_Ref_A input ramps from 0 to 5A at a given slope.

    With these techniques most people have been able to generate consistent start-up under load.

    However, because the initial rotor angle is unknown there will still be some initial rotation backwards sometimes. You can't eliminate this without doing something more. In some cases simply doing an RsRecal (with a large enough RES_EST_CURRENT) will initially force the rotor to move into alignment before you start-up. With high pole count motors this can be very effective as the mechanical rotation will be quite small. However, your motor has only 1 pole pair so this will be quite noticeable and challenging IMO.

    There are techniques that can sometimes be used to find the initial rotor angle (IPD_HFI example in proj_lab21) but they only work really well with rotors that have been specially designed with high saliency. And even then, as the currents are increased to generate the torque the saliency/inductance difference reduces and it is still quite challenging to track the angle under very large load starts.

    Regarding #2, I'm afraid this is an extremely challenging system requirement ESPECIALLY for sensorless. When two wheels need to provide 100% repeatable synchronized trajectories and speed it will be quite challenging without the use of sensors.


    In the case of your project I would strongly recommend looking at using some type of sensors to improve your start-up and synchronization.
  • Thanks for the suggestions! I will test these modifications as soon as possible.

    I am currently running the code under a slightly modified version of proj_lab04 (mapping throttle to Iq_ref_A). I was wondering if I can modify the code so the Iq_ref_A input ramps up at a slope as you said. Is this something built into the motorware or something I need to code myself?

    The motor that I am using now has three hall sensors. As far as I know the DRV8301-69m-kit only supports quadrature encoders. Are there any ways to make hall sensors work with the evaluation board? Thank you!
  • Zihe Huang said:
    I was wondering if I can modify the code so the Iq_ref_A input ramps up at a slope as you said. Is this something built into the motorware or something I need to code myself?

    an example is not provided, but you can use a TRAJ_ module from MotorWare to accomplish this.

    Zihe Huang said:
    As far as I know the DRV8301-69m-kit only supports quadrature encoders. Are there any ways to make hall sensors work with the evaluation board

    The EVM HW supports hall inputs. There is not a HALL example in MotorWare. We have it on our to-do list to add an example which uses HALL to start the motor then transition to FAST.

    There is a full HALL 6-step example for controlSUITE projects ( DRV8301-HC-C2-KIT) that I have posted on the Motor Drivers forum before.