Beispiel-Software für Takt- und Impulsgeneratoren

Diverse Programmbeispiele auf AVR-Basis

 
1. spannungsgesteuerter Pulsgenerator 10 Hz -> 5 kHz, 1 µs -> 30 µs
2. RS232 progr. Impulsgenerator 0,01 Hz - 50 kHz, 5 µs - 10 s
3. spannungsgesteuerter Taktgeber für Schrittmotore bis 100 kHz
3a. spannungsgesteuerter Taktgeber für 2 x Schrittmotore (inkl. Arduino)
3b. 2 x Stepper wie zuvor, jedoch Schrittfrequenz per UART (inkl. Arduino)
4. Frequenz/Frequenz Umsetzer
5. einfacher Taktgenerator für Schrittmotore bis 50 kHz, ATtiny25
5.a Taktgenerator für bipol. Schrittmotore (Quadraturencoder), ATtiny25
6. einfacher Spannungs-Frequenz-Wandler mit ATtiny25
7. einfache Schrittmotoransteuerung mit ATmega328 und A4982
8. ATmega328 und A4982, Bedienung über RS232
9. Generator 45,000 - 55,000 Hz mit Einstellung per Poti/Joystick
10a. PWM-Spannungssteller 0 - 5 V mit Tastern
10b. PWM-Spannungssteller 0 - 5 V mit Drehgeber
11. Langzeittimer mit ATtiny25
zurück zur Übersicht

 

Allgemein:

Die Programme wurden zumeist unter AVR-Studio 4.18 entwickelt. Zum Einrichten eines eigenen Projektes reicht die angehängte .c-Datei. Die 'fuses' werden für max. Taktfrequenz und ext. Quarz gewählt; BOD auf 4,3V gesetzt.

1. spannungsgesteuerter Pulsgenerator: 10 Hz -> 5 kHz; 1 µs -> 30 µs

Mit dem Programm U2f_pw_org.c generiert ein ATmega88 eine spannungsgesteuerte Frequenz mit variabler Pulsweite, die ebenfalls mit einer Steuerspannung einstellbar ist. Die dazugehörige U2Rf_pw_org.hex (ca. 2300 Byte) ist für einen ATmega48 übersetzt, sodaß beide Typen (..48 und ..88) damit funktionieren. Der µC wird gemäß dem Schaltbild angeschlossen. Für DIL-Gehäuse bitte die zugehörigen Pins anpassen!

Die Steuerspannungen werden an ADC2 (Frequenz) und an ADC3 (Pulsweite) erwartet und müssen im Bereich von 0V (für minimale Frequenz/Pulsweite) bis Vcc=+5V (für maximale Frequenz/Pulsweite) liegen. Die Widerstände R1-R4 können höhere Steuerspannungen entsprechend abschwächen. Da die Versorgungsspannung Vcc gleichzeitig auch als Referenzspannung Aref dient, sollte diese hinreichend stabil sein. Werden die Einstellungen per Poti vorgenommen, sollten diese mit Vcc des µCs versorgt werden. Eine Änderung der Versorgungsspannung wirkt sich dann nicht auf die Einstellungen aus.
Die Ausgangssignale selbst sind quarzstabil.

Am Ausgang F_OUT wird die eingestellte Frequenz mit konstanter Pulsweite (3 µs @ 10 MHz) ausgegeben und synchron dazu an PW_OUT das Signal mit der eingestellten Pulsweite. Die minimalen und maximalen Werte lassen sich im Programm per #define anpassen, wobei diese Werte plausibel sein müssen. Die Pulsweite wird auf 65500 Taktzyklen begrenzt und muß kleiner sein als die Periodendauer der eingestellten Frequenz. Darauf ist bei Programmänderungen zu achten.

Weitere Einschränkungen bestehen dadurch, daß der µC-interne Timer eine endliche Auflösung hat (0,1µs @ 10MHz), die gerade bei höheren Frequenzen die mögliche Auflösung reduziert. Die Steuerspannungen werden mit dem internen 10 Bit ADC erfaßt und gefiltert. Durch die 16-fache Filterung wird zwar die Auflösung ein wenig erhöht, die absolute Genauigkeit (z.B. Liniarität) des ADCs kann dadurch allerdings nicht verbessert werden. Wenn dies benötigt wird, sind externe ADCs mit höherer Auflösung/Genauigkeit zur Signalerfassung notwendig.

2013-10-18:
Eine Programmänderung erzeugt ein jitterfreies Ausgangssignal an PW_OUT, indem diese unabhängig von Interrupt-Verzögerungen per Hardware des µC erzeugt werden: Output Compare mit OCR1B. Die minimale Pulsweite ist nun 10 µs @ 10 MHz und die maximale Pulsweite 100ms. Die Ausgangsfrequenz kann von 10 Hz -> 10 kHz eingestellt werden.

Der nicht mehr verwendete Ausgang F_OUT ist nun auf Eingang geschaltet und wird mit dem internen Pullup auf '1' gehalten. Bleibt F_OUT (PB.1) unbeschaltet oder offen, führt jede Änderung an den ADC-Eingängen zur Änderung des Ausgangssignals. Auf '0' gelegt, wird das Ausgangssignal quarzstabil gemäß den letzten Einstellungen 'verriegelt'. Änderungen and den ADC-Eingängen werden ignoriert.
Die Änderungen können im Programm U2f_pw.c verfolgt werden. Die .hex-Datei dazu ist U2f_pw.hex.

nach oben

2. RS232 programmierbarer Impulsgenerator 0,01 Hz - 50 kHz, 5 µs - 10 s

Das Beispielprogramm FG_4313.c für einen ATtiny4313 zeigt die einstellbare Impulserzeugung von Signalen im Bereich 5 µs - 10 s mit einer Wiederholfrequenz von 0,01 Hz - 50 kHz. Die Dateneingabe erfolgt per RS232 und die Ausgabe der Impulse an OC1B (PB.4). Der ATtiny4313 wird mit den max. zulässigen 20 MHz getaktet, um noch 5µs Impulse erzeugen zu können; die Einstellung selbst wird in µs-Schritten vorgenommen kann aber durch Eingabe von Zusatztakten auf 50 ns Auflösung erhöht werden. Die maximale Pulsweite ('W') muß 10 µs kleiner sein als die Periodendauer ('P'); ggf. wird die Pulsweite automatisch reduziert.

Die Befehlsverarbeitung ist einfach gehalten, indem - eingeleitet durch ein Steuerzeichen ESC oder '.' - zunächst der ganzahlige Einstellwert ohne weitere Trennzeichen eingegeben und mit einem einzelnen Zeichen abgeschlossen werden, welches den Befehl darstellt.

<ESC> 1000P stellt die Periodendauer auf 1000 µs => 1 ms ein
<ESC> 10W stellt die Pulsweite auf 10 µs ein
<ESC> 10Z stellt für nachfolgenden Befehl 'P' oder 'W' höhere Auflösung in Timertakten (50 ns) ein. Hier 0,5 µs.
<ESC> 500F errechnet P und Z für die eingegebene Frequenz in Hz hier 500 Hz.
<ESC> 1O schaltet die Impulserzeugung ein (default nach Reset)
<ESC> 0O schaltet diese wieder aus
<ESC> V als einzelnes Zeichen gibt die Version aus

Damit man die eingestellten Werte auch auslesen kann, wird der Befehl als einzelnes Zeichen nach dem ESC/bzw. '.' eingegeben. Nachfolgend wird statt <ESC> mal '.' verwendet:

.W zeigt die zuletzt eingestellte Pulsdauer ein. Die Antwort bei default-Werten ist: W10000 für 10 ms
.P gibt die Periodendauer aus, wie sie zuletzt eingestellt wurde: P20000 für 20ms bzw. 50Hz als default-Wert
.F gibt die Frequenz in Hz aus. Genauere Werte erhält man durch Abfrage von '.P' mit anschließendem '.Z' als: (A x 1e6) / (P x A + Z) in Hz.
.Z zeigt die vorhandenen Zusatztakte an nachdem (!) die Befehle '.P', '.W' oder '.F' ausgeführt wurden
.O zeigt mit O1 die aktive Impulserzeugung an oder mit O0, daß diese unterbunden ist
.A gibt die Zusatztakte / µs aus. 20 bei 20 MHz Taktfrequenz
.V gibt wie zuvor beschrieben die Version des Taktgebers aus.

Getestet wurde die Schaltung mit der abgemagerten Schaltung eines reziproken Frequenzzählers, indem nur µC, Takterzeugung und RS232 bestückt wurden.
Alternativ kann auch der interne RC-Oszillator des Tiny4313 verwendet werden, wenn die abs. Frequenz unwichtig ist und nur ein festes Puls-Pausen-Verhältnis (PWM) erzeugt werden soll.

Abschließend noch die fertige FG_4313.hex Datei.

Programm für Arduino Uno (ATmega328):

Das Programm kann auch für die Verwendung auf einem Arduino UNO R3 abgeändert werden, wo schon die RS232 über USB-Umsetzer vorhanden ist. F_CPU ist auf 16MHz anzupassen und der Ausgang OC1B ist dort an PB.2 , weshalb #define PW_AUSGANG im Programm auf 2 geändert werden muß. Ferner sollte für eine stabile Takterzeugung der keram. Resonator entfernt werden, wie es hier beschrieben ist. Hier die fertige Anpassung: FG_328.ino
Ohne zu löten, kann man das Programm auf einem Arduino testen. Die Befehlseingabe erfolgt dabei über den Serial-Monitor.

nach oben

3. spannungsgesteuerter Taktgeber für Schrittmotore bis 100 kHz

Ein ATmega88 erzeugt die entsprechenden Schritt-/Richtungssignale für einen Schrittmotortreiber A4982. Die Schrittfrequenz wird hier der Einfacheit halber mit einem Potentiometer eingestellt, wobei das Programm stepper_1x.c dafür die gewünschte Betriebsart 1/1, 1/2, 1/4 oder 1/16 Schritt anbietet, den Phasenstrom für Stillstand und Fahrt vorgibt und letztlich ob die Drehrichtung fest vorgegeben ist oder beide Drehrichtungen ermöglicht. Die angefügte Datei stepper_1x.hex ist für Rechts-/Linkslauf mit 1/16 Mikroschritt ausgelegt.

Bei Mittenstellung des Potis dreht der Motor nicht. Bei Drehung des Potis nach rechts oder links folgt die Motordrehung der Potistellung, wobei die Schrittfrequenz proportional zur Potidrehung erhöht/vermindert wird. Das Potentiometer kann durch die Widerstände Rx und Ry derart angepaßt werden, daß die kleineren Drehzahlen feiner aufgelöst werden. Ein lineares Poti mit 100k Nennwiderstand und Rx=Ry=10k wären ein Beispiel dafür.
Alternativ zum gezeigten Poti kann die Schrittfrequenz auch durch eine externe Steuerspannung eingestellt werden: unipolar oder bipolar.

Zur Schaltung:
Der ATmega88 liefert alle Steuersignale für den A4982, die somit durch Programmänderung anpaßbar sind. An PD.5 wird ein ca. 1 MHz PWM-Signal mit 16 Stufen zur Steuerung des Motorstroms ausgegeben, durch den Spannungsteiler R12/R15 auf 0-4 V reduziert und mit C7 hinreichend gefiltert. An den Shunt-Widerständen R1 || R2 und R3 || R4 ergibt sich bei Vref = 4 V ein max. Spannungsabfall von 0,5 V. Die gezeigte Schaltung liefert daher max. 1 A / Phase. Der Strom kann mit kleineren Widerständen entsprechend erhöht werden. Beim Aufbau ist auf hinreichende Kühlung des A4982 zu achten. Die Schutzdioden D2 - D10 begrenzen Überspannungen am Ausgang. Die Ausgangsfilter sind für die Funktion der Schaltung nicht erforderlich, dienen aber zur Reduzierung von EMV.

Zur Drehzahl:
Die einstellbare Schrittfrequenz beträgt 1 kHz - 100 kHz. Der A4982 wird mit 1/16 Mikroschritt (MS1 = MS2 = 1) betrieben, was den ruhigsten Motorlauf ermöglicht. Bei einem typischen Motor mit 200 Vollschritten pro Umdrehung - 1,8°/Schritt - ergibt sich die maximale Drehzahl aus 100000/(200*16) = 31,25 Umdrehungen/s oder 1875 U/min. Schnellere Drehzahlen könnten durch 1/4 Mikroschrittbetrieb eingestellt werden, wobei aber Motor, Mechanik und Schrittmotortreiber kaum noch Spielraum für höhere Drehzahlen bieten.
Die minimale Drehzahl ist per Programm auf 1/100 der max. Drehzahl eingestellt. Umgerechnet auf Vollschritte ergibt sich die Start-Stopp-Frequenz zu 1000/16 = 67 Hz.

Erweiterung der Schaltung:
Die Schrittfrequenz von 100 kHz ist eine sinnvolle Obergrenze, die mit einem ATmega88 @ 20 MHz erzeugt werden kann. Sofern eine deutlich geringere Schrittfrequenz (<10 kHz) ausreichen sollte, kann der µC noch einen 2. Motortreiber ansteuern, indem mit OCR1A Impulse an PB.1 ausgegeben werden. Die Interruptroutine von TIMER1_COMPB kann als Vorlage für TIMER1_COMPA dienen. Die Steuerleitungen für die A4982 Betriebsarten können auf andere Port-Pins gelegt werden oder, falls nicht benötigt, auch per Steckbrücke bzw. fest beschaltet werden.

nach oben

3a. spannungsgesteuerter Taktgeber für 2 x Schrittmotore 30 kHz (inkl. Arduino)

Wie zuvor beschrieben, lassen sich mit einem ATmega48...328 auch zwei Schrittmotore ansteuern, sofern man nur Schritt- und Richtungssignale benötigt. Das Programm 'stepper_2x.c' wertet die Spannungen an ADC0 und ADC1 aus und erzeugt daraus Taktsignale für die Ausgänge OC1A und OC1B im Bereich 500 Hz - 30 kHz. Per #define BEIDE_RICHTUNGEN werden Richtungssignale für Kanal-A und Kanal-B erzeugt; in Mittenstellung der Potis werden keine Taktsignale ausgegeben. Schaltet man diese Option ab, bleibt der Motor bei Linksanschlag stehen und läuft bei Rechtsanschlag mit voller Drehzahl. Start- und Endfrequenz ist in weiten Bereichen einstellbar, wobei die maximale Frequenz direkt von der Taktfrequenz des µC abhängt.

Für den schnellen Test gibt es noch die Datei 'stepper_2x.hex' und für Arduinoanwender die Datei 'stepper_2x.ino', die mit setup() und loop() arbeitet und im Arduino-Stil ergänzt werden kann. Es ist lediglich zu beachten, daß Timer1 im vollen Umfang belegt ist und nicht durch Arduino-Libs angesprochen werden darf.

nach oben

3b. 2 x Stepper 30 kHz wie zuvor, jedoch Schrittfrequenz per UART (inkl. Arduino)

Bei dieser Version 'stepper_2x_seriell' entfallen die Potentiometer, da die Schrittfrequenzen per ser. Schnittstelle eingestellt werden. Die Dateneingabe erfolgt über (lesbare) ASCII-Zeichen, was die Bedienung per Terminal(-programm) ermöglicht. Die Drehrichtung wird durch das Vorzeichen des Sollwertes eingestellt. Die maximale Taktfrequenz kann bis 30 kHz betragen.

Die Befehlsverarbeitung ist einfach gehalten, indem - eingeleitet durch ein Steuerzeichen ESC oder '.' - zunächst der ganzahlige Einstellwert ohne weitere Trennzeichen eingegeben und mit einem einzelnen Zeichen abgeschlossen werden, welches den Befehl darstellt.

.1000A erzeugt an OC1A ein Signal mit 1 kHz
.-20000B an OC1B wird ein Signal mit 20 kHz ausgegeben, wobei das '-' Zeichen das Richtungssignal umschaltet
.0A oder .0B stoppen den jeweiligen Motor
.A
fragt die Sollfrequenz für Kanal A ab. Antwort: A1000<CR><LF>
.B ebenso für Kanal-B: B-20000<CR><LF>
.V als einzelnes Zeichen gibt die Version aus

Für den schnellen Test gibt es noch die Datei 'stepper_2x_seriell.hex' und für Arduinoanwender die Datei 'stepper_2x_seriell.ino', die mit setup() und loop() arbeitet und im Arduino-Stil ergänzt werden kann. Es ist zu beachten, daß Timer1 und die ser. Schnittstelle (USART0) im vollen Umfang belegt sind und nicht durch Arduino-Libs angesprochen werden dürfen.
Der im Schaltbild gezeigte Schnittstellenkonverter SP3232 kann entfallen oder durch einen anderen Baustein (MAX232) ersetzt werden.

nach oben

4. Frequenz/Frequenz Umsetzer

Aufbauend auf dem weiter oben gezeigten programmierbaren Impulsgenerator und an anderer Stelle gezeigten Beispielprogrammen für reziproke Frequenzzähler, erzeugt hier ein ATmega48/88 mit dem Programm f2f_konverter.c aus einem Eingangssignal ein in weiten Frequenzbereichen abgeleitetes Ausgangssignal. Für Messung und Signalerzeugung wird allein Timer1 verwendet.
Im Programmabschnitt main() wird der Wert der Eingangsfrequenz ermittelt und in der float-Variablen 'frequenz' abgelegt. Der Wert 'frequenz' kann beliebig verrechnet (multipliziert, dividiert und/oder mit einem Offset versehen) werden. Der nunmehr umgerechnete Wert 'frequenz' wird als Ausgabewert für die Signalerzeugung verwendet, indem die Periodendauer für das Ausgangssignal ermittelt wird. Die Ausgangsfrequenz nebst Tastverhältnis wird über die Output-Compare-Funktion von Timer1 erzeugt. Die untere Ausgangsfrequenz ist willkürlich auf 10 Hz eingestellt und die obere Ausgangsfrequenz wird durch die Taktfrequenz/400 des ATmega48/88 begrenzt. Maximal sind bei 20 MHz Taktfrequenz 50 kHz Ausgangsfrequenz möglich. Das Tastverhältnis des Ausgangssignals wird im Beispielprogramm zwar auf 50% eingestellt, kann bei Bedarf aber auch auf einen anderen prozentualen Wert oder auf eine konstante Pulsweite gesetzt werden .

Ein Schaltbild erübrigt sich eigentlich, da die Beschaltung des µC recht einfach ist. Die Takterzeugung kann intern auf 8 MHz eingestellt werden, wozu dann keine weiteren Bauteile notwendig sind. Oder man verwendet einen ext. Quarz, wenn ein stabileres Ausgangssignal benötigt wird.

Die fertige Datei f2f_konverter.hex ist für einen 10 MHz Quarz ausgelegt und kann direkt auf einem ATmega48 oder ATmega88 verwendet werden. Beispielhaft wird eine Ausgangsfrequenz mit Fin*1,12246 ausgegeben, was einem Ganztonschritt in der wohltemperierten Tonleiter entspricht.
Ein Beispielprogramm, welches aus einer Eingangsfrequenz eine Ausgangsspannung erzeugt (F2U_konverter), findet sich hier.

nach oben

5. einfacher Taktgeber für Schrittmotore 0 - 50 kHz, ATtiny25

Ein deutlich vereinfachter Taktgeber, wie unter 3. gezeigt, läßt sich mit einem ATtiny25 aufbauen. Abhängig von der Potistellung werden nur Takt- und Richtungssignal erzeugt. Das Programm läuft problemlos mit dem internen 8 MHz RC-Oszillator des Tiny25, kann aber auch auf einen ext. Quarztakt bis 20 MHz angepaßt werden. Damit sind dann wie im obigen Beispiel über 100 kHz Taktfrequenz möglich. Der erzeugte Ausgangsimpuls liegt im einstelligen µs-Bereich, was für übliche Treiberbausteine völlig ausreichend ist.

Die fertige .hex-Datei ist für F_CPU = 8 MHz ausgelegt. Übersetzt ist sie für einen ATtiny25 und läuft daher ebenso auf einem ..45/85.

nach oben

5a. Taktgeber für bipolare Schrittmotore 1- 1000 Hz (Quadraturencoder), ATtiny25

Basierend auf der vorangegangenen Schaltung werden hier zwei um 90° phasenverschobene Rechtecksignale erzeugt, die über nachgeschaltete Treiber einen bipolaren Schrittmotor direkt ansteuern können. Abhängig von der Potistellung werden Frequenz und Phasenlage (rechts-links) verändert. Das Programm mini_encoder_25.c läuft mit dem internen 8 MHz RC-Oszillator des Tiny25, kann aber auch auf einen ext. Quarztakt bis 20 MHz angepaßt werden. Die Ausgangsfrequenz ist hier auf 1 - 1000 Hz eingestellt kann aber bei Bedarf deutlich erhöht werden (>= 10 kHz).

Die fertige .hex-Datei ist für F_CPU = 8 MHz ausgelegt. Übersetzt ist sie für einen ATtiny25 und läuft daher ebenso auf einem ..45/85.

nach oben

6. einfacher Spannungs-Frequenz-Wandler, ATtiny25

Im Gegensatz zum zuvor gezeigten Taktgeber für Schrittmotore, werden beim U2F-Wandler Rechtecksignale mit 50% Tastverhältnis erzeugt. Dazu wird in der Ausgaberoutine die erzeugte Pulsweite als Periodendauer/2 eingestellt. Im Programm wird ein Umsetzungsfaktor von 1 kHz/V bei 8 MHz Taktfrequenz verwendet. Die maximale Ausgangsfrequenz des Tiny25 beträgt 25 kHz bei F_CPU = 8 MHz. Verwendet man einen externen Quarz mit 20 MHz, können >= 50 kHz Ausgangsfrequenz erreicht werden.

Die Datei mini_U2F.hex ist für den µC-internen RC-Oszillator mit 8 MHz ausgelegt. Übersetzt ist sie für einen ATtiny25 und läuft daher ebenso auf einem ..45/85.
Für höhere Ansprüche muß zum einen die Taktfrequenz mit einem Quarz stabilisiert und zum anderen die Versorgungsspannung sehr konstant gehalten werden, da diese gleichzeitig als Referenzspannung für den ADC verwendet wird.

nach oben

7. einfache Schrittmotoransteuerung mit ATmega328 und A4982

Weiter oben befindet sich die Beschreibung für einen spannungsgesteuerten Taktgeber für Schrittmotore; die reduzierte Schaltung dazu zeigt nur die notwendigen Bauteile. Die vollständige Schaltung soll hier gezeigt werden.

Hiermit lassen sich einfache Anwendungen aufbauen, die neben einem Schrittmotor noch mit 2 x optoentkoppelte Eingängen, 2 x ADC-Eingängen und 2 x Relais-/Ventil-Schaltausgängen auskommen. Ferner sind die Schnittstellen USART und TWI (IIC) des ATmega328 verfügbar, sodaß die Baugruppe (auch mehrere nebeneinander) als Untereinheit zu bestehenden Schaltungen verwendet werden kann.

Die Schaltung selbst dürfte weitgehend selbsterklärend sein, wobei zu beachten ist, daß die Schaltausgänge mit low-side-Schaltern arbeiten; auch die Optokoppler sind für Eingangssignale mit aktivem Zustand '0' ausgelegt. Als Betriebsspannung für den Schrittmotortreiber sind 12V eingezeichnet, wobei auch 24V verwendet werden können. Bei höheren Drehzahlen ist dies auch von Vorteil oder sogar notwendig. Die Schutzdioden D1-D8 werden in üblichen Schaltungen eingespart, was bei vielen Anwendungen auch in Ordnung sein kann. Sofern es möglich ist, den Schrittmotor im laufenden Betrieb an- und abzustecken, ist die Bestückung dieser Dioden dringend zu empfehlen.

Zum Schaltbild existiert eine Leiterplatte (ca. 100 x 36 mm², ds, dk, FR4), die sofern vorrätig auch angefordert werden kann; bei Bedarf bitte anfragen.


Obwohl weitgehend SMD-Bauteile bestückt werden, ist auch eine Handbestückung möglich. Der Treiber A4982 braucht unbedingt Kühlung, auch wenn bei der vorliegenden Schaltung der Phasenstrom moderat auf 1A begrenzt ist. Für die Handbestückung kann man unterhalb der A4982 ein wenig Lötpaste auftragen und diese nach der Verlötung der Pins von unten mit dünner Lötspitze und etwas Lötzinn abschließend verlöten. Dazu sind die 2 x 2mm Lötaugen vorgesehen. Alternativ kann man dazu auch Heißluft verwenden.

Da die Schaltung ohne Programm recht belanglos ist, gibt es ein kleines Programm 'step_m328.c', welches die einfache Ansteuerung des Motors im 1/16 Betrieb mit Anfahr- und Bremsrampen und automatischer Stromabsenkung in Ruhe zeigt. Aktiviert ist ein Programmteil TONLEITER, der die Bewegungen akustisch nachvollziehen läßt. Die Datei 'step_m328.hex' kann direkt in den ATmega328 programmiert werden. Es wird ein 18,432MHz Quarz erwartet.

Anpassung für Arduino Uno

Das zuvor gezeigte Programm läßt sich einfach auf einen Arduino Uno mit ATmega328 anpassen: lediglich die F_CPU muß auf 16 MHz eingestellt werden! 'stepper_a4982.ino'
Sofern die Signale für /Reset, Enable, Sleep, MS1+MS2(+MS3) und PWM auf der Ansteuerplatine fest verdrahtet sind (oder erst garnicht benötigt werden), reicht es aus, am Arduino lediglich Pin10 (PB2, step), Pin11 (PB3, direction) und GND anzuschliessen. Die übrigen Funktionen (insbesondere Stromabsenkung) sind dann optional.

nach oben

8. ATmega328 und A4982, Bedienung über RS232

Die zuvor gezeigte Schrittmotorsteuerung mit ATmega328 und A4982 läßt sich per UART (RS232) fernbedienen. Nachfolgend wird der aktuelle Stand beschrieben, Erweiterungen sind noch offen.

Die Befehlsverarbeitung ist einfach gehalten, indem ein Steuerzeichen '.' den Befehl einleitet/synchronisiert, danach der ganzahlige Einstellwert (wenn sinnvoll und zulässig auch mit '-' Vorzeichen) ohne weitere Trennzeichen eingegeben wird und abschließend der Befehl (ein einzelnes Zeichen) folgt. Die Abfrage der eingestellten Werte wird durch Weglassen des Zahlenwertes erreicht. Weiter oben findet sich ein anderes Beispiel, wo die Bedienung ein wenig besser erläutert wird. Die Befehle aktiv zu testen ist hilfreicher, als eine zu detaillierte Beschreibung zu erstellen. Die mit 'EEPROM' gekennzeichneten Werte werden beim Einschalten aus dem Speicher geladen, wie sie zuletzt gespeichert wurden.

Befehle (nnn = Integerzahl ggf. mit '-' Vorzeichen; Leerzeichen ' ' dienen nur der Lesbarkeit und werden nicht gesendet):

.nn A EEPROM stellt den Ruhestrom auf den Wert nn ein; zulässiger Bereich bis 0-15
.nn B EEPROM der Fahrstrom wird auf nn eingestellt; zulässiger Bereich wie zuvor
.nnn C EEPROM das Timeout für den Fahrstrom wird bei nnn = 100 auf 100 * 10ms eingestellt: nach 1s wird der Ruhestrom aktiviert; Bereich 0-10000
.nnn D   Dauerlauf des Motors ohne Rampenfunktion mit nnn µs; bei nnn = 500 ergibt sich 2kHz Schrittfrequenz; kleinste Schrittfrequenz 0,01 Hz
Stopp mit '.0D';
.1 E EEPROM Echo = EIN; bei der Abfrage der Werte werden Befehl+Zahlenwert ausgegeben, sonst nur der Zahlenwert; 'A3' Ruhestrom mit und nur '3' ohne Echo
.F   Abfrage der internen Taktfrequenz in MHz bzw. Takte/µs; typ. 16 bei 16MHz CPU-Takt
.H   Haltebefehl mit Rampe
.nnnnn I   setzen der aktuellen Soll- und Ist-Position auf 'nnnnn'; ohne Parameter: Abfrage der Ist-Position
.500 L EEPROM Setzen der Start/Stoppgeschwindigkeit auf 500 Schritte/s; ohne Parameter: Abfrage des aktuellen Wertes
.4 M EEPROM Setzen des Modus an PB0 (MS2) und PB1 (MS1) wobei das untere Bit die Richtung vorgibt: MS1*4 | MS2*2 | Richtung*1
.100 R   Relative Bewegung zur Soll-Position, '.-100R' entsprechend rückwärts
.5000 S EEPROM Fahrgeschwindigkeit mit 5000 Schritten/s; max. 50000; Abfrage des aktuellen Werte mit '.S'
.10 T   zusätzliche CPU-Takte bei Dauerlauf-Frequenz: '.10T' und '.500D' ergibt eine Taktperiode von 500 + 10/16 µs
.V   Ausgabe der Version als String
.100 Y EEPROM Rampe/Steigung der Beschleunigung auf 100 setzen; größere Werte ergeben eine höhere Beschleunigung
.100000 Z   Zielfahrt mit Rampe auf Sollposition; negative Werte für andere Richtung
.?   Status 0 oder 1; 1 = Motorfahrt ist aktiv, 0 = Motor ist bereit
.<Strg>+S   die eingestellten Parameter werden ins EEPROM geschrieben und beim Einschalten wieder geladen
     
    ab Version 1.1
.*   Ausgabe des '*' zur Kontrolle der Verbindung; (Test auf richtige Baudrate)
.!   die Einstellungen werden auf die im EEPROM gespeicherten Werte (zurück)gesetzt
.nnn @ EEPROM zusätzlich zum '.' wird ein Adressbyte definiert und sofort im EEPROM gespeichert; Bereich 97-255: 97= 'a'
.n # EEPROM Index für Baudrate schreiben: 0=9600, 1=19200, 2=38400, 3=57600, 4=76800, 5=115200

Das Programm 'stepper_controller.hex' ist für den ATmega328 übersetzt, wobei die Taktfrequenz auf 16MHz eingestellt ist. Es läuft somit auf der oben gezeigten Schaltung mit 16MHz Quarz oder auch auf einem Arduino Uno. Die Baudrate ist auf 19,2kBd eingestellt und als Befehle sind auch kleine Buchstaben zulässig, sofern diese nicht für die Adressierung verwendet werden (höhere Priorität).
Ab Version 1.1: Die Baudrate läßt sich ändern und der '.' durch ein weiteres Zeichen zur individuellen Adressierung (Kleinbuchstaben 'a', 'b', ... , 255) für jede einzelne Steuerplatine ersetzen; damit könnten dann weitere Motore über eine Schnittstelle adressiert und betrieben werden.

Die Grundeinstellung entspricht der Befehlsfolge: ".3A.10B.100C.1E.1000L.10000S.2M.50Y.1#.255@"

Während die gezeigte Bedienung einfach mit einem Terminalprogramm zu erledigen ist, gibt es eine Programmversion, die die Befehle als kodierten String (ähnlich i-Hex-Format) mit Prüfsumme erwartet. Hierbei wird die Möglichkeit genutzt, mehrere Module per Multiprozessor-Adressierung einheitlich anzusprechen. Einen kleinen Einblick gibt die Datei 'MCP_STEP_CMDS.h' mit den betreffenden Befehlen.

nach oben

9. Generator 45,000 - 55,000 Hz mit Einstellung per Poti/Joystick

Aus einer Kombination der obigen Schaltungen/Programme ist hier auf Basis ATmega48/88 ein Rechteckgenerator enstanden, der quarzgenaue Frequenzen im Bereich 45 - 55 Hz mit 1 mHz Auflösung erzeugt. Die Frequenz wird per Timer1 über OCR1A erzeugt, wie es ähnlich beim obigen U2F-Wandler gezeigt wird. Die Einstellung der Frequenz verwendet das Register OCR1B von Timer1, um eine Einstellfrequenz zu generieren, wie es bei den Taktgebern für Schrittmotore der Fall ist. In Mittenstellung erfolgt keine Änderung, bei Potidrehung wird die Frequenz abhängig von Drehrichtung und proportional zum Drehwinkel verändert. Dazu wird der Drehwinkel in (hier) zehn Stufen aufgeteilt und die Geschwindigkeit der Frequenzänderung per Tabelle eingestellt.

Die aktuelle Frequenz wird auf einer 5-stelligen 7-Segmentanzeige angezeigt und bei jeder Änderung im µC-internen EEPROM gespeichert. Beim Einschalten erscheint die zuletzt eingestellte Frequenz.

