Hall effekt sensorer 1: Placera kontroll (5 / 6 steg)
Steg 5: Homing
Även när vi försöker vårt bästa att räkna varje puls kan finnas tillfällen som kan vi missa några och långsamt förlora precision över tiden. För att minimera detta kan vi använda en målsökande rutin! Tanken är att skicka manöverdonet till en förutbestämd position (helt utdragen eller helt infällda läge) och ange räkningarna till ett känt värde. Oftast är det lättast att fullt ut dra tillbaka manöverdonet och räkningarna 0. I koden nedan återställs till maximalt räknar värde när fullt utsträckt och återställs till 0 när helt indragen.
Så du behöver ett sätt att berätta när motorn är på det gränser. Vi kommer här använda den nuvarande avkänning av MegaMoto för att titta på när strömmen sjunker till 0. När den gör det kan vi se att manöverdonet har hit gränslägesbrytaren och slutat röra sig. Vi har en liten räknare kör eftersom ibland nuvarande kan rapportera en falskt 0. Genom att se till att nuvarande är 0 under en längre tid vet vi att motorn verkligen är på en gräns och inte får felaktiga avläsningar.
Se bifogade uppförandekoden och kommentarer för mer information:
#define amp0 A5
#define PWMA0 6
#define PWMB0 5
#define enable0 13 //pins för första MegaMoto
#define switch0 7 //Up för att lägga till räknar
#define VÄXEL1 8 //Down knappen att subtrahera räknas
#define hall0 2 //interrupt stift för hall effekt sensorer
int aktiverar = 0; Aktivera pin för megaMoto
int lowampLimit = 0; //Low gräns att upptäcka när manöverdonet stannar
int ampere = 0; Nuvarande behandlingar
int timedelay [] = {750, 50}; första, regelbundna fördröjning för feedback
int hitLimits = 0;
int hitLimitsmax = 10; //value för att veta när indraget
int räkna [] = {0}. //Actuator
int maxCounts = 1150; //number räknas när fullt utsträckt
int sw [] = {1, 1}; växla upp, växla ner
int [prev] = {0, 0}, //previous switch staten
int currentPos = 0; //current position
int tröskel = 1;
int destination = 0;
bool framlänges = false;
bool bakåt = false; / / motor stater
bool extended = false;
bool indragen = false; //actuator positioner
bool firstRun = true; //first körning av motorn när knappen trycks
void setup() {
pinMode (amp0, ingång);
digitalWrite (amp0, låg); //set nuvarande sensorer
pinMode (PWMA0, OUTPUT);
pinMode (PWMB0, OUTPUT); //set PWM utgångar
pinMode (enable0, produktionen);
digitalWrite (enable0, låg); //set aktivera och tur ombord på OFF
pinMode (switch0, ingång);
pinMode (VÄXEL1, ingång);
digitalWrite (switch0, hög);
digitalWrite (VÄXEL1, hög), //set upp/ner switch, aktivera enternal reläer
pinMode (hall0, ingång);
digitalWrite (hall0, låg), //set hall, set låg starta för stigande kanten
attachInterrupt (0, speed0, RISING); Aktivera Halleffekten interupts
indragen = true; //start indragen
utökade = false;
Serial.BEGIN(9600);
} //end setup
void loop() {
ReadInputs (); //check input knappen, beräkna hastigheter
om (sw [0] == 0 & & sw [1] == 1 & & bakåt == false) destination = currentPos - 115; //dont Ändra destination när du flyttar
annars om (sw [0] == 1 & & sw [1] == 0 & & framåt == false) destination = currentPos + 115; //dont Ändra destination när du flyttar
Serial.Print ("antal [0]"); Serial.println(Count[0]);
Serial.Print ("currentPos"); Serial.println(currentPos);
Serial.Print ("destination"); Serial.println(destination);
om ((destination > = (currentPos - tröskel)) & & (destination < = (currentPos + tröskel))) stopMoving (); //stop om du är tillräckligt nära
annars om (destination > currentPos) goForwards (); //move om du behöver
annars om (destination < currentPos) goBackwards (); //move om du behöver
för (int jag = 0; jag < = 1; i ++) prev [i] = sw [i]; lagra switch värden som tidigare värden
} //end loop
void speed0() {
om (framlänges == true) räkna [0] ++; om flytta framåt, lägga till punkter
annars om (bakåt == true) räkna [0]--; om flyttar tillbaka, subtrahera räknas
} //end speed0
void ReadInputs() {
ampere = analogRead (amp0), //read nuvarande
SW [0] = digitalRead(switch0), sw [1] = digitalRead (VÄXEL1), //check växlar
currentPos = räkna [0]; //set där du är
} //end läsa ingångar
void goForwards()
{
framåt = sant;
baklänges = false; //set resa riktning
getFeedback (); //check strömförbrukning
digitalWrite (enable0, hög); //enable styrelsen
analogWrite (PWMA0, 255);
analogWrite (PWMB0, 0); //apply hastigheter
} //end goForwards
void goBackwards()
{
framåt = false;
baklänges = true; //set resa riktning
getFeedback (); //check strömförbrukning
digitalWrite (enable0, hög); //enable styrelsen
analogWrite (PWMA0, 0);
analogWrite (PWMB0, 255); //apply hastigheter
} //end goBackwards
void stopMoving()
{
framåt = false;
baklänges = false; //set resa riktning
analogWrite (PWMA0, 0);
analogWrite (PWMB0, 0); //set hastigheter till 0
Delay(10);
digitalWrite (enable0, låg); //disable styrelsen
} //end stopMoving
void getFeedback()
{
ampere = analogRead(amp0);
Serial.Print ("Amp avläsningar -"), Serial.println(amps);
om (ampere < = lowampLimit & & hitLimits < hitLimitsmax) hitLimits = hitLimits + 1.
annat hitLimits = 0;
om (hitLimits == hitLimitsmax & & bakåt == true)
{
Serial.println("RETRACTED");
indragen = sant;
räkna [0] = 0; Återställ räknaren när homing
destination = 0;
}
om (hitLimits == hitLimitsmax & & framåt == true)
{
Serial.println("Extended");
utökade = sant;
räkna [0] = maxCounts; Återställ räknaren när utsträckt
destination = maxCounts;
}
} //end getFeedback