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: 1687

Responder esta

Respostas a este tópico

Irei tentar, postarei se obtive sucesso.

Obrigado

Diego, achei o manual de conexão da sua placa com a placa de dois motores ( veja a sua placa na cor azul claro) 

http://www.basecamelectronics.com/files/v10/SimpleBGC_connection_di...

Acho que o Alexmos não divulgou esse protocolo de comunicação I2C para a placa de expansão.

Vou procurar.

Sim. É esse mesmo.

Não encontrei o protocolo na internet não, nem so site deles.

Tentei também ler as informações direto na placa de Gimbal do Alexmos, que eu tenho também, não leu nada.

Para tentar entender o protocolo I2C poderá usar um analisador lógico.

Mas mesmo assim não será simples não.

Posso estar enganado, mas esta placa que você adquiriu só funciona com o kit que ele mesmo vende, por isso acredito que você não encontrará nenhuma informação sobre o protocolo de comunicação desta placa, ou seja, os comandos para que possa fazer movimentar o motor. 

Carlos, também acho isso. 

O Alexmos não iria divulgar isso facilmente. 

O cara deve ser um genio. Você já viu as placas que ele desenvolveu ? 

São bem complexas e o programa de calibração muito sofisticado. 

O cara é um precursor no mundo dos motores de Gimbal.

E deve estar ficando rico, pois esta vendendo pelo mundo todo. 

Não acho que consigo o protocolo mesmo, vou trabalhar em cima do L6234 e ver se consigo resultados, posto notícias.

Obrigado aos dois pela ajuda!

Pessoal, consegui fazer funcionar.

Soldei os fios de entrada PWM no módulo e mandei os sinais e funcionou.

Utilizei uma das ondas trapezoidal que fiz e fez ele rodar. Conforme mudo elas a velocidade pode mudar. Posso mudar a velocidade dele também de acordo com o delay que envio os sinais.

Video dele funcionando https://youtu.be/Oy9S33i7XfM

Foi difícil mas acabou dando certo,

Obrigado ao José e ao Carlos pela ajuda que me deram!

Video privado, não conseguimos vê-lo. 

Quais ligações fez no L6234 ?

Parabéns !

Por nada Diego, só mais uma recomendação, retire o Atiny261 para ele não causar problemas ok.

Abraços!

Ou se preferir pode fazer uma programa para o Atiny261 que eu conheço de forma que ele gere todo o pwm e os pinos destinados a comunicação I2C, pode ser utilizado da seguinte forma:

1 - O SDA, direção, nível zero direção horária e nível um é anti-horário.

2 - O SCL, clock de velocidade, ou seja, a frequência dos pulsos injetados nesta entrada informará ao Atiny a velocidade que ele deve girar o motor.

Note que ele tem os pinos de gravação SPI, só falta soldar o conector.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço