Hallo! Hat jemand eine Idee, wie ich einen Schrittmotor langsam in der Drehzahl hochfahren kann? Es handelt sich um einen unipolaren Motor mit 5 Anschlüssen. Wenn Code's dann bitte nur in BASCOM, ich versteh kein C. ;-) Danke schon im Voraus. Grüße Thomas
Gast
#916994
In die Schleife, in der die Takte für den Motor erzeugt werden, muß eine variable Zeitschleife rein! also definiere zuerst 3 Konstanten -Startfrequenz -Arbeitsfrequenz -Bremsfrequenz zb wird: beim Start wird die Zeitschleife pro Schritt immer ein wenig kürzer bis die Arbeitsfrequenz erreicht ist. ...... Somit kanst Du eine Start.- bzw Bremsrampe erzeugen! Gruß Fred
Aber wie komme ich zu einer Variablen Zeitschleife? Bis jetzt hab ich das ganze so gemacht:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
80 | |
81 | |
82 | |
83 | |
84 | |
85 | |
86 | |
87 | |
88 | |
89 | |
90 | |
91 | |
92 | |
93 | |
94 | |
95 | |
96 | |
97 | |
98 | |
99 | |
100 | |
101 | |
102 | |
103 | |
104 | |
105 | |
106 | |
107 | |
108 | |
109 | |
110 | |
111 | |
112 | |
113 | |
114 | |
115 | |
116 | |
117 | |
118 | |
119 | |
120 | |
121 | |
122 | |
123 | |
124 | |
125 | |
126 | |
127 | |
128 | |
129 | |
130 | |
131 | |
132 | |
133 | |
134 | |
135 | |
136 | |
137 | |
138 | |
139 | |
140 | |
141 | |
142 | |
143 | |
144 | |
145 | |
146 | |
147 | |
148 | |
149 | |
150 | |
151 | |
152 | |
153 | |
154 | |
155 | |
156 | |
157 | |
158 | |
159 | |
160 | |
161 | |
162 | |
163 | |
164 | |
165 | |
166 | |
167 | |
168 | |
169 | |
170 | |
171 | |
172 | |
173 | |
174 | |
175 | |
176 | |
177 | |
178 | |
179 | |
180 | |
181 | |
182 | |
183 | |
184 | |
185 | |
186 | |
187 | |
188 | |
189 | |
190 | |
191 | |
192 | |
193 | |
194 | |
195 | |
196 | |
197 | |
198 | |
199 | |
200 | |
201 | |
202 | |
203 | |
204 | |
205 | |
206 | |
207 | |
208 | |
209 | |
210 | |
211 | |
212 | |
213 | |
214 | |
215 | |
216 | |
217 | |
218 | |
219 | |
220 | |
221 | |
222 | |
223 | |
224 | |
225 | |
226 | |
Vielleicht hilft das weiter? Steh leider noch immer aufm Schlauch. Grüße Thomas
Gast
#917025
na gut hab mir eine Zigarette und ein Bier gehohlt und versuche zuverstehen was du da gemacht hast. Fred
Lass dir das Bier schmecken! :-) Der Code funktioniert übrigens einwandfrei, ich möchte nur noch einen Sofstart haben und deshalb bin ich ja auch hier. ;-) Grüße Thomas
Gast
#917062
Jaja, das ist jetzt so, wie wenn einer sagt:
1 | |
Du müsstest abhängig von der Position den Timer0 = 217 unterschiedlich schnell laufen lassen. Denn der schaltet deine Schritte weiter. BTW: Wenn ich das Listing so ansehe, dann war es doch ein weiser Entschluss, C zu lernen.
Gast
#917073
Frage an Thomas E. > unipolaren Motor mit 5 Anschlüssen da ist doch bestimmt einer grün/gelb? -> Schutzleiter ein unipolarer Motor hat mindestens 6 Anschlüsse! (7) (2 Wicklungen mit je einer Mittelanzapfung + SL) dh Du hast einen bipolaren vor Dir! Unipolare Motoren werden mit 8 nicht 4 Zuständen berieben. (Vollschritt) Sonst weiß der arme Kerl ja garnicht in welcher Richtung er losdrehen soll! zb Rechtsdrehung Schritt Phase1 Phase2 Feld 1 +1 0 oben 2 +1 +1 oben/rechts 3 0 +1 rechts 4 -1 +1 unten/rechts 5 -1 0 unten 6 -1 -1 unten/links 7 0 -1 links 8 +1 -1 oben/links das - zeig einen Stomfluß umgekehrt durch die Phase an! Dises kanst Du durch eine H-Brücke erreichen. -> Du brauchst pro Motor (min) 4 Ausgänge (haste richtig gemacht) 2 x für Stom an 2 x für die Stromrichtung lass mal am Anfang die vier verschidenen Bewegeungen weg (90 Grad links usw) und programmiere erstmal eine Tabelle (2) und eine Sub mit den Schritten um nach links drehen zukönnen! Danach sollte es Dir leichtfallen auch nach rechts drehen zu können. Da ich aus Deiner Software sehe das du noch keine entspechende Hardware besitzt :) und keinerlei Erfahrung mit Schritty's hast, kannst Du das auch erstmal mit LED's an den Pin's simulieren! zu den Rampen und der Stromharmonisierung usw werde ich Dir dann auch weiterhelfen. Gruß Fred
Fred, ich sagte doch, der Motor hat fünf Anschlüsse und der von mir oben gepostete Code funktioniert auch und macht was er soll. Hardware ist vorhanden und alles läuft soeben vor mir auf dem Tisch. Ich möchte nur einen Softstart haben, das ist alles.
Gast
#917085
edit es ist ein schlechter Stil die Variablen nicht nach ihre Funktion und Wertebereich zu benennen Zeit zb für Programmphase Dim Schritt As Byte Dim Zeit As Byte Dim Position As Long besser Dim _b_Schritt As Byte Dim _b_Zeit As Byte Dim _l_Position As Long Gruß Fred
Gast
#917087
Mist Formatierung geht nicht so wie ich das will besser Dim bSchritt As Byte Dim bZeit As Byte Dim lPosition As Long Gruß Fred
Gast
#917093
> wenn das Funktioniert? While Zeit = 4 If Schritt = 1 And Position < 4400 Then S1 = 0 S2 = 0 S3 = 0 S4 = 1 Incr Position End If If Schritt = 2 And Position < 4400 Then S1 = 0 S2 = 0 S3 = 1 S4 = 0 Incr Position End If If Schritt = 3 And Position < 4400 Then S1 = 0 S2 = 1 S3 = 0 S4 = 0 Incr Position End If If Schritt = 4 And Position < 4400 Then S1 = 1 S2 = 0 S3 = 0 S4 = 0 Incr Position End If > gehört die Zeitschleife hier hin! Wend Fred
Ja, die While-Schleife funktioniert und ich wusste vorher auch schon, dass dort die Zeitschleife hinkommt. Nur, wie realisiere ich die Zeitschleife?
Gast
#917100
Hi >ein unipolarer Motor hat mindestens 6 Anschlüsse! (7) >(2 Wicklungen mit je einer Mittelanzapfung + SL) Nein. Es gibt unipolare Motoren mit 5 Anschlüssen. Bei denen sind die Mittelanzapfungen zusammengefasst. Einen Schutzleiter habe ich bis jetzt bei den wenigsten Schrittmotoren gefunden. @Thomas Das ändert aber nichts daran, das mir die Ansteuerung sehr suspekt vorkommt. Normalerweise werden immer zwei Wicklungshälften bestromt. Das der Motor trotzdem läuft ist kein Kriterium für korrekte Ansteuerung. Zu deinem Softstart: Wenn du 'Timer0 = 217' durch 'Timer0 = Variable' erstzt und die von einem hohen Startwert bei jedem Schritt bis auf die 217 verringert bekommst du einen Softstart. MfG Spess
spess53 wrote: > @Thomas > Das ändert aber nichts daran, das mir die Ansteuerung sehr suspekt > vorkommt. Normalerweise werden immer zwei Wicklungshälften bestromt. Das > der Motor trotzdem läuft ist kein Kriterium für korrekte Ansteuerung. Er läuft schon, nur mit vermindertem Drehmoment. Mittlerweile nehme ich zwei Wicklungshälften und er hat mehr Kraft. spess53 wrote: Wenn du 'Timer0 = 217' durch 'Timer0 = Variable' > erstzt > und die von einem hohen Startwert bei jedem Schritt bis auf die 217 > verringert bekommst du einen Softstart. Das werd ich mal versuchen, danke für den Tipp. LG Thomas
Gast
#917108
@spess53
>Nein. Es gibt unipolare Motoren mit 5 Anschlüssen.
ist mir noch keiner untergekommen!
Die Mittelanzapfungen sind eigendlich IMMER getrennt, um den
Motor (unipolar) auch an bipolaren Endstufen beteiben zu können!
Aber das kann ja Thomas E. leicht ausklingeln
Gruß Fred
Gast
#917117
Hi Ein bipolarer würde mit der Ansteuerung gar nicht laufen. In meiner Schrittmotorsammlung habe ich jetzt ganz spontan 3 Stück gefunden. Zwei davon sind von EPSON. MfG Spess
Gast
#917135
Hi @Fred: Nur damit du mir auch glaubst. MfG Spess
Gast
#917140
unterhalten wir uns um ausgebauten Bastelkram oder um Schrittmotoren mit dem was antreiben kann? (außer leichte Druckköpfe) bei den EPSON Motoren handelt es sich bestimmt um spez. Anfertigungen für einen spez. Drucker. EPSON kann es sich leisten für jede Anwendung einen spez. Motor herstellen zu lassen. (daher kein SL und zusammen gefasste Mittelanzapfungen) Dieser Bastelkram ist aber nach kürzester Zeit für keinen von uns mehr Verfügbar. wenn Thomas E. wirklich was über Schritty's wissen will sollte er sich nicht mit diesem Zeug beschäftigen! eine gute Seite ist: http://www.roboternetz.de/schrittmotoren.html Gruß Fred
Gast
#917142
@spess53 hab ich zu spät gesehen ich glaub Dir ja (das geht technisch), ist aber völlig unüblich! Gruß Fred
Gast
#917143
Hi Warum so gereizt? MfG Spess
Gast
#917154
>Warum so gereizt?
Ich doch nicht. Wenn Du mich sehen könntest, würdest Du feststellen
das ich noch im Kleinsignalbereich laufe.
Aber größere Motoren werden nicht mit Spielzeugspannungen(anfangs)
bertieben! -> Schutzleiter
120V sind üblich um möglichst schnell Strom fließen zulassen.(H)
Gut mit Thomas E. lag ich wohl daneben! Wenn der Motor wirklich
ein unipolarer mit gemeinsahmer Mittelanzapfung ist!
Fred :)
Gast
#917189
Hi Es kommt doch wohl auf die Anwendung an. In einem Diskettenlaufwerk braucht man keine 120V. MfG Spess
Gast
#917195
@spess53 jetzt laufen wir synchron. Aber für Thomas E. haben wir KEINE einzige Lösung! schwach Gruß Fred
Gast
#917204
Hi Wieso. Meinen Vorschlag von 18:36 wollte Thomas ausprobieren. Nur bis jetzt keine Rückmeldung. MfG Spess
@ Thomas E. (tomedl) Kannst du lesen? Ja? Wäre schön wenn du mal die Regeln des Forums beherrzigen würdest. Stehen direkt über dem Eingabefenster. Danke. Falk
Wieso erinnert mich das Programm so sehr an eins, das ein Mitschüler damals (1992; Turbo Pascal) "programmiert" hat? Der hat eine Laufschrift programmiert, die für jeden Buchstaben ein eigenen Programmteil geschrieben - Felder waren ihm wohl unbekannt. Zum Programm: Man lässt einen Timer laufen, in dessen ISR man den Schrittmotor einen Schritt weiter machen lässt. (Schritt zählen, die Ausgabemaske in einem Feld mit 4-8 Index großen Feld speichern - dann spart man sich all die Abfragen). Die ISR wird immer dann angesprungen, wenn der Timer einen bestimmten Vergleichswert erreicht hat (z.B. CTC-Mode). Beim Start wird der Vergleichswert relativ hoch angesetzt, um eine niedrige Frequenz zu erreichen. Eine Rampe kann man jetzt abhängig der bereits gemachten Schritte fahren, indem man den Vergleichswert bis zu einem bestimmten (maximale Schrittfrequenz) dekrementiert. "Beschleunigungsrampe" Wenn dann eine bestimmte Schrittanzahl erreicht wurde, vergrössert man den Vergleichswert wieder. Dann hat man die "Bremsrampe". Das muß man nur noch in die entsprechende Programmiersprache umsetzten. Welche das ist, sollte egal sein.
spess53 wrote: > Wieso. Meinen Vorschlag von 18:36 wollte Thomas ausprobieren. Nur bis > jetzt keine Rückmeldung. So, hier nun die Rückmeldung: Deine Idee habe ich umgesetzt und es funktioniert einwandfrei. Mittlerweile habe ich einen Softstart und einen Softstopp realisieren können. Ihr habt mir damit sehr geholfen, auch wenn die Diskussion über die Anschlüsse etwas unnötig war (mein Motor hat trotzdem fünf Anschlüsse). @Falk Ich denke du meinst den langen Code weiter oben? Sry, der kommt das nächste Mal in den Anhang. @Rahul Ich verstehe was du meinst, allerdings weiß ich noch nicht so genau, wie das mit den Feldern gehen soll. Vielleicht hat jemand ein Beispiel in BASCOM? Grüße Thomas
Gast
#917550
Hi Gut zu hören. MfG Spess
>Vielleicht hat jemand ein Beispiel in BASCOM?
Such im Bascom-Handbuch nach "Array"!
Dein Feld müsste dann so aussehen:
Initialisierung:
DIM A(4) as byte
A(1) = 16
A(2) = 8
A(3) = 4
A(4) = 2
im Programm wird dann der Port vermutlich so gesetzt:
PortD = A(Schritt)
Dann solltest du noch eine Richtungs-Variable benutzen, und damit
entscheiden, in welche Richtung der Motor drehen soll.
Das kann man dann dadurch realisieren, dass man den Feld-Index entweder
hoch- oder herunterzählt.
Von Bascom habe ich sonst keine Ahnung...
So, nun hab ich etwas weiter gebastelt und bin iweder auf Probleme gestoßen. Den Softstart habe ich so realisiert, wie von spess53 vorher oben beschrieben. Dazu zähle ich den Timer-Startwert pro Timer-Überlauf um eins hoch und dadurch vergeht immer weniger Zeit, um den Timer zum Überlaufen zu bringen -> der Schrittmotor wird immer schneller. Allerdings ist diese "Beschleunigungsrampe" nicht linear, sondern folgt eher mehr einer e-Funktion, da ja bei jedem Timer-Überlauf auch der nächste Startwert des Timers um eins erhöht wird. In BASCOM sieht das ganze so aus:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
x ist die Variable für den Sartwert, der Startwert selber wird mit Timer0 = x gesetzt. Als nächstes folgt die Bedingung für die Erhöhung des Startwertes:
1 | |
Anschließend wird noch die Variable y erhöht, welche die Schrittfolge vorgibt. Da ich nur vier Schritte benötige, wird die Variable bei erreichen von dem Wert 5 auf 1 zurückgesetzt. Das funktioniert auch recht gut, bis auf jene Tatsache, dass die "Beschleunigungsrampe" die Fomr einer e-Funktion besitzt. Warum verstehe ich ja, nur Abhilfe dagegen weiß ich keine. Wenn ihr mir da einen kleinen Tipp geben könntet, wäre ich dankbar. Als nächstes wollte ich die von Rahul der trollige angesprochenen Felder angehen. Da ich leider momentan für die nächsten Stunden nicht an den AVR kann, aber dennoch sehr neugierig bin, frage ich einfach hier mal, ob das so funktionieren kann. Ich hab mich mal im Tutorial von der Roboternetz-Seite schlau gemacht und habe mir dort ein wenig die Seite über Tabellen in BASCOM durchgelesen. Wenn ich das richtig verstanden habe, kann ich damit gewisse Schaltzustände der Ports einfach "abspeichern" und danach wieder abrufen. Der Code für so eine Tabelle würde laut Tutorial so aussehen:
1 | |
2 | |
3 | |
4 | |
5 | |
Das auslesen aus der Tabelle geschieht so:
1 | |
Mittlerweile habe ich es programmiert und es läuft, also das mit den Tabellen funktioniert prächtig, und ich spare einiges an Speicher. Trotzdem belibt noch das Problem mit der Beschleunigungsrampe.... Grüße Thomas
Gast
#917706
Hi Also mir geht es es eigentlich auch wie Rahul :Von Bascom habe ich sonst keine Ahnung... Das mit der Start/ Stoprampe ließe sich evtl. auch mit einer Tabelle realisieren. Dort werden die Timerwerte abgelegt. Damit lässt sich jeder Verlauf realisieren. >Das auslesen aus der Tabelle geschieht so: >PORTB = LOOKUP(0 , Schrittfolge) In deinem Programm hast du den Schrittmotor an Port D hängen, also sollte das auch hier so sein. Zum anderen überschreibst du mit PORTD=... den kompletten Port. Solange nur der Motor dranhängt gibt es keine Probleme. Ansonsten erst PortD (ich meine wirklich PortD und nicht PIND) einlesen, ein 'and &B11100001' und dann 'or' mit dem Lookupwert. Das ganze dann ausgeben. MfG Spess
Hi! Sry, im "echten" Programm hab ich eh PORTD stehen. >Zum anderen überschreibst du mit PORTD=... >den kompletten Port. Solange nur der Motor dranhängt gibt es keine >Probleme. Ansonsten erst PortD (ich meine wirklich PortD und nicht PIND) >einlesen, ein >and &B11100001' und dann 'or' mit dem Lookupwert. Das ganze dann >ausgeben. Sry, dass verteh ich jetzt nicht. >Das mit der Start/ Stoprampe ließe sich evtl. auch mit einer Tabelle >realisieren. Dort werden die Timerwerte abgelegt. Damit lässt sich jeder >Verlauf realisieren. Werd ich mal versuchen.
>eher mehr einer e-Funktion Eher 1/x, da man ja die Periodendauer verkürzt... >Tabellen in BASCOM durchgelesen. Tabellen sind nicht das gleiche wie Felder! Die Linearität der Frequenz kann man dadurch halbwegs erzeugen, indem man nicht bei jedem Durchlauf den Vergleichswert ändert, sondern in nicht linearen Abständen. Irgendwo hatte ich dazu noch eine Art Tabelle (müsste ich jetzt suchen). Darin habe ich die Differenzfrequenz und die damit zusammenhängede Periodendauer zwischen zwei Schrittfrequenzen berechnen lassen (OpenOffice.Org Calc...).
Gast
#917721
Hi Wenn du z.B. '&B00010010' auf den Port gibst werden deine Ausgänge 7,6,5 und 0 (die die nicht mit dem Motor verbunden sind) unweigerlich 0, egal was vorher dort stand. Deshalb erst Einlesen, diese Bits sichern und mit den zu setzenden Bits verknüpfen. MfG Spess
Rahul Der trollige wrote: > Tabellen sind nicht das gleiche wie Felder! Und was sind dann Felder? >Wenn du z.B. '&B00010010' auf den Port gibst werden deine Ausgänge 7,6,5 >und 0 (die die nicht mit dem Motor verbunden sind) unweigerlich 0, egal >was vorher dort stand. Deshalb erst Einlesen, diese Bits sichern und mit >den zu setzenden Bits verknüpfen. Warum soll ich die Ports einlesen? Da hängt ja eh nix dran außer Motor.
>Und was sind dann Felder?
Man kann sie auch Vektoren, Matrizen oder Array nennen.
Ich habe im anderen Post eins als Beispiel gebracht...
Gast
#917777
Hi Ich hatte geschrieben: 'Solange nur der Motor dranhängt gibt es keine...' Aber wenn noch etwas anderes dranhängt dann wird es problematisch. Auch bei Eingängen würde z.B. falls benutzt, der interne PullUp ausgeschaltet werden. Es gehört einfach zur sauberen Programmierung, das nur die Bits geändert werden, die geändert werden sollen. Bei so kleinen Programmen hast du noch den Überblick. Bei grösseren Sachen artet das sehr schnell in unnötigen Stress aus. MfG Spess
Rahul Der trollige wrote: >>Und was sind dann Felder? > > Man kann sie auch Vektoren, Matrizen oder Array nennen. > Ich habe im anderen Post eins als Beispiel gebracht... Habe nun versucht mich schlau zu machen, allerdings hab ich im I-net nix über Arrays gefunden. Kann mir jemand einen vollständigen Beispielcode mit einem funktionierenend Array posten? Gru´ Thomas
Gast
#921520
Hi Wie wärs mal mit der BASCOM-Hilfe? MfG Spess
spess53 wrote: > Hi > > Wie wärs mal mit der BASCOM-Hilfe? > > MfG Spess Tja, entweder bin ich zu blöd, die BASCOM-Hilfe zu verstehen oder ich kann einfach kein Englisch. Jedenfalls check ich's net. Gruß Thomas
Gast
#921540
Hi BASCOM-Hilfe PDF S.233 MfG Spess
Hallo! Okay, ich habs jetzt in gefunden (genau auf Seite 233, danke Spess! ;-) ) Soweit ich das verstehe, ist ein Array etwas ähnliches wie eine Tabelle, nur mit dem Unterschied, dass mit den Daten im Array gearbeitet werden kann (sie können verändert werden, z.B. Wert um eins erhöhen, falls irgendeine Bedingung erfüllt wird). Um ein Array zu erstellen, muss ich folgenden Code tippen:
1 | |
2 | |
3 | |
4 | |
Mit Dim A(10) as Byte erstelle ich das Array. Mit DimB as Byte erstelle ich eine Variable des Typs Byte. Mit For B = 1 To 10 definiere ich, dass die Variable B in die zehn Felder des Arrays gefüllt werden soll. Und was mach ich mit A(b) = B? Wie liest man aus dem Array aus? Fragen über Fragen - aber ihr seht, ich bin schon ein Stückchen weiter! ;-) lg Thomas
>Und was mach ich mit A(b) = B?
Damit weist man den aktuellen Wert von B dem Array A an der Stelle B zu.
Zuweisen und Auslesen geht genauso wie mit "normalen" Variablen.
Rahul Der trollige wrote: >>Und was mach ich mit A(b) = B? > > Damit weist man den aktuellen Wert von B dem Array A an der Stelle B zu. > Zuweisen und Auslesen geht genauso wie mit "normalen" Variablen. Aha, also wird das Array nicht mit Zahlen von 1 bis 10 bezeichnet, sondern mit Buchstaben? Da könnte man dann ja nur 26 Felder haben? Mir kommt vor, da verstehe ich was nicht richtig. Also gut, nochmal von vorne:
1 | |
2 | |
3 | |
4 | |
Auslesen würde dann so funktionieren:
1 | |
Gruß Thomas
Gast
#921677
Hi >Aha, also wird das Array nicht mit Zahlen von 1 bis 10 bezeichnet, >sondern mit Buchstaben? B ist eine Variable und kann deshalb so gross werden, wie der Variablentyp, den du mit DIM vereinbart hast. Nimm mir es bitte nicht übel, aber du hast noch einige Defizite. Versuche doch mal in einer Bibliothek ein Buch über BASIC zu bekommen. Da kannst du dich mal über grundlegende Funktionen, Datentypen und Programmiertechniken informieren. Das Internet ist auch nicht das Non plus Ultra. MfG Spess
spess53 wrote: > Nimm mir es bitte nicht übel, aber du hast noch einige Defizite. > Versuche doch mal in einer Bibliothek ein Buch über BASIC zu bekommen. > Da kannst du dich mal über grundlegende Funktionen, Datentypen und > Programmiertechniken informieren. Das Internet ist auch nicht das Non > plus Ultra. Wieso sollte ich es dir übel nehmen? Ich habe erst vor zwei Monaten mit der µC-Spielerei begonnen und bin mir daher im Klaren, dass ich noch lange nicht der perfekte Programmierer bin. Aber aus diesem Grund frag ich hier ja nach, um meine Projekte zu verwirklichen. Ich werde mich mal nach einem guten Buch umsehen, danke für den Tipp. Grüße Thomas
Gast
#921683
Hi Sieh mal hier im Forum unter Buchtipps nach. Das Buch von Kühnel könnte etwas für dich sein. MfG Spess
spess53 wrote: > Hi > > Sieh mal hier im Forum unter Buchtipps nach. Das Buch von Kühnel könnte > etwas für dich sein. > > MfG Spess Ich werde die Bücher von Dr. Claus Kühnel und Ronald Walter bestellen. Grüße Thomas
Gast
#922200
Um eine konstante Beschleunigung zu erhalten, musst Du die Frequenz
linear mit der Zeit erhöhen, nicht linear mit der Schrittzahl.
Und die vergangene Zeit kannst Du errechnen, indem Du alle bisherigen
Timerwerte zusammenaddierst.
Oder Du machst es so:
Frequenz = Startfrequenz;
Beschleunigung = Startbeschleunigung; //z.B. +1
Wartezeit = 0;
loop:
Frequenz += Beschleunigung * Wartezeit;
if(Frequenz == Zielfrequenz){Beschleunigung = 0;}
//oder if(Schrittzahl == BeschlEnde){Beschleunigung = 0;}
else if(Schrittzahl == BremsBeginn){Beschleunigung = -1;}
else if(Schrittzahl == BremsEnde){MotorStop;}
Wartezeit = Taktfrequenz / Frequenz;
Es ist angebracht, die Frequenz nicht in Hertz, sondern in z.B.
Achtelhertz zu berechnen (Fixed-Point-Arithmetik).
Statt der Division Wartezeit = Taktfrequenz / Frequenz;
kannst Du auch eine Tabelle verwenden.
Um welche Frequenzen geht es denn hier?
Hallo! Danke für die Antwort, eProfi, aber ich habe das Problem bereits gelöst. Es läuft parallel zum Haupttimer ein zweiter Timer mit, der beim Überlauf den Startwert des Haupttimers um eins erhöht. Damit bekomme ich eine lineare Beschleunigungsrampe. Das einzige, was mir jetzt noch zu schaffen macht, ist das von spess53 angesprochene Problem mit dem überschreiben des gesamten PortD. Ich kann die LED, die an PortD.0 hängt nicht mehr benutzen, da ich bei jedem Schritt den gesamten PortD neu überschreibe. Die Tabelle dazu:
1 | |
2 | |
3 | |
4 | |
Jetzt müsste ich irgendwie den PortD.0 dazu kriegen, nicht von dieser Tabelle erfasst zu werden und damit jederzeit und unabhängig zu ändern ist. Grüße Thomas
Hallo! Ich habe das Problem jetzt folgendermaßen gelöst:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
In die Variable A wird der Wert aus der Tabelle geschrieben (z.B. &B00000110) und mit PortD = A ausgegeben. Die Variable B kann die Werte 0 oder 1 annehmen. Ganz unten prüfe ich dann noch den Wert von Y, falls dieser 50 überschreitet wird der Wert von B geändert. Das Ganze funktioniert auch einwandfrei, aber eine Frage hab ich noch. Was wird mit A = A Or B gemacht? Für mich wäre das ein Widerspruch, da ich einfach sage: A istgleich A oder B. Damit wäre ja A eigentlich unbestimmt oder? Vielleicht weiß ja jemand die Antwort auf meine Frage. LG Thomas
>A istgleich A oder B. Damit wäre ja A eigentlich unbestimmt oder?
Das ist kein Vergleich, sondern eine Zuweisung.
Man könnte es auch so schreiben:
X = A Or B
A = X
Am Ende steht in A das gleiche wie bei A = A or B
Gast
#922740
Aber auch dann hast Du keine lineare Beschleunigung, da die SchrittFrequenz ja TimerFrequenz / Teilerwert ist und Du den Teilerwert linear änderst, dann hast Du ja eine 1/x Funktion. Naja, ist aber trotzdem schon mal besser als das Incrementen mit der Schrittfrequenz, da die Funktion bei Deinen Werten vermutlich doch ziemlich linear verläuft (deshalb habe ich nach Deinen Frequenzen gefragt). Nochwas: Es ist oft viel einfacher, beim Zählen nicht bei 1, sondern bei 0 zu beginnen. Außerdem kannst Du den Schrittzähler und den "StepState" in ein- und der selben Variablen speichern. Ich würde folgendes vorschlagen: Portd = Lookup(0,StepCnt AND 3) OR Ledzustand Oder numeriert BASCOM ein Array ab 1? Das wäre ein Grund, den Compiler sofort beiseite zu legen. Aber ich sehe schon, Du kannst auf dem Gebiet der Binärzahlen und der Boolschen Algebra noch viel lernen. Mit der Zeit bekommt man ein Gefühl dafür. Viel Spass dabei!
Gast
#922767
Hi >Ich habe das Problem jetzt folgendermaßen gelöst: > If X = 1 Then A = Lookup(0 , Schritte) > If X = 2 Then A = Lookup(1 , Schritte) > If X = 3 Then A = Lookup(2 , Schritte) > If X = 4 Then A = Lookup(3 , Schritte) Für so etwas gibt es 'Switch case' MfG Spess
Gast
#922771
>Für so etwas gibt es 'Switch case'
case seleckt
...
...
.
.
.
um einen auf Geschwindigkeit zu machen, nicht auf Code-Größe
Gast
#922796
> If X = 1 Then A = Lookup(0 , Schritte) > If X = 2 Then A = Lookup(1 , Schritte) > If X = 3 Then A = Lookup(2 , Schritte) > If X = 4 Then A = Lookup(3 , Schritte) Nicht, dass ich eine Ahnung von Basic hätte, aber in C könnte ich die 4 Zeilen oben so schreiben: A = Lookup(X-1 , Schritte) ????
Gast
#922798
> A = Lookup(X-1 , Schritte)
das wird Dein Comp. ähnlich übersetzen!
Gast
#922931
Hi Sollte natürlich 'select case' heissen. Mein einziger Kontakt zu BASCOM war bisher, daß ich mal vor einigen Jahren mal die Codebegrenzung der Demoversion gehackt habe. Um weiteren Diskussionen vorzubeugen: Ich habe das nie genutzt und auch nicht weitergegeben. MfG Spess
Gast
#923122
>> A = Lookup(X-1 , Schritte) >das wird Dein Comp. ähnlich übersetzen! Wie was? Der Bascom-Compiler übersetzt > If X = 1 Then A = Lookup(0 , Schritte) > If X = 2 Then A = Lookup(1 , Schritte) > If X = 3 Then A = Lookup(2 , Schritte) > If X = 4 Then A = Lookup(3 , Schritte) in > A = Lookup(X-1 , Schritte) Dann wäre er wirklich gut. >Portd = Lookup(0,StepCnt AND 3) OR Ledzustand Das würde voraussetzen, dass man immer mit Schritt "0" anfängt. Wenn man eine bestimmte Strecke fährt (z.B. 30 Schritte) und dann eine weitere (z.B. 45 Schritte), dann setzt man den Schrittzähler i.d.R. wieder auf 0 zurück. da sich weder 30 noch 45 durch 4 teilen lassen, hätte man einen selbstgemachten Schrittfehler. Für diese Anwendung mag >Portd = Lookup(0,StepCnt AND 3) OR Ledzustand funktionieren - bei Erweiterungen gäbe es Probleme.
Gast
#924248
Hi Mir ist gerade Appnote vom Atmel in die Hände gefallen. Der zugehörige Code ist zwar in C. Aber vielleicht hilft es dir trotzdem weiter. MfG Spess
Carsten wrote: >> A = Lookup(X-1 , Schritte) > > das wird Dein Comp. ähnlich übersetzen! Das wird mein C (?) Compiler garantiert NICHT in ein switch/case oder if Konstrukt übersetzen.
>Das wird mein C (?) Compiler garantiert NICHT in ein switch/case oder if >Konstrukt übersetzen. Kann dein C-Compiler auch Bascom nebenbei? ;)
Gast
#941601
STK500-Besitzer: "Das würde voraussetzen, dass man immer mit Schritt "0" anfängt." Nein, der StepCnt ist ein globaler Zähler, der alle Steps (increment für vorwärts und decrement für rückwärts) mitzählt und gleichzeitig die untersten Bits als Pointer in die Tabelle zeigen. Zähler ist dafür vielleicht ein suboptimaler Name, StepState ginge auch. Nochmal, diese Variable ist. Schade, dass fast keine Schrittmotoren 256 Schritte pro Umdrehung haben. Beispiel: Wenn Du bei Schritt 123 stehst und 30 Schritte nach rechts machst, steht er danach auf Schritt 153. Danach 45 Schritte nach links --> Schritt 108 30 Schritte nach rechts: Schritt Pointer Bitmuster 123 3 1000 124 0 0001 125 1 0010 ... 152 0 0001 153 1 0010 jetzt Drehrichtung umkehren (45 Schritte nach links): 152 0 0001 151 3 1000 ... 109 1 0010 108 0 0001 Man bracht keine Fallunterscheidung o.ä. für die Richtung. Man subtrahiert einfach 1 und fertig. Das geht übrigens auch über eine Umdrehung hinaus. Zum Setzen der Bits: PortD = PortD AND $1e OR stepTable[StepCnt AND 3]
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
