Continue to Site

Welcome to our site!

Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

  • Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

Fan jerks when turned ON

I am using LPC804M101JD24 & DRV10983 for BLDC fan control. The issue I am facing is that the fan jerks when turned ON. After initial jerk, it runs fine through various speeds. The motor parameters I have set is listed below. Please help me in finding which of them is not set properly and causes jerking.
Thank you.

// ---------------------------------------- Parameter Config ---------------------------------------- //
// ----------- Setup ----------- EEPROM MotorParameter of DRV10983 ----------- //

struct_drv10983.MotorParam1.bit.Rm = 0x48; // Pg.19 , Rm (Motor Phase Resistance) // 0x48 - 1.23Ohm
struct_drv10983.MotorParam2.bit.Kt = 0x5A; // Pg.20 , Kt (BEMF Constant) // 0x69 - 528mV/Hz

struct_drv10983.SysOpt8.bit.VregSel = 1; // Pg.14 , Buck Regulator Voltage // 1 - 3.3V

struct_drv10983.SysOpt2.bit.BrkDoneThr = 4; // Pg.24 , Braking Mode Setting // 4 - 0.33s

struct_drv10983.SysOpt1.bit.RvsDrThr = 0; // Pg.22 , Reverse Drive Threshold // 0 - 6.3Hz
struct_drv10983.SysOpt1.bit.RvsDrEn = 0; // Pg.22 , Reverse drive enable // 0 - disable

struct_drv10983.SysOpt1.bit.ISDen = 1; // Pg.22 , Initial speed detect (ISD) // 1 - enable
struct_drv10983.SysOpt1.bit.ISDThr = 0; // Pg.23 , ISD stationary judgment threshold // 0 - 6Hz(80ms,no zero cross)

struct_drv10983.SysOpt8.bit.IPDCurrThr = 4; // Pg.25 , IPD current threshold 0.2Ax(n+1) // 4 - 0.8A
struct_drv10983.SysOpt8.bit.IPDClk = 3; // Pg.25 , Inductive sense clock // 3 - 95Hz
struct_drv10983.SysOpt5.bit.IPDRlsMd = 1; // Pg.25 , IPD release mode (Brake.Recirculate.Clk) // 1 - recirculate mode
struct_drv10983.SysOpt1.bit.IPDAdvcAgl = 0; // Pg.26 , Advancing angle after inductive sense // 0 - 30* degree

struct_drv10983.SysOpt4.bit.AlignTime = 7; // Pg.27 , Align time // 7 - 0.04s
struct_drv10983.SysOpt2.bit.OpenLCurr = 3; // Pg.27 , Open loop current setting // 3 - 1.6A
struct_drv10983.SysOpt2.bit.OpLCurrRt = 2; // Pg.27 , Open loop current ramp-up rate setting // 2 - 1.5 Vcc/s
struct_drv10983.SysOpt3.bit.StAccel = 7; // Pg.27 , Open loop start-up accelerate (first order) // 7 - 0.3Hz/s
struct_drv10983.SysOpt3.bit.StAccel2 = 7; // Pg.27 , Open loop start-up accelarate (second order) // 7 - 0.22Hz/s2
struct_drv10983.SysOpt4.bit.Op2ClsThr = 10; // Pg.27 , Open to closed loop threshold// 0-15 = n*0.8Hz, 16-31=(n+1)*12.8Hz // 10 - 8Hz

struct_drv10983.SysOpt7.bit.ClsLpAccel = 7; // Pg.30 , Closed loop accelerate // 7 - 0.045/s
struct_drv10983.SysOpt9.bit.CLoopDis = 0; // Pg.47 , close loop disable // 0 - Transfer to closeloop

struct_drv10983.SysOpt6.bit.HWiLimitThr = 7; // Lock detection current limit threshold((n+1)x0.4A) // 7 - 3.2A
struct_drv10983.SysOpt6.bit.SWiLimitThr = 0; // Acceleration current limit threshold(nx0.2A) // 0 - no acceleration

// Pg.33 , Lock Detect and Fault Handling
struct_drv10983.SysOpt5.bit.LockEn0 = 0; // Pg.34 , Lock detection current limit // 0 - disable // 1 - enable
struct_drv10983.SysOpt5.bit.LockEn1 = 1; // Pg.34 , Abnormal speed // 1 - enable // 1 - enable
struct_drv10983.SysOpt5.bit.LockEn2 = 1; // Pg.35 , Abnormal Kt // 1 - enable // 1 - enable
struct_drv10983.SysOpt5.bit.LockEn3 = 1; // Pg.35 , no motor fault // 1 - enable // 1 - enable
struct_drv10983.SysOpt8.bit.LockEn4 = 1; // Pg.36 , Open loop stuck(no zero cross detected) // 1 - enable// 1 - enable
struct_drv10983.SysOpt7.bit.LockEn5 = 1; // Pg.36 , Stuck in closed loop(no zero cross detected) // 1 - enable// 1 enable

struct_drv10983.SysOpt9.bit.KtLckThr = 3; // Abnormal Kt lock detect threshold // 3 - Kt_high=2Kt, Kt_low=1/2Kt

struct_drv10983.MotorParam1.bit.DoubleFreq = 0; // Pg.44 , Set Driver Output // 0 - 25 kHz
struct_drv10983.SysOpt7.bit.Deadtime = 10; // Pg.37 , dead time btn HS & LS gate drive (n+1)40ns // 10 - 440ns
struct_drv10983.MotorParam3.bit.CtrlAdvMd = 0; // Pg.31 , Motor commutate time // 0 - Fixed time
struct_drv10983.SysOpt3.bit.CtrlCoef = 3; // Pg.31 , Control Coefficient // 3 - 1
struct_drv10983.MotorParam2.bit.AdjMode = 1; // Pg.28 , Closed loop Full cycle adjustment // 1 - half cycle
struct_drv10983.MotorParam3.bit.Tdelay = 0x6B; // Pg.31 , Commutation Control Advance Angle (2.5us*TCtrlAdv) // 6B -
struct_drv10983.SysOpt9.bit.SpdCtrlMd = 1; // Pg.47 , Speed input mode // 1 = PWM input
// Pg.36 , AVS(Anti Voltage Surge)
struct_drv10983.SysOpt5.bit.AVSIndEn = 1; // Pg.46 , No available function // 1
struct_drv10983.SysOpt5.bit.AVSMEn = 0; // Pg.46 , Mechanical AVS Disable
struct_drv10983.SysOpt5.bit.AVSMMd = 0; // Pg.46 , Mechanical AVS mode // 0 - AVS to Vcc

struct_drv10983.SysOpt9.bit.FGcycle = 3; // Pg.47 , FG cycle select // 3 - 1 pulse output per 3 electrical cycle
struct_drv10983.SysOpt9.bit.FGOLsel = 0; // Pg.47 , FG open loop output select // 0 - FG outputs in both open loop and closed loop
 
Look at paragraph 8.4.2.1 in the datasheet; how the driver syncs to motor position.

One option is to initially force the motor into a set alignment, which can make it jerk before starting up.
The other option tries to measure the rotor position from the winding inductance. If that does not work, presumably it will pull it to the set position anyway?

 
Jerk is defined as the derivative of acceleration or current with intensity a product of time. Torque @ 0 RPM is equivalent is typically 10x current at rated load and 100x no-load max RPM current.

It depends on your design specs (unknown)
1. Minimum time seek to target speed?
2. Initial acceleration or current limit ( which affects power source )
3. Specified jerk rate such as a damped pendulum limit which equates to a conversion to a linear displacement ( which bus drivers should use)
4. conservative stress limits for moving parts ( which affects bearing aging )
5. Other

Method of seeking solution depends on rotational load ranges, friction, and how to specify excessive jerk and if you want to make it adaptive by smart feedback.
1. incremental changes, trial & error T&E
2. binary doubling sensitivity T&E
3. Taguchi method of multi-parameter sensitivity changes for optimization
4. Binary search method: test a limit then divide by 2 on each iteration if high or low ( like SAR ADC)

Ultimately the best Design Verification Test (DVT) plan is to define the design spec 1st then verify it with a planned test and measurement setup like min max load, min max voltage, min max temperature. j = da / dt = A/s or Hz/s = ___ under all conditions. Where A/s is initially limited by Tau=L/DCR


Options: with ideas from Grok in italics

1. increase struct_drv10983.SysOpt4.bit.AlignTime = 0x7 (0.04s) is too short ( try incremental changes)
2. Slow down the ramp-up rate (OpLCurrRt = 1 for 0.75 Vcc/s or 0x00 for 0.38 Vcc/s). ( this seems to be a good Jerk method but only 2 options)
3. Reduce OpenLCurr to a lower value from 0x3 to 0x2 or 0x1 (1.6A, 1,2A, 0.8A)
4. You didn't specify if Jerk was too +ve or too -ve
"Open Loop Acceleration Too Slow:
  • StAccel = 7 (0.3 Hz/s) and StAccel2 = 7 (0.22 Hz/s²) indicate a very slow acceleration profile. While this shouldn’t directly cause jerking, it might exacerbate the issue if the rotor loses synchronization after a sudden current application in the align-to-open-loop transition.
  • Fix: Experiment with slightly higher acceleration, e.g., StAccel = 0x0A (0.75 Hz/s), to smooth the transition while ensuring the motor can follow."
