mikrocontroller.net

Forum: FPGA, VHDL & Co. Schrittverlust im Schrittmotor korrigieren


Autor: Den (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Freunde,
ich habe ein Inkrementaldrehgeber an dem Rotor eines Schrittmotor 
befestig.
Die Signale(Recheckig) von Inkremtal geben mir die Drehzahl bzw die 
position des Motors.Ein Counter_A zählt die Inkremente Signal und ein 
Counter_B zählt die tatzätliche Drehzahl des Motor und die Verlust ist 
dann die Differenz zwischen beide Counter. Nun habe ich beide Counter in 
separaten Process gesetzt , da die Processe parallele abrbeiten.Aber in 
welche Process soll ich die Verlust, also die Differenz zwischen beide 
Counter berechnen??? in eine anderen Process oder in einem von den 
beiden Processen.

 Mein S-Motor ist bipolare und wird mit 8 Signal angesteurt also 4 mal 2 
H-Brücke.

Hier mein Progamm  für die Ansteuerung...
wie kann ich zu diesem Progamm die Erfassung und Korrektur der Verlust 
ergänzen??? Ich hatte die Erfassung und Korrektur in eine andere Process 
, aber es hat nicht funktionniert....

Ich biete Um Hilfe

Danke

......
constant A1 : Std_Logic_Vector(7 downto 0) := "01010000";
constant A2 : Std_Logic_Vector(7 downto 0) := "00001010"; 

Begin

PROCESS (Reset,clk)
        
BEGIN
       
 IF Reset = '1' THEN
            counter <= (others => '0');
            counter1 <= (others => '0');
            counter_B<= (others => '0');
                                         
  elsIF rising_edge(clk) THEN 

    IF enable_in ='0' THEN
               
     IF counter ="00000010000000000000011" THEN ----Geschwindigkeit des  Schritt

                              counter <= (others => '0');           
                         
                              counter_B<= counter_B + '1';--tatsäztlichen Schrittanzahl des Motor 

                              counter1 <= counter1 + '1';

                        ELSE

                             counter <= counter + '1';
                                                    
---------------------------------------------------------------------------

                            ------------RECHTSLAUFT-------------

---------------------------------------------------------------------------


                            IF Richtung = '1'  then  
                                                                              
                                 CASE counter1 IS   


                                 WHEN "00" =>
                
                                     aus <= not A1 xor A2;
                
                                 WHEN "01" =>
        
                                     aus <= not A1 xor not A2;
        
                                WHEN "10" =>
        
                                     aus <= A1 xor not A2;
        
                                WHEN "11" =>
                
                                      aus <= A1 xor A2;
                
                                 WHEN OTHERS =>
        
                                      aus <= "00000000";
        
                            END CASE;

               
---------------------------------------------------------------------------

                        ----------------LINKSLAUFT-------------

---------------------------------------------------------------------------

                        ELSIF Richtung ='0' then

            
                            CASE counter1 IS   


                            WHEN "00" =>
                
                                aus <= A1 xor A2;--01011010
                
                            WHEN "01" =>
        
                               aus <= A1 xor not A2;--01010101
        
                           WHEN "10" =>
        
                              aus <= not A1 xor not A2;--10100101
        
                           WHEN "11" =>
                
                                 aus <= not A1 xor A2;--10101010
                
                           WHEN OTHERS =>
        
                                  aus <= "00000000";
        
                             END CASE; 
                                                    
                 ELSE

                     counter <= (others => '0');

                     counter1 <= (others => '0');

                     aus <= "00000000";

                        end if;              
                   
                    end if;
                END IF;

            End IF;
 

Autor: Den (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry ...

die Counter_A(  Signale von Inkremental)  geben die tatsäztliche 
Drehzahl also die Ist-Werte  und  Counter_B geben die Sollwerte, die 
gedreht werden sollen.

Danke

Autor: Thisamplifierisloud (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du Schrittverluste hast, würde ich die Ursache dafür abstellen,
nicht am Symptom herumdoktern.

Ausserdem wird das immer ungenau, weil vermutlich die Auflösung des 
Inkrementalgebers nicht exakt die gleiche Auflösung wie der Steppmotor 
hat.

Autor: Jürgen Schuhmacher (engineer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das kann man schon noch interpolieren / korrelieren aber ich stimme auch 
zu, lieber die Ursache zu beheben. Wenn das nicht geht, muss man die 
vorlustigen Schritte mitzählen und hinterher draufzählen.

Verhindern kann man das mit einer intelligenten Regelung, die den Motor 
mitsimuliert und passend den Strom kurz erhöht, wenn er droht, aus dem 
Takt zu geraten.

https://data.epo.org/publication-server/getpdf.jsp...


Darin steckt auch eine kluge Steuerung, wie der Motor anzufahren hat, um 
energetisch günstig zu beschleunigen und zu bremsen. Wenn der Motor z.B. 
gegen einen Anschlag fährt, daraf man ihn nicht zu hart dagegenfahren, 
weil er sonst über das Haltemoment zurückspringt. Da gibt es viel zu 
tun, wenn man genau sein will. Dafür kann man auch gänzlich auf 
Drehgeber verzichten.

Autor: Den (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Schumi und Thisamp,
hier habt recht ich habe noch überlegt, es ist sehr kompliziert die 
Verlust mit der Steuerung zu korriegieren ohne aus die Ursache 
zuzugreifen.Ich werde jetzt nur die Verlust ermittel und später überlege 
wie ich das auflösen kann

Danke für ihre Mühe

Autor: Sigurt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit den Drehgebern ist es doch einfach: Du musst doch nur zählen, wenn 
ich es richtig verstehe.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.