cancel
Showing results for 
Search instead for 
Did you mean: 

Blocking BLDC motor at zero speed.

DTort.1
Associate III

I am using board B-G431B-ESC1 and Motor Control 5.Y.3. How to implement BLDC blocking at zero speed. I have Hall sensors in the motors, but there is no encoder so I cannot control the position. I do not need position control, I just need a lock, and if the rotor is displaced, then I don’t need to go back, but just continue to lock. I see this as passing direct current (PWM) through the windings or possibly alternately turning on the motor with forward and reverse rotation. How can this be done?

Thanks in advance!

12 REPLIES 12
Javier1
Principal

how long (time) and strong (power) do you need this lock to be?

we dont need to firmware by ourselves, lets talk

Since this can lead to overheating of the windings, these are short periods of time, perhaps tens of seconds. That is, this is not a permanent mode of operation, but for some time after reaching zero speed, I would like to be able to block the BLDC. An approximate power of 50W will suit me, but if it can be made controllable, then it will be even better.

Which modulation are you using? FOC, trapezoidal ...

I know that FOC supports regen braking... you can even set the max Current (power) of the braking

we dont need to firmware by ourselves, lets talk

FOC,

Yes it supports regenerative braking at a speed other than zero, but there is no solution when the motor is stopped. I need a static stopping torque.

I have come across the definition of "DC Vector" when looking for information.

Im not familiar with st foc api but cant you do something like setspeed(0)?

Could you give me some link for "DC vector"?

we dont need to firmware by ourselves, lets talk

Unfortunately, it won't work that way, yes, there is an api function MC_ProgramSpeedRampMotor1 (0, 100);

where the first argument is speed and the second is time, but it works by PID speed error control. That is, while the speed error is zero and there is no torque. Rotation resistance appears, but very weak if the motor is rotated.

DTort.1
Associate III

In general, I solved my problem. The idea is to turn on the PWM on one phase then the PWM will control the blocking torque.

I just did it manually via HAL functions, I hope it won't lead to problems when returning to control via the Motor Control library.

If someone knows a more beautiful and correct way to do this, please write here.

MC_StopMotor1();
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);
TIM1->CCR1 = 500;

0693W00000HoHsrQAF.png

Shorting all three LOW or HIGH side mosfets will short the induced current in the motor to fixed potential ground/vcc.

This gives you a better braking strength when stopped or low speeds indeed. (when the EMC fields built in iside the coils doesnt need to colapse because there is no EMC built in yet)

Im not familiar with the st control api but if you find something like setFOCstep( stepNumber)

You would want to set it to setFOCstep(7)

or (1,1,1)

0693W00000HoLv6QAF.png0693W00000HoLvGQAV.pnghttps://microchipdeveloper.com/mct5001:space-vector-modulation

we dont need to firmware by ourselves, lets talk

Thanks for your reply! Yes, turning on all the lower transistors is what I have already considered. It turns out to be a good idea for dynamic braking at low speed, when regenerative braking can no longer work, but no braking torque is generated at zero speed. That is, in essence, the braking torque in this method is a function of the rotational speed. The faster we are to crank, the more difficult it becomes. If turn the rotor slowly, there will be almost no resistance.

This method is essentially a special case of mine when the PWM duty cycle of the first phase is equal to 0 and we get the first small braking torque,

TIM1->CCR1 = 0;

then increasing the PWM braking torque increases.

TIM1->CCR1 = 500;

The Motor Control library contains functions for this:

/**
  * It turns on low sides switches. This function is intended to be
  * used for charging boot capacitors of driving section. It has to be
  * called each motor start-up when using high voltage drivers
  */
void R3_2_TurnOnLowSides( PWMC_Handle_t * pHdl );