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.
Vielen Dank, wenn ich euch richtig verstanden habe, ist das ok: http://de.farnell.com/9712380/passive-bauelemente/product.us0?sku=rakon-lf-a140a (Farnell Best.Nr.: 9712380 ) und dazu 2x56pF ..
Kannst auch einen Keramikresonator nehmen. Bei diesem sind die Kondensatoren beispielsweise bereits eingebaut: http://de.farnell.com/1170435/passive-bauelemente/product.us0?sku=murata-cstcc8m00g53-r0 Sind nicht so genau wie ein Quarz, aber wenn die +-0.5% ausreichen, ist das eine sehr kostengünstige und einfache Variante.
Benutze ich auch für meine MSPs. Bestelle allerdings bei Reichelt, da kosten sie nur die Hälfte :)
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.
Ich habe es auch mit den beiden internen Refenrenzen probiert, der ADC ist einfach sehr ungenau:
1 | void init_ADC(void) |
2 | {
|
3 | ADC12CTL0 = SHT0_15 + REFON +ADC12ON + MSC; |
4 | ADC12CTL1 = CSTARTADD_0 + SHS_0 + SHP + ADC12DIV_0 + ADC12SSEL_0 + CONSEQ_1; |
5 | ADC12MCTL0 = SREF_0 + INCH_2; //ADC12MEM0, A2 |
6 | ADC12MCTL1 = SREF_0 + INCH_3; //ADC12MEM1, A3 |
7 | ADC12MCTL2 = SREF_0 + INCH_4 + EOS; //ADC12MEM2, A4 |
8 | //ADC12MCTL3 = SREF_0 + INCH_5; //ADC12MEM3, A5
|
9 | ADC12CTL0 |= ENC; //ADC startfähig machen |
10 | |
11 | }
|
liegt das am Design des Boards?
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.
Was zeigt Dein obiger Plot...? Das Diagramm sieht nach LabVIEW aus. Wie hast du die Daten aufgenommen?
"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
hat es sinn mit dem internen ADC weiter zu experimentieren, oder sollte ich gleich auf einen externen umsteigen? Wie sind eure Erfahrungen?
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"
Ich habe mich entschieden mit einem externen ADC zu experimentieren: Mit welchem externen AD-Wandler habt ihr gute Erfahrungen gemacht, bzw. was halt ihr vom MAX1144? http://www.maxim-ic.com/quick_view2.cfm/qv_pk/3383
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.
@Johnny das hoert sich interessant an. Wie kann ich die interne Ref. mit einem C stabilisieren? (http://www.mikrocontroller.net/attachment/39962/msp430-pxxx-sch.gif) Hast du noch ein paar Infos zum IIR-Filter?
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 ;-)
Hab übrigens gerade zufällig folgenden Thread gefunden, wo es um die Stabilisierung von Vref+ geht: Beitrag "MSP430 Erfahrungsaustausch zu ADC12 gesucht"
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.
nur wärs halt schön, überhaupt zu wissen, was die von olimex denn da nun verlötet haben, denn diese information fehlt auf dem datenblatt
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.
Also kann ich für die Timer problemlos die 8MHz nehmen, aber für das Programm selbst halt etwas weniger...
Sollte klappen. Zumindest steht im Datenblatt explizit drin, dass der maximale MCLK abhängig von der Spannung ist. Auszug aus dem Datenblatt des F1611.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.