Försök till styrsystem svets, Arduino

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Tragiskabananer
Inlägg: 9
Blev medlem: 27 december 2016, 18:40:29

Försök till styrsystem svets, Arduino

Inlägg av Tragiskabananer »

Hej! Har en äldre svets som den gamla styrelektroniken havererat på. Tanken slog mig att montera in något vettigare kanske mer modernare. Innan det blir något mer avancerat så använder jag ett färdigt motorstyrningskit så behöver jag bara slå av/på kontaktor, gasventil och motorstyrning. Ingen fara med säkerheten, bollar idéer med en utbildad elektriker så jag vet vad jag ger mig in på. Ser det här mer som en sak som jag kan lära mig av.

Till problemet! Det hade varit enkelt att bara slå av/på allting direkt men det är lite fränare att tajma så att gasventilen slår på nån halv sekund innan kontaktor och motorstyrning, vice versa när man släpper knappen. Har knyckt lite kod av en som gjort samma operation på youtube och försökt anpassa det till mitt projekt. Och det fungerar dugligt, koden gör det den ska men jag har problem med att den ibland studsar tillbaka till "steg ett". Det är lättast å se på seriella monitorn hur den beter sig. (Knappen är kopplad på ingång 2 med en 10k resistor.) Det gör den ostabil och det vill man inte ha. Ett annat problem jag har är att "postflow"-funktionen fungerar inte som jag vill. Kontaktor och motorstyrning ska stänga av innan magnetventilen när knappen släppts. Men den gör inte det när någon av de två kommenterade raderna i IF-sektionerna för stegTvå och StegTre inte är med i koden. Avkommenterar jag någon av de så fungerar det som det ska.

Om det finns andra lösningar på problemet eller tips på förbättringar på min kod så är all konstruktiv kritik välkommet. Har försökt kommentera och göra det tydligt så gott det går. Försöker framtidsäkra koden genom att använda millis(), med delay hade jag varit klar längesen, men det är ju inte det bästa att använda om man vill göra flera saker samtidigt senare.

// E Hansson

Kod: Markera allt

/*Styrsystem för svets. Eller prototyp till en iaf.
  På utgångarna kan det enkelt kopplas in optokopplare som styr relän osv. 
*/

const int pKnappIn = 2;                       //Konstanter till in/utgångar på mikrokontroller
const int magnetVentil = 13;
const int kontaktor = 12;
const int motorstyrning = 11;

unsigned int preflow = 1000;                 //Tider som bestämmer timingen
unsigned int tidKontaktor = 250;
unsigned int tidMotorstyrning = 2500;
unsigned int postflow = 2500;

unsigned long CurrentMillis;                //Variabler som lagrar tiden som används för timingen
unsigned long magnetventilAvMillis;
unsigned long motorstyrningAvMillis;
unsigned long kontaktorTillMillis;
unsigned long kontaktorAvMillis;

bool pKnapp = false;                        //Olika logiska argument
bool lastpKnapp;
bool stegEtt = false;
bool stegTva = false;
bool stegTre = false;

void setup() {
  pinMode(magnetVentil, OUTPUT);          //Definiering av ingångar/utgångar
  pinMode(kontaktor, OUTPUT);
  pinMode(motorstyrning, OUTPUT);

  pinMode(pKnappIn, INPUT);
  Serial.begin(9600);

}

void loop() {
  styrsystem();
}

void styrsystem () {

  CurrentMillis = millis();

  pKnapp = digitalRead(pKnappIn);

  if ((pKnapp == false && pKnapp != lastpKnapp)) {                //Beskriver vad som händer när knappen släppts
    stegTva = true;
    stegTre = true;
    lastpKnapp = false;
    kontaktorAvMillis = CurrentMillis + tidKontaktor;
    magnetventilAvMillis = CurrentMillis + postflow;
    Serial.print("Släpp knapp");
  }

  if (pKnapp == true && pKnapp != lastpKnapp) {                //Beskriver vad som händer när knappen trycks in
    stegEtt = true;
    stegTva = false;
    stegTre = false;
    lastpKnapp = true;
    digitalWrite (magnetVentil, HIGH);
    kontaktorTillMillis = CurrentMillis + preflow;
    Serial.print("Trycker in knapp");
  }

  if (stegEtt && CurrentMillis > kontaktorTillMillis) {             //Steg ett är när knappen trycks in och vad som ska klicka igång då.
    stegEtt = false;                                                //
    digitalWrite(motorstyrning, HIGH);
    digitalWrite(kontaktor, HIGH);
    Serial.print("Steg Ett");
  }

  if (stegTva && CurrentMillis > kontaktorAvMillis) {              //Steg två används när knappen släppts. Fortfarande oklart om motorstyrningen ska
    stegTva = false;                                               //vara low här
    digitalWrite(kontaktor, HIGH);
    //digitalWrite(motorstyrning, LOW);
    Serial.print("Steg Två");
  }

  if (stegTre && CurrentMillis > magnetventilAvMillis) {          //Steg tre stänger av allting, styr även hur länge magnetventilen ska vara på efter
    stegTre = false;                                              //det att knappen släppts
    digitalWrite(motorstyrning, LOW);
    digitalWrite(kontaktor, LOW);
    //delay (800);
    digitalWrite(magnetVentil, LOW);
    Serial.print("Steg Tre");
  }

}
Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Försök till styrsystem svets, Arduino

