mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430 Launchpad ADC10


Autor: Bernd N (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich beschäftige mich derzeit mit dem Launchpad, respektive mit dem 
MSP430g2231 ADC10.

Ich habe das Board seit ein paar Tagen und habe ein kleines Testprogram 
für den ADC10 geschrieben. Ich verwende die interne 1,5V Referenz und 
messe mit dem ADC 256 samples und gebe den Meßwert, über USB, an einem 
Terminal aus.

Meine Frage bezieht sich auf den ADC... vorweg, ich habe keinerlei 
Erfahrung mit dem MSP ADC10 und daher weiß ich nicht ob die 
Einstellungen (ADC Clock) etc. richtig vorgenommen ist. Das Program 
funktioniert soweit aber die letzten Stellen sind recht unruhig und das 
obwohl ich schon reichlich Mittelwertbildung betreibe.

Die Initialisierung sieht so aus:

void main (void)
{
    WDTCTL = WDTPW + WDTHOLD;                                   // Stop watchdog timer
    BCSCTL1 = CALBC1_1MHZ;
    DCOCTL = CALDCO_1MHZ;                                       // SMCLK = DCO = 1MHz

    P1SEL |= TXD;
    P1DIR |= 0x43;                                              // Set Led1, Led2, TXD to output direction

    ADC10CTL1 = INCH_5;
    ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON;
    ADC10AE0 |= 0x10;

    __bis_SR_register(GIE);                                     // interrupts enabled

    while (1) {
        AdcValOut (getAdcValue ());
        P1OUT ^= LED2;
        delay ();                                               // ~ 4x per Second
    }
}


Die Wandlerroutine so:

// adc loop
int16_t getAdcValue (void)
{
    uint16_t AvgCount = 0;
    int32_t AvgSum = 0;

    for (AvgCount = 0; AvgCount < 256; AvgCount ++) {
        ADC10CTL0 |= ENC + ADC10SC;                             // Sampling and conversion start
        while (ADC10CTL1 & ADC10BUSY);                          // ADC10BUSY?
        AvgSum += ADC10MEM;                                     // Average over 256 samples
    }
    return (((AvgSum >> 8) *15000) / 1024);
}


Hoffe ihr habt eine Idee hierzu.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ADC10CTL0 |= ENC + ADC10SC;
while (ADC10CTL1 & ADC10BUSY);
ersetzen durch:
ADC10CTL0 &= ~ADC10IFG;
ADC10CTL0 |= ENC + ADC10SC;
while (!(ADC10CTL0 & ADC10IFG));
BUSY-Flag zeigt nur an, ob gerade eine Wandlung läuft, ADC10MEM ist da 
noch nicht mit dem Wandlungsergebnis geladen.

Ausserdem kann natürlich auch dein zu messendes Signal rauschen oder Du 
hast die Spannungsversorgung nicht ausreichend mit C's entkoppelt...

Autor: Bernd N (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank, werde es gleich mal ausprobieren... würde mich sehr wundern 
wenn dem so ist.

...For correct results, poll the ADC10BUSY bit...

sagt das Datenblatt :-(

Ich formuliere meine Frage mal etwas weitergehend. Gibt es einen 
vernünftigen Beispielcode den man als Referenz verwenden kann ? Das 
Datenblatt ist in vielerlei Hinsicht ziemlich wischi waschi. Zum SHT 
wird nur gesagt das es eine Impedanzabhängigkeit zur Quelle gibt. Es 
wird eine Filterwirkung beschrieben wenn man die Sample & Hold Zeit 
verändert aber wie die Zusammenhänge genau sind, da schweigt das 
Datenblatt. Ebenso zm ADC Clock... hier gibt es einen Range aber keine 
Empfehlung.

Hat jemand einen ADC Code dessen Einstellungen man als optimal 
bezeichnen könnte ?

Meßquelle ist ein Impedanzwandler... also niederohmig genug.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd N schrieb:
> Vielen Dank, werde es gleich mal ausprobieren... würde mich sehr wundern
> wenn dem so ist.
>
> ...For correct results, poll the ADC10BUSY bit...
>
> sagt das Datenblatt :-(
Völlig aus dem Zusammenhang gerissen!
Hat mit der Messung nix zu tun. Hierbei geht's um das Stoppen einer 
Wandlung durch Reset (ENC):

Stopping ADC10 activity depends on the mode of operation. The
recommended ways to stop an active conversion or conversion sequence 
are:
Resetting ENC in single-channel single-conversion mode stops a
conversion immediately and the results are unpredictable. For correct
results, poll the ADC10BUSY bit until reset before clearing ENC.

Schau Dir doch mal das Diagramm Figure 20-5 an.
Wandlung beendet und Ergebnis in ADC10MEM wird mit Setzen von ADC10IFG 
angezeigt!

> Das
> Datenblatt ist in vielerlei Hinsicht ziemlich wischi waschi.
Datenblatt?
Du meinst den User-Guide!

> Zum SHT
> wird nur gesagt das es eine Impedanzabhängigkeit zur Quelle gibt. Es
> wird eine Filterwirkung beschrieben wenn man die Sample & Hold Zeit
> verändert aber wie die Zusammenhänge genau sind, da schweigt das
> Datenblatt.
Nö!
Die Impedanz deiner Quelle bildet mit der Eingangsimpedanz des ADC einen 
Tiefpass. Die Sampling-Zeit muss nun gemäß den Angaben mindestens so 
groß gewählt werden, damit das Signal auch "einschwingen" kann, bevor 
gesampelt wird!

> Ebenso zm ADC Clock... hier gibt es einen Range aber keine
> Empfehlung.
Es gibt keine optimalen Einstellungen!
Die hängen von Deinen Präferenzen ab.
Der ADC funktioniert eben von fMin bis fMax problemlos.
Wie schnell er tatsächlich sein muss, hängt von Deinen Anforderungen ab!
Z.B. eben die oben angesprochene Sampling-Zeit. Ist der ADC-Clock zu 
hoch, kannst Du möglicherweise eine notwendige Sampling-Zeit nicht mehr 
einhalten... sie wäre z.B. zu kurz!

Autor: Mark (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Bernd,

hast Du Dir mal Dein Eingangssignal mit einem Scope angeschaut?
Wie groß ist Dein Signal genau und wie stark schwankt es?


Habe letztens eine Unterspannungsüberwachung für einen Solar-Akku 
gemacht,
mit Mittelung und Hysterese mit einem ADC10, das ging sehr gut, den Code 
hab ich aber grad nicht hier, könnte ich heute Abend mal raussuchen.

Ich hab eine externe Referenz genommen (anstelle eines LDO), die aus dem 
12V Akku die Spannung für den MSP430 generiert. Im MSP nehm ich dann Vcc 
als Referenz für den ADC. Die 12V werden per Spannungsteiler einfach 
unterhalb Vcc geteilt und dann gemessen - nur so als Hintergrund-Info.
Das Signal aus einem Akku ist natürlich ziemlich 'glatt' ;-)

Gruß
Mark

Autor: Bernd N (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

habe Stefans Hinweise nun in Verwendung, Danke Stefan für die Erklärung. 
Ist dann aber schon beschämend das in den TI Sample Codes es falsch 
vorgemacht wird :-)

Ich habe jetzt 512 Werte gemittelt und auf 12 BIT skaliert, schwankt +- 
1 Digit (1 mV) das ist doch recht ordentlich.

Danke nochmal,

Bernd

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.