Arduino kod fråga

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
KristoferV
Inlägg: 151
Blev medlem: 10 september 2013, 21:33:43

Arduino kod fråga

Inlägg av KristoferV »

Håller på med ett projekt där jag tänkt använda mig av Wesley Kagans freevalve kod.

Den är dock för 4takt och jag kan inte förstå var detta defineras? Jag vill ha 2takt, 0-360 grader = en cykel.

Tack på förhand

Kod: Markera allt

//This code is full of test strings and is generally a conglomerate of code from stackexchange and
//bad form. If it looks stupid, I probably wrote it. 
//Wesley Kagan, 2020

const int hall = 2;
int hallcounter = 0;
int hallstate = 0;
int lasthallstate = 0;
unsigned long triggerTime;
unsigned long last_triggerTime;
unsigned long timeGap;
unsigned long last_timeGap;
unsigned int degree;
unsigned int state;
int newstate;


void setup() {
  pinMode(hall, INPUT);
  Serial.begin(115200);
  pinMode(13, OUTPUT);    // sets the digital pin 13 as output
  pinMode(12, OUTPUT);    // sets the digital pin 12 as output
  attachInterrupt(0, magnet_detect, RISING);//Initialize the intterrupt pin digital pin 2
  degree = 0;
}

 void loop()
 {
  //The compiler says this is needed otherwise the govt. takes my cat
   }

void magnet_detect() {
      hallcounter ++;
      triggerTime = millis();
      timeGap = triggerTime - last_triggerTime;
      last_triggerTime = triggerTime;
     
      if (timeGap >= last_timeGap + last_timeGap / 2)
      {
        //Serial.println(state);
        Serial.println("missing tooth");
        hallcounter = 1; 
        state++; //This right here is garbage and you know it.
      }
    
      last_timeGap = timeGap;
      //Serial.println(hallcounter);
    
     degree = hallcounter * 6;
     if ((state % 2) == 0) { //Bool wasn't working so this dumpster fire got started.
        Serial.print("STATE 1 ");
        Serial.println(degree);
        if (6 <= degree && degree <= 180) { //EDIT HERE INTAKE
        digitalWrite(13, HIGH); // sets the digital pin 13 on
        }
        else {
        digitalWrite(13, LOW);  // sets the digital pin 13 off
        }
     }
     if ((state % 2) == 1) {
        Serial.print("STATE 2 ");
        Serial.println(degree);
        if (180 <= degree && degree <= 354) { //EDIT HERE EXHAUST
        digitalWrite(12, HIGH); // sets the digital pin 13 on
        }
        else {
        digitalWrite(12, LOW);  // sets the digital pin 13 off
        }
     }
  lasthallstate = hallstate;
}
Användarvisningsbild
ajje
Inlägg: 2351
Blev medlem: 12 mars 2010, 16:35:31
Ort: Smedjebacken

Re: Arduino kod fråga

Inlägg av ajje »

(state % 2) gör att varannat varv är insug och varannat är utblås.

Tänker du bygga en tvåtaktsmotor med ventiler? :D
KristoferV
Inlägg: 151
Blev medlem: 10 september 2013, 21:33:43

Re: Arduino kod fråga

Inlägg av KristoferV »

ajje skrev:(state % 2) gör att varannat varv är insug och varannat är utblås.

Tänker du bygga en tvåtaktsmotor med ventiler? :D
Ja typ. Luftmotor som drivs med tryckluft

Ok så (state % 1) bör lösa det?
Användarvisningsbild
ajje
Inlägg: 2351
Blev medlem: 12 mars 2010, 16:35:31
Ort: Smedjebacken

Re: Arduino kod fråga

Inlägg av ajje »

Nej, % 1 kommer att göra så bara den ena fasen körs varje varv

Jag är inte tillräckligt mycket programmerare för att skriva om det där åt dig, särskilt inte nu när jag sitter med telefonen.

Någon annan här kanske kan förbarma sig :D
FormerMazda
Inlägg: 6066
Blev medlem: 27 februari 2006, 14:59:36
Ort: Tranås (Jönköping)

Re: Arduino kod fråga

Inlägg av FormerMazda »

Koden är ju lite hårt skriven, så att ändra en variabel för att ändra 4takt till 2takt blir svårt.

