**Dies ist eine alte Version des Dokuments!**
Inhaltsverzeichnis
!!! 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 Deliano-Steckbrett-USA}}|[http://de.wikipedia.org/wiki/Steckbrett|Steckbrett]) kann nicht schaden, ebenso ein Bündel Prüfklipp-Kabel, die einfach an das LaunchPad angeklemmt werden können.
Bei mir sah das dabei so aus: Bild in höherer Auflösung.1)
Die verwendete MCU erwies sich als erstaunlich robust. Wie man so eine MCU dann doch kaputt kriegt, ist ganz unten beschrieben.
Wie man an das 4e4th kommt, steht auf der 4e4th-Start-Seite.
Auf dieser Seite werden OUTPUT-Experimente gezeigt. Die grundlegenden INPUT-Experimente sind auf einer Extra-Seite zusammengefasst.
Wem das LaunchPad zu unhandlich ist, der kann auch die MCU direkt stecken.
Port-Pin über Widerstand an Masse legen
Einzelnen Pin schalten
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 ermitteln. 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 Oszilloskop2) 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, dass 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
Mehrere Pins schalten
Als praktisches Beispiel dient der Servotester für analoge Servos im Modellbau. Es wird ein ganzer Port verwendet, um 8 Servos gleichzeitig zu bedienen.
Strom durch P1.4 nach Masse
Verschiedene ohmsche Lasten ausprobieren
Hier wird der Aufbau aus dem vorherigen Experiment noch einmal benutzt.
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 Portpin, steigt dessen Innenwiderstand im FET an, und der Stromfluss 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. Dass heißt aber nicht, das ein Portpin nicht doch mehr Strom liefern könnte, und auch verträgt, wie man sieht!
Kurzschluss
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.
Und was passiert, wenn die Versorgungsspannung (Vcc) des LaunchPad kurzgeschlossen wird? Auch nichts Schlimmes.
TI hat da vorgesorgt. Das LaunchPad wird vom USB-Kabel mit 5V gespeist. Ein LDO (250-mA Low-Dropout Voltage Regulator) macht daraus 3.6V für die MCU und alle anderen Teile auf der Leiterplatte. Bei einem Kurzschluss schaltet der Regler ab. Damit wird verhindert, dass ein Kurzschluss über das USB-Kabel in den Laptop oder PC duchschlägt. Das LaunchPad ist also recht experimentiersicher aufgebaut.
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 Portpin, 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 Bildern 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, dass 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 hochgezogen. 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 ein 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ädt 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 initialer Strom nicht so lange, der Pin wird mehr geschont. Doch es war ja gerade meine Absicht, zu zeigen, dass 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, dass der initiale Ladestrom:
Imax = 3.4 V / 37.5 Ohm = 90 mA
vom Portpin offensichtlich geliefert wird. Dabei muss man sagen, dass 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, dass 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 Portpin 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 3) 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öht 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
PWM-Signal am LR-Glied
Das gleiche PWM-Progrämmchen kann auch dazu benutzt werden, die Zu- und Abschaltvorgänge bei Gleichspannung an einer Spule sichtbar zu machen.
Die Spule L1 leistet Widerstand beim Einschalten des Stromes (H-Pegel). Der Strom kommt erst allmählich in Gang. Über dem Widerstand R1 baut sich daher die Spannung allmählich auf. Beim Abschalten (L-Pegel) verhält es sich anders herum - die Spule zieht noch Strom nach, und die Spannung an R1 sinkt langsam ab.
Meine kleine Spule aus der Grabbelkiste hatte keine all zu hohe Induktivität. Der Effekt wird daher erst bei recht hoher Frequenz richtig deutlich sichtbar. Ein PWM mit einer Periode von 25µs und 50% Tastverhältnis reichte aber aus, den Effekt zu zeigen. Der ohmsche Widerstand des Drahtes dieser Spule war 16Ω.
In einem weiteren Versuch wird eine Diode D1 über L1 gelegt, mit der Sperrrichtung zum Portpin hin - Freilaufdiode. Das Bild zeigt deutlich den Effekt. Beim Abschalten kann nur noch ein geringer Strom von die Spule aus Vss gezogen werden, das Meiste kreist nun in der Spule selbst. Das schützt die angeschlossene Elektronik vor Überspannungen. Wie man sieht, hat es die MCU mit dieser kleinen Spule auch ohne Freilaufdiode überlebt, vermutlich wegen der eingebauten Schutzdioden, und weil R1 den Strom begrenzt.
Der Effekt wird in Schaltnetzteilen verwendet (https://en.wikipedia.org/wiki/Buck_converter) und auch, um Leistungs-LEDs als Glühbirnenersatz zu treiben.
(Hier war ich zu faul den richtigen Winkel zu finden und das Raumlicht auszublenden, bzw mich dunkler zu kleiden. Dafür sieht man das es möglich ist sowas freihändig zu knipsen )
Mache den Versuch mit verschiedenen Spulen. Es war gar nicht so einfach, eine Spule zu finden, deren Induktivität hoch genug war, den Effekt mit diesen einfachen Mitteln auch deutlich zu zeigen. Trafospulen und Ankerwicklungen von kleinen Elektromotoren hatten zu geringe Werte.
Vertauscht man R1 und L1, kriegt man das klassische Bild. Nun sieht man an den Flanken des Signals die Spannungssprünge vor der Spule. Beim Einschalten geht die Spannung dort hoch, und beim Abschalten zieht die Spule die Spannung runter. Betrachtet man zwei verschiedene Spulen gleichzeitig, wird schön erkennbar, dass die Abklingzeiten der beiden Spulen verschieden lang sind. Die linke Spule war eine Luftspule, die rechte hatte einen Eisenkern. Die Anzahl der Wicklungen war unbekannt. Der ohmsche Widerstand des Drahtes dieser Spulen war links 860Ω, rechts 71Ω.
(Hier verwende ich schon ein digitales Oszilloskop )
Um mal zu zeigen was passiert, wenn Spulen ganz ohne Schutz- und Freilaufdioden betrieben werden, gibt es einen eigenen Beitrag: Spule ausschalten - Spannungsspitzen?
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 dasselbe 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.
Atmende LED
Mit der grünen LED an Bord des LaunchPad und PWM lässt sich eine kleine Spielerei machen - eine „atmende“ LED. Dazu wird das PWM des Timers A0 auf den Portpin P1.6 geschaltet. Das Listing weiter unten, PWM an Portpin P1.6, zeigt, wie es geht.
Hier noch eine kurze Erklärung zum PWM-Modul der hier eingesetzten MCU. Das geht zwar über das, was in den grundlegenden Experimenten stehen sollte, etwas hinaus, aber da man immer wieder darüber stolpert, mal kurz das Wesentliche.
Das PWM macht ein Timer. Dafür hat der zwei Register. Das Wiederhol- und das Puls-Register. Einmal gestartet, zählt der Timer ohne Zutun der CPU immer wieder von null bis zum Wert im Wiederholregister hoch. Der zugeordnete Portpin ist dabei gesetzt. Und wenn der Zählerstand gleich dem Wert im Pulsregister geworden ist, wird der Portpin umgeschaltet. Ab nun ist er zurückgesetzt. Und wenn der Zähler beim Wert des Wiederhol-Registers angekommen ist, geht das von vorne los. Das ist alles.
Die Entscheidung, an welchem Portpin denn nun das PWM-Signal erscheinen soll, wird am Portpin selbst getroffen, nicht im Zähler. Der Zähler weiß davon gar nichts. Jeder Portpin hat dafür eine zweite Ausgabe-Funktion. Nicht jeder Pin kann PWM ausgeben, im Datenblatt der MCU findet man die Pinbelegungen. Wenn am Pin z.B. TA0.1 als zweite Funktion steht, heißt das, man kann dort eine Ausgabe von Timer A0 hinschalten. Und zwar diejenige, die der Timer zusammen mit dem Pulsregister Nr.1 erzeugt. Im Grunde also ganz einfach.
Kompliziert wird es nur dadurch, dass es verschiedene OUTMODES des Timers gibt. PWM ist nur eine davon. Und die heißt nicht mal so, sondern reset/set, oder umgekehrt, oder toggel, oder so. Und es kann nicht nur auf das Pulsregister verglichen werden, sondern auch auf andere Eingabewerte. Und das Pulsregister heißt da TA0CCR1, und das Wiederholregister TA0CCR0, und dann haben die noch jeweils ein Controllregister für die Einstellungen, die man da machen kann, und es gibt zwei Timer der Sorte A mit jeweils zwei Pulsregistern, also TA0CCRx … Und das machts dann doch unübersichtlich am Anfang. Aber nur Mut, mit ein bisschen Übung findet man sich dann doch da durch.
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 Lautsprechers 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 ziemlich 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 angeschlossen. "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, dass 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, dass 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 weitergeht. 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 ausschalten 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 Vergleichswert 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, dass 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 beschrieben werden. Man muss sich dann erstmal durch den ganzen Wust an Infos durchwühlen, um die zu finden, die man gerade braucht.
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. Nachmessen: 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, dass die Lampe eher schwach leuchtet, wenn man sie mit dem BD135 und R=10K anschaltet. 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, dass so ein kleiner Steuerstrom schon 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 herumliegen, ähnlich dem im Bild. Der hatte 6 Anschlussdrä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, dass 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-Blockbatterie 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 z.B.). Und tippe dann damit abwechselnd mal an rot und dann an weiß, dann zuckt der Motor deutlich. Mit etwas Geschick findet man heraus, dass 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 sich 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, dass die Pegel an den Pins runtergezogen 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 Vorwiderstand von 45 Ohm 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 machen 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.4) 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 der 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 herauszufinden ü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 )
PWM an Portpin P1.6
\ PWM an Pin P1.6 des MSP430G2553 im Texas Instruments LaunchPad. DECIMAL 500 constant 16KHZ \ Wiederholrate bei 8MHZ DCO 16KHZ 3 / constant DUTY \ 33% Pulsweite HEX \ 76543210 : P16IO 40 0022 cset \ P1DIR P1.6 OUT 40 0026 cclr \ P1SEL P1.6 GPIO ; : P16SEL 40 0022 cset \ P1DIR P1.6 OUT 40 0026 cset \ P1SEL P1.6 select second function ; BIN \ FEDCBA9876543210 0000000011100000 constant OUTMOD \ reset/set 0000001000010000 constant TA0MOD \ SMCLK, up mode, TAR clear HEX : PWM- 0 160 ! ; \ TA0CTL stop timer : PWM+ \ -- \ init and start PWM at P1.6 16khz 172 ! \ TA0CCR0 set period outmod 164 ! \ TA0CCTL1 set output mode duty 174 ! \ TA0CCR1 set pulsewidth ta0mod 160 ! \ TA0CTL set timer mode and run ; : TSET \ w p -- \ set width and period while pwm keeps running. 172 ! \ TA0CCR0 set period register 174 ! \ TA0CCR1 set compare register (duty cycle) ; : TTAR \ test timerA register - timer is running? 10 0 DO 170 @ . LOOP ; DECIMAL \ uncomment next line to start pwm \ p16sel pwm+ \ use TSET to set period and duty cycle \ -------------------------------------- \ Spielerei: Die atmende LED decimal variable warten : atmen red cclr \ turn red LED off. p16sel pwm+ \ turn pwm on. begin \ start breathing ... 16 0 do warten @ ms i 31 * 16khz tset loop 0 16 do warten @ ms i 31 * 16khz tset -1 +loop key? until key drop \ until key is pressed. pwm- p16io \ turn pwm off. red cset green cset ; \ turn both LED on. \ uncomment next line to start demo \ 150 warten ! atmen ( 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, dass die Schaltung stimmt bevor die Spannungsquelle angeschlossen wird - doppelt und dreifach checken!