5. If the fan is stationary or has high inertia, the ISD might misjudge the state, leading to an abrupt start. Fix: Try disabling ISD (ISDen = 0) to force the align phase to take full control of rotor positioning, or increase ISDThr (e.g., 0x01 for 9 Hz) to give more time for detection.


Anecdotal
Above is not a refined answer as I do not know how to use this IC but I do have some servo, BLDC and stepper experience.

Back in the 80's when HDDs used brushless linear or rotary actuators many HDD companies provided me samples to test to get qualified for corporate to buy in large qty. My 3rd career move was as a Test Engineer at Burroughs and to reverse engineer and test HDD's, I only knew as those things that spin around. Starting with stepper motors at only 6 MB I learnt how Hitachi/NPL controlled acoustic jerks that cause overshoot with a thin rotary viscous damper and had acceleration profiles for steppers to optimize seek times. Later from Maxtor I learn how the fastest HDD on a single PCB was the Maxtor's R2D2 sounding HDD. I had serial number 6. It sounded like R2D2 during "autocal" which was correct by design improvements in the late 80's. Starting up the servo was somewhat like how a modem calibrates a telephone line EQ before connecting data on twisted pairs. This servo drive measured various seek times using various patterns like incrmental butterfly pattern and incremental steps over the range as the magnet force was not constant which affects the torque and servo loop gain error and over/undershoot. But the voice coil was really a loud speaker ! They were the fastest and noise was comprised on startup. The thing they did extremely well was to power up and measure all the critical motor paremeters to optimize seek time with near zero overshoot using current sensing and magnetic dedicated servo position sensing, and acceleration current sensing to create a target velocity and PID conrol on position error before reading or writing data. HDD servo design has advanced orders of magnitude over the decades with extremely fast, quiet and reliable results. I have yet to find a more complex product design in a similar size box which has evolved in 6 decades of engineering yet made so inexpensive and reliable. This opportunity also taught me how to refine my craft in designing DVTs for any product that got me an offer as QA Mgr at Seagate.

The lesson learnt was you create excellent motor control by target specs and autocal measurements, by design, not just trial and error.
 
I am using LPC804M101JD24 & DRV10983 for BLDC fan control. The issue I am facing is that the fan jerks when turned ON. After initial jerk, it runs fine through various speeds. The motor parameters I have set is listed below. Please help me in finding which of them is not set properly and causes jerking.
Thank you.

// ---------------------------------------- Parameter Config ---------------------------------------- //
// ----------- Setup ----------- EEPROM MotorParameter of DRV10983 ----------- //

struct_drv10983.MotorParam1.bit.Rm = 0x48; // Pg.19 , Rm (Motor Phase Resistance) // 0x48 - 1.23Ohm
struct_drv10983.MotorParam2.bit.Kt = 0x5A; // Pg.20 , Kt (BEMF Constant) // 0x69 - 528mV/Hz

struct_drv10983.SysOpt8.bit.VregSel = 1; // Pg.14 , Buck Regulator Voltage // 1 - 3.3V

struct_drv10983.SysOpt2.bit.BrkDoneThr = 4; // Pg.24 , Braking Mode Setting // 4 - 0.33s

struct_drv10983.SysOpt1.bit.RvsDrThr = 0; // Pg.22 , Reverse Drive Threshold // 0 - 6.3Hz
struct_drv10983.SysOpt1.bit.RvsDrEn = 0; // Pg.22 , Reverse drive enable // 0 - disable

struct_drv10983.SysOpt1.bit.ISDen = 1; // Pg.22 , Initial speed detect (ISD) // 1 - enable
struct_drv10983.SysOpt1.bit.ISDThr = 0; // Pg.23 , ISD stationary judgment threshold // 0 - 6Hz(80ms,no zero cross)

struct_drv10983.SysOpt8.bit.IPDCurrThr = 4; // Pg.25 , IPD current threshold 0.2Ax(n+1) // 4 - 0.8A
struct_drv10983.SysOpt8.bit.IPDClk = 3; // Pg.25 , Inductive sense clock // 3 - 95Hz
struct_drv10983.SysOpt5.bit.IPDRlsMd = 1; // Pg.25 , IPD release mode (Brake.Recirculate.Clk) // 1 - recirculate mode
struct_drv10983.SysOpt1.bit.IPDAdvcAgl = 0; // Pg.26 , Advancing angle after inductive sense // 0 - 30* degree

