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.

DRV8308: Unable to achieve low RPMs in closed-loop mode

Part Number: DRV8308

We are using a 77W 8-pole BLDC with the DRV8308.  Our application is a small outdoor vehicle which will hold up to 20kg.  The starting speed must be very slow (around 1km/h).

Using the DRV8308 EVM and our own PCB, we are unable to get closed-loop to get a solid LOCKn at any speed lower than 60Hz.

60Hz translates to around 1.2km/h on our vehicle, but going from 0Hz straight to 60Hz results in a very sudden jerking motion.  If we choose any speed lower than 60Hz (eg. 30Hz) we get shuddering/stuttering in the BLDC, and it's very hard to regain control (have have to choose a target speed of >100Hz to regain control).

What can we do to get the DRV8308 to obtain a lock at low speeds?

Thanks so much for your help.

  • Hi Andrew,

    What register settings are you using?
    What registers settings have you tried, and what are the results?
  • Hi Rick,

    Below is the results that we had, followed by the register settings used to get there.

    Fclkin is the input that we used to try to start the BLDC from stationary.  The table shows what LOOPGN value I needed to get it going.
    Currently, I just pick one LOOPGN value at initialization and leave it at that.

    Here are the register settings that I use to initialize the DRV8308.  The comments reflect what we have modified.
    Let me know if there's anything I can do to make it more readable.

    // CTRL1 Register
    G_CTRL1_REG.Address = 0x00;
    G_CTRL1_REG.AG_SETPT = 0x7; //andrew: AG_SetPt: //4 - 48Hz //7 - 382Hz.
    G_CTRL1_REG.ENPOL = 0x0;
    G_CTRL1_REG.DIRPOL = 0x0;
    G_CTRL1_REG.BRKPOL = 0x0;
    G_CTRL1_REG.SYNRECT = 0x1;
    G_CTRL1_REG.PWMF = 0x1; //andrew: 50kHz.
    G_CTRL1_REG.SPDMODE = 0x0; //andrew: Closed-loop clock-freq mode.
    G_CTRL1_REG.FGSEL = 0x0; //andrew: HALL-U.
    G_CTRL1_REG.BRKMOD = 0x0;
    G_CTRL1_REG.RETRY = 0x1;

    // ADVANCE Register
    G_ADVANCE_REG.Address = 0x01;
    G_ADVANCE_REG.ADVANCE = 0x21; //andrew: ADVANCE of 33 (default).

    // COMCTRL1 Register
    G_COMCTRL1_REG.Address = 0x02;
    G_COMCTRL1_REG.SPDREVS = 0x03;
    G_COMCTRL1_REG.MINSPD = 0xB4;

    // MOD120 Register
    G_MOD120_REG.Address = 0x03;
    G_MOD120_REG.BASIC = 0x0;
    G_MOD120_REG.SPEEDTH = 0x4; //andrew: LOCKn tolerance 0x4 - 3.13%. //0x6 - 12.5%.
    G_MOD120_REG.MOD120 = 0xF82; //andrew: MOD120: 3,970 (as per datasheet).

    // DRIVE Register
    G_DRIVE_REG.Address = 0x04;
    G_DRIVE_REG.LRTIME = 0x0;
    G_DRIVE_REG.HALLRST = 0x0;
    G_DRIVE_REG.DELAY = 0x0;
    G_DRIVE_REG.AUTOADV = 0x0; //andrew: Auto phase-advance OFF.
    G_DRIVE_REG.AUTOGN = 0x0; //andrew: Auto LOOPGAIN adjustment OFF (unstable at low RPMs).
    G_DRIVE_REG.ENSINE = 0x0;
    G_DRIVE_REG.TDRIVE = 0x1;
    G_DRIVE_REG.DTIME = 0x0;
    G_DRIVE_REG.IDRIVE = 0x0;

    // SPDGAIN Register
    G_SPDGAIN_REG.Address = 0x05;
    G_SPDGAIN_REG.INTCLK = 0x2; //andrew: INTCLK: 2 - 12.5MHz, INTCLK: 4 - 3.1 MHz, 5 - 1.6MHz (integrator clk). Higher INTCLK results in more overshooting.
    G_SPDGAIN_REG.SPDGAIN = 0x001; //andrew: SPEEDGAIN of '1' is most stable.

    // FILK1 Register
    G_FILK1_REG.Address = 0x06;
    G_FILK1_REG.HALLPOL = 0x1; //andrew: HALLPOL inverted (don't touch).
    G_FILK1_REG.BYPFILT = 0x0; //andrew: Do not bypass the filter (don't touch).
    G_FILK1_REG.FILK1 = 0x12C; //0x2BC; //0x4DB; //andrew: Filter Pole1 at 610Hz (finely adjusted, don't touch).

    // FILK2 Register
    G_FILK2_REG.Address = 0x07;
    G_FILK2_REG.FILK2 = 0x4D1; //andrew: Filter Zero1 at 75hz (finely adjusted, don't touch).

    // COMPK1 Register
    G_COMPK1_REG.Address = 0x08;
    G_COMPK1_REG.BYPCOMP = 0x1; //andrew: Do bypass the compensator.
    G_COMPK1_REG.COMPK1 = 0x12C; //andrew: Pole2 at 146Hz (default), but is being bypassed.

    // COMPK2 Register
    G_COMPK2_REG.Address = 0x09;
    G_COMPK2_REG.AA_SETPT = 0x0; //andrew: AA_SETPT: 0 - 3Hz (default), but AA bypassed.
    G_COMPK2_REG.COMPK2 = 0x258; //andrew: Zero2 at 36Hz (default), but is being bypassed.

    // LOOPGN Register
    G_LOOPGN_REG.Address = 0x0A;
    G_LOOPGN_REG.OCPDEG = 0x3; //andrew: Deglitch time (5us)(default); don't touch.
    G_LOOPGN_REG.OCPTH = 0x3; //andrew: OCP threshold (1V) (default); don't touch.
    G_LOOPGN_REG.OVTH = 0x0; //andrew: OV threshold (0) (default); don't touch.
    G_LOOPGN_REG.VREF_EN = 0x0; //andrew: VREGEN (0) (default); don't touch.
    G_LOOPGN_REG.LOOPGN = 30; //andrew: (decimal) LOOPGAIN necessary to start at FGOUT = 60Hz.

    // SPEED Register
    G_SPEED_REG.Address = 0x0B;
    G_SPEED_REG.SPEED = 1400; //andrew: Open-loop max speed. Set at 8,000 RPM (0x1F40). //4,000 = 0xFA0

    // FAULT Register
    G_FAULT_REG.Address = 0x2A; //andrew: Don't touch any of these for now.
    G_FAULT_REG.RLOCK = 0x0;
    G_FAULT_REG.VMOV = 0x0;
    G_FAULT_REG.CPFAIL = 0x0;
    G_FAULT_REG.UVLO = 0x0;
    G_FAULT_REG.OTS = 0x0;
    G_FAULT_REG.CPOC = 0x0;
    G_FAULT_REG.OCP = 0x0;

  • Hi Andrew,

    We will have to investigate further. While we are investigating, would you please try the lower Fclkin with G_MOD120_REG.BASIC = 0x1; and report your findings.

    Thanks.
  • Hi Rick,

    Thanks for your prompt reply.
    I tried G_MOD120_REG.BASIC = 0x1, but unfortunately there's no improvement; the minimum speed that the BLDC can start is the same.

    Andrew