Stap 11: Controlesoftware voor de Arduino
/*
* BLDC_congroller 3.1.1
* door David Glaser
*
* De 3.x serie van programma's is voor de ST L6234 3-fase Motor Driver IC
*
* Loopt een schijf toer motor met de klok mee
* Met regeneratief remmen
* Motor snelheid en remmen wordt beheerd door een enkele potentiometer
* Motor positie wordt bepaald met drie sensoren van Hall-Effect
* De Arduino ontvangt uitgangen van 3 hall-sensoren (pinnen 2,3,4)
* en hun combinatie omgezet in 6 verschillende telefonieoverdracht stappen
* PWM-uitgangen op pennen 9,10,11, op 32 kHz (overeenkomend met nl 1,2,3 respectievelijk
* 3 doen op pinnen 5,6,7 (IN 1,2,3)
* Analoog in 0 is aangesloten op een potmeter om te veranderen van de PWM-plicht en wijzigen
* tussen autorijden en remmen met energieterugwinning.
* 0-499: remmen
* 500-523: kustvaarders
* 524-1023: autorijden
* Er zijn veel regels commentaar die werden gebruikt voor het opsporen van fouten door
* afdrukken van verschillende waarden voor de seriële aansluiting.
*/
int HallState1; Variabelen voor de drie hall-sensoren (3,2,1)
int HallState2;
int HallState3;
int HallVal = 1; binaire waarde van alle 3 hall-sensoren
int mSpeed = 0; niveau van de snelheid van de motor
int bSpeed = 0; remmen van niveau
int gasklep = 0; Deze variabele wordt gebruikt met analoge in voor het meten van de positie van de gasklep potentiometer
VOID Setup {}
pinMode(2,INPUT); Hal 1
pinMode(3,INPUT); Hal 2
pinMode(4,INPUT); Hal 3
Uitgangen voor de L6234 Motor-Driver
pinMode(5,OUTPUT); IN 1
pinMode(6,OUTPUT); IN 2
pinMode(7,OUTPUT); IN 3
pinMode(9,OUTPUT); NL 1
pinMode(10,OUTPUT); NL 2
pinMode(11,OUTPUT); NL 3
Serial.begin(9600); uncomment deze lijn als u de seriële aansluiting gebruiken
ook uncomment Serial.flush opdracht aan einde van het programma.
/ * PWM-mailfrequentie instellen op pinnen 9,10 en 11
Dit codefragment vandaan
http://usethearduino.blogspot.com/2008/11/Changing-PWM-Frequency-on-Arduino.html
*/
Set PWM voor pinnen 9,10 tot en met 32 kHz
Eerst schakelt u alle drie prescaler bits:
int prescalerVal = 0x07; Maak een variabele met de naam prescalerVal en stel deze gelijk aan het aantal nummer "00000111" binair getal "00000111" "00000111"
TCCR1B & = ~ prescalerVal; EN de waarde in TCCR0B met binair getal "11111000"
Nu het instellen van de juiste prescaler bits:
int prescalerVal2 = 1; prescalerVal ingesteld op binair getal "00000001"
TCCR1B | = prescalerVal2; OF de waarde in TCCR0B met binair getal "00000001"
Set PWM voor pinnen 3,11 tot en met 32 kHz (alleen pin 11 wordt gebruikt in dit programma)
Eerst schakelt u alle drie prescaler bits:
TCCR2B & = ~ prescalerVal; EN de waarde in TCCR0B met binair getal "11111000"
Nu het instellen van de juiste prescaler bits:
TCCR2B | = prescalerVal2; OF de waarde in TCCR0B met binair getal "00000001" //First uit alle drie prescaler bits:
}
MAIN LOOP VAN DE PRGROM
void loop {}
tijd = millis();
afdrukken van tijd aangezien programma gestart
Serial.println(time);
Serial.Print("\n");
gasklep = analogRead(0); waarde van de gasklep potentiometer
mSpeed = kaart (gashendel, 512, 1023, 0, 255); autorijden is toegewezen aan de bovenste helft van de potentiometer
bSpeed = kaart (throttle, 511, 255, 0, 0); regeneratief remmen op de onderste helft van de pot
mSpeed = 100; gebruikt voor foutopsporing
HallState1 = digitalRead(2); Lees de invoerwaarde van hal 1
HallState2 = digitalRead(3); invoerwaarde afgelezen in hal 2
HallState3 = digitalRead(4); Lees de invoerwaarde van Hall 3
digitalWrite (8, HallState1); LED's ingeschakeld wanneer de bijbehorende sensor is hoog - oorspronkelijk gebruikt voor foutopsporing
digitalWrite (9, HallState2);
digitalWrite (10, HallState3);
HallVal = (HallState1) + (2 * HallState2) + (4 * HallState3); Berekent de binaire waarde van de 3 Hall-sensoren
/*Serial.Print ("H 1:"); gebruikt voor foutopsporing
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 transistor hulpuitgangen
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);
*/
Apparatuur voor telefonische overdracht voor automobiliteit geworden
Elk binair getal heeft een behuizing die correspondeert met verschillende transistoren wordt ingeschakeld
Bits Math wordt gebruikt om de waarden van de output wijzigen
Voor zelfstudie over bitmath met de Arduino: http://www.arduino.cc/playground/Code/BitMath
PORTD bevat de uitgangen voor de pennen IN op het L6234-stuurprogramma
die bepalen of de boven- of ondergrens transistor van elke fase wordt gebruikt
De uitgangen voor de nl-pennen worden gecontroleerd door de Arduino opdracht analogWrite, die
Hiermee stelt u de plicht van de PWM (0 = OFF, 255 = ON of waarde die wordt gecontroleerd door de potentiometer throttle).
Als (gashendel > 511) {}
schakelaar (HallVal)
{
Case 3:
PORTD = B011xxx00; Gewenste Output voor pinnen 0-7 xxx verwijst naar de Hall-ingangen, die niet mogen worden gewijzigd
PORTD & = B00011111;
PORTD | = B01100000; //
analogWrite(9,mSpeed); PWM op fase A (hoge kant transistor)
analogWrite(10,0); Fase B uit (plicht = 0)
analogWrite(11,255); Fase C - dienstdoende = 100% (lage kant transistor)
breken;
Case 1:
PORTD = B001xxx00; Gewenste Output voor pinnen 0-7
PORTD & = B00011111; //
PORTD | = B00100000; //
analogWrite(9,mSpeed); PWM op fase A (hoge kant transistor)
analogWrite(10,255); Fase B op (lage kant transistor)
analogWrite(11,0); Fase B uit (plicht = 0)
breken;
Case 5:
PORTD = B101xxx00; Gewenste Output voor pinnen 0-7
PORTD & = B00011111; //
PORTD | = B10100000;
analogWrite(9,0);
analogWrite(10,255);
analogWrite(11,mSpeed);
breken;
Case 4:
PORTD = B100xxx00; Gewenste Output voor pinnen 0-7
PORTD & = B00011111;
PORTD | = B10000000; //
analogWrite(9,255);
analogWrite(10,0);
analogWrite(11,mSpeed);
breken;
Case 6:
PORTD = B110xxx00; Gewenste Output voor pinnen 0-7
PORTD & = B00011111;
PORTD = B11000000; //
analogWrite(9,255);
analogWrite(10,mSpeed);
analogWrite(11,0);
breken;
Case 2:
PORTD = B010xxx00; Gewenste Output voor pinnen 0-7
PORTD & = B00011111;
PORTD | = B01000000; //
analogWrite(9,0);
analogWrite(10,mSpeed);
analogWrite(11,255);
breken;
}
}
Apparatuur voor telefonische overdracht voor het remmen met energieterugwinning
PORTD (Outputs voor IN pinnen op L6234) pinnen zijn altijd laag dus alleen de
lagere transistoren op elke fase worden gebruikt
bovenste transistoren zijn altijd af tijdens regen. remmen.
else {}
PORTD = B000xxx00; Gewenste Output voor pinnen 0-7
PORTD & = B00011111;
PORTD | = B00000000; //
schakelaar (HallVal)
{
Case 3:
analogWrite(9,bSpeed);
analogWrite(9,0);
analogWrite(10,0);
analogWrite(11,0);
breken;
Case 1:
analogWrite(9,bSpeed);
analogWrite(10,0);
analogWrite(11,0);
breken;
Case 5:
analogWrite(9,0);
analogWrite(10,0);
analogWrite(11,bSpeed);
breken;
Case 4:
analogWrite(9,0);
analogWrite(10,0);
analogWrite(11,bSpeed);
breken;
Case 6:
analogWrite(9,0);
analogWrite(10,bSpeed);
analogWrite(11,0);
breken;
Case 2:
analogWrite(9,0);
analogWrite(10,bSpeed);
analogWrite(11,0);
breken;
}
}
tijd = millis();
afdrukken van tijd aangezien programma gestart
Serial.println(time);
Serial.Print("\n");
Serial.Flush(); uncomment dit als u seriële poort voor foutopsporing gebruiken
}