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

Ja tinha enviado esse link. Esse é o novo site do Alexmos. 

O cara ficou rico e esta vendendo um tanto de placa. 

Mas a placa do Diego, não encontrei-a no site. 

Parece ser um clone ou algo assim. 

Desculpe, não tinha percebido que você já tinha passado o link.

Não precisa se desculpar.

Todos estão ai para ajudar.

Fala pessoal,

Seguinte, vou colocar dados atualizados,

Usando o grupo (Arduino + módulo do L6234 que isa I2C + motor) eu tentei várias configurações de ondas para fazer o motor funcionar. Algumas fazem ele movimentar alguns graus, bem pouco, chutaria uns 5º.

Segui o que os datasheets que falam em fazer uma curva trapezoidal, mas elas não estão surtindo efeito.

A única que surtiu efeito foi a linha azul do gráfico que está indicando que é do vídeo. Ele fez o seguinte movimento: http://youtu.be/IhL7Yayx-sg  . Para mim não tem explicação, as ondas trapezoidais não fazem nem se quer uma volta e esse faz, nos trancos mas faz.

Segue o código atualizado para I2C, já tentei vários padrões de curva para o motor girar, mantive somente 1 array porque não dá para postar tudo aqui.

O código é um junção do que encontrei na internet.

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

#include <Wire.h>


//--Trapezio
//const int pwmSin[] = {0.03,0.07,0.1,0.14,0.17,0.21,0.24,0.27,0.31,0.34,0.37,0.41,0.44,0.45,0.48,0.51,0.54,0.57,0.6,0.63,0.66,0.68,0.71,0.73,0.76,0.78,0.8,0.82,0.84,0.86,0.87,0.87,0.91,0.93,0.93,0.9,0.87,1,1,0.96,0.97,0.99,0.97,0.98,0.99,0.9,0.93,0.95,0.98,0.97,0.95,1,1,0.99,0.97,0.92,0.98,0.89,0.87,0.86,0.86,0.84,0.82,0.8,0.78,0.76,0.73,0.71,0.68,0.66,0.63,0.6,0.57,0.54,0.51,0.48,0.45,0.42,0.39,0.36,0.32,0.29,0.26,0.22,0.19,0.15,0.12,0.08,0.05,0.01,-0.02,-0.06,-0.09,-0.12,-0.16,-0.19,-0.23,-0.26,-0.29,-0.33,-0.36,-0.39,-0.42,-0.45,-0.49,-0.52,-0.54,-0.57,-0.6,-0.63,-0.65,-0.68,-0.7,-0.73,-0.75,-0.77,-0.79,-0.81,-0.83,-0.86,-0.89,-0.92,-0.95,-0.97,-0.98,-0.99,-1,-1,-0.99,-0.97,-0.96,-0.93,-0.91,-0.87,-0.9,-0.93,-0.95,-0.97,-0.98,-0.99,-1,-1,-0.99,-0.98,-0.97,-0.95,-0.93,-0.9,-0.87,-0.83,-0.81,-0.79,-0.77,-0.75,-0.73,-0.7,-0.68,-0.64,-0.61,-0.59,-0.56,-0.53,-0.5,-0.47,-0.44,-0.41,-0.39,-0.36,-0.33,-0.29,-0.26,-0.23,-0.19,-0.16,-0.12,-0.11,-0.07,-0.04,0};
//

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

int i = 0;

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

