Pessoal,

Estou tendo dificuldades para manipular um motor Brushless, iPower GBM5208H de 200T, trifásico.

Não consigo fazer ele girar por completo, tentei de duas formas trabalhar com ele, mas não está fazendo muito sentido.

Nesse eu tentei de forma simples através de HIGH e LOW no Arduino.

Consegui o seguinte resultado mostrado neste vídeo: https://youtu.be/ruwCN2oBq78

--------------------------------------------------------------------------

int IN1 = 9;
int IN2 = 10;
int IN3 = 11;

int tempDelay = 1000;

void setup()
{
//Define os pinos como saida
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
Serial.begin(9600);
}

void loop()
{
Serial.println("INICIANDO...");


Serial.println("1");
digitalWrite(IN1, HIGH);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
delay(tempDelay);

Serial.println("2");
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
delay(tempDelay);

Serial.println("3");
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
delay(tempDelay);

Serial.println("4");
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
delay(tempDelay);

Serial.println("5");
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH);
delay(tempDelay);

Serial.println("6");
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
delay(tempDelay);


}

--------------------------------------------------------------------------

Agora, nesse eu tentei usando PWM

Consegui o seguinte resultado mostrado neste vídeo: https://youtu.be/Sa6QLaAhIbg

Com esse código, qualquer uma das variáveis pwmSin usadas têm o mesmo efeito:

--------------------------------------------------------------------------

// Slow and precise BLDC motor driver using SPWM and SVPWM modulation
// Part of code used from http://elabz.com/
// (c) 2015 Ignas Gramba www.berryjam.eu
//

const int IN1 = 9;
const int IN2 = 10;
const int IN3 = 11;


// SPWM (Sine Wave)
//const int pwmSin[] = {127, 138, 149, 160, 170, 181, 191, 200, 209, 217, 224, 231, 237, 242, 246, 250, 252, 254, 254, 254, 252, 250, 246, 242, 237, 231, 224, 217, 209, 200, 191, 181, 170, 160, 149, 138, 127, 116, 105, 94, 84, 73, 64, 54, 45, 37, 30, 23, 17, 12, 8, 4, 2, 0, 0, 0, 2, 4, 8, 12, 17, 23, 30, 37, 45, 54, 64, 73, 84, 94, 105, 116 };


/// SVPWM (Space Vector Wave)
const int pwmSin[] = {128, 147, 166, 185, 203, 221, 238, 243, 248, 251, 253, 255, 255, 255, 253, 251, 248, 243, 238, 243, 248, 251, 253, 255, 255, 255, 253, 251, 248, 243, 238, 221, 203, 185, 166, 147, 128, 109, 90, 71, 53, 35, 18, 13, 8, 5, 3, 1, 1, 1, 3, 5, 8, 13, 18, 13, 8, 5, 3, 1, 1, 1, 3, 5, 8, 13, 18, 35, 53, 71, 90, 109};


//const int pwmSin[] = {128, 132, 136, 140, 143, 147, 151, 155, 159, 162, 166, 170, 174, 178, 181, 185, 189, 192, 196, 200, 203, 207, 211, 214, 218, 221, 225, 228, 232, 235, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 249, 250, 250, 251, 252, 252, 253, 253, 253, 254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 254, 254, 253, 253, 253, 252, 252, 251, 250, 250, 249, 248, 248, 247, 246, 245, 244, 243, 242, 241, 240, 239, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 249, 250, 250, 251, 252, 252, 253, 253, 253, 254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 254, 254, 253, 253, 253, 252, 252, 251, 250, 250, 249, 248, 248, 247, 246, 245, 244, 243, 242, 241, 240, 239, 238, 235, 232, 228, 225, 221, 218, 214, 211, 207, 203, 200, 196, 192, 189, 185, 181, 178, 174, 170, 166, 162, 159, 155, 151, 147, 143, 140, 136, 132, 128, 124, 120, 116, 113, 109, 105, 101, 97, 94, 90, 86, 82, 78, 75, 71, 67, 64, 60, 56, 53, 49, 45, 42, 38, 35, 31, 28, 24, 21, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 8, 7, 6, 6, 5, 4, 4, 3, 3, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 8, 7, 6, 6, 5, 4, 4, 3, 3, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 21, 24, 28, 31, 35, 38, 42, 45, 49, 53, 56, 60, 64, 67, 71, 75, 78, 82, 86, 90, 94, 97, 101, 105, 109, 113, 116, 120, 124};


int currentStepA;
int currentStepB;
int currentStepC;
int sineArraySize;
int increment = 0;
boolean direct = 1; // direction true=forward, false=backward

//////////////////////////////////////////////////////////////////////////////

void setup() {

setPwmFrequency(IN1); // Increase PWM frequency to 32 kHz (make unaudible)
setPwmFrequency(IN2);
setPwmFrequency(IN3);

pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);

sineArraySize = sizeof(pwmSin)/sizeof(int); // Find lookup table size
int phaseShift = sineArraySize / 3; // Find phase shift and initial A, B C phase values
currentStepA = 0;
currentStepB = currentStepA + phaseShift;
currentStepC = currentStepB + phaseShift;

sineArraySize--; // Convert from array Size to last PWM array number
Serial.begin(9600);
}

//////////////////////////////////////////////////////////////////////////////

void loop() {

analogWrite(IN1, pwmSin[currentStepA]);
analogWrite(IN2, pwmSin[currentStepB]);
analogWrite(IN3, pwmSin[currentStepC]);

//Serial.print("A:");
Serial.print(pwmSin[currentStepA]);
Serial.print("\t");
Serial.print(pwmSin[currentStepB]);
Serial.print("\t");
Serial.print(pwmSin[currentStepC]);
Serial.print("\n");

if (direct==true) increment = 1;
else increment = -1;

currentStepA = currentStepA + increment;
currentStepB = currentStepB + increment;
currentStepC = currentStepC + increment;

//Check for lookup table overflow and return to opposite end if necessary
if(currentStepA > sineArraySize) currentStepA = 0;
if(currentStepA < 0) currentStepA = sineArraySize;

if(currentStepB > sineArraySize) currentStepB = 0;
if(currentStepB < 0) currentStepB = sineArraySize;

if(currentStepC > sineArraySize) currentStepC = 0;
if(currentStepC < 0) currentStepC = sineArraySize;

/// Control speed by this delay
delay(10);

}


void setPwmFrequency(int pin) {
if(pin == 9 || pin == 10) {
TCCR1B = TCCR1B & 0b11111000 | 0x01;
}
else if(pin == 11) {
TCCR2B = TCCR2B & 0b11111000 | 0x01;
}
}

--------------------------------------------------------------------------

Eu já tentei de tudo e não sei mais o que posso tentar, se alguém tem experiência ou entenda sobre o assunto por favor me dê orientações :D

Obrigado!

Exibições: 1689

Responder esta

Respostas a este tópico

Se for usar baixa rotação, acho que dá para fazer como controle de gimbal.

Mas se for para alta rotação, os algoritmos são extremamente complexos !

Tem alguns meses que tenho estudado isso.

Não entendi o porque deste C.I DS1337, tem a ver com o motor BLDC, já que o mesmo é um RTC.

Me desculpe a falha  !!! Copiei o link errado !

Qual circuito esta usando ? BLDC não funciona como motor de passo !

Dá uma olhada nisso :

http://labdegaragem.com/forum/topics/tutorial-arduino-esc-motor-sem...

O sr. Diego não está usando um circuito específico, ele está querendo desenvolver.

Nós também...

Diego, o exemplo que usou é para conexão direta do Arduino com L6234 !

Que acredito não seja o seu caso. 

Cuidado, pois poderá queimar uma das placas. Leu no link?

http://www.berryjam.eu/2015/04/driving-bldc-gimbals-at-super-slow-s...

Tem o manual da sua placa? Vi que ela tem um microcontrolador 

Poderia enviar fotos da placa? 

Talvez possa ajuda-lo. 

Acompanhando este tópico....

Já tentei de toda forma fazer um "ESC" caseiro, com PIC16, ATtiny e acabei desistindo e comprando um pronto.

Mas espero que consigamos algo :D

Para fazer ESC como eu já disse, tem que usar três meia pontes H. Uma para cada fase. 

Você fez isso ? 

Só estou esperando chegar os meus L6234, para tentar isso. 

Já comprei um SN754410NE (4 x Half H Driver) .

Mas não testei ainda. Acho que com esse não vai funcionar.

Utilizei esse circuito e adicionei alguns fios para serem 'sensores' de BEMF, mas não deu certo .... projeto engavetado ainda.

Eu não colocaria esses resistores ai . Qual o valor deles? 

A BEMF  deve ser medida em outro local....

http://labdegaragem.com/forum/topics/dji-phantom-2-quadricoptero?co...

http://labdegaragem.com/forum/topics/tutorial-arduino-esc-motor-sem...

Achei essas fotos da placa. Bem interessantes.
Ela pode ser alimentada com 12V ? Tem um regulador de 5V para o ATTINY 261A ?

E a comunicação é I2C. 

Uma sugestão para o seu teste - inverta a sequencia de conexão de dois fios do motor BLDC. Faça algumas outras tentativas para saber se vai dar certo. A inversão de fios, vai inverter a rotação também. 

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço