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


von Den (Gast)


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

1
......
2
constant A1 : Std_Logic_Vector(7 downto 0) := "01010000";
3
constant A2 : Std_Logic_Vector(7 downto 0) := "00001010"; 
4
5
Begin
6
7
PROCESS (Reset,clk)
8
        
9
BEGIN
10
       
11
 IF Reset = '1' THEN
12
            counter <= (others => '0');
13
            counter1 <= (others => '0');
14
            counter_B<= (others => '0');
15
                                         
16
  elsIF rising_edge(clk) THEN 
17
18
    IF enable_in ='0' THEN
19
               
20
     IF counter ="00000010000000000000011" THEN ----Geschwindigkeit des  Schritt
21
22
                              counter <= (others => '0');           
23
                         
24
                              counter_B<= counter_B + '1';--tatsäztlichen Schrittanzahl des Motor 
25
26
                              counter1 <= counter1 + '1';
27
28
                        ELSE
29
30
                             counter <= counter + '1';
31
                                                    
32
---------------------------------------------------------------------------
33
34
                            ------------RECHTSLAUFT-------------
35
36
---------------------------------------------------------------------------
37
38
39
                            IF Richtung = '1'  then  
40
                                                                              
41
                                 CASE counter1 IS   
42
43
44
                                 WHEN "00" =>
45
                
46
                                     aus <= not A1 xor A2;
47
                
48
                                 WHEN "01" =>
49
        
50
                                     aus <= not A1 xor not A2;
51
        
52
                                WHEN "10" =>
53
        
54
                                     aus <= A1 xor not A2;
55
        
56
                                WHEN "11" =>
57
                
58
                                      aus <= A1 xor A2;
59
                
60
                                 WHEN OTHERS =>
61
        
62
                                      aus <= "00000000";
63
        
64
                            END CASE;
65
66
               
67
---------------------------------------------------------------------------
68
69
                        ----------------LINKSLAUFT-------------
70
71
---------------------------------------------------------------------------
72
73
                        ELSIF Richtung ='0' then
74
75
            
76
                            CASE counter1 IS   
77
78
79
                            WHEN "00" =>
80
                
81
                                aus <= A1 xor A2;--01011010
82
                
83
                            WHEN "01" =>
84
        
85
                               aus <= A1 xor not A2;--01010101
86
        
87
                           WHEN "10" =>
88
        
89
                              aus <= not A1 xor not A2;--10100101
90
        
91
                           WHEN "11" =>
92
                
93
                                 aus <= not A1 xor A2;--10101010
94
                
95
                           WHEN OTHERS =>
96
        
97
                                  aus <= "00000000";
98
        
99
                             END CASE; 
100
                                                    
101
                 ELSE
102
103
                     counter <= (others => '0');
104
105
                     counter1 <= (others => '0');
106
107
                     aus <= "00000000";
108
109
                        end if;              
110
                   
111
                    end if;
112
                END IF;
113
114
            End IF;

von Den (Gast)


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

von Thisamplifierisloud (Gast)


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.

von J. S. (engineer) Benutzerseite


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?pn=2068436&ki=A1&cc=EP


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.

von Den (Gast)


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

von Sigurt (Gast)


Lesenswert?

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

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.