Hallo zusammen, ich habe ein RN-MEGA2560 Mikrocontroller und möchte einen Takt für einen Schrittmotor von 400 Hz erzeugen. Der Quarz hat einen Wert von 16000000, der Prescaler liegt bei 256 und ich verwende einen 16-Bit Timer den ich auf einen Timerwert von 65380 einstelle. Als Ergebnis erhalte ich einen Wert von 400,6410256 Hz. Kann mir bitte jemand mitteilen, ob das Ergebnis falsch oder richtig ist. Vielen Dank für die Hilfe.
Gast
#2844971
Nein. Ist nicht richtig.
Gast
#2844974
Ja. Ist richtig.
Gast
#2844979
Wenn mich mein Schätzeisen nicht trügt müsste die Frequenz bei 1 liegen und nicht bei 400.
Gast
#2844984
Hmm schrieb: > Nein. Ist nicht richtig.Beitrag melden Bearbeiten Löschen Dafür
Gast
#2844985
Müsste stimmen. Aber wenn du schon einen 16Bit Timer hast, könntest du ja auch einen kleineren Prescaler wählen und die 400Hz deutlich besser erreichen, z.B. ganz ohne Prescaler und Vorbelegung mit 25.536 oder andere Kombinationen...
Gast
#2844987
g457 schrieb: > müsste die Frequenz bei 1 liegen Bei einem Quarz mit einer Genauigkeit von mindestens 1E-4 müßte die Frequenz doch genauer zu bestimmen sein.
Gast
#2844989
Hi Für so etwas benutzt man den CTC-Mode. Wenn du zu Fuss den Pin Togglen willst muss das für 400 Hz alle 77 Timertakte erfolgen. Bei dir sind es 155. MfG Spess
Gast
#2844993
Die Antwort hängt davon ab, was du damit meinst: Thomas Holländer schrieb: > einen 16-Bit Timer den ich auf einen Timerwert von 65380 einstelle Wenn du den Timer im CTC-Modus betreibst und diesen Wert als CTC-Wert einstellst, ist es falsch. Wenn du den eher ungeschickteren Weg nimmst, wirklich den Zählwert des Timers mit dem obigen Wert quasi vorzubelegen, ist die Timer-Wartezeit grob 1/400 Sekunde, was so jetzt auch erstmal noch nichts mit einem Takt von 400 Hz zu tun hat.
Ja, nein, ich bin verwirrt;-) Gibt es denn irgendwo ein gutes Tutorial?
Gast
#2845068
Gast
#2845070
Vielen Dank für die Infos. Ich habe meine Formel überprüft. sie ist richtig:-) Jetzt habe ich auch noch von einer Bekannten ein Oszilloskop erhalten. Mal schauen ob ich damit klar komme, sonst melde ich mich noch einmal.
Gast
#2845121
Thomas Holländer schrieb: > Ich habe meine Formel überprüft. sie ist richtig:-) Denk aber dran, daß die Frequenz, mit dem der Timer seinen TOP Wert erreicht, nicht gleich der Frequenz des Signals für den Stepper sein muß.
Was meinst du damit? Ich habe folgende Schrittmotorsteuerung: http://de.nanotec.com/schrittmotor_steuerungen_smc11.html und zwar den SMC11, der standartmäßig auf 1/8 Schritt steht. Als Schrittmotor habe ich: SPG1518M0504-102 http://de.nanotec.com/schrittmotor_lowcost.html Die Eingangsspannung für die Schrittmotorensteuerung beträgt 12 V.
Gast
#2845237
Vielleicht schrieb: > Denk aber dran, daß die Frequenz, mit dem der Timer seinen TOP Wert > erreicht, nicht gleich der Frequenz des Signals für den Stepper sein > muß. Thomas Holländer schrieb: > Was meinst du damit? ca. 400Hz ist die Frequenz die du ausgerechnet hast. Du schreibst aber nicht, wie du daraus ein Signal auf dem µC Pin machst. per ISR, per Pin toggle, per PWM, per sonstigem Programm und wie sieht das aus ??? Und weiter vom Pin geht es durch einen Treiber zum Stepper. All das kann Einfluß auf den Steppertakt haben. Da die Infos nicht vorliegen, können wir nicht wissen, ob die 400Hz auch am Stepper ankommen.
Hier mal das Bascom-Programm:
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 | |
Das Signal wird über Pin 6 an die Schrittmotorsteuerung weiter gegeben. Von da aus gehts zum Schrittmotor. Ich hoffe die Angaben reichen jetzt:-)
Gast
#2845340
Hi >Timer1 = 64911 >Stepper1_step = 0 : Waitus 1 : Stepper1_step = 1 Handbuch nicht gelesen: Pulsbreite > 2 μs. MfG Spess
Also so: Timer1 = 64911 Stepper1_step = 0 : Waitus 3 : Stepper1_step = 1 : Waitus 3 Damit ist die Pulspause und Pulsbreits > 2 µs. Oder?
Gast
#2845400
Hi >Also so: >Timer1 = 64911 >Stepper1_step = 0 : Waitus 3 : Stepper1_step = 1 >oder? Das Timer-Vorladen bleibt trotzdem Müll. Selbst BASCOM kennt CTC. MfG Spess
1. Gibt es zu CTC ein Tutorial? 2. Welche Nachteile hat meine Variante?
Thomas Holländer schrieb: > 1. Gibt es zu CTC ein Tutorial? Brauch man denn für alles heute ein Tutorial?
Gast
#2845597
Thomas Holländer schrieb: > 2. Welche Nachteile hat meine Variante? Die ISR kann man sich sparen. Die low Zeit des Signals stellst du über die Krücke WAITMS und das auch noch im Interrupt ein.
1 | |
2 | |
Damit kann man den CTC mode einstellen. Der Timer läuft bis zum COMPARE1A Wert und fängt dann wieder bei 0 an. Bei dieser Einstellung und dem 16MHz Systemtakt tut er das mit 800Hz. Durch das "COMPARE A = TOGGLE", schaltet er den OC1A Pin des µC immer um und du erhältst ein 400Hz Rechteck mit 50% Tastverhältnis. Damit bist du allerdings auf den OC1A Pin des µC festgelegt und müßtest die Verkabelung entsprechend anpassen. (Dieser CONFIG TIMER Befehl konfiguriert sogar den OC1A Pin auf OUTPUT - muß also nicht explizit als Output eingestellt werden. Zugegebenermaßen ist der CONFIG TIMER BASCOM Befehl nicht gut dokumentiert und ich bin hinter die Funktion nur mit Datenblatt des µC und Simulator gekommen. Es gibt je nach Anforderung viele Möglichkeiten das Signal zu erzeugen. Komplett kann man das nur dem Datenblatt entnehmen.
Ich nehme jetzt den "normalen" Timer und habe folgendes Programm erstellt, womit ich erfolgreich einen Schrittmotor drehen lassen kann.
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 | |
Laut meinen Berechnungen steigert sich alle 5 Sekunden die Frequenz um 50 Hz, beginnend ab 50 Hz. Das funktioniert auch, allerdings zeigt mein Frequenzmessgerät andere Hz-Werte an: Errechnet Timer1: Messgerät: 50 Hz 50 Hz 100 Hz 75 Hz 150 Hz 100 Hz 200 Hz 125 Hz 250 Hz 150 Hz 300 Hz 175 Hz Wie kommt es zu den Unterschieden? Geht des Messgerät (http://www.conrad.de/ce/de/product/124403/VOLTCRAFT-VC170-Digital-Multimeter-VC100-Serie-4000-Counts-CAT-III-250-V/1101010&ref=list) falsch oder habe ich mich bei den Timerwerten verrechnet? Vielen Dank für die Hilfe.
Wie hast du sie denn errechnet?
Die Berechnung erfolgte nach folgender Formel:
Ich hoffe die Formel stimmt.
Gast
#2857767
Simon K. schrieb: > Brauch man denn für alles heute ein Tutorial? Zu jedem Mist ein Tutorial ist wohl etwas übertrieben. Ein vernünftiger Quellcodegenerierungsassistent sollte es auch tun ;-) Früher (tm) musste man sich durch Tabellen und Erläuterungen im Datenblatt durchwühlen :-(
Thomas Holländer schrieb: > Die Berechnung erfolgte nach folgender Formel: Die Formel hab ich jetzt nicht kontrolliert. Ich hab deine Werte nachgerechnet und sie scheinen zu stimmen. Trotzdem ist der ganze Ansatz verquert. Nimm den CTC Modus und Toggle in der ISR den Pin. Dann brauchst du auch solche Hacks mit der Wartezeit in der ISR nicht um einen Puls zu formen. Dein Messgerät ist sicherlich nicht 'zu ungenau'. 200Hz muss jeder Frequenzmesser problemlos messen können und ausserdem sind die gemessenen Werte zu schön im 25Hz Raster, als das das Zufall sein könnte. Was ich mir höchtens vorstellen könnte ist, dass dein Messgerät mit den 3 µs Pulsen nicht glücklich ist. Daher. mach es richtig. In der Timer ISR den Pin Toggeln, so dass es immer 2 Aufrufe braucht, um 1 komplette 'Schwingung' fertig zu stellen. Und anstatt dem #*&$@ Timer vorladen, nimmst du den CTC Modus und gut ists. Dann braucht man auch nicht mehr so bescheuert von 65535 aus runterrechnen, sondern weist einfach dem OCR1A Register den neuen Wert zu und schon 'tickt' der Timer mit der neuen Frequenz. Genau dafür hat ATmel den CTC Modus eingebaut .... damit man ihn benutzt, wenn er angebracht ist. Und deine Anwendung ist ein Paradebeispiel für 'angebracht sein'. Wenn nicht hier, wo sollte der CTC sonst angebracht sein?
Troll schrieb: > Simon K. schrieb: >> Brauch man denn für alles heute ein Tutorial? > > Zu jedem Mist ein Tutorial ist wohl etwas übertrieben. Ein vernünftiger > Quellcodegenerierungsassistent sollte es auch tun ;-) > > Früher (tm) musste man sich durch Tabellen und Erläuterungen im > Datenblatt durchwühlen :-( Das ist auch heute noch vernünftig anstelle des Assistenten. Die 3 Einstellungen raussuchen dauert keine 2 Minuten. Gegenüber dem Rest der Entwicklungszeit sind das Peanuts, die komplett untergehen.
Den CTC-Modus hat auch schon ein anderer user erwähnt. Ich bräuchte mal ein Beispiel in Bascom oder ein Tutorial wo es erklärt wird.
Es ist wirklich ganz einfach. Du konfigurierst den Timer auf CTC Config Timer1 = Timer , Prescale = 64, Clear_Timer = 1 und hängst eine ISR an den Compare Match vom OC1A On OC1A ToggleStep und in der ISR Funktion toggelst du einfach den Pin ToggleStep: Toggle Stepper1_step return Jetzt weist du an OCR1A einfach einen Wert zu. OCR1A = 2000 der Timer zählt dann von 0 bis 2000 und wenn die 2000 erreicht sind, passieren 2 Dinge * der Timer beginnt wieder bei 0 zu zählen * da es sich hier um einen Compare Match handelt (also eine Übereinstimmung des Zählregisters mit dem OCR1A Register), wird die zugehörige ISR aufgerufen. Bumm. Nicht mehr lange rumrechnen. Wenn du 258 Timer Schritte brauchst, dann schreibst du auch 257 (258-1) in das OCR1A Register Kein Timer Vorladen mehr. Der Timer beginnt ganz von alleine wieder bei 0 zu zählen.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.