Hall effekt sensorer 1: Placera kontroll (4 / 6 steg)
Steg 4: Placera kontroll
Nu när vi har sett en grundläggande avbryta kan vi utöka den för att styra motorn. Vi kommer för att använda en enda variabel och sedan beroende om manöverdonet är går framåt eller bakåt vi kommer att addera eller subtrahera från värdet.
Subrutin speed0() ska kopplas till avbrottet. Genom att veta den aktuella positionen och beräkna den destination ståndpunkten vet vi vilket håll du skicka motorn. Tänk på att räkningarna inte är perfekt. Om du kör motorn på länge fram och tillbaka kan du förlora en räknas här och där och långsamt tappa bort var du är. Vi kommer att använda en målsökande rutin (se nästa steg) för att hålla allt i schack.
Den bifogade uppförandekoden kommer att flytta manöverdonet framåt eller bakåt genom en viss summa när du trycker på knapparna på stift 7 eller 8 (aktiv låg). Du kan testa det genom att använda en tråd ansluten till GND.
Se bifogade koden nedan för mer detaljer.
#define PWMA0 6
#define PWMB0 5
#define enable0 13 //pins för första MegaMoto
#define switch0 7 //Up knapp
#define VÄXEL1 8 //Down knapp
#define hall0 2 //interrupt stift för hall effekt sensorer
int aktiverar = 0; Aktivera pin för megaMoto
int räkna [] = {0}. //Actuator
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 firstRun = true; //first körning av motorn när knappen trycks
void setup() {
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
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 - 200; //dont Ändra destination när du flyttar
annars om (sw [0] == 1 & & sw [1] == 0 & & framåt == false) destination = currentPos + 200; //dont Ändra destination när du flyttar
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() {
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
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
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