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.

PICCOLO & DRV8305 BOOSTERPACK LOW-ZERO SPEED & ROTATION DIRECTION

Other Parts Discussed in Thread: DRV8305

Hello everybody,

I have two questions for my application Piccolo with DRV8305 Boosterpack:

1) a) Is it possible to have stable rotor rotation below 100rpm (12hz on the scope) with enough torque? Below 90rpm it is jerky and
   tends to stall with no mechanical load. Max torque before stall on the GUI indication is 0.6Nm at 100rpm,with supply dc current=0.4A and Vdc=35V.
   Some of the motor specs are listed below:
   
USER_MOTOR_TYPE                        MOTOR_Type_Pm
USER_MOTOR_NUM_POLE_PAIRS                   (7)
USER_MOTOR_Rs                                (0.01959898)
USER_MOTOR_Ls_d                           (0.00002308)
USER_MOTOR_RATED_FLUX              (0.026944)

Nominal motor max Voltage 50V and max current 60A. I never use the motor under high load with DRV8305 boosterpack.
Take in mind that the Rs, Ls and Flux values are not necessarily absloluteley right, more likely they are
close to reality.
   b) Is there any project for DRV8305 BOOSTERPACK, for zero speed start under load like HFI?


2) Can I change the rotation direction through the software (without changing the phase terminals connection)?
   Which variable inside the code defines the rotation direction? I want to change the rotation from
   clockwise to counter-clockwise in stand alone mode, using an external switch.
   Is it feasible with the FAST observer or there are limitations?

Could you suggest me any document guides for these?

Thanks,

