Pages: [1]   Go Down
Author Topic: Brushless Motor Become Slower when combined with the IMU  (Read 996 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 72
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi Everyone, i have a problem with brushless motor programming. I am not using ESC, but use L6234D as a motor driver. So far, i have successfully make my brushless motor rotating well.

Here is my arduino sketch for rotating Brushless Motor foy my Gimbal:
Code:
// constants won't change. They're used here to
// set pin numbers:
const int motorPin1 =3;
const int motorPin2 =6;
const int motorPin3 =5;

// Variables will change:
boolean direct = true; // direction true=forward, false=backward

int pwmSin[] = {127,110,94,78,64,50,37,26,17,10,4,1,0,1,4,10,17,26,37,50,64,78,94,110,127,144,160,176,191,204,217,228,237,244,250,253,254,253,250,244,237,228,217,204,191,176,160,144,127
}; // array of PWM duty values for 8-bit timer - sine function

 
//int pwmSin[]={511,444,379,315,256,200,150,106,68,39,17,4,0,4,17,39,68,106,150,200,256,315,379,444,511,578,643,707,767,822,872,916,954,983,1005,1018,1022,1018,1005,983,954,916,872,822,767,707,643,578,511
//}; // array of PWM duty values for 10-bit timer - sine function
 
int increment;
int currentStepA=0;
int currentStepB=16;
int currentStepC=32;

// the following variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
//long motorDelayActual = 0;  // the actual delay, based on pot value and motor delay set above
long lastMotorDelayTime = 0;

void initBLDC() {

  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  
  //TCCR1B = TCCR1B & 0b11111000 | 0x01; // set PWM frequency @ 31250 Hz for Pins 9 and 10
  TCCR2B = TCCR2B & 0b11111000 | 0x01; // set PWM frequency @ 31250 Hz for Pins 11 and 3 (3 not used)

 

  ICR1 = 255 ; // 8 bit resolution
  //ICR1 = 1023 ; // 10 bit resolution

}

 
void setup() {
  
  initBLDC();
  
}


void loop() {

BLDCmove();
    
}
 
 
 
void BLDCmove() {
if((millis() - lastMotorDelayTime) > 0)
{ // delay time passed, move one step
 
  if (direct==true)
  {
    increment = 1;
    
  currentStepA = currentStepA + increment;
  if(currentStepA > 47) currentStepA = 0;
  if(currentStepA<0) currentStepA =47;
  
  currentStepB = currentStepB + increment;
  if(currentStepB > 47) currentStepB = 0;
  if(currentStepB<0) currentStepB =47;
  
    currentStepC = currentStepC + increment;
  if(currentStepC > 47) currentStepC = 0;
  if(currentStepC<0) currentStepC =47;
  
  }
  
  
  if (direct==false)
  {
    increment = -1;
    
  currentStepA = currentStepA + increment;
  if(currentStepA > 47) currentStepA = 0;
  if(currentStepA<0) currentStepA =47;
  
  currentStepB = currentStepB + increment;
  if(currentStepB > 47) currentStepB = 0;
  if(currentStepB<0) currentStepB =47;
  
    currentStepC = currentStepC + increment;
  if(currentStepC > 47) currentStepC = 0;
  if(currentStepC<0) currentStepC =47;
  }
  
lastMotorDelayTime = millis();

}
  
analogWrite(motorPin1, pwmSin[currentStepA]);
analogWrite(motorPin2, pwmSin[currentStepB]);
analogWrite(motorPin3, pwmSin[currentStepC]);
  
}

Then, i combine the code above with my IMU sketch, The code is here:
https://github.com/mamette/Brushless/blob/master/brushless_IMU.ino

The result is my brushless motor rotating much slower. Is IMU processing affected my brushless motor speed?

Thank You..
« Last Edit: June 12, 2013, 07:47:56 pm by mamette » Logged

0
Online Online
Shannon Member
****
Karma: 207
Posts: 12199
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Could you explain more about the hardware - what kind of brushless motor?  What is your approach to commutation?
What pins are controlling / sensing what?  And what interrupts are you using?
Logged

[ I won't respond to messages, use the forum please ]

Dubuque, Iowa, USA
Offline Offline
Faraday Member
**
Karma: 47
Posts: 2517
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

There are no interrupts being used in his code posted on GitHub.

You're going to need to be more clever in how you set up the scheduling of the various functions of your gimbal. It looks like in your code you considered implementing a timer interrupt and that is probably the best way to run things. Decide how quickly you want your gimbal motors to be able to turn and set up an interrupt so that those motors are always updated with that frequency. All of the other tasks of reading from the gyros/accelerometer or calculating the kalman filter, etc. should be considered secondary; you don't need to be doing everything on every loop().
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 72
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Could you explain more about the hardware - what kind of brushless motor?  What is your approach to commutation?
What pins are controlling / sensing what?  And what interrupts are you using?

I use this board:
https://www.hobbyking.com/hobbyking/store/__27033__MultiWii_328P_Flight_Controller_w_FTDI_DSM2_Port.html

And this is the motor:
http://www.rctimer.com/index.php?gOo=goods_details.dwt&goodsid=871&productname=

And i use L6234D as a motor driver:
http://www.st.com/st-web-ui/static/active/cn/resource/technical/document/application_note/CD00004062.pdf

I use 3 phase sine wave PWM signal to commutate the motor, i use pins 3, 6 and 5 for PWM, and I not use interrupts (may be this is the problem).


There are no interrupts being used in his code posted on GitHub.

You're going to need to be more clever in how you set up the scheduling of the various functions of your gimbal. It looks like in your code you considered implementing a timer interrupt and that is probably the best way to run things. Decide how quickly you want your gimbal motors to be able to turn and set up an interrupt so that those motors are always updated with that frequency. All of the other tasks of reading from the gyros/accelerometer or calculating the kalman filter, etc. should be considered secondary; you don't need to be doing everything on every loop().

Ok, i will try to use interrupts..
« Last Edit: June 12, 2013, 08:04:42 pm by mamette » Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 72
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Well, i try to use Interrupt, and the code is like this:

Code:
// constants won't change. They're used here to
// set pin numbers:
const int motorPin1 =3;
const int motorPin2 =6;
const int motorPin3 =5;

// Variables will change:
boolean direct = true; // direction true=forward, false=backward

int pwmSin[] = {127,110,94,78,64,50,37,26,17,10,4,1,0,1,4,10,17,26,37,50,64,78,94,110,127,144,160,176,191,204,217,228,237,244,250,253,254,253,250,244,237,228,217,204,191,176,160,144,127
}; // array of PWM duty values for 8-bit timer - sine function

 
//int pwmSin[]={511,444,379,315,256,200,150,106,68,39,17,4,0,4,17,39,68,106,150,200,256,315,379,444,511,578,643,707,767,822,872,916,954,983,1005,1018,1022,1018,1005,983,954,916,872,822,767,707,643,578,511
//}; // array of PWM duty values for 10-bit timer - sine function
 
int increment;
int currentStepA=0;
int currentStepB=16;
int currentStepC=32;

// the following variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
//long motorDelayActual = 0;  // the actual delay, based on pot value and motor delay set above
long lastMotorDelayTime = 0;

void initBLDC() {

  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  
  //TCCR1B = TCCR1B & 0b11111000 | 0x01; // set PWM frequency @ 31250 Hz for Pins 9 and 10
  TCCR2B = TCCR2B & 0b11111000 | 0x01; // set PWM frequency @ 31250 Hz for Pins 11 and 3 (3 not used)
  //TCCR0B = TCCR0B & 0b11111000 | 0x01; // set PWM frequency @ 31250 Hz for Pins 5 and 6
  
  ICR1 = 255 ; // 8 bit resolution
  //ICR1 = 1023 ; // 10 bit resolution
  TIMSK2 |= _BV(TOIE1);
  sei();

  // Enable Timer1 Interrupt for Motor Control
  OCR0A = 0;
  OCR0B = 0;
  OCR1A = 0;
  OCR1B = 0;  
  OCR2A = 0;  
  OCR2B = 0;  
}


ISR(TIMER2_OVF_vect) {  
 if((millis() - lastMotorDelayTime) > 0)
{ // delay time passed, move one step
 
  if (direct==true)
  {
    increment = 1;
    
  currentStepA = currentStepA + increment;
  if(currentStepA > 47) currentStepA = 0;
  if(currentStepA<0) currentStepA =47;
  
  currentStepB = currentStepB + increment;
  if(currentStepB > 47) currentStepB = 0;
  if(currentStepB<0) currentStepB =47;
  
    currentStepC = currentStepC + increment;
  if(currentStepC > 47) currentStepC = 0;
  if(currentStepC<0) currentStepC =47;
  
  }
  
  
  if (direct==false)
  {
    increment = -1;
    
  currentStepA = currentStepA + increment;
  if(currentStepA > 47) currentStepA = 0;
  if(currentStepA<0) currentStepA =47;
  
  currentStepB = currentStepB + increment;
  if(currentStepB > 47) currentStepB = 0;
  if(currentStepB<0) currentStepB =47;
  
    currentStepC = currentStepC + increment;
  if(currentStepC > 47) currentStepC = 0;
  if(currentStepC<0) currentStepC =47;
  }
  
lastMotorDelayTime = millis();

}
  
analogWrite(motorPin1, pwmSin[currentStepA]);
analogWrite(motorPin2, pwmSin[currentStepB]);
analogWrite(motorPin3, pwmSin[currentStepC]);
  
};  

void setup() {
 
  initBLDC();
  
}


void loop() {

  //IMU Code Here
    
}
 

But, it is didn't works. Looks like the brushless motor not commutating, motor just hold it's position..

I know my code is wrong, but i can't find the wrong part, i think i need help here..
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 72
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Is there anybody can help me?
Logged

Pages: [1]   Go Up
Jump to: