BLDC controllers are very new with respect the classical DC motor controllers, mainly taking into account position control. The objective of this repo is to gather studies to help design of robots (small and big) with BLDC.
Find in this Repo the STL Files used to test the two motors. Find also STL files for the USB-CAN Box for the Tinymovr kit.
Motor 1 | Motor 2 | |
---|---|---|
Picture | ||
Ref | Eachine 2204-2300KV | MAD component 5005-280KV |
Resistance/phase(milliOhms) | 170 | 100 |
Inductance/phase(microHenri) | 10 | 76 |
Outer diameter(mm) | 28 | 56 |
Max quadratic current Iq in coils | 12 A | 18 A |
Purpose | Fast/silent animatronics (eye) | Powerful robotic articulation |
Documentation Here, the tinymovr controller board is powered by a DC power supply 15V - 10A. The communication is done via a standard FTDI USB - UART device (for experiment purpose here... Later via CAN bus) By default, Iq is limited to 10A and speed to 300000ticks/s 1 turn is 8192 ticks.
Iq = (Ia/sqrt(3) + 2*Ib/sqrt(3))cos(theta) - Iasin(theta)
Torque (N.m) = Kc*Iq(A)
U(V) = Kv*Omega(rad/s)
Knowing that Kc = 1/Kv
The power in the system is used in internal resistor, controller and to general mechanical movement
P_in = P_Joule + P_controller + P_mecha
P_in = U_in.I_in = I_q.I_q.R + P_controller + C*Omega
P_controller in control state is here 0.060A for 15V => 1W
To get the input current when motor is blocked (consider power of controller is small enough) :
I_in = R.I_q.I_q/U_in
the motor is set next to a weighing scale with a lever arm of 95mm. Input voltage : 15V.
Position target (ticks) | Motor current Iq (A) | Input current Iinput (A) | weight (g) | torque (N.m) |
---|---|---|---|---|
0 | 0.918 | 0.060 | 0 | 0.000 |
1000 | -0.165 | 0.060 | 5 | 0.005 |
2000 | -3.640 | 0.120 | 13 | 0.012 |
3000 | -6.112 | 0.230 | 21 | 0.020 |
4000 | -8.710 | 0.420 | 29 | 0.028 |
5000 | -10.040 | 0.570 | 34 | 0.032 |
Find below the input current of the Tinymovr controller function of the current delivered in coils.
Find below the torque generated by the motor function of the current delivered in coils
Kc = Torque/Iphase = 0.032/10.04 = 0.0032 N.m/A
Kv = 1/Kc = 310.8 rad/s/V
KV = 2970 rpm/V
And find below the torque produced function of input current
the motor is set next to a weighing scale with a lever arm of 98mm. Input voltage : 15V.
Position target (ticks) | Motor current Iq (A) | Input current Iinput (A) | weight (g) | torque (N.m) |
---|---|---|---|---|
0 | 0.277 | 0.050 | 0 | 0.000 |
1000 | -1.983 | 0.090 | 50 | 0.048 |
2000 | -4.547 | 0.200 | 112 | 0.106 |
3000 | -6.995 | 0.420 | 175 | 0.166 |
4000 | -9.527 | 0.740 | 236 | 0.224 |
5000 | -9.973 | 0.840 | 247 | 0.235 |
6000 | -10.025 | 0.860 | 249 | 0.237 |
Find below the input current of the Tinymovr controller function of the current delivered in coils.
Find below the torque generated by the motor function of the current delivered in coils
Kc = Torque/Iphase = 0.032/10.04 = 0.0234 N.m/A
Kv = 1/Kc = 42.7 rad/s/V
KV = 407 rpm/V
And find below the torque produced function of input current
the motor is without load
Speed target (ticks/s) | Input amps (A) | Measured speed (ticks/s) |
---|---|---|
0 | 0.060 | 168 |
7000 | 0.060 | 506 |
8000 | 0.060 | 2373 |
10000 | 0.060 | 9880 |
20000 | 0.060 | 17605 |
40000 | 0.060 | 38343 |
80000 | 0.060 | 79606 |
160000 | 0.070 | 147904 |
320000 | 0.080 | 278386 |
640000 | 0.090 | 281503 |
See that until 10000 ticks/s, the measured speed is far from the commanded one. The rotor slips and is too slow. On the contrary, the high speed does not go above 300000 ticks/s. This is nominal since the speed is limited (can be tuned in Tinymovr)
the motor is without load
Speed target (ticks/s) | Input amps (A) | Measured speed (ticks/s) |
---|---|---|
0 | 0.060 | -0 |
5000 | 0.060 | -292 |
6000 | 0.060 | 4173 |
7000 | 0.060 | 4915 |
8000 | 0.060 | 5408 |
9000 | 0.060 | 7836 |
10000 | 0.060 | 8835 |
20000 | 0.090 | 75905 |
160000 | 0.140 | 166808 |
320000 | 0.470 | 270000 |
See that the motor can reach slower speeds even if it slips.
This part is in progress, waiting for CAN controllers. Here is a small video with serial communication. The position gain is small by default, that is why, the phase inversion occurs at a very low frequency (with respect to a classical DC controller like Dynamixel) The code is in this Repo (Leap2BLDCUART folder)
The folder MotorControl contains a Python3 script to control a brushless motor with a Tinymovr controller. Change the name of the serial port in the script before starting.
The key hacks are :
- Up arrow : hold position
- right arrow : decrease and hold position
- left arrow : increase and hold position
- z : set current position as zero
- c : calibrate
- r : reset the controller
- p : oscillate position between max and min current
- space : soft emergency stop
The belt reductor design is under progress, based on Open Dynamic Robot Initiative