Forum: Mikrocontroller und Digitale Elektronik MSP430 Launchpad ADC10


von Bernd N (Gast)


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:
1
void main (void)
2
{
3
    WDTCTL = WDTPW + WDTHOLD;                                   // Stop watchdog timer
4
    BCSCTL1 = CALBC1_1MHZ;
5
    DCOCTL = CALDCO_1MHZ;                                       // SMCLK = DCO = 1MHz
6
7
    P1SEL |= TXD;
8
    P1DIR |= 0x43;                                              // Set Led1, Led2, TXD to output direction
9
10
    ADC10CTL1 = INCH_5;
11
    ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON;
12
    ADC10AE0 |= 0x10;
13
14
    __bis_SR_register(GIE);                                     // interrupts enabled
15
16
    while (1) {
17
        AdcValOut (getAdcValue ());
18
        P1OUT ^= LED2;
19
        delay ();                                               // ~ 4x per Second
20
    }
21
}

Die Wandlerroutine so:
1
// adc loop
2
int16_t getAdcValue (void)
3
{
4
    uint16_t AvgCount = 0;
5
    int32_t AvgSum = 0;
6
7
    for (AvgCount = 0; AvgCount < 256; AvgCount ++) {
8
        ADC10CTL0 |= ENC + ADC10SC;                             // Sampling and conversion start
9
        while (ADC10CTL1 & ADC10BUSY);                          // ADC10BUSY?
10
        AvgSum += ADC10MEM;                                     // Average over 256 samples
11
    }
12
    return (((AvgSum >> 8) *15000) / 1024);
13
}

Hoffe ihr habt eine Idee hierzu.

von Stefan (Gast)


Lesenswert?

1
ADC10CTL0 |= ENC + ADC10SC;
2
while (ADC10CTL1 & ADC10BUSY);
ersetzen durch:
1
ADC10CTL0 &= ~ADC10IFG;
2
ADC10CTL0 |= ENC + ADC10SC;
3
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...

von Bernd N (Gast)


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.

von Stefan (Gast)


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!

von Mark (Gast)


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

von Bernd N (Gast)


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

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
Noch kein Account? Hier anmelden.