void setup() {

Wire.begin();

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() {

Wire.beginTransmission(16);

Wire.write((uint8_t) pwmSin[currentStepA]);
Wire.write((uint8_t) pwmSin[currentStepB]);
Wire.write((uint8_t) pwmSin[currentStepC]);

Wire.endTransmission();

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(3);

}

Abraços pessoal!

Espero que consigam me ajudar.

Tem um grande erro nesta tabela, para que você possa utilizar ponto decimal a sua variável tem que ser do tipo float e não do tipo int, como você declarou "const int..."

Você está certo, mas eu tentei com valores convertidos também para graus.

Eu acabei pegando um exemplo que eu tinha descartado.

Usei este, por exemplo:

const int pwmSin[] = {180,185,189,194,199,204,208,213,218,222,227,232,236,241,245,250,254,259,263,268,272,277,281,285,290,294,298,303,307,311,315,316,318,319,320,321,322,323,325,326,326,327,328,329,330,331,331,332,332,333,334,334,334,335,335,335,336,336,336,336,336,336,336,336,336,335,335,335,334,334,334,333,332,332,331,331,330,329,328,327,326,326,325,323,322,321,320,319,318,316,315,316,318,319,320,321,322,323,325,326,326,327,328,329,330,331,331,332,332,333,334,334,334,335,335,335,336,336,336,336,336,336,336,336,336,335,335,335,334,334,334,333,332,332,331,331,330,329,328,327,326,326,325,323,322,321,320,319,318,316,315,311,307,303,298,294,290,285,281,277,272,268,263,259,254,250,245,241,236,232,227,222,218,213,208,204,199,194,189,185,180,175,171,166,161,156,152,147,142,138,133,128,124,119,115,110,106,101,97,92,88,83,79,75,70,66,62,57,53,49,45,44,42,41,40,39,38,37,35,34,34,33,32,31,30,29,29,28,28,27,26,26,26,25,25,25,24,24,24,24,24,24,24,24,24,25,25,25,26,26,26,27,28,28,29,29,30,31,32,33,34,34,35,37,38,39,40,41,42,44,45,44,42,41,40,39,38,37,35,34,34,33,32,31,30,29,29,28,28,27,26,26,26,25,25,25,24,24,24,24,24,24,24,24,24,25,25,25,26,26,26,27,28,28,29,29,30,31,32,33,34,34,35,37,38,39,40,41,42,44,45,49,53,57,62,66,70,75,79,83,88,92,97,101,106,110,115,119,124,128,133,138,142,147,152,156,161,166,171,175,180};

Descobri mais uma coisa. Essa sua placa é uma expansão para a placa ALexmos para dois motores. Assim no total ficarão três motores para controle X,Y e Z de um gimbal.

http://www.hobbywill.com/camera-gimbals/gimbal-controllers/alexmos-...

Specifications:
The extension board for the AlexMos Brushless Gimbal Controller to enable a 3rd axis for yaw. 

Se não tiver acesso aos comandos que terá que enviar para a interface I2C, ficará muito dificil usa-la.

Você tem acesso à esses comandos ?

Sim, comprei ela justamente por causa disso, é um modo prático de controlar o motor com esse módulo.

O problema é descobrir como ele se comunica, eu achava que seria simplesmente enviando o ângulo desejado.Mas aparentemente não é só isso.

Colega, se não souber o protocolo de comunicação, será impossível usa-la. 

Não adianta chutar..

Você disse que tem um forum sobre o assunto ? 

Tem esse protocolo serial no site do Alexmos, mas acho que não é esse :

http://www.basecamelectronics.com/files/SimpleBGC_2_4_Serial_Protoc...

Diego o seu problema não será resolvido com uma ou com outra forma de onda, esta última é uma senoide + a 3ª harmônica, eu a utilizo para aumentar o torque de motor C.A nas baixas rotações. Resumindo enquanto não se fizer o autotuning você não irá conseguir girar este motor, recomendo que você compre um BEC e utilize para fazer os seus testes e vê também as formas de onda.

Veja o pdf da Freescale sobre isto:http://cache.freescale.com/files/microcontrollers/doc/app_note/AN45...

Muito bom esse documento, um dos melhores que já ví até agora.

Estou pensando em conectar fios direto no chip da L6234 e enviar sinais PWM para as entradas dela. Acha uma boa idéia? Já que o protocolo I2C da placa será difícil descobrir.

Diego,siga essa orientação da conexão direta do L6234 com o Arduino. 

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

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço