Hallo,
ich habe eine Board von Olimex, auf dem optional eine Quarz für den MSP
vorgesehen ist. Da ich die serielle Schnittstelle mit mehr als 9600baud
betreiben will, muss ich nun "aufrüsten". Auf dem Board sind zweit
Plätze für Kondensatoren und und ein freier Platz für den Quarz.
Wie gross müssen die Kondensatoren dimensioniert sein, bzw. was für
einen Quarz könnt ihr empfehlen?
Danke
Quarz kannst du jeden bis 8 MHz benutzen. Die Kondensatoren richten sich
nach der vom Quarz geforderten Lastkapazität. Da musst du im Datenblatt
des Quarzes nachschauen und dann ausrechnen. Und zwar so:
CL = 2 * Cq - Cpar
CL ist jeder der Lastkondensatoren, Cq ist die geforderte
Lastkapazität des Quarzes und Cpar die parasitäre Kapazität der Pins und
der Leitungen, kann man mit etwa 5pF annehmen.
Beispiel: Der Quarz will 33pF Last sehen, also müssen die beiden
Kondensatoren jeweils etwa 60pF groß sein.
> Da ich die serielle Schnittstelle mit mehr als 9600baud> betreiben will, muss ich nun "aufrüsten".
Das musst Du nicht unbedingt. Du kannst den DCO mit dem
32-kHz-Uhrenquarz in Software stabilisieren.
Beispiele dafür gibt es von TI als slac015k.zip, das darin enthaltene
fet140_uart03_19200.c zeigt, wie auf diese Art und Weise mit 19200 Baud
gearbeitet werden kann.
Natürlich ist es oft sinnvoller und auch einfacher, mit einem richtigen
Quarz zu arbeiten, dann ist der Takt deutlich stabiler als bei o.g.
Softwarelösung.
Spezielle "Baudratenquarze" sind jedoch nicht erforderlich, da der
Baudratengenerator der MSP430-UART sehr flexibel ist.
Wenn Du beim 'F169 und Deiner Olimex-Platine den zweiten Oszillator
verwenden möchtest, kann ich nur auf Supachris' Beitrag verweisen.
Bedenke, daß Du in der Initialisierungsroutine auf das Einschwingen des
Quarzoszillators warten solltest; in o.g. Quellcodesammlung ist das
exemplarisch enthalten.
Ich hab noch eine Frage zu dem Olimex MSP Board. Sehe ich das richtig,
dass die +VeRef direkt mit der Versorgungsspannung gespeist wird?
Erklärt das die Ungenauigkeit des ADCs?
> Sehe ich das richtig, dass die +VeRef direkt mit> der Versorgungsspannung gespeist wird?
Ja, solange Du R30 nicht entfernst, ist das so.
> Erklärt das die Ungenauigkeit des ADCs?
Höchstens, wenn Du VeRef auch verwendest. Der ADC12 im '169 aber kann
auch mit einer internen Referenzspannungsquelle von 1.5V oder 2.5V
betrieben werden.
Hallo,
Siehe hier. Ein Quarz 3,57... MHz für 19200 Bit/s.
https://community.ti.com/forums/t/346.aspx
We actually have a code example that implements a software UART using
the Timer_A. Please see the follwing zip file from www.MSP430.com for
several different examples: http://www.ti.com/lit/zip/slac011 (namely,
see msp430x11x1_ta_uart19200_01.c)
Gruss Klaus.
Software-UART braucht man doch am F169 nicht, der hat doch 2(!) USARTs
in Hardware, die jeweils einen Baudratengenerator mit Modulator haben,
um auch gebrochene Teilerfaktoren zu realisieren. Für sehr hohe
Geschwindigkeiten ist es allerdings vielleicht besser, einen
Baudratenquarz zu benutzen, ich fahre 921.600 baud mit einem 7,3728MHz
Quarz. Allerdings muss man dann Vcc schon leicht mehr als 3,3V haben.
Bernd K. wrote:
> Ich habe es auch mit den beiden internen Refenrenzen probiert, der ADC> ist einfach sehr ungenau:> liegt das am Design des Boards?
Nein, die internen Referenzen sind recht ungenau (4%)und driften
außerdem noch (100ppm/°C). Das Rauschen kommt allerdings vom ADC selbst,
2 Bits unten wackeln eigentlich immer, das SNR ist sicherlich nicht
besonders hoch, sonst stünde es im Datenblatt. Aber der Fakt, dass TI
diese wichtige Angabe einfach weggelassen hat, lässt auf ein recht
niedriges SNR schließen.
Allerdings ist das Offset doch recht hoch bei dir, das könnte wirklich
durch Layout-Probleme kommen.
> Das Rauschen kommt allerdings vom ADC selbst,> 2 Bits unten wackeln eigentlich immer,
Sicher? Das könnte auch am Board-Layout liegen. Die üblichen sechs
Abblockkondensatoren sind da und nah genug am Controller plaziert?
Möchte man es präziser haben und hat genug Zeit, kann mit Oversampling
(von TI in slaa323 beschrieben) erheblich mehr Auflösung erzielt werden.
Mit 256-fach-Oversampling sind 16 Bit möglich, und die "stehen"
erstaunlich ruhig, selbst auf dem nicht sonderlich tollen Layout des
'F449-Evaluation-Boards MSP430-449STK2 von Olimex.
"Allerdings ist das Offset doch recht hoch bei dir, das könnte wirklich
durch Layout-Probleme kommen."
es liegt eine Gleichspannung an, Eingang liegt nicht auf Masse.
Was würdet ihr mir raten, erstmal mit einer externen Vref anfangen?
Öhm, und wie hoch ist die Gleichspannung, wie hoch ist denn das
Rauschen? Was erwartest du denn von einem 12-Bit ADC, der auf der
gleichen Chipfläche mit einem µC sitzt, und dann noch mit interner
Referenz und das ganze auf einem 2-Lagen Demo-Board?
die Gleichspannung lag bei 0.14V. Ich hab eigentlich angenommen, dass
der ADC des MSP wesentlich genauer ist. Um richtig genau zu werden muss
man wohl selbst ein Board entwickeln, wollte mir den Aufwand nur sparen.
Wie sind eure Erfahrungen mit der Genauigkeit des MSP?
@Martin
es ist ein Labview Programm, via USart werden die Daten zum PC
übertragen (hex-dezimal konvertierung findet auf MSP statt).. mit
Labview wird das ganze dann nur dargestellt
Die Frage ist, was Du willst. Brauchst Du absolute Präzision? Verfügst
Du über ausreichend genaue Messgeräte? Ein übliches 3 1/2-stelliges DMM
ist nicht ansatzweise ausreichend, um einen 12-Bit-ADC zu beurteilen.
Ich kann ansonsten nur auf meine bereits erwähnten Erfahrungen
verweisen: Beitrag "Re: Quarz fuer MSP430"
Normalerweise ist ein externer ADC wirklich nicht nötig.
Nimm vom MSP die internen Referenzspannungen und stabilisiere sie noch
mit einem externen C. Dann noch ein wenig oversampling wie bereits
geschrieben wurde (z.B. mit drei Zeilen Code ein IIR Filter machen) und
schon hast Du einfach und kostengünstig schöne Messwerte.
Schau hier:
http://focus.ti.com/lit/ds/symlink/msp430f169.pdf
und hier:
http://focus.ti.com/lit/ug/slau049f/slau049f.pdf Seite 17-3
Du kannst die interne Vref+ auf Pin 7 herausführen und dann dort noch
zusätzlich stabilisieren. Gibt sicher irgendwo eine Application Note
dazu, wie man das am besten macht.
Ein IIR Filter kannst Du z.B. nach diesem Prinzip resourcenschonend
realisieren:
AlterTeil = GefilterterMesswert >> Filterwert;
NeuerTeil = ADCWert >> Filterwert;
GefilterterMesswert = GefilterterMesswert - AlterTeil + NeuerTeil;
Vielleicht vorher den ADCWert noch hochskalieren, da sonst beim Schieben
Information verloren geht. Dieses Beispiel kann je nach Parameter noch
optimiert werden, ist halt eben nur ein Beispiel ;-)
Ich benutze übrigens einen LTC1864 am MSP430, geht einwandfrei, das CS
lasse ich mir vom Timer A in Hardware erzeugen, passend dazu den
Interrupt um die Daten per SPI abzuholen.
Vref+ ist auf dem Proto-Board von Olimex bereits mit 2 Kondesatoren
stabilisiert. Die Kondesatoren sind im Eagle-Schematic nicht verzeichnet
gewesen.
Hast du ein Code-Beispiel fuer den IIR-Filter? Wirkt der wie ein
gleitender Mittelwert?
Ja ein IIR ist wie ein gleitender Mittelwert. Codebeispiel steht ja
bereits oben. Mehr ist es nicht, es ist sogar bereits ausführlicher als
nötig. Mann könnte es auch in einer Zeile Code machen...
Wenn Du einen 12bit-Wandler hast, empfehle ich folgenden Code:
gefiltert = (summiert += adc - gefiltert) >> 4;
Dieser Code hat den Vorteil, dass er
1. sehr schnell ist
2. nach endlicher Zeit der Wert "gefiltert" auch den Wert "adc" annimmt.
Beispiel: bei einem Eingang von
1000 wird summiert 16000 und der stabile Zustand ist:
12bit 16bit 12bit 12bit 4bit
gefiltert = (summiert += adc - gefiltert) >> 4;
1000 = (16000 += 1000 - 1000 ) >> 4;
der maximale Wert:
4095 = (65520 += 4095 - 4095 ) >> 4;
0fff = (fff0 += 0fff - 0fff ) >> 4;
Wenn Du stärker filtern willst, musst Du für "summiert" mehr Bits (24
oder 32) vorsehen:
12bit 18bit 12bit 12bit 6bit
gefiltert = (summiert += adc - gefiltert) >> 6;
oder den ADC-Wert kleinerrechnen (skalieren):
10bit 16bit 10bit 10bit 6bit
gefiltert = (summiert += (adc >> 2) - gefiltert) >> 6;
gefiltert = (summiert += adc / 4 - gefiltert) / 64;
Das Ergebnis ist hier aber nur ein Viertel des Eingangswertes.
Aufpassen:
1. der >>-Operator hat eine andere Rangfolge als / , muss also
geklammert werden.
2. bei signed-Variablen haben >> und / verschiedene Ergebnisse.
Erklärung der Funktionsweise:
erste Iteration:
gefiltert = (summiert += adc - gefiltert ) >> 4;
00ff = ( 0000 += 0fff - 0000 ) >> 4;
2. Iteration:
01f0 = ( 0fff += 0fff - 00ff ) >> 4;
3. Iteration:
= ( 1f00 += 0fff - 01f0 ) >> 4;
d.h. es wird solange auf "summiert" aufsummiert, bis summiert/16 so groß
wie adc wird (adc - (summiert >> 4) ist dann 0).
Auseinandergedröselt lautert der Code ja:
summiert = summiert + adc - gefiltert;
gefiltert = summiert >> 4;
n.b.: mein alter Code:
summiert += adc - (gefiltert = summiert >> 4);
braucht eine Iteration länger zum Erreichen des Endwertes, da das
gefiltert aus dem "alten summiert" berechnet wird.
um nochmal das Thema vom Anfang aufzugreifen. Bernd schreibt, dass dort
Plätze für den Quarz und den Kondensator vorgesehen sind, das sind Q3,
C32 und C33, richtig? auf den Cs sitzen bei mir aber schon
Kondensatoren, allerdings steht im Datenblatt nicht, was drin ist (Siehe
Link von Bernd im ersten Post). Muss ich die dann erst rauslöten? Wozu
sind die überhaupt dort, wenn sie vom Quarz abhängig dimensioniert
werden müssen?
Der Kondensatorenwert ist total unkritisch. Da braucht man nicht eine
Sekunde drüber nachdenken wenn man nicht gerade eine genaue Uhr mit dem
Controller realisieren will.
Naja, solche pauschalen Aussagen kann ich nicht unterstützen. Für
normale Anwendungen mit Standard-Quarzen, wie es sie bei Reichelt und
Conrad gibt, stimmt das, da kann man irgendwas zwischen 15 und 33 pF
rein löten. Aber wenn es auf Genauigkeit ankommt, oder ein etwas
hochwertiger Quarz, meinetwegen von Jauch verwendet wird, dann gibts da
schnell Probleme. Wir haben z.B. solche kleinen SMD Quarze von Jauch
nicht mit 22pF zum Laufen bekommen. Auch kann´s passieren, dass die
Standard-Quarze immer mal nicht richtig schwingen oder aussetzen, wenn
der Wert arg daneben liegt. Da sucht man sich einen Wolf dann.
im Prinzip kann ich auf dem Board ja keine 8MHz Quarze einsetzen, da die
Versorgungsspannung nur 3.3V ist. Richtig?
Wie siehts mit 4MHz Quarzen aus?
Grüße
Jens
Jens B. wrote:
> im Prinzip kann ich auf dem Board ja keine 8MHz Quarze einsetzen, da die> Versorgungsspannung nur 3.3V ist. Richtig?
Doch kann man. Nur läuft der MSP430 dann evtl. nicht richtig, wenn du
die 8MHz ohne Vorteiler für den MCLK benutzt. Wenn du die nur für den
SMCLK nimmst oder den Vorteiler benutzt, gehts problemlos.
> Wie siehts mit 4MHz Quarzen aus?
Was sollte dagegen sprechen? Mit 3,3V sind 7,3Mhz etwa laut dem Diagramm
im Datenblatt möglich. 7,3728MHz Baudratenquarz klappt damit bei mir
zumindest bisher auch.
Sollte klappen. Zumindest steht im Datenblatt explizit drin, dass der
maximale MCLK abhängig von der Spannung ist. Auszug aus dem Datenblatt
des F1611.