Leo

  • 1. continuous low speed operation is primarily a function of bits of resolution of the voltage on their effects on the FAST observer. This means increasing the Bemf voltage being measured vs. the full voltage scale. You can increase this by increasing the flux of the motor, increasing the frequency of the motor, or reducing the full scale voltage of measurement. It will also help some if there is some current being measured, so some load is better than none.

    @ 12 Hz your motor is producing 0.324V of Bemf. Your inverter full scale voltage is 44.3V. So you are 0.73% or 32 counts of 4096. This is quite low obviously.


    2. yes, just set a negative speed (or negative IqRef_A if using torque mode). Make sure ForceAngle is off after start-up. Keep it off until you stop at zero speed for a significant amount of time.

    in SPRUHJ1 there is a section on full load start-up that you should review
  • Hi Chris,

    Thank you very much for the explanation and all the information. Following your instructions the 'jerking' limit lower up to 40rpm which is quite good. Moreover, the external direction switch worked fine by setting a negative speed.

    Now I plan to install a position encoder on the rotor in order to produce full torque from standstill situation. The encoder will be disabled after enough speed obtained and the control of the motor will be switched back to the 'FAST' observer again. The encoder I plan to use gives analog output with range 0-3.3V for 0-360 degrees. So it can be fed in an ADC channel.  My questions are:

    1) Which rotor position is regarded as 'zero' degrees, in order to mechanically align the rotor? Is it considered according the phase A ? How it is practically set?

    2) Which is the variable (or variables) that I have to feed the ADC result (θ angle)? Is it the SpeedRef ? Which are the files that must be modified for this application?

    3) When the speed limit is reached for the start up, how do I have to switch from the encoder to the 'FAST' calculator? I mean that the transition from hardware to software position calculations must be done smoothly. Are there any critical points for this or just changing the angle 'source' is fine?

    Thanks in advance,

    Leo

     

  • 1 &2. see the examples in InstaSPIN_motion proj_lab12
    an alignment (through RsRecal or by setting an IdRef_A before start-up) and zero-ing out of the encoder count must be done

    3. you will be changing the angle used from your ENC to EST. you should obviously make sure they are close before you make the switch.
  • Hi Chris,
    I studied the lab12 and the pdf's related and they were very helpful.
    I have some questions related:

    1) Since the piccolo doesn't have eQEP module, I plan to use an encoder (AS5600) which gives an analog output,
    0-3.3V for 0-360 degrees range. If I setup an ADC channel in the same way as the potentiometer, I suppose that it will
    give normalized units from 0.0-0.9999999 for 0-360 degrees.
    So, can I use this result directly for the "angle_pu" inside the "ctrl.h" file? Is it the same units as the QEP and Encoder calculation
    outputs? If not which is the right way?

    2) Do I have to declare something inside the "user.h" file for this application or it is not necessary?

    3) The spruhj1f.pdf describes (in pargraph 18.3) the, "InstaSPIN-MOTION Position Convert" setup procedure.
    Is it also necessary to be done for the project_lab05b with my encoder's results? Because, I think that SpinTac is not used in this project.
    Or some functions are used inside SpinTac which affect this project as well?

    4) When I switch from the Encoder to the Estimator angle I will have to set a speed threshold for the transition.
    Which is the variable I have to control? Is it the "gMotorVars.Speed_krpm"? Are the units, normalized 0-1 or RPM?
    The variable "gMotorVars.Speed_krpm" gets the rpm value from the Estimator (gMotorVars.Speed_krpm = EST_getSpeed_krpm(obj->estHandle);)
    and I think it is better to compare the RPM transition threshold always with the estimator value. Or you suggest me a better way?

    Thanks,
    Leo
  • 1. there are InstaSPIN Piccolo devices with QEP module (F2805x, F2806x) but you are correct that F2802x does not have one.
    you will need to convert your IQ12 analog value into an IQ24 per unit value.

    2. no

    3. SpinTAC is not used in 5b. The encoder labs for SpinTAC start with proj_lab12

    4. Speed_krpm is the estimated speed from FAST in KRPM. Yes, I would use this value, but you should observer this value at zero speed and during start-up. It will not be accurate until there is enough rotor movement for FAST to lock on to the estimate. So you may have to handle this condition so that your switch doesn't happen incorrectly at zero / low speed.
  • Hi Chris,
    Thanks for the reply.
    I set up the hardware with the rotor angle sensor and it works fine on the scope. I also get IQ24
    values in the debugger to the variable (gRotorEncoder) I set up for the rotor sensor.

    1) How can I put this variable result form my rotor angle sensor which is calculated inside the proj_lab.c, to the "angle_pu" which is inside the ctrl.h?

    2) How can I see the current Estimator angle_pu values inside the debugger in order to compare with my rotor sensor values?

    Thanks,
    Leo
  • 1.
    see proj_lab12b
    there is a ctrlQEP that is used

    // run the controller
    CTRL_run(ctrlHandle,halHandle,&gAdcData,&gPwmData,ENC_getElecAngle(encHandle));


    2.
    in ctrl.h
    angle_pu = EST_getAngle_pu

    you can use this as long as you aren't overwriting the angle_pu with your sensor angle
  • Hi Chris,
    I have the piccolo 28027 which doesn't have a QEP module. My encoder uses an ADC channel for the angle signal feedback. I set up the ADC channel in the same way as the potentiometer and I create the result inside the variable "gRotorEncoder" inside the proj_lab03a.c .

    The problem is that when I connect this variable with the angle_pu (angle_pu = gRotorEncoder instead of angle_pu = Est_getAngle_pu) inside the ctrl.h, I get an error "#20" that the gRotorEncoder is undefiened.

    Which is the right way to declare the "gRotorEncoder" inside the ctrl.h and be sure that the right value will be connected with the "angle_pu" ?

    Thanks
    Leo
  • that's because you probably only defined it in proj_lab##.c
    you need to have it defined in ctrl.h or in a file that it includes

    I'd also review proj_lab12b if you haven't to at least understand how a project with encoder works.
  • Hi Chris,
    I have reviewed the proj_lab12b. The motor runs now with my encoder but it is not very stable.
    The values that my encoder give to angle_pu vary from 0 to 1.
    What is the values range that estimator gives to angle_pu?
    I suspect either that my sensor set up doesn't output the right values range or the sensor is not aligned to the rotor correctly.

    Thanks,
    Leo
  • //! \brief Gets the angle value from the estimator in per unit (pu), IQ24.
    //! \details This function returns a per units value of the rotor flux angle. This value wraps around
    //! at 1.0, so the return value is between 0x00000000 or _IQ(0.0) to 0x00FFFFFF or _IQ(1.0).
    //! An example of using this angle is shown:
    //! \code
    //! _iq Rotor_Flux_Angle_pu = EST_getAngle_pu(handle);
    //! \endcode
    //! \param[in] handle The estimator (EST) handle
    //! \return The angle value, pu, in IQ24.
    extern _iq EST_getAngle_pu(EST_Handle handle);
  • Hi Chris,
    Thank you very much for the information. I set it up and works much better.
    Regards
    Leo
  • Hi Chris,
    Since the rotor position is known at standstill situation (due to the rotor sensor installed) , could you suggest any techniques or adjustments to be done in order to increase the torque (increase current-by increasing the voltage amplitude?) from the standstill position?
    When the Vbus is 35V the maximum Idc is 1.5A for start up when loading the rotor. To what extend can the torque be increased since the "max motor current" is set up to 20A (the motor can handle higher amps than that) and how it can be achieved?
    By increasing the flux 50% the torque is higher but this is close to the limit of jerking the motor.

    Thanks Leo.
  • 1. are you limiting the maximum current in your code somewhere? USER_MOTOR_MAX_CURRENT ?
    2. even though you have a sensor, it is mechanical, not electrical. You have to perform an alignment. This means moving the rotor to an electrical zero (in the example in lab12 we use RsRecal with RES_EST_CURRENT set as high as possible to guarantee any load on the rotor is moved) and then reading the mechanical angle and using that as an offset for zero.
  • Hi Chris,
    1. The USER_MOTOR_MAX_CURRENT is set to (20.0) amperes. Is there any other variable that also defines that, like a ramp increase curve or something similar that may affects it?
    2. I set up the encoder and also aligned it with the rotor zero according lab12. After that I run the motor with the estimator and just observed in the debugger the values of the angles given from the estimator and compared to those given from my encoder. The fault-difference is less than 0.005 for the rpm range 0 up to 500rpm, in pu units from 0.0 to 1.0. Afterwards I enable the encoder and works properly till the 600rpm. Above ~650rpm I get a fault on the DRV board. The USER_PWM_FREQ_KHz is (60.0) and the USER_NUM_PWM_TICKS_PER_ISR_TICK is (3), so the ADC sampling rate must be 20KHz. Should it be higher?

    Anyway, this is not such a problem because I have set a threshold of 350rpm that switches from encoder to estimator and reverse.
    The issue is that the motor current limits to 1.5A at standstill situation with the encoder enabled ("angle_pu" gets the result of the encoder exclusively) as I referred to my previous post.
    Could you suggest me something to test or any idea of what is happening in standstill situation?
    Do you think that it has to do with more precise alignment (spruhj1f referees to +-3 degrees accuracy which is 0.857 degrees for 7polepairs)?
    The encoder is 12bit so in the precision is 0.615 degrees in the electrical field, so I consider it covers the demands.

    Thanks,
    Leo
  • 1. if you have a speed controller then it is acting like a ramp controller to the Iq reference. You could set a high acceleration at the speed controller, or seed the output of the speed controller, or remove it altogether and just provide a step input to IqRef.

    2. assuming you are using F28069M then your PWM and TICKS should work.
    I can't tell you if the fault is from over current, losing synchronization (shouldn't be this if the EST still agrees with the ENC), or something else.

    when you say you are limited to 1.5A, what is the IqRef during that time? If using the speed controller it should be saturating to 20A. Is it? What is the peak of the phase currents during this time?

    and by standstill do you mean that you are at zero speed but trying to start-up to a higher speed?
    or you are holding 0 speed?

    if you are holding 0 speed, what sort of dynamic load are you providing that you would think would cause more torque to be produced by the machine?