Kleine Regelung

Moin Kollegen,

ich hatte gestern schon mal etwas gepostet, war aber zu allgmein. Ich habe auch schon gesucht, aber wenn man die “richtige Frage” nicht kennt, ist es etwas schwierig.

Folgendes Problem:
Wir ihr auf dem Bild sehen könnt habe ich einen Akutator (Nur als Model) welcher mir durch das Poti die Spannung ausgibt. Von 0-5 Volt.

–>Was jetzt passieren soll ist, dass ich einen Voltwert vorgebe über einen 2 Wege Taster und mein Aktuator die Pos anfährt. Also meine Sollwert und meinen IstWert am Akt soll dann gleich sein.

Den Teil mit den Tastern habe ich schon hinbekommen.–> Wenn ich den Taster nach oben oder unten drücke, Zählt der Wert rauf oder runter, von 0 - 255. und schlatet den Ausgang Siehe Code. Im moment fährt das ding dann einfach weiter.

Was ich jetzt einfach nicht ganz cheche, wie muss so eine Regelung aussehen. Also dass der jetzt zu meinem Sollwert fährt und da dann stehen bleibt. Müsste ja eine weitere if, else if schleife sein. NUR WIE? Da gibts doch sicher schon 1000 Beispiel. Evtl kennt da jemand was…

VIELEN DANK!!

// Aktuator Test
// 

int volt_s1=0;   // Vollt Soll (eingestellt)
int volt_i1 = A0;  // Volt am Poti

int SW1=22;  //Taster 1 rausfahren
int SW2=23;  //Taster 2 einfahren
int up=36;   // Signal ausfahren (DC Motor hängt an einer HBrücke)
int dw=37;  // Signal einfahren




void setup()
{
  Serial.begin(115200);
  pinMode(SW1,INPUT);
  digitalWrite(SW1,HIGH);  
  pinMode(SW2,INPUT);
  digitalWrite(SW2,HIGH);
  
  pinMode(dw, OUTPUT);
  digitalWrite(dw, HIGH);
  
  pinMode(up, OUTPUT);
  digitalWrite(up, HIGH);

  
}

void loop()
{


  
  
  if(!digitalRead(SW1)&&digitalRead(SW2)) 
  {
    if(volt_s1<255)volt_s1++;
    
    Serial.println(volt_s1);
    digitalWrite(up, HIGH);
    digitalWrite(dw, LOW);

    delay(10);
  }
  else if(digitalRead(SW1)&&!digitalRead(SW2))
  {
    if(volt_s1!=0)volt_s1--;
    
    Serial.println(volt_s1);
    digitalWrite(dw, HIGH);
    digitalWrite(up, LOW);
    delay(10);
  }
  
  
}

Rechnet die Werte des Poti um. 0Volt = 0, 5V = 255

byte value = map(analogRead(volt_i1), 0, 1023, 0, 255);

Na das ich die Mapfkt brauch ist schon klar, aber wie muss so eine Regelschleife aussehen?

Was gibt meine map Funktion dir für einen Wert zurück, wenn du den Motor mit PWM 127 ansteuerst? Wenn er auf 50% ohne zu übersteuern macht, dann brauchst du keine Regelung sondern lediglich eine Steuerung.

Na die Funktion zeigt mir ja nur umgerechnet vom Analog in zu Out an, was der Wert ist, wo mein Akt grad steht.

Aber deswegen fährt er ja noch lange nicht da hin, wo ich Ihm sage…

Das müßten ja auch erstmal 2 schleifen sein oder?

if { volt_i1>volt_s1 //Abfrage welche Spannung höher ist. (Musst ja wissen in welche Richtung)
digitalWrite(up, HIGH)
aber wie gehts jetzt weiter???
Das er aufhört, wenn wert erreicht?
{if volt_i1 == volt_s1
digitalWirte(up, LOW) <---- Aber wie geht das, dass er in einem Intervall stoppt. Weil nen exakten Voltwert wird man ja never ever erreichen.

else if { volt_i1<volt_s1
digitalwrite(dw, HIGH)
…selbiges wie oben und anderet rum

const int intervall = 5;

if(istWert > sollWert - intervall && istWert < sollWert + intervall)

Hier hast du einen Bereich von +/-5 um den Sollwert

hi,

nicht so schlau, serenifly, dann fährt er bis soll-5 und pendelt da rum.

ich würde: 1. überprüfen, ob der betrag von soll minus ist größer als 4. 2. wenn ja, falls ist größer als soll > in die richtige richtung fahren, bis soll größer gleich ist. falls soll größer als ist > in die richtige richtung fahren, bis ist größer gleich soll. 3. zurück zu 1.

gruß stefan

Kommt auch darauf an wie genau das sein soll. Ich dachte es reicht vielleicht, wenn man den Sollwert ungefähr erreicht. Dann würde ich an der Stelle aufhören zu fahren und erst wieder anfangen wenn ein neuer Sollwert vorgegeben wird.

Kann der Motor nur EIN/AUS oder auch PWM?

Wenn er nur ein und aus geschalten wird, bietet sich sowas an:

const int totband = 3;  // stellt ein Totband ein, innerhalb dessen der Steller nicht nachgeführt wird.
int Ist = analogread(Potipin);
if (volt_s1 > Ist + totband){
  Motorlinksdrehen();
}
if (volt_s1 < Ist - totband){
  Motorrechtsdrehen();
}

Falls du den Motor mit PWM ansteuern kannst, dann bietet sich die PID-Library an.

Super danke, jetzt fehlt nur noch in der schleife, dass er stehenbleibt, wenn er den Bereich erreicht hat.

Ist doch drin. Wenn beide Bedingungen nicht erfüllt sind wird nichts gemacht.

Danke für eure Tips, hat perfekt geklappt, ich habe das jetzt in nem anderen Post zusammengelegt, da es ursprünglich 2 Lösungswege für ein Problem war, aber nur eins weiter verfolgt habe. Bitte dort posten, dass es keine Verwirrung gibt. Dort ist jetzt auch der Code zu finden. Vielen Dank!