BLDC Motor Control med Arduino, bärgades HD motor och hallgivare (11 / 12 steg)
Steg 11: Styrprogram för Arduino
/*
* BLDC_congroller 3.1.1
* av David Glaser
*
* Den 3.x serien program är för ST L6234 3-fas Motor Driver IC
*
* Kör en driva motor medurs
* Med regenerativ bromsning
* Varvtal och bromsning styrs av en enda potentiometer
* Motor position bestäms med tre Hall-effekt sensorer
* Arduino får utgångar från 3 hallgivare (stift 2,3,4)
* och omvandlar deras kombination till 6 olika förvandling steg
* PWM utgångar på stift 9,10,11, vid 32 kHz (motsvarande EN 1,2,3 respektive
* 3 göra på stiften 5,6,7 (i 1,2,3)
* Analog in 0 är ansluten till en potentiometer till ändra tullen som PWM och ändra
* mellan bilismen och regenerativ bromsning.
0-499: bromsning
* 500-523: utrullning
* 524-1023: bilism
* Det finns många rader kommenterade ut som användes för avlusning av
* skriva ut olika värden för seriell anslutning.
*/
int HallState1; Variabler för tre hall sensorer (3,2,1)
int HallState2;
int HallState3;
int HallVal = 1; binära värdet av alla 3 hallgivare
int mSpeed = 0; Speed nivå av motorn
int bSpeed = 0; bromsning nivå
int gaspådrag = 0; variabeln används med analog i att mäta positionen för potentiometer spjäll
void setup() {
pinMode(2,INPUT); Hall 1
pinMode(3,INPUT); Hall 2
pinMode(4,INPUT); Hall 3
Utgångar för L6234 Motor föraren
pinMode(5,OUTPUT); I 1
pinMode(6,OUTPUT); I 2
pinMode(7,OUTPUT); I 3
pinMode(9,OUTPUT); EN 1
pinMode(10,OUTPUT); EN 2
pinMode(11,OUTPUT); EN 3
Serial.BEGIN(9600); avkommentera den här raden om du vill använda seriell anslutning
även avkommentera Serial.flush kommando vid slutet av programmet.
/ * Anger PWM frekvens på stift 9,10 och 11
denna bit av koden kommer från
http://usethearduino.blogspot.com/2008/11/Changing-PWM-Frequency-on-Arduino.html
*/
Ställ in PWM för stift 9,10-32 kHz
Först ta bort alla tre prescaler bitar:
int prescalerVal = 0x07; skapa en variabel som kallas prescalerVal och ange den motsvarar det binära tal som "00000111" nummer "00000111" talet "00000111"
TCCR1B & = ~ prescalerVal; OCH värdet i TCCR0B med binärt tal "11111000"
Nu Ställ rätt prescaler bitar:
int prescalerVal2 = 1; Ange prescalerVal till binärt tal "00000001"
TCCR1B | = prescalerVal2; ELLER värdet i TCCR0B med binärt tal "00000001"
Ställ in PWM för stift 3,11 till 32 kHz (enda stift 11 används i detta program)
Först ta bort alla tre prescaler bitar:
TCCR2B & = ~ prescalerVal; OCH värdet i TCCR0B med binärt tal "11111000"
Nu Ställ rätt prescaler bitar:
TCCR2B | = prescalerVal2; ELLER värdet i TCCR0B med binärt tal "00000001" //First avmarkera alla tre prescaler bitar:
}
MAIN, KRETSAR AV PRGROM
void loop() {
tid = millis();
skriver ut tid sedan programmet startade
Serial.println(Time);
Serial.Print("\n");
gaspådrag = analogRead(0); värdet av potentiometer spjäll
mSpeed = karta (gasspjäll, 512, 1023, 0, 255); bilismen har mappats till den övre halvan av potentiometer
bSpeed = karta (spjäll, 511, 255, 0, 0); regenerativ bromsning på nedre hälften av potten
mSpeed = 100; för felsökning
HallState1 = digitalRead(2); Läs indatavärde från Hall 1
HallState2 = digitalRead(3); Läs indatavärde från Hall 2
HallState3 = digitalRead(4); Läs indatavärde från Hall 3
digitalWrite 8, HallState1. Lysdioder aktiverad när motsvarande sensor är hög - ursprungligen används för felsökning
digitalWrite (9, HallState2).
digitalWrite 10, HallState3.
HallVal = (HallState1) + (2 * HallState2) + (4 * HallState3); Beräknar det binära värdet av de 3 hallgivare
/*Serial.Print ("H 1:"); för felsökning
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");
Monitor transistorutgångar
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);
*/
Kommutering för bilismen
Varje binärt tal har ett fall som motsvarar olika transistorer är påslagen
Lite matematik används för att ändra värdena för utdata
För läraren på bitmath med Arduino: http://www.arduino.cc/playground/Code/BitMath
PORTD innehåller utgångarna för IN stiften på L6234 föraren
som avgör om den övre eller nedre transistorn av varje fas används
Utgångar för sv stiften styrs av Arduino kommandot analogWrite, som
anger skyldighet PWM (0 = OFF, 255 = ON eller throttle värde som styrs av potentiometer).
om (spjäll > 511) {
växel (HallVal)
{
fall 3:
PORTD = B011xxx00; Önskad effekt för stift 0-7 xxx refererar till Hall ingångar, som inte bör ändras
PORTD & = B00011111;
PORTD | = B01100000; //
analogWrite(9,mSpeed); PWM på fas A (hög side transistor)
analogWrite(10,0); Fas B off (tull = 0)
analogWrite(11,255); Fas C - jourhavande = 100% (underkant transistor)
bryta;
fall 1:
PORTD = B001xxx00; Önskad effekt för stift 0-7
PORTD & = B00011111; //
PORTD | = B00100000; //
analogWrite(9,mSpeed); PWM på fas A (hög side transistor)
analogWrite(10,255); Fas B på (underkant transistor)
analogWrite(11,0); Fas B off (tull = 0)
bryta;
fall 5:
PORTD = B101xxx00; Önskad effekt för stift 0-7
PORTD & = B00011111; //
PORTD | = B10100000;
analogWrite(9,0);
analogWrite(10,255);
analogWrite(11,mSpeed);
bryta;
fall 4:
PORTD = B100xxx00; Önskad effekt för stift 0-7
PORTD & = B00011111;
PORTD | = B10000000; //
analogWrite(9,255);
analogWrite(10,0);
analogWrite(11,mSpeed);
bryta;
fall 6:
PORTD = B110xxx00; Önskad effekt för stift 0-7
PORTD & = B00011111;
PORTD = B11000000; //
analogWrite(9,255);
analogWrite(10,mSpeed);
analogWrite(11,0);
bryta;
fall 2:
PORTD = B010xxx00; Önskad effekt för stift 0-7
PORTD & = B00011111;
PORTD | = B01000000; //
analogWrite(9,0);
analogWrite(10,mSpeed);
analogWrite(11,255);
bryta;
}
}
Kommutering för regenerativ bromsning
PORTD (resultat för i stiften på L6234) stift är alltid låga så att endast den
lägre transistorer på varje fas används
övre transistorer är alltid under regen. bromsning.
annat {
PORTD = B000xxx00; Önskad effekt för stift 0-7
PORTD & = B00011111;
PORTD | = B00000000; //
växel (HallVal)
{
fall 3:
analogWrite(9,bSpeed);
analogWrite(9,0);
analogWrite(10,0);
analogWrite(11,0);
bryta;
fall 1:
analogWrite(9,bSpeed);
analogWrite(10,0);
analogWrite(11,0);
bryta;
fall 5:
analogWrite(9,0);
analogWrite(10,0);
analogWrite(11,bSpeed);
bryta;
fall 4:
analogWrite(9,0);
analogWrite(10,0);
analogWrite(11,bSpeed);
bryta;
fall 6:
analogWrite(9,0);
analogWrite(10,bSpeed);
analogWrite(11,0);
bryta;
fall 2:
analogWrite(9,0);
analogWrite(10,bSpeed);
analogWrite(11,0);
bryta;
}
}
tid = millis();
skriver ut tid sedan programmet startade
Serial.println(Time);
Serial.Print("\n");
Serial.flush(); avkommentera detta om du vill använda seriell port för felsökning
}