Forum: Mikrocontroller und Digitale Elektronik Schrittmotorsteuerung Positionsrückgabe


von Dieter (Gast)


Lesenswert?

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);

von Nico W. (nico_w)


Lesenswert?

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.

von Dieter (Gast)


Lesenswert?

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?

von Nico W. (nico_w)


Lesenswert?

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.

von Dieter (Gast)


Lesenswert?

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?

von Dieter (Gast)


Lesenswert?

Kann bitte Jemand einen Vorschlag machen?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Dieter schrieb:
> Kann bitte Jemand einen Vorschlag machen?
1
    while((readInt(RAMPSTAT_1) & 0x200) != 0x200) //position_reached
2
    {
3
       // Abfrage auf Input, STOP senden oder was auch immer
4
    }
5
    SendMessage ('C', 300, 1);

von Dieter (Gast)


Lesenswert?

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);

von Dieter (Gast)


Lesenswert?

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?

von Axel R. (Gast)


Lesenswert?

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

von Axel R. (Gast)


Lesenswert?

hingerotzt, sorry...

StromTuner

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.