Arduino – die besten Beiträge

Wie messe ich das aktuelle Drehmoment, das an einem Gleichstrommotor wirkt?

Hallo zusammen

Ich möchte gerne einen Motorregler mit einem Gleichstrommotor machen. Man kann sich vorstellen, dass sich am Motor eine Seiltrommel befindet und es wird am Seil gezogen. Das Ziel ist es die Kraft, welche am Seil wirkt, zu regeln. Es gibt 3 Zustände:

- Am Seil wird fest gezogen und der Motor muss abwickeln um die Kraft beizubehalten

- Das Seil wird fest gehalten, aber es bewegt sich nicht. Der Motor dreht zwar nicht, aber es wirkt ein Gegenmoment um die Kraft im Seil zu erhalten.

- Am Seil wird zu wenig gezogen und der Motor wickelt das Seil auf, um die Kraft im Seil zu erhalten.

Nun möchte ich das realisieren. Meine Regelgrösse ist ja das Motordrehmoment. Im Fall 1 und 3 kann man das ja berechnen, in dem man die Drehzahl und die Leistung oder den Strom am Motor misst (können das Motorsteuergeräte?). Dann wäre die Formel ja F = R×I² / (w×r). w ist omega, die Winkelgeschwindigkeit und r der Radius der Seiltrommel. So könnte man ja den Stromregeln und somit auch F regeln. Bei einem Regelkreis würde es ja durch die positive oder negative Stellgrösse automatisch ein auf- oder abwickeln geben. Wie sieht das aber nun im Fall aus, wenn das Seil sich nicht bewegt? (Fall 2). Dann wäre Omegs ja 0 und man würde durch 0 teilen. Aber man kann ja auch dann ein Drehmoment auf den Motor geben, das entgegen haltet. Wie rechnet man in diesem Fall das Bremsmoment des Motors (Gegenmoment) aus, wenn der Motor gar nicht dreht? Und für Fall 1 und 3, misst ein Motordrive / shield den Strom, damit man den zum regeln nutzen kann? Würde das dann mit einem Arduino und einem PID Regler regeln. Die Drehzahl und Winkelgeschwindigkeit könnte ich über einen Encoder ermitteln.

Leistung, Elektronik, Strom, Elektromotor, Kraft, Elektrotechnik, Wissenschaft, Spannung, Motor, Arduino, Automation, Elektrizität, Engineering, Ingenieur, Mechatronik, Physik, Regelung, Widerstand, Drehmoment

Interrupt im Programmablaufplan?

Hey, ich muss gerade für NWT einen PAP zeichnen.in dem Programm kommt auch der interrupt- Befehl vor. Ich weiß aber nicht wie genau ich ihn in den PAP einbauen soll. Der Interrupt-Befehl kommt im setup vor fällt er dann also unter start, so wie die ganzen Deklaration zum Beispiel auch? Wie würdet ihr das machen? Wohin geht der Pfeil dann nieder zurück vom unterprogramm?
meine Idee war diese hier (grobe Skizze, Befehle sind noch nicht eingetragen):

Das Programm hierzu ist übrigens das:

int warteZeit = 500;     
int versagtZeit = 0;
int tasterStatus;
int tasterPin = 2;
int Pin;
int Signal = 0;
int startZeit = 500;
int LED1 = 4;
int LED2 = 5;
int LED3 = 6;
int LED4 = 7;
int LED5 = 8;
int DurchgangsZaehler = 0;

void setup() {
 pinMode(tasterPin, INPUT_PULLUP);         
 pinMode(LED1, OUTPUT);                    
 pinMode(LED2, OUTPUT);
 pinMode(LED3, OUTPUT);
 pinMode(LED4, OUTPUT);
 pinMode(LED5, OUTPUT);
 Serial.begin(9600);                       
 attachInterrupt(digitalPinToInterrupt(tasterPin), tempo, FALLING);     
}

void loop() {
  for ( Pin = LED1; Pin < LED5; Pin++) {  
   digitalWrite(Pin, HIGH);                    
   delay(warteZeit);                         
   digitalWrite(Pin, LOW);                     
   if (Signal == 1) {                       
    for (DurchgangsZaehler = 0; DurchgangsZaehler < 3; DurchgangsZaehler++) { 
     digitalWrite(LED1, HIGH);                
     digitalWrite(LED2, HIGH);
     digitalWrite(LED3, HIGH);
     digitalWrite(LED4, HIGH);
     digitalWrite(LED5, HIGH);
     delay(200);                              
     digitalWrite(LED1, LOW);                
     digitalWrite(LED2, LOW);
     digitalWrite(LED3, LOW);
     digitalWrite(LED4, LOW);
     digitalWrite(LED5, LOW);
     delay(200);                              
    }

    Signal = 0;                              
    warteZeit=startZeit;                       
  }
 }
 for ( Pin = LED5; Pin > LED1; Pin--) {                         
 digitalWrite(Pin,HIGH);
delay(warteZeit);                                                                                      digitalWrite(Pin, LOW);                                       
    if (Signal == 1) {                                          
   for (DurchgangsZaehler = 0; DurchgangsZaehler < 3; DurchgangsZaehler++) {  
     digitalWrite(LED1, HIGH);                                   
     digitalWrite(LED2, HIGH);
     digitalWrite(LED3, HIGH);
     digitalWrite(LED4, HIGH);
     digitalWrite(LED5, HIGH);
     delay(200);                                                
     digitalWrite(LED1, LOW);                                    
     digitalWrite(LED2, LOW);
     digitalWrite(LED3, LOW);
     digitalWrite(LED4, LOW);
     digitalWrite(LED5, LOW);
     delay(200);                                                 
   }
   Signal = 0;                                                   
   warteZeit=startZeit;                                         
  }
 }
 Serial.print("Wartezeit=");                                   
 Serial.println(warteZeit);
}
void tempo() {                                                  
if (digitalRead(tasterPin) == 0 && Pin == 6) {                  
   warteZeit = warteZeit - 50;                                  
   Serial.print("Richtig gedrückt, Wartezeit beträgt nun ");   
   Serial.print(warteZeit);
   Serial.println(" Millisekunden");
 }
 else {                                                       
   Signal = 1;                                                 
}
}

Danke schonmal, falls ihr trotz dieser langen Frage antwortet

Bild zum Beitrag
Cplusplus, Arduino, NWT, Programmiersprache, C (Programmiersprache), PAP, nwt-projekt, Arduino Uno, Arduino IDE

Meistgelesene Beiträge zum Thema Arduino