Etape 11 : Logiciel de contrôle pour l’Arduino
/*
* BLDC_congroller 3.1.1
* par David Glaser
*
* La série 3.x de programmes est pour la ST L6234 moteur 3 phases Driver IC
*
* Fonctionne un moteur de lecteur de disque dans le sens horaire
* Avec système de freinage
* Moteur vitesse et le freinage est commandé par un potentiomètre unique
* Moteur position est déterminée par trois capteurs à effet Hall
* L’Arduino reçoit des sorties de 3 sondes de hall (broches 2,3,4)
* et convertit leur combinaison en 6 étapes de commutation différentes
* PWM sorties sur les broches 9,10,11, à 32 kHz (correspondant respectivement à fr 1,2,3
* 3 ne sur broches 5,6,7 (1,2,3)
* Analogique 0 est relié à un potentiomètre pour modifier l’obligation PWM et définir
entre les automobilistes et régénérative freinage.
* 0 à 499 : freinage
* 500-523 : cabotage
* 524-1023 : automobile
* Il existe de nombreuses lignes a commenté dehors qui ont été utilisés pour le débogage de
* impression des valeurs différentes pour la connexion série.
*/
int HallState1 ; Variables pour les capteurs trois hall (3,2,1)
int HallState2 ;
int HallState3 ;
int HallVal = 1 ; valeur binaire de toutes les sondes de hall 3
int mSpeed = 0 ; niveau de vitesse du moteur
int bSpeed = 0 ; niveau de freinage
manette des gaz int = 0 ; Cette variable est utilisée avec analog dans pour mesurer la position du potentiomètre papillon
void setup() {}
pinMode(2,INPUT) ; Hall 1
pinMode(3,INPUT) ; Hall 2
pinMode(4,INPUT) ; Hall 3
Sorties du pilote de moteur L6234
pinMode(5,OUTPUT) ; DANS 1
pinMode(6,OUTPUT) ; 2
pinMode(7,OUTPUT) ; 3
pinMode(9,OUTPUT) ; FR 1
pinMode(10,OUTPUT) ; FR 2
pinMode(11,OUTPUT) ; FR 3
Serial.Begin(9600) ; Décommentez cette ligne si vous utilisez la connexion en série
aussi décommenter la commande Serial.flush à la fin du programme.
/ * La valeur de fréquence PWM sur Epingles 9,10 et 11
ce morceau de code provient de
http://usethearduino.blogspot.com/2008/11/Changing-PWM-Frequency-on-Arduino.html
*/
Goupilles de réglage PWM pour 9,10 à 32 kHz
Tout d’abord, désactivez tous les trois bits de diviseur :
int prescalerVal = 0 x 07 ; Créez une variable nommée prescalerVal et égal au nombre nombre binaire « 00000111 » nombre « 00000111 » « 00000111 »
TCCR1B & = ~ prescalerVal ; ET la valeur TCCR0B à nombre binaire « 11111000 »
Maintenant, définissez les bits de diviseur appropriés :
int prescalerVal2 = 1 ; prescalerVal une valeur égale au nombre binaire « 00000001 »
TCCR1B | = prescalerVal2 ; OU la valeur TCCR0B à nombre binaire « 00000001 »
Goupilles de réglage PWM pour 3,11 à 32 kHz (seule broche 11 est utilisée dans ce programme)
Tout d’abord, désactivez tous les trois bits de diviseur :
TCCR2B & = ~ prescalerVal ; ET la valeur TCCR0B à nombre binaire « 11111000 »
Maintenant, définissez les bits de diviseur appropriés :
TCCR2B | = prescalerVal2 ; OU la valeur TCCR0B à //First le nombre binaire « 00000001 » effacer tous les trois bits de diviseur :
}
GRANDE BOUCLE DE LA PRGROM
void loop() {}
temps = millis() ;
imprime le temps depuis le démarrage de programme
Serial.println(Time) ;
Serial.Print("\n") ;
gaz = analogRead(0) ; valeur du potentiomètre papillon
mSpeed = carte (accélérateur, 512, 1023, 0, 255) ; automobile est mappé sur la moitié supérieure du potentiomètre
bSpeed = carte (throttle, 511, 0, 0, 255) ; régénération de freinage sur le fond la moitié du pot
mSpeed = 100 ; utilisé pour le débogage
HallState1 = digitalRead(2) ; lire la valeur d’entrée du Hall 1
HallState2 = digitalRead(3) ; lire la valeur d’entrée du Hall 2
HallState3 = digitalRead(4) ; lire la valeur d’entrée du Hall 3
digitalWrite (8, HallState1) ; LED allumé lorsque le capteur correspondant est élevé - initialement utilisé pour le débogage
digitalWrite (9, HallState2) ;
digitalWrite (10, HallState3) ;
HallVal = (HallState1) + (2 * HallState2) + (4 * HallState3) ; Calcule la valeur binaire des capteurs Hall 3
/*Serial.Print (« H 1: ") ; utilisé pour le débogage
Serial.println(HallState1) ;
Serial.Print ("H 2:") ;
Serial.println(HallState2) ;
Serial.Print (« H 3: ") ;
Serial.println(HallState3) ;
Serial.println("") ;
*/
Serial.println(mSpeed) ;
Serial.println(HallVal) ;
Serial.Print("\n") ;
Sorties de transistor de moniteur
Delay(1000) ;
/ * T1 = digitalRead(2) ;
T1 = ~ T1 ;
T2 = digitalRead(4) ;
T2 = ~ T2 ;
T3 = digitalRead(5) ;
T3 = ~ T3 ;
Serial.Print(T1) ;
Serial.Print("\t") ;
Serial.Print(T2) ;
Serial.Print("\t") ;
Serial.Print(T3) ;
Serial.Print("\n") ;
Serial.Print("\n") ;
Serial.Print(digitalRead(3)) ;
Serial.Print("\t") ;
Serial.Print(digitalRead(9)) ;
Serial.Print("\t") ;
Serial.println(digitalRead(10)) ;
Serial.Print("\n") ;
Serial.Print("\n") ;
Delay(500) ;
*/
Commutation pour automobile
Chaque nombre binaire a un cas qui correspond à différents transistors étant allumés
Math de bit sert à modifier les valeurs de sortie
Tutoriel sur bitmath avec l’Arduino : http://www.arduino.cc/playground/Code/BitMath
PORTD contient les sorties pour les broches IN sur le pilote L6234
qui déterminent si le transistor supérieur ou inférieur de chaque phase utilisé
Les sorties pour les broches EN sont contrôlées par l’Arduino commande analogWrite, qui
définit l’obligation de la PWM (0 = OFF, 255 = ON ou valeur qui est contrôlée par le potentiomètre de papillon).
Si {(gaz > 511)
Switch (HallVal)
{
cas 3 :
PORTD = B011xxx00 ; Sortie désirée pour xxx broches 0-7 fait référence aux entrées Hall, qui ne doivent pas être changées
PORTD & = B00011111 ;
PORTD | = B01100000 ; //
analogWrite(9,mSpeed) ; MLI sur la Phase A (transistor à haute pression)
analogWrite(10,0) ; Phase B arrêt (obligation = 0)
analogWrite(11,255) ; Phase C - duty = 100 % (transistor à basse pression)
rupture ;
cas 1 :
PORTD = B001xxx00 ; Sortie désirée pour broches 0-7
PORTD & = B00011111 ; //
PORTD | = B00100000 ; //
analogWrite(9,mSpeed) ; MLI sur la Phase A (transistor à haute pression)
analogWrite(10,255) ; Phase B (transistor à basse pression)
analogWrite(11,0) ; Phase B arrêt (obligation = 0)
rupture ;
cas no 5 :
PORTD = B101xxx00 ; Sortie désirée pour broches 0-7
PORTD & = B00011111 ; //
PORTD | = B10100000 ;
analogWrite(9,0) ;
analogWrite(10,255) ;
analogWrite(11,mSpeed) ;
rupture ;
cas 4 :
PORTD = B100xxx00 ; Sortie désirée pour broches 0-7
PORTD & = B00011111 ;
PORTD | = B10000000 ; //
analogWrite(9,255) ;
analogWrite(10,0) ;
analogWrite(11,mSpeed) ;
rupture ;
cas 6 :
PORTD = B110xxx00 ; Sortie désirée pour broches 0-7
PORTD & = B00011111 ;
PORTD = B11000000 ; //
analogWrite(9,255) ;
analogWrite(10,mSpeed) ;
analogWrite(11,0) ;
rupture ;
cas 2 :
PORTD = B010xxx00 ; Sortie désirée pour broches 0-7
PORTD & = B00011111 ;
PORTD | = B01000000 ; //
analogWrite(9,0) ;
analogWrite(10,mSpeed) ;
analogWrite(11,255) ;
rupture ;
}
}
Commutation pour système de freinage
Broches PORTD (sorties de pins sur L6234) sont toujours faibles alors que le
des transistors plus bas sur chaque phase sont utilisés
transistors haute sont toujours hors tension pendant regen. de freinage.
else {}
PORTD = B000xxx00 ; Sortie désirée pour broches 0-7
PORTD & = B00011111 ;
PORTD | = B00000000 ; //
Switch (HallVal)
{
cas 3 :
analogWrite(9,bSpeed) ;
analogWrite(9,0) ;
analogWrite(10,0) ;
analogWrite(11,0) ;
rupture ;
cas 1 :
analogWrite(9,bSpeed) ;
analogWrite(10,0) ;
analogWrite(11,0) ;
rupture ;
cas no 5 :
analogWrite(9,0) ;
analogWrite(10,0) ;
analogWrite(11,bSpeed) ;
rupture ;
cas 4 :
analogWrite(9,0) ;
analogWrite(10,0) ;
analogWrite(11,bSpeed) ;
rupture ;
cas 6 :
analogWrite(9,0) ;
analogWrite(10,bSpeed) ;
analogWrite(11,0) ;
rupture ;
cas 2 :
analogWrite(9,0) ;
analogWrite(10,bSpeed) ;
analogWrite(11,0) ;
rupture ;
}
}
temps = millis() ;
imprime le temps depuis le démarrage de programme
Serial.println(Time) ;
Serial.Print("\n") ;
Serial.Flush() ; Décommentez ceci si vous souhaitez utiliser le port série pour le débogage
}