Other Parts Discussed in Thread: SFRA, CONTROLSUITE, TMS320F28379D
Tool/software:
Dear C2000 Team,
I'm working on a dual motor control project based on the FCL_SFRA_XL example from ControlSUITE, running on a TMS320F28379D. I've modified the code to use a 17-bit BiSS-C absolute encoder instead of the default incremental (QEP) encoder.
System Configuration:
-
MCU: TMS320F28379D
-
Base Project: FCL_SFRA_XL (ControlSUITE)
-
Build Level: FCL_LEVEL3 (Current loop control) , FCL_LEVEL 4 (position loop)
-
Motor: PMSM
-
Encoders Tested:
-
EnDat (13-bit absolute) – Motor reaches max speed and operates as expected
-
BiSS-C (17-bit absolute) – Motor gets stuck at 1700 rpm after that not increase the motor speed.
-
-
Issue 1: Motor Stalls in FCL_LEVEL3 with BiSS-C
With the BiSS-C encoder in FCL Level 3:
-
The motor starts normally and runs at low-to-mid speed.
-
It fails to accelerate beyond a certain point.
-
No faults are triggered, but the motor stalls or gets stuck at constant speed.
-
The same motor and parameters work perfectly with the EnDat encoder and reach full speed.
Issue 2: Unexpected Reverse Rotation in Position Loop
In the higher build levels with position control (FCL_LEVEL4):
-
The motor sometimes operates normally and tracks position correctly.
-
However, intermittently the motor suddenly rotates in the reverse direction at high speed.
-
This typically happens during or right after target position transitions.
-
No fault flags are set, but it appears the controller applies full reverse torque momentarily.
.
-
Implementation Details:
-
BiSS-C feedback is read using a custom bissc_angle_read() function.
-
MechTheta is calculated as:
bissc.RawTheta = 1.0 - ((float)bissc_data_struct.position / 131072.0); // 17-bitbissc.MechTheta = bissc.RawTheta - bissc.InitTheta; -
Electrical angle is derived as:
bissc.ElecTheta = _IQfrac(PolePairs * bissc.MechTheta); motor->ElecTheta = bissc.ElecTheta; -
FCL and ISR timings are unchanged between the encoder types.
-
Angle read is updated inside the A-task before FCL.
Observations:
-
All encoder values appear stable during low-speed operation.
-
ElecTheta wraps correctly between 0.0 and 1.0.
Any suggestions or best practices would be greatly appreciated to resolve this issue. Please let me know if you need logs, code snippets, or additional test data.
Thank you,
divyesh Patel.