Men dom har magnetpickup och vid varje trigger från den så mäter dom tiden mellan triggers.
Om tiden är större än eller lika med snittet av förra två tidsgapen så antas en tand räknad = avancera state och säg att vi vridit motorn 6°.
Sen har det byggts nån knepig grej med remainders av state och om graderna är inom vissa områden så sätts utgång 12 eller 13 hög eller låg.

Nästan enklare kan vara att du beskriver vad du vill att arduinon ska göra och vad den har för inputs.
Tror inte ett program behöver vara så svårsrkivet.
svanted
Inlägg: 5082
Blev medlem: 30 augusti 2010, 21:20:38
Ort: Umeå

Re: Arduino kod fråga

Inlägg av svanted »

ersätt:
degree = hallcounter * 6;
if ((state % 2) == 0) { //Bool wasn't working so this dumpster fire got started.
Serial.print("STATE 1 ");
Serial.println(degree);
if (6 <= degree && degree <= 180) { //EDIT HERE INTAKE
digitalWrite(13, HIGH); // sets the digital pin 13 on
}
else {
digitalWrite(13, LOW); // sets the digital pin 13 off
}
}
if ((state % 2) == 1) {
Serial.print("STATE 2 ");
Serial.println(degree);
if (180 <= degree && degree <= 354) { //EDIT HERE EXHAUST
digitalWrite(12, HIGH); // sets the digital pin 13 on
}
else {
digitalWrite(12, LOW); // sets the digital pin 13 off
}
}
lasthallstate = hallstate;

med:

degree = hallcounter * 6;

if (6 <= degree && degree <= 180) { //EDIT HERE INTAKE
digitalWrite(13, HIGH); // sets the digital pin 13 on = intake
digitalWrite(12, LOW); // sets the digital pin 12 off = exhaust
}
else {
digitalWrite(13, LOW); // sets the digital pin 13 off
digitalWrite(12, HIGH); // sets the digital pin 12 on
}
lasthallstate = hallstate;
men den kan bara starta med kolven inom typ 6 - 50°
KristoferV
Inlägg: 151
Blev medlem: 10 september 2013, 21:33:43

Re: Arduino kod fråga

Inlägg av KristoferV »

ajje skrev:Nej, % 1 kommer att göra så bara den ena fasen körs varje varv

Jag är inte tillräckligt mycket programmerare för att skriva om det där åt dig, särskilt inte nu när jag sitter med telefonen.

Någon annan här kanske kan förbarma sig :D
Jo fick det typ att funka, har bara konstaterat att ena outputen funkar med hjälp av led på arduino kortet. Ska koppla in allt strax och se hur det beter sig.
KristoferV
Inlägg: 151
Blev medlem: 10 september 2013, 21:33:43

Re: Arduino kod fråga

Inlägg av KristoferV »

FormerMazda skrev:Koden är ju lite hårt skriven, så att ändra en variabel för att ändra 4takt till 2takt blir svårt.

Men dom har magnetpickup och vid varje trigger från den så mäter dom tiden mellan triggers.
Om tiden är större än eller lika med snittet av förra två tidsgapen så antas en tand räknad = avancera state och säg att vi vridit motorn 6°.
Sen har det byggts nån knepig grej med remainders av state och om graderna är inom vissa områden så sätts utgång 12 eller 13 hög eller låg.

Nästan enklare kan vara att du beskriver vad du vill att arduinon ska göra och vad den har för inputs.
Tror inte ett program behöver vara så svårsrkivet.
Ja det är en hemmabyggd "2takts" motor med styrda "freevalve" ventiler. Ventilerna öppnar på någon millisekund så behöver bara av/på signal från Arduino, inget krongel med kurvor.

Har en triggerskiva med magneter 42-2, alltså 42 tänder minus 2 som är missing tooth.
Från hall sensorn får jag en positiv signal


Takt 1 0-180 grader, ska gå att justera
Takt 2 180-360 grader, ska gå att justera

Sen har jag en extra funktion som behöver kunna kopplas in exempelvis 0-90 grader.

Det här med tidpunkter är inte hugget i sten, ska labbas en hel del, kan va så att jag behöver överlappa dem trots de snabba ventilerna.

Sen gör det inget om koden är hårt skriven, allt är bara för att kunna testa en teori. Finliret kan man fixa sen
Skriv svar