1
\$\begingroup\$

I am trying to learn controlling BLDC motors without using an ESC, but using Arduino and a driver, instead. At home I found an old DVD driver and took out the motor, which was Nidec Slim 24C, http://www.nidec.com/en-NA/product/motor/category/A010/B010/P0000010/ , with 5-wires: u, v, w, COM, fg. I know, normally BLDC motors have three wires (u, v, w). I understand in this one COM is the center point, and fg is the feedback info line.

I had some L298N modules at home and decided to try them. Normally, with 3-wired BLDC one would wire the motor such that u-v, v-w, w-u, are energized. But with L298 it did not look so easy, I wired each pole against the COM, in sequence; and I was able to run the motor. Phases are connected to L298 output lines 1,2,3 and COM is connected to +5V on L298. Although not as fast as rated (6000rpm), but about 1000+ rpm, or so, smooth and quiet, I was able to get a stable (and high) speed by playing with the delay parameter between phases. Here is the simple Arduino code:

int u = 2;
int v = 3;
int w = 4;
int EN1 = 5;
int EN2 = 6;
int f = A0;

int val2 = 6000;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  pinMode(u, OUTPUT);
  pinMode(v, OUTPUT);
  pinMode(w, OUTPUT);
  pinMode(EN1, OUTPUT);
  pinMode(EN2, OUTPUT);
  pinMode(f, INPUT);
  digitalWrite(u, LOW);
  digitalWrite(v, LOW);
  digitalWrite(w, LOW);
  digitalWrite(EN1, HIGH);
  digitalWrite(EN2, HIGH);
  digitalWrite(w, HIGH);
  delayMicroseconds(val2);
  digitalWrite(u, HIGH);
}

void loop() {
  // put your main code here, to run repeatedly:
  delayMicroseconds(val2);
  digitalWrite(v, HIGH);
  digitalWrite(w, LOW);
  delayMicroseconds(val2);
  digitalWrite(w, HIGH);
  digitalWrite(u, LOW);
  delayMicroseconds(val2);  
  digitalWrite(u, HIGH);
  digitalWrite(v, LOW);
  if (val2 > 2000) {
    val2 -= 10;
    Serial.println(val2);
  }
}

My question is, whether this implementation is a correct one - to be used in the future for any BLDC motor?

  • By connecting each phase against the COM, do I loose any speed and/or torque?

  • With 3-wire only motor how would I use the same logic. Somwehere I read about "Virtual Center Point", by connecting all three phase leads together, with equal weight resistors in serial. Will that give me the same result as real center point?

EDIT1: Yes, "Virtual Center Point" works. I tested with 6 Ohm resistors connected serial to (secondary/parallel) leads, connected together, instead of COM pin, and it worked OK.

EDIT2: I modiefied the code, such that it slowly accelerates by decreasing the delay time. I could go down to 2000 microseconds, i.e., 2 milliseconds between phases. So, roughly I think one revolution takes about 10 milliseconds, which makes 100 revolutions per second, and 6000 rpm. My resistors had low wattage, so they got very hot (no current limitting or control), so I stop when I see 2000 microseconds.

\$\endgroup\$
1
\$\begingroup\$

For BLDC motor has 3-wire only (e.g, HDD brushless motor), i also able to make it run with L298. In my project, there is no "Virtual Center Point". I use 3 half of H-bridge to make 3 phase pulse for BLDC motor (3-wire).

If you interested, detail project is on my blog here: https://engineer2you.blogspot.com/2018/01/brushless-motor-l298-arduino.html Thank you.

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.