AVR mit zwei Schrittmotoren ?

StepperIOS

  • 1
  • 2
  • Page 1 of 2
jomixl
Benutzer
Avatar
Gender:
Posts: 223
Registered: 02 / 2008
Subject:

AVR mit zwei Schrittmotoren ?

 · 
Posted: 10.04.2019 - 09:29  ·  #1
Hallo,
ich muss zwei Schrittmotoren mit einem AVR ansteuern von denen jeweils nur einer läuft.
Die Endstufen benötigen nur Takt und Dir, also ideal für einen UserDevice.
Da der AVR ja nur einen Motor handeln kann muss ich eine Umschaltung der Signale vornehmen.
Nun meine Frage:
muss ich das mit Hardware machen oder kann ich in der StepperIOS die Unterscheidung vornehmen
und dort mit dem richtigen Takt-Pin wackeln ?

Hat das schon jemand gemacht?

Gruß Joachim
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2081
Registered: 03 / 2003
Subject:

Re: AVR mit zwei Schrittmotoren ?

 · 
Posted: 10.04.2019 - 10:01  ·  #2
Hallo Joachim,

nein ich hab das noch nicht gemacht, aber solche Endstufen benötigen doch normalerweise auch ein Enable. Also wenn du Takt und Dir beider parallel schaltest und den Enable steuerst ..... ;)

Gruss
Harry
jomixl
Benutzer
Avatar
Gender:
Posts: 223
Registered: 02 / 2008
Subject:

Re: AVR mit zwei Schrittmotoren ?

 · 
Posted: 10.04.2019 - 11:32  ·  #3
hallo Harry,
werden die Motoren ohne Enable stromlos ? Das wäre nicht gut, denn die Position muss erhalten bleiben.
Ich hoffe Rolf kann meine Frage beantworten......

danke
Joachim
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: AVR mit zwei Schrittmotoren ?

 · 
Posted: 11.04.2019 - 18:32  ·  #4
Hallo Jo,
ich habe da keine Erfahrung. Ich nehme bei uns hier jeweils
ein kleiner XMega pro Motor.
Wie Harry geschrieben hat wäre so ein Enable Pin sinnvoll.
Aber wenn damit ein Motor/Treiber stromlos wird dann hilft
da nur en externes Gatter, vermute ich.

rolf
TheBeginner
Schreiberling
Avatar
Gender: n/a
Location: Wunsiedel Bayern
Age: 66
Posts: 755
Registered: 06 / 2013
Subject:

Re: AVR mit zwei Schrittmotoren ?

 · 
Posted: 11.04.2019 - 20:20  ·  #5
Also wenn nur einer der beiden laufen soll, dann würde ich den Code
nehmen der hier schon mal besprochen wurde. Ich weiß jetzt nicht mehr
wer es war der mir dabei geholfen hatte.

Joachim ich poste mal meinen Code, vllt kannst was gebrauchen.
Bei mir haut es 100% hin mit den Code.


Code


  Takt_X    [@PortB,5] : bit; // X6 
  DIR_X     [@PortB,2]: bit;  // X10 

  Takt_Y    [@PortA,7] : bit; 
  DIR_Y     [@PortA,4]: bit;  



Code

procedure onTickTimer;                 //
begin
  //Takt X ausgeben
  if X_Step = true then
      incl(Takt_X);
      uDelay_1(3);   //alt 3 uS
      excl(Takt_X);
  endif;
  //Takt Y ausgeben
  if Y_Step = true then
      incl(Takt_Y);
      uDelay_1(3);   //alt 3 uS
      excl(Takt_Y);
  endif;
  //Takt Z ausgeben
  if Z_Step = true then
      incl(Takt_Z);
      uDelay_1(3);   //alt 3 uS
      excl(Takt_Z);
  endif;

  Tick_True:= true;
end;



Code

