Als neues Mitglied möchte ich mich kurz bei euch vorstellen:
Mein Name ist Patrick, bin 37 Jahre jung, verheiratet und habe einen kleinen Sohn (3Jahre). Ich arbeite als CAD Konstrukteur mit Catia V5, ACAD und Medusa hauptsächlich den Sondermaschinenbau ab.
Meine Hobbys sind mein Sohn, Sport, Technik im allgemeinen, CNC Fräsen (Portalfräse von Haase), versuche mich an der Drehmaschine (kleine Chinadrehe von Bernado mit 400mm Spitzenweite) und am konventionellen Fräsen (China Fräse Optimum MH25V). Als neustes Hobby kam der Atmega168 mit Bascom dazu. Allerding befinde ich mich da noch in den Kinderschuhen.
Zu meinem Vorhaben: Ich möchte gerne einen Schrittmotor über eine Treiberendstufe mit Bascom steuern. Start - Stop, Linkslauf - Rechtslauf, Geschwindigkeit über Poti steuern.
Zur Hardware:
1. Schrittmotor 4,2A / 1,8° pro Schritt 2. Leadshine Treiber M542 3. Atmega168 (RN - Mini Control) 4. USB All Avr Programmer
Zur Software: 1. Win7 64bit 2. Bascom (Demo)
Das für mich größte Problem ist die Geschwindigkeitssteuerung. Bisher dacht ich immer das ich die Geschwindigkeit über eine Pwm (Compare Wert) steuern könnte. Der Treiber benötigt aber ein Tastverhältnis von 50% und eine Frequenz von 0 - 300kHz für die Geschwindigkeit.
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = clear Up , Prescale = 1 '(16000000/1) / (256*2) = 31250Hz = 31,25kHz 'Jetzt soll also ein Puls (Rechtecksignal) von 31kHz am Portb.1 ankommen
'Hauptprogramm
Do
Pwm = 128 'Compare1a = 128 also Tastverhältniss 50%
Loop
End
Ich dachte erst das die Geschwindigkeit über das Tastverhältnis eingestellt wird. Aber diese wird über die Frequenz eingestellt.
Wie kann ich die Frequenz einstellen? Sagen wir mal in 1,5kHz Schritten von 0 - 300kHz? Da komme ich einfach nicht weiter... bzw. weis ich nicht wie ich das Bascom beibringen soll...
Du versuchst jetzt deine Frequenz über den Prescaler einzustellen und lässt deinen Timer voll durchlaufen, bzw. bei der halben Zeit etwas tun. Du musst die Frequenz aber über die den Timerwert einstellen. Dafür musst du einen geeigneten Prescaler wählen (je nach Timerauflösung). Einen Portpin lässt du dann mit erreichen eines bestimmten Timerwertes toggeln (2x toggeln bei gleichem Timerwert ergibt ein Tastverhältnis von 50%). Mit dem Ändern des Timerwertes (z.B. durch Abfrage von Port-Eingängen) ändert sich die Frequenz am Ausgang. Kleinere Timerwerte => höhere Frequenz und umgekehrt. Die Frequenzen kannst du dir über Den Prozessortakt, den Prescaler und die Timerwerte (Prozessortakte) ausrechnen. Aber Faktor 2 für das Toggeln nicht vergessen .
...ok, also ich versuche als erstes mal nur einen Takt über den Timer1 an einem Pin zu erzeugen - den maximalen Takt (oder annähernd) für den den Leadshinetreiber.
So richtig hast du das mit den Timern glaube ich noch nicht verstanden.
Bei dir läuft der Timer nun jedes mal von 55 bis 65535 durch und erzeugt dann den Interrupt, das sind dann so 245 Hz. Wenn du eine hohe Frequenz erzeugen willst, dann musst du die 55 von 65535 abziehen.
300kHz wirst du damit aber nie erzielen, keine Ahnung wieviele Anweisungen da im Hintergrund bei "Toggele" laufen, aber das werden verschachtelte If-Bedingungen sein, die vermutlich nicht in 55 Prozessortakten zu erledigen sind. Ich würde spontan vermuten, dass der Interrupt selber + die Timerbelegung deine 55 Prozessortakte schon "auffressen".
Die Frage bleibt eh, was willst du damit erreichen? Jeder Impuls wird ja einen Schritt am Schrittmotor erzeugen, oder? So schnell dreht kein Schrittmotor der Welt, im Vollschrittbetrieb wären das 45.000 1/min bei einem 1,8° Motor. Selbst bei 1/16 Schritt kommt kein Motor mit.
Grundsätzlich bist du aber auf dem richtigen Weg. Die Geschwindigkeitsregelung erfolgt über die Vorbelegung des Timers, je größer die Zahl desto höher die Geschwindigkeit. Die musst du aber natürlich noch sinvoll dimensionieren. Wenn du das über Poti steuern willst, dann eben die Analogspannung einlesen und entsprechend per Parameter den Timer1 vorbelegen.
Ich persönlich würde ohne "toggle" arbeiten, da du so immer 2 Durchläufe für 1 Puls brauchst. In die ISR einfach:
Port=1 Port=0
Das sollte dem Treiber reichen und ist auch deutlich schneller abgearbeitet als irgendwelche If-Schleifen. Zur Not musst du eben noch ein "waitµs" einbauen.