Die Schaltung ist eine abgemagerte Version eines Frequenzzählers. Dort finden sich auch weitere Informationen zur Ansteuerung der 7-Segmentanzeige.

Alternativ zum gezeigten Poti kann auch ein fester Spannungsteiler 1:1 den ADC6-Eingang auf Vcc/2 Potential halten, um versehentliche Frequenzänderungen zu verhindern. Diverse feste oder ein variabler Widerstand, der die Einstellgeschwindigkeit vorgibt, wird dann per Drehschalter oder Taster/n je nach Richtung gegen Vcc oder GND geschaltet

Das Programm 'Generator_50Hz.c' berücksichtigt den gezeigten 12 MHz Quarz und kann bei Bedarf angepaßt werden. Dazu gibt es die fertig .hex-Datei.

nach oben

10a. PWM-Spannungssteller per Tasten

Mit der gezeigten Schaltung erzeugt ein ATtiny25 ein PWM-Signal, welches sich mit zwei Tastern in der Pulsbreite verändern läßt und nach anschließender Filterung eine analoge Ausgangsspannung im Bereich 0 - 5 V erzeugt. Mit der gezeigten LC-Filterung können auch Ausgangsströme im mA-Bereich entnommen werden; ein Operationsverstärker als Puffer ist nicht unbedingt notwendig, sofern keine exakten Ausgangsspannungen benötigt werden. Bei kleiner Belastung am Ausgang kann auch ein RC-Filter (z.B. 10 k / 100 nF) verwendet werden.

Das zugehörige Beispielprogramm zeigt einen Einstellbereich von 0,5 -> 5 V in 0,1 V Schritten. Die Tasten "up" und "down" verändern die Ausgangsspannung in diesem Bereich im Einzelschritt oder bei längerem Drücken mit schneller Folge (10 / s). Der letzte Einstellwert wird im EEPROM abgelegt. Bei Einschalten wird der zuletzt gewählte Spannungswert ausgegeben. Dazu noch die .hex-Datei.

Bezüglich des PWM-Signals muß angemerkt werden, daß im gewählten PWM-Modus mit OC1C als oberer Vergleichswert bei fast 100% Tastverhältnis die Lücke (kurzer negativer Impuls) nicht wie erwartet ca. 15 ns sondern ca. 30 ns lang ist. Bei der hier gezeigten Auflösung mit 50 Stufen, beträgt die Änderung pro Stufe ca. 80 ns. Da sind die 15 - 30 ns nicht von Belang. Sollte der sich ergebene Fehler bei feinerer Auflösung zu groß werden, ist es sinnvoll auf einen anderen AVR-Baustein auszuweichen

nach oben

10b. PWM-Spannungssteller per Drehgeber

Die Funktion dieser Schaltung ist ähnlich zu der zuvor gezeigten Version mit dem wesentlichen Unterschied, daß hier ein mechanischer Drehgeber statt Taster zur Einstellung der Ausgangsspannung verwendet wird.

Bei Betätigen von 'Reset' wird der minimale Stellwert eingestellt. Zudem ist neben OC1B (PB4) auch der invertierte Ausgang OC1Bn (PB3) freigegeben, sodaß damit externe FETs als Schalter einen niederohmigen Ausgang bilden können. Im Beispielprogramm ist angedeutet, wie man hierzu noch eine Totzeit einstellen kann. Damit wird verhindert, daß im Umschaltmoment beide Transistoren gleichzeitig aktiv sind und einen störenden Querstrom erzeugen. Zum schnellen Probieren hier noch die .hex-Datei.

nach oben

11. Langzeittimer mit ATtiny25

Akkubetriebene Geräte sollten je nach Ladeschaltung nicht dauernd am Ladegerät betrieben werden. Entweder werden die Akkus langfristig überladen und verschleißen dadurch vorzeitig, oder es ist eine Trennung vom Ladegerät notwendig, damit ein neuer Ladezyklus startet. Das Timing zum Nachladen muß nicht sonderlich genau sein, aber für mobile Anwendungen ist eine möglichst geringe Ruhestromaufnahme wichtigt.

Die gezeigte Schaltung besteht aus wenigen Komponenten: µC mit Abblockkondensatoren und Schalttransister zum Schalten größerer Lastströme.

Das gezeigte Programm aktiviert den Schaltausgang einmal im Monat für ca. 6 Stunden. Die Puls- und Pausenzeit wird mit dem internen Watchdog-Timer erzeugt, der bei 1 - 2 % Genauigkeit mit durchschnittlich ca. 7 µA @ 5 V Stromaufnahme auskommt. Das Programm ist recht kurz und kann den eigenen Bedürfnissen angepaßt werden. Die .hex-Datei.

nach oben

Kontakt:

zurück zur Übersicht