struct_drv10983.SysOpt4.bit.AlignTime = 7; // Pg.27 , Align time // 7 - 0.04s
struct_drv10983.SysOpt2.bit.OpenLCurr = 3; // Pg.27 , Open loop current setting // 3 - 1.6A
struct_drv10983.SysOpt2.bit.OpLCurrRt = 2; // Pg.27 , Open loop current ramp-up rate setting // 2 - 1.5 Vcc/s
struct_drv10983.SysOpt3.bit.StAccel = 7; // Pg.27 , Open loop start-up accelerate (first order) // 7 - 0.3Hz/s
struct_drv10983.SysOpt3.bit.StAccel2 = 7; // Pg.27 , Open loop start-up accelarate (second order) // 7 - 0.22Hz/s2
struct_drv10983.SysOpt4.bit.Op2ClsThr = 10; // Pg.27 , Open to closed loop threshold// 0-15 = n*0.8Hz, 16-31=(n+1)*12.8Hz // 10 - 8Hz

struct_drv10983.SysOpt7.bit.ClsLpAccel = 7; // Pg.30 , Closed loop accelerate // 7 - 0.045/s
struct_drv10983.SysOpt9.bit.CLoopDis = 0; // Pg.47 , close loop disable // 0 - Transfer to closeloop

struct_drv10983.SysOpt6.bit.HWiLimitThr = 7; // Lock detection current limit threshold((n+1)x0.4A) // 7 - 3.2A
struct_drv10983.SysOpt6.bit.SWiLimitThr = 0; // Acceleration current limit threshold(nx0.2A) // 0 - no acceleration

// Pg.33 , Lock Detect and Fault Handling
struct_drv10983.SysOpt5.bit.LockEn0 = 0; // Pg.34 , Lock detection current limit // 0 - disable // 1 - enable
struct_drv10983.SysOpt5.bit.LockEn1 = 1; // Pg.34 , Abnormal speed // 1 - enable // 1 - enable
struct_drv10983.SysOpt5.bit.LockEn2 = 1; // Pg.35 , Abnormal Kt // 1 - enable // 1 - enable
struct_drv10983.SysOpt5.bit.LockEn3 = 1; // Pg.35 , no motor fault // 1 - enable // 1 - enable
struct_drv10983.SysOpt8.bit.LockEn4 = 1; // Pg.36 , Open loop stuck(no zero cross detected) // 1 - enable// 1 - enable
struct_drv10983.SysOpt7.bit.LockEn5 = 1; // Pg.36 , Stuck in closed loop(no zero cross detected) // 1 - enable// 1 enable

struct_drv10983.SysOpt9.bit.KtLckThr = 3; // Abnormal Kt lock detect threshold // 3 - Kt_high=2Kt, Kt_low=1/2Kt

struct_drv10983.MotorParam1.bit.DoubleFreq = 0; // Pg.44 , Set Driver Output // 0 - 25 kHz
struct_drv10983.SysOpt7.bit.Deadtime = 10; // Pg.37 , dead time btn HS & LS gate drive (n+1)40ns // 10 - 440ns
struct_drv10983.MotorParam3.bit.CtrlAdvMd = 0; // Pg.31 , Motor commutate time // 0 - Fixed time
struct_drv10983.SysOpt3.bit.CtrlCoef = 3; // Pg.31 , Control Coefficient // 3 - 1
struct_drv10983.MotorParam2.bit.AdjMode = 1; // Pg.28 , Closed loop Full cycle adjustment // 1 - half cycle
struct_drv10983.MotorParam3.bit.Tdelay = 0x6B; // Pg.31 , Commutation Control Advance Angle (2.5us*TCtrlAdv) // 6B -
struct_drv10983.SysOpt9.bit.SpdCtrlMd = 1; // Pg.47 , Speed input mode // 1 = PWM input
// Pg.36 , AVS(Anti Voltage Surge)
struct_drv10983.SysOpt5.bit.AVSIndEn = 1; // Pg.46 , No available function // 1
struct_drv10983.SysOpt5.bit.AVSMEn = 0; // Pg.46 , Mechanical AVS Disable
struct_drv10983.SysOpt5.bit.AVSMMd = 0; // Pg.46 , Mechanical AVS mode // 0 - AVS to Vcc

struct_drv10983.SysOpt9.bit.FGcycle = 3; // Pg.47 , FG cycle select // 3 - 1 pulse output per 3 electrical cycle
struct_drv10983.SysOpt9.bit.FGOLsel = 0; // Pg.47 , FG open loop output select // 0 - FG outputs in both open loop and closed loop
If the IPD current threshold is too low, the motor may not detect the initial rotor position correctly. Try to increase IPDCurrThr to 1.0A or 1.2A.
 

Latest threads

New Articles From Microcontroller Tips

Back
Top