Inlägg av Icecap »

Steg 1 är att knappen definitivt inte ska kopplas direkt in i mikroprocessorn.

Det finns så mycket störningar i en svets att knappen MÅSTE avstöras med hårdvara!

Helst ska det vara en optokopplare mellan knappen och mikroprocessorn men det kan gå med mindre:
- Knappens ena sida till GND.
- Knappens andra sidan till ett motstånd till VDD. Ett värde på kanske 2,2k.
- Därifrån går ett motstånd (10k) till processorpinnen.
- Mellan processorpinnen & GND plsceras en keramisk kondensator på 10-100nF.

Nu får du en nolla när knappet påverkas och en etta när du släpper - och processorn får inte in störningar på VDD i samma omfattning så den återställs inte så ofta.
Tragiskabananer
Inlägg: 9
Blev medlem: 27 december 2016, 18:40:29

Re: Försök till styrsystem svets, Arduino

Inlägg av Tragiskabananer »

Jodå, jag har full koll på att det är väldigt smutsig el i svetsen. Just nu försöker jag bara få ordning på själva programmet. Kommer troligen använda optokopplare till knappen. Ingenting är byggt i svetsen än, utan det är bara ihopkopplat på en breadboard tillsvidare.
pfyra
Inlägg: 345
Blev medlem: 8 mars 2015, 14:14:44
Ort: utanför Karlstad

Re: Försök till styrsystem svets, Arduino

Inlägg av pfyra »

Det blir lätt en aning rörigt och lätt att göra fel om man har 3 (eller fler) variabler för att hålla koll på i vilket tillstånd (state) programmet är. Det första jag skulle göra är att byta ut stegEtt, stegTva, stegTre till en enda variabel "steg" som har värde 1, 2 eller 3. Man kan då lätt bygga ut systemet till alla de där 37 tillstånden man drömt om utan mardrömmar om alla variabler.

För att sätta namn på stegen så kan du använda en enum, t.ex:
enum State {
STATE_IDLE = 0,
STATE_STARTING_UP,
STATE_WELDING,
STATE_SOMETHING
};

if (STATE_IDLE){ (eller en switch-sats)
/* sov... */
} else if ....

Med en enum (eller vanlig integer) så kan du lätt stega vidare till nästa tillstånd med t.ex steg+=1;

Jag vet inte hur en svets fungerar så jag hittade på några namn. Det är värt att tänka till lite kring namnen på tillstånden, personligen skulle jag vilja att de beskriver vad i svetsflödet de hör ihop med. Helst inte något om knappens tillstånd och helst inte någon 1,2,3 heller (men ibland så är det nödvändigt..).
Användarvisningsbild
mankan
EF Sponsor
Inlägg: 905
Blev medlem: 18 juli 2015, 11:23:22
Ort: Linköping

Re: Försök till styrsystem svets, Arduino

Inlägg av mankan »

pfyra skrev: 2 mars 2021, 08:53:08 enum State {
STATE_IDLE = 0,

if (STATE_IDLE){ (eller en switch-sats)
Goda råd men låt bli if-satsen som den skrivs ovan eller låt enum:en börja på 1 :-)
if (steg == STATE_IDLE){ // funkar däremot som önskat.
pfyra
Inlägg: 345
Blev medlem: 8 mars 2015, 14:14:44
Ort: utanför Karlstad

Re: Försök till styrsystem svets, Arduino

Inlägg av pfyra »

Whoops! Ja, if-satsen som jag skrev den är förstås helt fel. Tack för rättningen mankan!
Behövs inte många rader kod innan man fått med en bug :lol:
Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Försök till styrsystem svets, Arduino

Inlägg av Icecap »

Och sedan dagens tips: Ha med ett villkor som fångar "alla andra" villkor på ett säkert sätt, då kommer den inte att fastna i vinkelvolten om det kommer någon störning.

Typ

Kod: Markera allt

switch(sekvensvariabel)
  {
  case x:
    break;
  case y:
    break;
  default:
  // Fångar alla dom som ingen case fångar.
  // Perfekt för att säkra att störningar kan avslutas säkert.
  }
svanted
Inlägg: 5082
Blev medlem: 30 augusti 2010, 21:20:38
Ort: Umeå

Re: Försök till styrsystem svets, Arduino

Inlägg av svanted »

dagens fråga,
vad är kilometrarna mellan Ystad och Treriksröset?
Skriv svar