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

Você irá conseguir girar este tipo de motor BLDC sem que você consiga localizar a posição das bobinas em relação aos imãs, trocando em miúdos, sem fazer o autotuning para saber a sequência correta de aplicação das fases. Outra coisa os motores BLDC trabalham com forma de onda do tipo trapézio mas funcionam com senoide também, mas tem que verificar o rendimento, pois a senoide fica entorno de 70% já o trapézio fica acima dos 90%.

Você tem algum exemplo para eu ter como referência?

  • Para que eu possa te ajudar com este motor eu terei que comprar um e material para estudar

  • Tudo que eu sei é somente teorias

  • Por isso tem que ser testadas

Uma pergunta, você não está ligando este motor diretamente na saída do Arduino, caso esteja, retire esta ligação pois você irá causar danos ao seu Arduino.

Carlos, estava testando aqui, e também tenho um módulo que posso ligar uma lipo para ter mais torque.

Em relação ao trapézio creio que seja o caminho, consegue me ajudar a fazer este código?

Qual é o modelo desta placa?

Como lhe falei terei que comprar um motor desses para que eu possa realmente ajudar.

Uma pergunta, você tem osciloscópio?

Eu já fiz inversor de frequência para ali mentar motor C.A, trifásico através de baterias com 72 Volts.

Mas no caso do BLDC sem sensor de posição, precisamos aplicar um onda do tipo quadrada, mas com o duty de 10% de ton com uma frequência de 3Khz, para mensurarmos nos outros enrolamentos a polaridade das tensões refletidas "f.c.e.m" e com isso determinar a orientação dos campos.

Com este sinal aplicado somente em uma fase e com o osciloscópio nas outras fases vendo o sinal, mexa manualmente no eixo de forma que ele altere apenas um polo da sua posição e anotar as mudanças nos sinais das fases.

Após estes levantamentos, poderemos criar o autotuning e o restante fica mais simples.

Carlos,

A placa é um módulo alexmos 3 eixos, veja aqui: http://www.iflight-rc.com/alexmos-3rd-extension-module.html

Ela se comunica através de I2C, bem prático.

A partir dela fiz uma tabela senoidal e mandei para a placa, movimenta, mas não gira por completo.

Acho que vale a tentativa de fazer uma tabela de trapézio para ver o resultado.

Só estou tendo dificuldade de fazer ele no exel, pegar a tabela e aplicar, a senoidal é fácil, já trapézio não sei como fazer.

Opa, Alexmos usa o L6234, não é ? 

Confirme por favor. 

https://www.basecamelectronics.com/

Vou dar uma estudada no seu caso.....

José,

Sim, usa ele mesmo.

Obrigado

Já confirmei , é isso mesmo - ela usa o chip driver de BLDC  L6234.

Qual tensão esta alimentando o motor?  12V ? 

Use uma bateria de chumbo (7A) ou uma fonte de PC para testes.

Mas cuidado com curtos ...

Tem o link do manual da sua placa? Bem legal essa placa. 

Não encontrei no site do Alexmos, essa placa. 

Poderia informar onde comprou? Tenho interesse também. 

Obrigado.

Galera, usar um transistor para cada fase não é recomendável. É gambiarra.

E não vai dar torque nenhum. E não tente usar o L298 também pois ele não serve !

Isso tudo esta escrito no link que eu enviei. 

Tem que usar uma meia ponte H independente para cada fase !

Por exemplo L6234 (ja encomendei um) - não tem no Brasil...

Somente se comprar a placa pronta...

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço