Table of Contents
Will be translated soon.
!!! Achtung: Steck die beiden Jumper für den UART richtig herum !!! Anleitung
Grundlegende Experimente mit einer MCU
Die hier angegebenen Experimente wurden mit der MCU MSP430G2553 von Texas Instruments auf deren LaunchPad gemacht. Die Experimente können aber ebenso gut mit anderen MCUs angestellt werden. Es wird aber für nichts gehaftet. Kleine Forth Programme für die Experimente mit der MCU sind weiter unten angegeben.
Für diese Experimente brauchte ich ein LaunchPad, ein Multimeter, ein Oszilloskop und einige Kleinteile wie Widerstände und Kondensatoren, und einen kleinen Lautsprecher. Ein Steckbrett kann nicht schaden, ebenso ein Bündel Prüfklipp-Kabel die einfach an das LaunchPad angeklemmt werden können.
Bild in höherer Auflösung: Bei mir sah das dabei so aus.
Die verwendete MCU erwies sich als erstaunlich robust. Wie man so eine MCU dann doch kaputt kriegt ist ganz unten beschreiben.
Wie man an das 4e4th kommt steht auf der 4e4th.start Seite.
Port Pin über Widerstand an Masse legen
Wer schon weiß was passiert wenn man einen Widerstand an den Portpin anschließt, möge weiter lesen, und mir sagen ob hier alles richtig und verständlich beschrieben worden ist. Alle anderen brauchen das für ihre Sammlung an Basiswissen. Es erscheint vielleicht als zu triviales Experiment, ist es aber spätestens dann nicht mehr, wenn man Schaltungen mit MCUs aufbauen will.
P1.4 — R_L — GND
Den Widerstand RL von 100 Ω Nennwert zuerst mit dem Multimeter nachmessen, um den wahren Wert zu ermittlen. Und am Portpin P1.4 die Ausgangsspannung U0 messen, noch ohne den Lastwiderstand RL angeschlossen zu haben. Dann den Widerstand RL zwischen P1.4 und Masse anklemmen. Wir messen nun am Portpin P1.4 mit dem Multimeter eine kleinere Ausgangspannung UL.
RL [Ω]|U0 [V]|UL [V] | ||
96 | 3,4 | 2,8 |
Dieser Sachverhalt soll nun auch auf dem Oszilloskop dargestellt werden. Das Testprogramm TON generiert dafür ein Rechtecksignal 1:1 auf den beiden Port Pins P1.4 und P1.5. An P1.4 wird der Lastwiderstand angeschlossen, P1.5 bleibt frei.
- Warum sinkt die Ausgangsspanung am Portpin P1.4 unter ohmscher Last etwas ab? Das liegt daran das der Ausgangstreiber ein Feldeffekttransistor (FET) ist. Ein FET verhält sich wie ein Widerstand. Dieser innen im Chip liegende Widerstand Ri bewirkt den Spannungsabfall, da der Messpunkt M an P1.4 Mitten im Spannungsteiler liegt.
Vcc — Ri — P1.4 — M — R_L — GND
Entsprechend der Spannungsteilerformel kann der Innenwiderstand berechnet werden:
Formel (1) Ri = R_L * ( U0-U_L ) / U_L
Strom durch P1.4 nach Masse mittels bekannter Widerstände abschätzen
Benutze wieder den Aufbau aus dem vorherigen Experiment.
P1.4 --- R_L --- GND
Werte von RL mit dem Multimeter bestimmen. U0 und UL mit Multimeter messen. Danach Ri und I nach Formel (1) berechnen. Wir beginnen mit einem Widerstand von 100 Ω Nennwert. Nachmessen ergab einen Widerstand von 96 Ω. Durch parallel oder seriell schalten von bis zu drei solchen Widerständen lassen sich andere Widerstandswerte erzeugen. Immer nachmessen was erzeugt wurde.
U0 [V] | UL [V]|RL [Ω] | Ri [Ω] | I [mA] | Nennwert [Ω] | |
3,545 | 0,676 | 8 | 33,953 | 84,500 | 1×10 |
3,545 | 1,871 | 38 | 33,999 | 49,237 | 3×100 parallel |
3,545 | 2,297 | 46 | 24,993 | 49,935 | 2×100 parallel |
3,545 | 2,854 | 96 | 23,243 | 29,729 | 1×100 |
3,545 | 3,182 | 193 | 22,017 | 16,487 | 2×100 seriell |
3,545 | 3,299 | 291 | 21,699 | 11,337 | 3×100 seriell |
Der Chip bleibt dabei kühl, schafft diese ohmsche Last an einem Pin ohne weiteres. Das Datenblatt zum MSP430G2553 besagt genau das gleiche: Erniedrigt man die ohmsche Last am Port Pin, steigt dessen Innenwiderstand im FET an, und der Stromfluß wird begrenzt. Der Preis dafür ist aber eine stark sinkende Ausgangsspannung an dem Pin. Das ist solange in Ordnung, wie die nachfolgende Schaltung keinen zugesicherten Pegel braucht. Will man hingegen mit dem Pin eine nachfolgende Logikschaltung verwirklichen, die den vollen Pegel benötigen um ihre Schaltschwellen zu erreichen, dann muss die ohmsche Last begrenzt werden. Typischerweise sind dann nur noch 5mA ohmsche Last am Pin ok. Das heißt aber nicht, das ein Portpin nicht doch mehr Strom liefern könnte, und auch verträgt wie man sieht!
Kurzschluß
Auch kein Grund zur Panik! Die direkte Messung mit dem Multimeter M ergab:
P1.4=H --- M --- GND --> I = 66.5 mA P1.5=H --- M --- GND --> I = 64.5 mA P1.4=H --- M --- P1.5=L --> I = -48.3 mA P1.4=L --- M --- P1.5=H --> I = 48.8 mA
Der Portpin hat das ohne weiteres ausgehalten , begrenzt den Strom selbst.
Rampen Generator
Ein klassisches Beispiel für Widerstandsnetze ist das R2R-Netzwerk um Spannungsrampen zu erzeugen. Das ist einfach zu verstehen. Es ergibt sich aus der Spannungsteiler Schaltung. Weil es so einfach ist kann es auch schnell mal aufgebaut werden. Für Demonstrationszwecke kann das an unserer MCU sogar aus nur 3x R und 1x 2R gemacht werden. Die Widerstände 2R vor den Schaltern entsprechen praktisch dem Innenwiderstand eines FET am Portpins, der FET selbst ist zugleich auch der Schalter. Das Ganze reduziert sich damit auf folgendes:
GND---2R---P1.4---R---P1.5---R---P1.6---R---P1.7---> Vx
Mit R=14Ω passt das schon. Der Aufbau und das Ergebnis ist in den folgenden Bilden zu sehen. Ein kleines Forthprogramm für den D/A Wandler gibt es natürlich auch.
Strom von P1.4 nach P1.5 mittels bekannter Widerstände abschätzen
Schaltet man einen Widerstand nicht gegen Masse, sondern gegen einen anderen Portpin, wirkt dort ebenfalls ein FET, nun als Abflusswiderstand.
Vcc --- P1.4 --- R_L --- P1.5 --- GND
Im Falle eines Kurzschlusses von P1.4 nach P1.5 wirken deren Innenwiderstände begrenzend auf den Strom der fließen kann. Wir messen mit dem Multimeter nach was beim Kurzschluss passiert. Dazu wurden die Pins manuell gesetzt.
P1.4 = high --- P1.5 = low
RL [Ω]|U0 [V] |UL [V] | I [mA] | ||
0 | 3,545 | 2,142 | 49,1 |
Wie man sieht übersteht der Chip das problemlos. Solche Situationen kommen auch praktisch vor. Es geschieht beim einlöten von Bauteilen gar nicht so selten das aus versehen Brücken entstehen und solche Kurzschlüssse erzeugen. Also keine Panik, der Chip bleibt auch dabei heile. Auch das kann mit dem Testprogramm TON am Oszilloskop dargestellt werden.
Zwischen P1.4 und P1.5 wurde der Lastwiderstand R_L mit 100 Ω angeschlossen.
P1.4 --- R_L --- P1.5
Man sieht also, dass der H-Pegel absinkt während der L-Pegel etwas angehoben wird. Hier noch weitere Bilder davon mit höheren Widerstandswerten.
Bilder in höherer Auflösung:
H-Pegel an P1.4 mit Lastwiderstand liegt bei 3V ist also etwas abgesunken, der L-Pegel an P1.5 wird auf 0.6V hoch gezogen. Raster 1 cm. Vertikal 1V/cm, horizontal 5ms/cm.
An 300 Ω ist der Effekt geringer.
An 10 kΩ (gemessen 9,82 kΩ) ist der Effekt praktisch aufgehoben.
Wie verhält sich ein Portpin an einem großen Kondensator?
Der Pin verhält sich wie ein Widerstand. (push-pull output)
Verifikation: An einem Kondensator müsste sich eine typische Lade- Entladekurve wie bei einem RC-Glied zeigen.
Mache folgende Schaltung mit ähnlichen Werten
P1.4 --- +C1- --- GND
C1 = Elektrolyt Kondensator 100 µF 35V
Signal an P1.4 soll eine Rechteck 1:1 sein. (square wave)
Periodendauer T = 30 ms
Dann ist folgendes zu beobachten:
Die Ladekurve setzt bei U0=0V ein und ist nach 15ms bei >99% also praktisch Umax=3.4V angekommen. Der Kondensator wurde also über P1.4 wie über einen Widerstand solange geladen, wie dieser den Pegel high hatte. Wird dann P1.4 auf low umgeschaltet, entläd sich der Kondensator. Der Pin verhält sich auch dabei wie ein Widerstand. Man sieht eine typische Lade- Entladekurve eines RC-Gliedes.
Die Variablen für TON müssen nun eine niedrige Frequenz ergeben, damit sich der Kondensator auch ganz auf- und entladen kann. Kleinere Kondensatoren gehen natürlich auch, 10µF füllen sich halt schneller. Dann fließt auch initiale Strom nicht so lange, der Pin wird mehr geschont. Doch es war ja gerade meine Absicht zu zeigen das der Pin auch den 100µF noch 'packt'.
Bild in höherer Auflösung: Lade- und Entladekurve RC-Glied. Gitter 1x1cm, Einstellung horizontal 5ms/cm, vertikal 1V/cm.
Wie groß ist der Widerstand über den geladen und entladen wird?
Oder anders gefragt: Was kann ein Portpin an initialem Ladestrom liefern um einen leeren Kondensator zu laden?
Die Zeitkonstante des Kondensators ist tau=RC und bei t0 fließt der Strom Imax=Umax/R - das sind bekannte Formeln aus den Grundlagen der Elektrotechnik. In der e-Funktion der Ladekurve hat nach der Zeit t=tau die Spannung etwa 63 % der angelegten Spannung Umax erreicht. Nach der Zeit t=5tau ist der Kondensator auf mehr als 99 % aufgeladen. Oder: bei 63% der Spannung liegt tau. Aus dem Bild des RC-Gliedes am Oszilloskop kann man diese Werte abschätzen. Bis zum Pegel von 3,4 V * 0,63 = 2,142 V sind 3,75 ms vergangen.
R = tau / C = 3,75 / 100 = 37.5 Ohm [ms/µF = 1kOhm ]
Daraus folgt das der initiale Ladestrom:
Imax = 3.4 V / 37.5 Ohm = 90 mA
vom Portpin offesichtlich geliefert wird. Dabei muss man sagen, das Kondensatoren stark vom Nennwert abweichen können und altern. Hätte der Kondensator tatsächlich nur noch 50% der Kapazität, wäre ein halb so großer Ladestrom anzunehmen.
Eine andere Methode den Ladestrom zu ermitteln benutzt die Formel der Ladekurve.
Ladekurve U(t) = Umax*(1 - e^(-t/tau))
Wir lesen aus dem Bild ab:
Bei t0=0 ist U0=0V
Bei t1=7.5ms ist U=3V
Umax ist 3.4V
Wie groß ist dann tau?
3=3.4(1-e^(-7.5/tau)) --> tau = 3.50456 ms
Damit lässt sich R wieder berechnen wie weiter oben zu R = 35 Ohm. Und I = 97 mA. Das tau kann man übrigens von Wolfram Alfa berechnen lassen - einfach die Gleichung eingeben.
Probier auch andere Kondensatoren aus. Ich habe einen noch größeren angeschlossen, und aus dessen Ladekurve vom Oszilloskop folgendes ermmittelt.
C2 = 470 µF Periode T = 12x10ms Bei t1=35ms ist U=3V Umax = 3.4V 3=3.4(1-e^(-35/tau)) --> tau = 16.3546 R = 16.3546 / 470 = 34.7 Ohm Imax = 3.4 V / 34.7 Ohm = 97.9 mA
Man sieht das der initiale Ladestrom fast gleich ausfällt, aber natürlich noch länger anhält.
PWM Signal am RC-Glied
Nach den Experimenten mit Widerständen und Kondensatoren folgt eine Kombination davon.
P2.5 -- R --x-- C -- GND
An Port Pin P2.5 kommt das PWM Signal an, und geht über einen Widerstand R an den Kondensator C dessen anderer Anschluss an Masse liegt. Bei x wird das resultierende Signal 1) im RC-Glied abgenommen. Ich habe R=10K und einen kleinen blauen Stützkondensator genommen von ca. C=100nF, aufgebaut wieder auf dem Steckbrett.
Wenn die PWM Frequenz hoch genug ist, wird die Ausgangsspannung des PWM gemittelt. Das sorgt dafür, dass bei gleichbleibender Pulsweite eine Gleichspannung entsteht. Wenn das Verhältnis Puls/Pause 50% ist, dann entspricht diese Gleichspannung der halben Speisespannung. Wird der Puls länger, erhöhet sich die Spannung, und wird der Puls kürzer, wird die Spannung geringer. ist das gut zu sehen. Die Spannung bei x geht immer rauf und wieder runter, je nach Pulsbreite, bei gleichbleibender PWM Frequenz. Das Forth Programm dazu PWM_an_RC zeigt wie es gemacht worden ist.
Vergleiche auch: Tiefpass, einfacher Integrierer
LED anschließen
Betrachten wir zunächst was mit einer roten 3mm LED passiert die ohne alles an einer Batterie mit 3V angeschlossen wird. Sie leuchtet - sonst passiert nix! Die LED wird nicht heiß, geht auch nicht kaputt. Miss den Strom mit dem Multimeter nach. Dann probier das selbe zwischen P1.4 und P1.5 - leuchtet auch, wird auch nicht heiß, weder die LED noch der Chip, beides bleibt heile.
Batterie 3V (2x1.5 AA) Bat. --- LED red ->-- GND --> I = 59.8 mA Port P1.4=H --- LED red ->-- P1.5=L --> I = 23.2 mA
Du siehst, um LEDs in einer kleinen Matrix direkt am Chip zu betreiben braucht es gar keine begrenzenden Widerstände. Und da die LEDs dann ja auch noch gepulst betrieben werden, ist die Last im Chip recht klein.
Mit dem Programm T1 kannst du das sichtbar machen. Der Pegel an P1.4 sinkt wieder etwas ab auf 3V etwa, der an P1.4 wird leicht angehoben auf 0,6V. Das ist alles.
Lautsprecher anschließen
Pegelveränderung und Spannungsspitzen
Ein kleiner Lautsprecher, (8Ω 0,2W 5,5cm∅) soll als Modellfall für eine Spule dienen. Wie werden induktive Lasten vertragen? Die Schaltung ist wieder denkbar simpel. Der Lautsprecher wird einfach ohne alles zwischen zwei Portpinnen angeklemmt, und dann im Gegentakt der Ausgänge betrieben. Die beiden Kondensatoren im Bild dienen nur dem Größenvergleich. Es sind die Test-Kondensatoren aus den vorhergehenden Experimenten. Mehr als 50mA gibt so ein Portpin nicht her wie wir oben gesehen haben.
3,4V * 50mA = 170mW
Bis 200mW kann unser Lautsprecherchen belastet werden, das passt also.
P1.4 --- LS --- P1.5
Mit Hilfe des Testprogramms TON wird der Gegentakt gemacht. Mit der Variablen ETWAS kann die Tonhöhe variiert werden. Ist der eine Pin “1”, ist der andere “0”. Die resultierenden Pegel sind in den nebenstehenden Oszilloskop-Bildern wiedergegeben. Im unbeschalteten Zustand sieht man im Bild links die vollen Pegel. Rechts ist der Pegel “1” an P1.4 auf 2V gesunken, und der Pegel “0” daran dann angehoben auf 1,6V weil der andere Pin nun dagegen treibt.
Die Intensität des Kathodenstrales am Oszilloskop hab ich gehörig hoch gedreht, damit man die “Überschwinger” gut sehen kann, die von der Spule des Lautsprechers stammen. Diese Spannungsspitzen belasten die Ports natürlich, werden aber von der Konstruktion eines Portpins her vom ESD Schutz geschluckt (Schutzdiodenwirkung am FET zu seinem Substrat). Bei Spulen mit vielen Windungen können KV-Spannungen resultieren, wenn so eine Spule einfach abgeschaltet wird. Das ist bei unserem Lautsprecherchen mit seinen wenigen Windungen aber nicht der Fall. Die Spannungsspitzen sind klein und sehr schmal und haben kaum Energie, sind daher verträglich und werden von der Schutzbeschaltung ohne weiteres geschluckt.
Der ohmsche Widerstand des Lautsprecher ist nur 8Ω, natürlich 'zieht' das Strom aus dem Pin. Der hält das aber aus, wie man weiter oben bei den Experimenten mit den Widerständen gesehen hat. Natürlich sinkt der “1” Pegel wieder tüchtig ab, und der “0” Pegel wird angehoben, sie nähern sich zeimlich an. Bei Tönen im Hörbereich ist das aber alles unkritisch. So ein Lautsprecher darf also getrost so betrieben werden.
(Wie sich das genau verhält an den Flanken der Rechteckwelle hoffe ich auch noch darstellen zu können, sobald ich mir ein moderneres Oszilloskop ausleihen konnte.)
Bilder in höherer Auflösung:
Lautsprecher, 8Ω 0,2W 5,5cm∅
Voller Pegel an P1.4. Gitter 1cm; Horizontal 0,5ms/cm, vertikal 1V/cm; Hilfsline auf 0V
Lautsprecher angeschlosen. "1" noch 2V, "0" nun 1,6V. Gitter 1cm; Horizontal 0,5ms/cm, vertikal 1V/cm; Hilfsline auf 0V
Schwingung der Membran
Bei einer tiefen Frequenz der Rechteckwelle (50Hz) sieht man bei genügend großer Verstärkung dass eine gedämpfte Sinusschwingung den Pegeln überlagert ist. Die stammt von der Rückstellkraft der Membran. Die ausgelenkte elastische Membran schwingt zurück und induziert dabei wieder eine Spannung. Diese Schwingung ist bei 10-facher Verstärkung der Pegel schon ganz gut zu sehen auf dem Foto und auch im Film.
Der zeigt das LaunchPad, den Lautsprecher, die Frequenz, und am Oszilloskop die Schwingung der Pegel mit 0,2V/cm. Gegen Ende dann Verstärkung der Schwingung auf 0,1V/cm.
Im sieht man was passiert, wenn man die Membran berührt. Zunächst im Außenbereich, und dann im Zentrum. Dabei ist zur Verdeutlichung des Effektes nur noch der “0”-Pegel auf dem Oszilloskop dargestellt. Die Triggerkurve ist ausgeblendet. Natürlich ist der Effekt auch auf dem “1”-Pegel in der anderen Hälfte der Rechteckwelle sichtbar.
Hier auszugsweise einige Bilder aus dem Tonfilm.
Man sieht die stärkere Dämpfung der Membran durch den Daumen wohl ganz gut.
Höhere Auflösung:
Das Bild zeigt die gedämpfte Sinusschwingung in den Pegeln deutlich.
Resonanz der Membran
Die Eigenschwingung der Membran kann in den vorhergehenden Bildern ausgemessen werden. Was passiert wenn man den Lautsprecher mit ansteigenden Frequenzen betreibt zeigt
. Auszugsweise auch davon einige Bilder.
Es ist schön zu sehen das im Resonanzfall sowohl der “1”- als auch der “0”-Pegel schön 'ausgebeult' sind. Der Sinus liegt über dem Pegel. Und es ist zu hören das der Ton lauter wird.
Im vierten Bild ist der Resonanzfall ohne die Hilfslinie gezeigt. Die halbe Periode der Schwingung ist 1ms. Die Resonanzstelle des Lautsprechers liegt also bei 500Hz. Wie funktioniert eigentlich so ein SWEEP über die Frequenzen? Ich habe das mit der PWM Funktion realisiert.
PWM generieren für das SWEEP
So ein SWEEP über ein ganzes Frequenzspektrum gelingt recht einfach mit dem Timer und einem Portpin der MCU. Um damit zu experimentieren ist unten mein PWM Beispiel in Forth angegeben. Ich habe dazu den TimerA und den Portpin P2.2 genommen, weil die bei meinen Experimenten frei waren, und die Kommunikation mit dem Terminal dabei ungestört weiter geht. Spiele einfach mit dem PWM herum. Es kann auch dabei am Lautsprecher nichts passieren. Der P2.2 ist als Ausgang da genau so robust wie P1.4.
So ein PWM (Puls Width Modulation) ist eine feine Sache. Man braucht dazu einen Zähler (timer), Register um Zählerstände zu vergleichen, und einen Portpin den man an und aus schalten kann. In unserer MCU ist das bereits eingebaut.
Der Timer TA1 kann im up/down modus betrieben werden. Dabei zählt der timer von NUll bis zu dem Wert T
im Register TA1CCR0 hoch, und ab da wieder runter. Unterwegs trifft der Zähler dabei den Vegleichswert V
im Register TA1CCR2. Dabei wird dann jedesmal ein Flag getoggelt. Macht man V
halb so groß wie T
bekommt man ein Tastverhältnis von 50%. Nun braucht man nur noch dieses Flag an den Portpin zu übertragen, schon hat man sein PWM Signal. Da der Timer unabhängig vom Programm im Hintergrund läuft und auch die Übertragung des Flags an den Port von der Hardware gemacht wird, braucht man sich nicht mehr darum zu kümmern. Sobald der Timer gestartet wurde läuft das automatisch endlos ab, bis man den Timer wieder anhält.
Das wurde im SWEEP benutzt. Da werden einfach nur der Timer und der Portpin konfiguriert, die Zählerwerte gesetzt, das PWM gestartet und dann gewartet, derweil PWM läuft und die Rechteckwelle am P2.2 macht. Dann wird T und V verkleinert und das ganze beginnt von vorn. So 'sweept' man durch die PWM Frequenzen. Dabei ist es schön das die beteiligten Register des Timers wie Variablen gelesen und geschrieben werden können.
Was wo eingestellt werden muss damit Timer und Portpin wie gewünscht arbeiten ist im MSP430x2xx Family User's Guide der MCU beschrieben. Was dort geschrieben steht ist zunächst sehr verwirrend, weil bei jedem Modul natürlich immer gleich alle seine Funktionen beschreiben werden. Man muss sich dann erstmal durch den ganzen Wust an Infos durchwühlen, um die zu finden, die man gerade baucht.
Wer sowas noch nicht so kennt, mag hier mal schauen, da hab ich das mal vorexerziert:
So kann man ein Blockschema benutzen...
Transistor anschließen
Stroboskop
Da wir nun schon bis zum PWM Signal an P2.5 gekommen sind, zeige ich hier ein Experiment aus dem man dann weitere schöne Experimente machen kann: Das Stroboskop. Dazu wurde eine helle LED Taschenlampe etwas umgebaut. Mit einem Transistor, einem Widerstand und etwas löten geht das schon. Das ist nichts anderes als das einfache LEDan LEDaus Grundprogramm. Aber so eine helle Taschenlampe wirkt schon etwas eindrucksvoller, und wir schalten damit einen größeren Strom als der Portpin noch hergeben kann.
Die Taschenlampe wird von 4x AAA Batterien betrieben. Sie wird geöffnet. Die LEDs auf dem Platinchen vorne in der Lampe sind alle parallel betrieben. Das macht es einfach dazwischen zu kommen. Nachmesse: Es fließen ca. 350mA wenn die Lampe leuchtet. Dann das Experiment aufbauen: Zwischen die Kathoden der LEDs und den Minus-Pol des Batterie Packs kommt der Transistor Tr. Seine Basis wird über einen Widerstand R an P2.5 angeschlossen. Nimmt man einen BD135 als Transistor sind bis 1,5A Laststrom möglich, bei einem Darlington TIP120 sind es 5A. Das reicht, da braucht man keine weitere Kühlung an den Transistoren.
Man sieht das die Lampe eher schwach leuchtet wenn man sie mit dem BD135 und R=10K an macht. Der H-Pegel an P2.5 bleibt dabei aber schön oben bei 3,4V. Nimmt man den Widerstand R weg leuchtet die Lampe voll, der Pegel an P2.5 sinkt aber ab auf nur 0,8V - wie erwartet, s.oben. Man kann also durchaus ganz ohne den Basis-Widerstand den Transistor betreiben, der BD135 schaltet voll durch wenn er vom Portpin direkt getrieben wird. Nimmt man den TIP120 kann R=10K belassen werden, die Darlingtonschaltung sorgt dafür das so ein kleiner Steuerstrom genügt.
Für das gebastelte Stroboskop habe ich mich für den TIP120 mit R an der Basis entschieden. Da muss ich mich dann um nichts weiter kümmern. Im sieht man das Stroboskop im Test. Das Forth dafür kann man sich aus dem PWM Beispiel machen.
Schrittmotor
Man besorge sich einen kleinen Schrittmotor, z.B. aus einem alten Drucker. Ich hatte einen Fuji Stepper Motor SM25 2005-A herum liegen, ähnlich dem im Bild. Der hatte 6 Anschlußdrähte - rot, blau, weiß, gelb, grün, grün. Die Achse kann man bei diesem kleinen Motörchen von Hand leicht drehen, sie springt dabei von einer Position zur nächsten - 20 Positionen für eine volle Umdrehung.
Mit dem Ohmmeter testet man nun erstmal die Verbindungen der Drähte. Dabei fand ich folgende Werte und das Schema:
rot | blau | weiß | gelb | grün1 | grün2 | Schema | |
rot | OL | 94Ω | OL | OL | 45Ω | A | |
blau | OL | 93Ω | 46Ω | OL | B | ||
weiß | OL | OL | 47Ω | C | |||
gelb | 45Ω | OL | D | ||||
grün1 | OL | ||||||
grün2 | OL |
(OL = keine Verbindung)
Es fällt auf das 4x fast die gleichen Werte, und 2x davon das doppelte zu messen war. Das sieht ganz nach zwei Spulen mit Mittelanzapfung aus.
Ein Test an 3V (2x Mignon Batterien) ergab keine Zuckungen des Motors, egal wie man kombinierte. Mit einer 9V Block Batterie hingegen tat sich dann schon was! Man verbinde grün2 fest mit dem Minuspol, und nehme einen Draht in die Hand, der vom Pluspol kommt (Krokoklemmen zB). Und tippe dann damit abwechselnd mal an rot und dann an weiß, dann zuckt der Motor deutlich. Mit etwas Geschick findet man heraus, das er dann mal einen Schritt vorwärts, und dann wieder einen Rückwärts macht. Desgleichen mit grün1 und den Anschlüssen blau/gelb. Es sieht also so aus als könne man durch kurzes einschalten einer Spule den Motor um einen Schritt weiter stellen. Nun müsste man ausprobieren welche Abfolge zu einer Drehung in eine Richtung führt. Auch das ist manuell machbar. Man schließt dazu die grünen zusammen an Masse (MinusPol der Batterie), und tippt dann einfach der Reihe nach von außen nach innen alle vier Anschlüsse mit dem Draht vom Pluspol kurz an - rot, blau, weiß, gelb. Das gibt vier Schritte in die gleich Richtung. Macht man das in der umgekehrten Reihenfolge dreht der Motor rückwärts. So einfach geht das.
Nun machen wir das mit der MCU. Ermutigt durch das Lautsprecherexperiment wird eine Steppermotorspule direkt zwischen zwei Portpins angeklemmt, mal sehen was passiert. Hm, nix - schade. Am Oscilloskop sieht man wieder das die Pegel an den Pins runter gezogen werden, aber der Motor tut keinen Schritt. Tat er an der 3V Batterie ja auch noch nicht. Dazu ist der Strom aus dem FET der MCU also wohl zu schwach. Mit den Erkenntnissen aus dem Experiment hier ging allerdings später auch was direkt an der MCU, siehe weiter unten.
Da wir offensichtlich etwas mehr Strom dafür benötigen als ein Port hergibt, muss wieder unser TIP120 ran. Damit lässt sich das schön schalten. Mit vier Stück davon und je einem Basiswiderstand ist schon alles aufgebaut was man braucht, die Freilaufdiode ist bei diesem Darlington-Transistor nämlich schon eingebaut. Damit ich sehen kann welcher Transistor gerade durchschaltet, wurde jedem eine LED spendiert. (Keine Sorge, das halten die aus an der 9V Blockbatterie, weil die Spule schon einen 45 Ohm Vorwiderstand darstellt, s.oben.) Das Ergebnis wurde in kurzen Videoclips festgehalten.
Und hier ist mein Forthprogramm für den Schrittmotor. Damit werden in experimenteller Weise die Antriebe des Steppers realisiert, die im englischsprachigen Wikipedia erklärt sind. (Im deutschen Wiki war es leider nicht so verständlich dargelegt.)
Es gibt vier grundlegende Antriebsformen.
- Wave drive
- Full step drive (two phases on)
- Half stepping
- Microstepping
Die ersten drei sind digitale Formen, und einfach zu mache mit Forth. Im full step drive werden ganze Schritte ausgeführt. Der Wave Drive macht das ebenso, hat aber nur immer eine Spule an, ist daher schwächer im Drehmoment. Beim half step drive ergeben sich halbe Schrittweiten ohne den elektrischen Aufbau ändern zu müssen; allerdings sind abwechselnd zwei und dann nur eine Spule an, was unterschiedliche Drehmomente der Schritte zur Folge hat, die Vollschritte sind dabei schwächer.
Nachdem das nun ging hab ich noch mal versucht den Schrittmotor 'ohne alles' an die MCU anzuschließen.2) An die grünen Drähte kam Vcc des LaunchPad, und die Ports wurden als 'sink' betrieben. Dazu muss man im Forthprogramm lediglich die Pinlogik umkehren. Also statt 0001 für _A_ nun 1110 usw. Und sieh da, nun ruckelte dar Stepper an. Der wave drive erwies sich dabei als untauglich, da gab es Zuckungen des Steppers, aber keine richtige Drehung. Im full stepp drive drehte das Motörchen dann aber munter. Und im half step drive auch, aber schwächlich in den Schritten bei denen nur eine Spule an war. Direkt an einem Pin der MCU geht also nur der full step drive ordentlich. Dabei sind ja immer 2 Spulen aktiviert, und das reicht dann auch bei dem recht schwachen Strom durch den FET des Portpins aus um den Stepper in Bewegung zu versetzen. Das erklärt nun auch, warum da mit der 3V Batterie manuell nichts zu machen war. Denn das kriegt man von Hand nicht so ohne weiteres hin immer die richtigen 2 Spulen gleichzeitig an zu machen. Um also eindeutige Effekte zeigen zu können, ist es schon ratsam Transistoren wie den TIP120 zu schalten. Für spezielle Anwendungen hingegen, wenn man schon weiß was man will und wie das geht, scheint es auch ok zu sein den Stepper direkt an einem Port der MCU zu betreiben. Man könnte ja auch je Spule 2 Pins als 'sink' schalten. Dann gibt es mehr Strom pro Spule.
Die Versuche zeigen auch, dass so ein Schrittmotor dazu da ist ganze Schritte zu vollführen. Und in den Vollschrittpositionen stehen zu bleiben. Die Halbschritte sind nur dazu da den Motor glatter drehen zu lassen, damit wird der wellige ruckelnde Verlauf gemildert. Halten sollte man in den Halbschrittpositionen aber nicht in echten Anwendungen. Halbe Positionen sind instabil, und wenn dort aktiv gehalten wird mit längeren Pulsen oder gar Dauerstrom, gehen die Spulen in die Ohmsche Betriebsart über, und werden heiß. In den vollen Schritten hingegen hält der Stepper passiv auch stromlos fest. Dazu sind sie gebaut.
Es gibt ausgefuchstere Steuerungen um Schrittmotoren anzusteuern, und Bausteine die das unterstützen z.B. Piccolo Motor Control. Das heraus zu finden überlasse ich aber eurem Spieltrieb. Hier ging es mir um ein grundlegendes Experiment. Um die Arbeitsweise des Motörchens zu erkennen.
Einfache Forth Programme für die Experimente
Diese kleinen Testprogramme sind in 4e4th - For Education: Forth - für das Lanchpad geschrieben worden.
Pegel an Portpin P1.4 und P1.5
DECIMAL \ Variable abfragen. : ? @ u. ; \ Port pins als Ausgaenge betreiben und auf H oder L setzen 112 P1 1+ 2CONSTANT P1OUTPUT 16 P1 2CONSTANT P14 32 P1 2CONSTANT P15 64 P1 2CONSTANT P16 48 P1 2CONSTANT P14&5 112 P1 2CONSTANT P14&5&6 : PHL p14 cset p15 cclr ; : PHH p14 cset p15 cset ; : PLL p14 cclr p15 cclr ; : PHLH p14 cset p15 cclr p16 cset ; \ Rechteckwelle mit DO LOOP erzeugen. variable ETWAS 636 CONSTANT T ( T ~ 1ms = 1kHz Ton) : 1KHZ T 2 / etwas ! ; : 500HZ T etwas ! ; : 50HZ T 10 * etwas ! ; : WARTEN ( adr -- ) @ 0 DO LOOP ; : UMSCHALTEN p14&5&6 ctoggle ; : TON phlh begin umschalten etwas warten key? until pll ; \ periodischen Puls an P1.4 erzeugen. variable LANGE : \LANGE 20000 lange ! ; \lange : PULS p14 cset etwas warten p14 cclr ; : PP phl begin puls lange warten key? until pll ; : INIT p1output cset 1KHZ \lange ; ( finis)
PWM an Portpin P2.2
\ PWM mk18082012 \ based on: \ PWM DB 2012-0704 1:30AM \ adapted to 2kHz DB 2012-0722 \ Thanks to Dirk for figuring out how PWM works at pin P2.2 \ some labels HEX 20 CONSTANT BIT5 30 CONSTANT MC_3 \ Timer A mode control: 3 - Up/Down C0 CONSTANT OUTMOD_6 \ toggle-set 192 CONSTANT TA1CCR0 196 CONSTANT TA1CCR2 186 CONSTANT TA1CCTL2 180 CONSTANT TA1CTL 6 CONSTANT TACLR 200 CONSTANT TASSEL_2 2A CONSTANT P2DIR 2E CONSTANT P2SEL DECIMAL \ 50% PWM duty cycle for a PWM period of 0.5ms 2000 1000 2CONSTANT 2KHZ \ some more periods 40000 20000 2CONSTANT 50HZ 4000 2000 2CONSTANT 1KHZ 200 100 2CONSTANT 10KHZ \ handle timer A1 : TA1HALT 0 TA1CTL ! ; \ timer anhalten : SETTA1 ( n1 n2 -- ) ta1halt TA1CCR2 ! \ set time of period TA1CCR0 ! \ set pulsewidth OUTMOD_6 TA1CCTL2 ! \ CCR2 reset/set TASSEL_2 MC_3 + TACLR + TA1CTL ! \ SMCLK, up mode, clear TAR ; \ init portpin P2.2 as PWM output : PWMOUT BIT5 P2DIR CSET \ P2.2 and P2.5 output BIT5 P2SEL CSET \ P2.2 and P2.5 options select ; \ now do the PWM : StartPWM ( n1 n2 -- ) pwmout setta1 ; : StopPWM ta1halt BIT5 P2DIR CCLR ; \ some prepared tones : PWM0 50hz startpwm ; : PWM1 1khz startpwm ; : PWM2 2khz startpwm ; : PWM3 10khz startpwm ; \ a sweep from low to high frequencies 20000 constant LANGE : hoeher TA1CCR0 @ 100 - dup 0= IF DROP pwm0 exit THEN dup 1 rshift TA1CCR2 ! TA1CCR0 ! ; : sweep PWM0 begin 50 ms hoeher key? until stoppwm ; variable DELTA : inidelta -100 delta ! ; : umkehren delta @ negate delta ! ; : setfreq TA1CCR0 @ delta @ + dup 0 50hz drop rot within IF dup 1 rshift TA1CCR2 ! TA1CCR0 ! ELSE drop umkehren THEN ; : sweep+ pwm0 inidelta begin 50 ms setfreq key? until stoppwm ; ( finis )
Links
- http://processors.wiki.ti.com/index.php/BoosterPacks Es gibt etliche Platinen die einfach auf das LauncPad aufgesteckt werden können. TI hat diese booster packs getauft.
- http://www.ti.com/ww/en/launchpad/home_head.html Alle Evaluation Boards im Überblick.
- http://www.designinganalogchips.com Für alle die mehr verstehen wollen von der Verbindung der digitalen Welt mit der Analogen und den Innereien davon, also den Sensoren von denen die MCUs gefüttert werden, und den Effektoren auf die sie dann wirken, nehme das Buch von Hans Camenzind, Designing Analog Chips, zur Hand. Du kannst es bei ihm kostenlos herunter laden.
MCU schrotten
Überspannung hilft dabei sehr. Bei meinen Experimenten mit Spulen und Transistoren (z.B. TIP120, s.oben) wurde ein 12V/7Ah Bleiakkumulator an den Transistor angeschlossen. Der kann 2,1A initial. Aus versehen wurde beim Zusammenstecken der Schaltung mit dem Pluspol vom Akku der Portpin P1.5 kurz berührt. Das genügte um den Chip funktionsunfähig zu machen. Danach ging das Forthprogramm nicht mehr, keine Reaktion mehr der MCU. Aber beim dritten Versuch das Programm neu zu flashen, also nach dreimaligem Löschen des flash, nahm die MCU das Programm doch wieder an, und lief brav los als sei nichts gewesen. Lediglich P1.5 ließ sich nicht mehr schalten, zeigte konstant 918mV Pegel. Die Programmer-Schaltung auf der Platine hatte offensichtlich nichts abbekommen, USB seriell und Jtag gingen nach wie vor.
Also: Aufpassen das die Schaltung stimmt bevor die Spannungsquelle angeschlossen wird - doppelt und dreifach checken!