Schrittmotorsteuerung Positionsrückgabe

Gast #4929556
Hallo,

ich nutze das Schrittmotor IC TMC5072 und habe folgendes Problem:

Ich möchte eine Rückmeldung geben wenn der Motor eine Position erreicht 
hat, dass klappt soweit jedoch wird in der Zeit wo der Motor fährt immer 
wieder das Flag abgefragt (über SPI ist die gesamte Ansteuerung), dabei 
wird alles andere blockiert, sodass ich nicht z.B. während der Motor 
noch fährt sagen kann Motor stop.

Wie könnte man das realisieren?

aktuell mache ich es so nur dann sind halt durch die while-schleife 
andere Aktionen in der Zeit blockiert.
1
writeDatagram(SWMODE_1, 0, 0, 0, 0); //sg_stop  */
2
      
3
      writeDatagram(CHOPCONF_1 , 0, 1, 1, 213); //TOFF: 5, HSTRT: 5, HEND: 3, TBL: 2
4
      writeDatagram(IHOLD_IRUN_1 , 0, 7, 2, 0);
5
      writeInt(VHIGH_1, 256);
6
      writeInt(VCOOLTHRS_1, 256);
7
      writeDatagram(PWMCONF_1,0,20,4,0);//PWM_GRAD: 4, pwm_autoscale: 1, FREEWHEEL: 1
8
      writeDatagram(RAMPMODE_1, 0, 0, 0,MODE_POSITION);
9
      writeInt(VSTART_1, 0);
10
      writeInt(A1_1, 40000);
11
      writeInt(V1_1, 50000);
12
      writeInt(AMAX_1, 40000);
13
      writeInt(VMAX_1, sMotor[0].ulNormalSpeed);
14
      writeInt(DMAX_1, 40000);
15
      writeInt(D1_1, 40000);
16
      writeInt(VSTOP_1, 10);
17
      writeInt(TZEROWAIT_1, 0);
18
      
19
      writeInt(XTARGET_1, ActPos + newPos);
20
      ActPos = readInt(XACTUAL_1);
21
      
22
      writeInt(XACTUAL_1, 0);  
23
      
24
      while((readInt(RAMPSTAT_1) & 0x200) != 0x200); //position_reached
25
      SendMessage ('C', 300, 1);
#4929568
Vielleicht hiermit?

> R+C 7 event_pos_reached
> 1: Signals, that the target position has been reached
> (position_reached becoming active).
> (Flag and interrupt condition are cleared upon reading)
> This bit is ORed to the interrupt output signal.
Gast #4930183
Das Problem besteht nicht primär mit der gewählten Art der Rückmeldung 
vom TMC5072, sondern in der Lösung des blockieren anderer Befehle....

denn während die Rückmeldung gelesen wird kann dann kein anderes 
commando wie z.B. stop bearbeitet werden.


Kennt sich jemand mit Trinamic aus?
#4930489
Ja, ist mir schon klar. Du benötigst einen Interrupt. Den wollte ich dir 
damit aufzeigen. Den externen Interrupt an einen Pin setzen. Sobald der 
feuert hast du dein Ende erreicht.

Diesen Teil meine ich.
> This bit is ORed to the interrupt output signal.
Gast #4932367
Die Möglichkeit ist bei mir leider nicht möglich da die Hardware bereits 
fertig ist und kein Interrupt Ausgang vorgesehn ist.

Gibt es irgendwie eine andere Möglichkeit das zu lösen?
Gast #4934322
Marc V. schrieb:
>> Kann bitte Jemand einen Vorschlag machen?
>     while((readInt(RAMPSTAT_1) & 0x200) != 0x200) //position_reached
>     {
>        // Abfrage auf Input, STOP senden oder was auch immer
>     }
>     SendMessage ('C', 300, 1);

klappt leider nicht da der µC in der Zeit wo in der While-Schleife immer 
wieder die Position über SPI abfragt nichts anderes machen kann.

Dadurch kann nicht gestoppt werden während der Motor noch fährt...

Nehme ich die while-Schleife weg klappt das stoppen während der Fahrt.

Wie kann ich die Positioabfrage so gestalten, dass der µC nicht 
blockiert ist ?
1
while((readInt(RAMPSTAT_2) & 0x200) != 0x200) //position_reached
2
{
3
        if (sMotor[1].motorStop == 1)
4
  {
5
    writeInt(VMAX_2, 0);          
6
  }
7
}
8
HIDSendMessage ('C', 921, 1);
Gast #4935280
Niemand eine Idee wie ich das lösen könnte?

Mein SPI läuft mit 500 kHz d.h für ein Befehl(5 Bytes) zum TMC5072 
braucht es 80µs.

Hab schon an sowas gedacht:

Die aktuelle Position im Interrupt z.B. alle 200 ms abfragen dann hätte 
man noch in der Zwischenzeit die Möglichkeit ein Befehl z.B. Motorstop 
(writeInt(VMAX_1, 0)) unterzubrigen das auch vom TMC5072 registriert 
wird.

oder?


Kann bitte Jemand einen Lösungsvorschlag machen?
Gast #4935420
Hört sich doch schonmal plausibel an.

Du kannst in wie while schleife einfach noch ein Flag abfragen, welches 
Du mit deinem Stop-Befehl auslöst. also die While erweitern. dann fragt 
er die Position ab und prüft, ob Du den Motor stoppen möchtest.
Genauso könntest Du das Konstrukt deienr While Schleife timergesteuert 
alle 100ms ausführen lassen. in der Zwischenzeit kannst Du in der Main() 
ein Flag setzen, wleches Du beim Einsprung des Timers als erstes 
"abfragentuhst". Ist diese gesetzt, wird nich die Position rückgelesen, 
sondern "Stop" gesendet.

Manchmal sieht man eben den Wald vor Bäumen nicht.
Ich muss wieder...

StromTuner

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.