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

Onde esta a comunicação I2C nos dois exemplos que citou ?

Não encontrei nada a respeito. Foram esses dois exemplos que usou ???

Rodrigo gostei do c.i L6234, gostaria de saber onde foi feita a aquisição desta placa.

Diego, pergunto o porque de você está enviando tabelas de formas de onda para esta placa pois ela só precisa de comandos?

Este código era quando eu estava usando direto no arduino, sem a placa.

A difereça entre esse e o do I2C é que mando os valores com o comando wire.write(valor) substituindo as 3 linhas do analogWrite.

Diego, você tem o chip L6234 ? 

Não entendi o uso das 3 linha analog write...

Não teria que usar a interface I2C ??

https://www.arduino.cc/en/Reference/Wire

Board I2C / TWI pins
Uno, Ethernet A4 (SDA), A5 (SCL)

Diego, ainda ão entendi como esta usando a sua placa.

Como fez as conexões ?

Este código era quando eu estava usando direto no arduino, sem a placa.

A difereça entre esse e o do I2C é que mando os valores com o comando wire.write(valor) substituindo as 3 linhas do analogWrite.

Como esta usando a placa no momento?

Qual programa esta usando, como esta fazendo as conexões?

Faça um desenho das ligações. 

Estou querendo te ajudar...

Eu não consigo fazer um desenho agora José.

Mas é simples, Uso o A5 SCL e o A4 SDA do Arduino e ligo no módulo.

E o VCC e GND da placa ligo na bateria lipo, é só isso.

Na verdade Carlos, eu não sei o protocolo I2C desta placa, estou deduzindo que é mandando o ângulo. Não consigo encontrar datasheet dela, deve ser restrita mesmo.

Diego dê uma olhada neste site:https://www.basecamelectronics.com/

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço