Salve a tutti!
vi presento il mio progetto, un controller per motori brushless a tre connettori, come quelli della bici elettrica. Questo tipo di motori ha al loro interno un sensore magnetico, anche detto sensore hall, che serve per un corretto timing delle tre fasi del motore. ora, considerando che io sono uno studente del 3° anno delle superiori, potrei aver commesso degli errori molto grossolani. Chi può darmi una mano con questo ambizioso(?) progetto? si accettano suggerimenti per nuove funzioni da sviluppare.
//_____PIN_____
#define H1 2 //hall n1
#define H2 3 //hall n2
#define H3 4 //hall n3
#define M1P 5 //pin ramo positivo, connettore 1
#define M2P 6 //pin ramo positivo, connettore 2
#define M3P 7 //pin ramo positivo, connettore 3
#define M1N 8 //pin ramo negativo, connettore 1
#define M2N 9 //pin ramo negativo, connettore 2
#define M3N 10 //pin ramo negativo, connettore 3
#define Portante 11 //pin PWM
#define mag_p 12 //pin sensore magnetico pedelec
#define acc_p A0 //pin analogico acceleratore
//_____VARIABILI_____
int acc=0; //variabile lettura acceleratore
boolean mag=0; //variabile di lettura sensore magnetico
int Hall_1=0; //variabile di lettura stato sensore hall 1
int Hall_2=0; //variabile di lettura stato sensore hall 2
int Hall_3=0; //variabile di lettura stato sensore hall 3
int Hall_tot=0; //totale binario dei sensori hall
//_____SETUP_____
void setup(){
//definizione dei tre pin hall come input:
pinMode(H1, INPUT);
pinMode(H2, INPUT);
pinMode(H3, INPUT);
//definizione degli output
pinMode(Portante, OUTPUT);
pinMode(M1P, OUTPUT);
pinMode(M2P, OUTPUT);
pinMode(M3P, OUTPUT);
pinMode(M1N, OUTPUT);
pinMode(M2N, OUTPUT);
pinMode(M3N, OUTPUT);
}
//_____timing_motore_____
void timing_motore(){
//lettura stato sensori hall:
Hall_1=digitalRead(H1);
Hall_2=digitalRead(H2);
Hall_3=digitalRead(H3);
//conversione necessaria per lo switchcase:
Hall_tot = Hall_1 + ( Hall_2 * 2 ) + ( Hall_3 * 4 );
//switchcase
switch(Hall_tot) {
case 9:
//M1='+'
//M2='-'
//M3='0'
digitalWrite(M1N, LOW);
digitalWrite(M2P, LOW);
digitalWrite(M3P, LOW);
digitalWrite(M3N, LOW);
digitalWrite(M1P, HIGH);
digitalWrite(M2N, HIGH);
break;
case 1:
//M1='+'
//M2='0'
//M3='-'
digitalWrite(M1N, LOW);
digitalWrite(M2P, LOW);
digitalWrite(M2N, LOW);
digitalWrite(M3P, LOW);
digitalWrite(M1P, HIGH);
digitalWrite(M3N, HIGH);
break;
case 5:
//M1='0'
//M2='+'
//M3='-'
digitalWrite(M1P, LOW);
digitalWrite(M1N, LOW);
digitalWrite(M2N, LOW);
digitalWrite(M3P, LOW);
digitalWrite(M2P, HIGH);
digitalWrite(M3N, HIGH);
break;
case 4:
//M1='-'
//M2='+'
//M3='0'
digitalWrite(M1P, LOW);
digitalWrite(M2N, LOW);
digitalWrite(M3P, LOW);
digitalWrite(M3N, LOW);
digitalWrite(M1N, HIGH);
digitalWrite(M2P, HIGH);
break;
case 12:
//M1='-'
//M2='0'
//M3='+'
digitalWrite(M1P, LOW);
digitalWrite(M2P, LOW);
digitalWrite(M2N, LOW);
digitalWrite(M3N, LOW);
digitalWrite(M1N, HIGH);
digitalWrite(M3P, HIGH);
break;
case 8:
//M1='0'
//M2='-'
//M3='+'
digitalWrite(M1P, LOW);
digitalWrite(M1N, LOW);
digitalWrite(M2P, LOW);
digitalWrite(M3N, LOW);
digitalWrite(M2N, HIGH);
digitalWrite(M3P, HIGH);
break;
default:
//M1='0'
//M2='0'
//M3='0'
digitalWrite(M1P, LOW);
digitalWrite(M1N, LOW);
digitalWrite(M2P, LOW);
digitalWrite(M2N, LOW);
digitalWrite(M3P, LOW);
digitalWrite(M3N, LOW);
break;
}
}
//_____LOOP_____
void loop(){
acc=analogRead(acc_p);
map(acc, 0, 1023, 0, 255);
analogWrite(portante, acc);
timing_motore();
}