Schrittmotorsteuerung Positionsrückgabe

Gast #4929556
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);
Gast #4930183
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?
Gast #4934322
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);
Gast #4935280
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?
Gast #4935420
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren