Part Number: TMS320F28069M
Other Parts Discussed in Thread: CONTROLSUITE, MOTORWARE
Hi,
We are using sensorless Instaspin MOTION software on a custom board to control the speed of a BLDC motor, but we are not able to make it spin. As soon as we enter a speed command the motor starts to vibrate and barely spins. The readings of the estimator speed (EST_getSpeed_krpm) are nonsense, swithing positive and negative values randomly.
We are not designing the software from scratch, we are using a previous sensored Instaspin MOTION project that works perfectly. The changes we have made are disable QEP modules and replace STPOSCONV functions with the FAST estimator ones.
For example, the speed in the sensored project was calculated as follows: _IQmpy(STPOSCONV_getVelocityFiltered(stObj->posConvHandle), _IQ(fSpeedKRPMPerPU))
And the sensorless speed is obtained like this: _IQmpy(EST_getSpeed_krpm(obj->estHandle), _IQ(fSpeedKRPMPerPU))
In both cases fSpeedKRPMPerPU = ((0.001 * 60.0 * gUserParams.iqFullScaleFreq_Hz) / gUserParams.motor_numPolePairs)
As the control was unsuccessful, I checked the estimator variables in the sensored project and compared them with the correct speed. What I found out is that the estimator measurements are incorrect (both EST_getSpeed_krpm and EST_getFm_pu), but besides that:
- EST_getSpeed_krpm is suppose to be per unit, but it is not.
- Both EST_getSpeed_krpm and EST_getFm_pu are giving an incorrect value with a factor of 1.4. I mean, if the correct value is 1.5 krpm, they are giving 1.07 kprm approximately.
Indeed, I applied the 1.4 factor correction and the results of the estimator values and the sensored values are almost the same (and correct). These are the variables used to check the problem.
gspeedKrpmPU = _IQmpy(EST_getSpeed_krpm(obj->estHandle), _IQ(1.4)); //Corrected gspeedFmPU = EST_getFm_pu(obj->estHandle); _iq pu_to_khz_sf = _IQ(gUserParams.iqFullScaleFreq_Hz/1000.0); _iq khz_to_krpm_sf = _IQ(60.0/gUserParams.motor_numPolePairs); _iq Mechanical_Freq_kHz = _IQmpy(gspeedFmPU,pu_to_khz_sf); gspeedKrpmFm = _IQmpy(_IQmpy(Mechanical_Freq_kHz,khz_to_krpm_sf), _IQ(1.4)); //Corrected
So, my first question is, why EST_getSpeed_krpm is not per unit if the documentation says so (in fact, it is the actual speed)? I thought it may be a code bug, but the values are obtained directly from the estimator which is in ROM and we cannot access to it.
My second question is, why in both cases the error is 0.71 times the real value? Again, the data is obtained from functions in ROM, so I don't know what could be wrong.
All control parameters are taken from the sensored project, so they are tested and correct.
Any idea on how to proceed with this? We could just multiply the estimator speed by 1.4, but this is not a real solution, and the rest of the estimator values could be also wrong.
Thank you in advance,
Best regards