//  S_Freq;     -> StartFreq
//  E_Freq;     -> EndFreq
//==============================================================================
Procedure Proc_Rampen_Fahrt;
begin
  TickTimerStop;
  rest:= 0;
  accel_count:= Start_rampwert;
  dly_alt  := S_Freq;
  newDelay := S_Freq;
  TickTimerTime(dly_alt);
  TickTimerStart;
  Tick_True:= false;

  step_half:=  step_count div 2;

  {Rampe anfahren}
  Repeat
    if Tick_True = true then
      accel_count:= accel_count + 1;
      newDelay := dly_alt - (2* dly_alt + rest) div (4 * accel_count + 1);
      TickTimerReload(newDelay);               
      Tick_True:= false;                       
      rest:= (2 * dly_alt + rest) mod (4 * accel_count + 1);
      dly_alt := newDelay;
      step_count:= step_count - 1;
    endif;
  until (newDelay < E_Freq) or (step_count = step_half);
  rampwert := longword(accel_count);

  {Fullspeed}
  Repeat
    if Tick_True = true then
      Tick_True:= false;                       
      step_count:= step_count - 1;
    endif;
  Until (step_count <= rampwert);

  {Rampe abbremsen}
  Repeat
    if Tick_True = true then
      accel_count:= accel_count + 1;
      newDelay := dly_alt + (2* dly_alt + rest) div (4 * accel_count + 1);
      TickTimerReload(newDelay);               // writing a new value
      Tick_True:= false;                       
      rest:= (2 * dly_alt + rest) mod (4 * accel_count + 1);
      dly_alt := newDelay;
      step_count:= step_count - 1;
    endif;
  until step_count = 0;


  //Alles beenden
  TickTimerStop;
  Tick_True:= false;
  X_Step:= false;
  Y_Step:= false;
  Z_Step:= false;
end Proc_Rampen_Fahrt;



Gruß Frank
jomixl
Benutzer
Avatar
Gender:
Posts: 223
Registered: 02 / 2008
Subject:

Re: AVR mit zwei Schrittmotoren ?

 · 
Posted: 11.04.2019 - 22:17  ·  #6
Hallo,
zunächst mal danke für die Antworten.
Ich bin mir nicht ganz sicher ob ich das mit der StepperIOS richtig verstanden habe, ich meine diese Routine wird bei jedem Schritt aufgerufen.
Dann kann ich doch abhängig von einem Flag den Takt für den eine bzw. andern Motor erzeugen. Die Rampen werden ja dann vom System erzeugt und beide Motoren bleiben bestromt.
Hab bisher nur ein kleines Testprogramm gemacht (nur für den Oszi) aber die Takte werden erzeugt.

Solange ich immer nur einen Motor bewegen will sollte das doch funktionieren .... oder hab ich da was übersehen?

Gruß Joachim
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2081
Registered: 03 / 2003
Subject:

Re: AVR mit zwei Schrittmotoren ?

 · 
Posted: 12.04.2019 - 09:41  ·  #7
Hallo Joachim,

ja: wie selektierst du den Motor? Dazu bräuchtest du mindestens noch eine externe Logik, die den Takt und die Richtung auf die jeweilige Endstufe schaltet. Da der Motor nicht ohne Strom sein darf, kannst du den Enable natürlich hart verdrahten.

Gruss
Harry
jomixl
Benutzer
Avatar
Gender:
Posts: 223
Registered: 02 / 2008
Subject:

Re: AVR mit zwei Schrittmotoren ?

 · 
Posted: 12.04.2019 - 11:23  ·  #8
Hallo Harry,
ich denke es reichen die 2 Takt und 2 Dir Signale. Enable ist ständig an.
Wenn sich Motor 1 bewegen soll dann Takte ich mit Takt 1, bei Motor 2 mit Takt 2 in der
stepperIOS abhängig von einem Auswahlflag. Dir wird vorher richtig gesetzt.

... wie gesagt, bisher sieht es so aus als würde das funktionieren.
Muss vielleicht noch erwähnen dass ich den Stepperport nur als Userdevice deffiniert habe:

StepType = UserPort;

ohne Angabe der Ports.

Gruß Joachim
  • 1
  • 2
  • Page 1 of 2
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 15 · Cache Hits: 14   139   153 · Page-Gen-Time: 0.024747s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI