Forum: Mikrocontroller und Digitale Elektronik MSP430 ADC10 Pin verfälscht Spannung


von Steffe (Gast)


Lesenswert?

Wie in Beitrag "Messprobleme durch Masseverbindung von Modulen mit mehreren Netzteilen?" berichtet, versuche 
ich einen Strom via DRV8801 mit MSP430G2231 ADC10 zu messen.
Der Strom-Signal-Ausgang des DRV8801 hat einen Tiefpass (10k / 33nF) und 
geht bei mir auf P1.1 des Launchpad Rev. 1.5 (UART Jumper gezogen), den 
ich wie folgt initialisiere:
1
#define CURRENT BIT1
2
3
  // start adc
4
  //ADC10CTL0 &= ~ENC;    // Disable ADC
5
  ADC10AE0 = POS | CURRENT;    
6
  ADC10CTL0 = ADC10SHT_2  // sample-and-hold time (64)
7
        + MSC    // "sequential conversion"?
8
        //+ REF2_5V  //  
9
        //+ REFON    // 
10
        + ADC10ON   // ADC on
11
        + ADC10IE  // ADC interrupt enable
12
        ; 
13
  ADC10CTL1 = INCH_1       // Channel
14
        //+ ADC10SSEL_3   // SMCLK
15
        //+ CONSEQ_0    // Conversion sequence (single channel)
16
        //+ CONSEQ_1    // Conversion sequence (scan)
17
        + CONSEQ_2    // Conversion sequence (repeat channel)
18
        //+ CONSEQ_3    // Conversion sequence (repeat scan)
19
        ;
20
  ADC10CTL0 |= ENC 
21
        + ADC10SC;               // Enable and start conversion

Sobald der Kanal in ADC10CTL1 ausgewählt wird, steigt die Spannung des 
offenen Pins dort auf ca. Vcc/2 und mit angeschlossenem Strom-Signal 
wird dieses um ca. 100 mV "hochgezogen".
Das schlägt sich auch auf die Messung nieder:

155e-3 V /(3,6V/1024) = 44

und das ist auch der ADC Wert in ADC10MEM.


Sind der Filterkondensator und der ADC "Schuld"?

SLAU144J:
22.2.2   ADC10 Inputs and Multiplexer
The eight external and four internal analog signals are selected as the 
channel for conversion by the
analog input multiplexer. The input multiplexer is a break-before-make 
type to reduce input-to-input noise
injection that can result from channel switching (see Figure 22-2). The 
input multiplexer is also a T-switch
to minimize the coupling between channels. Channels that are not 
selected are isolated from the A/D, and
the intermediate node is connected to analog ground (V SS ) so that the 
stray capacitance is grounded to
help eliminate crosstalk.
The ADC10 uses the charge redistribution method. When the inputs are 
internally switched, the switching
action may cause transients on the input signal. These transients decay 
and settle before causing errant
conversion.


SLAS694J:

10-Bit ADC, Power Supply and Input Range Conditions (MSP430G2x31 Only)

PARAMETER           TEST CONDITIONS TA VCC MIN      TYP      MAX    UNIT
...
CI Input capacitance                               25°C 3 V 27      pF
RI Input MUX ON resistance         0 V ≤ VAx ≤ VCC 25°C 3 V 1000 Ω

von Steffe (Gast)


Lesenswert?

Im Gegensatz zu obiger Dauer-Messung fallen einzelne Messungen nicht so 
ins Gewicht - was passiert denn da im ADC? Warum ist der Sample-and-Hold 
- oder welche Kapazität auch immer - so geladen?

von Bernd N (Gast)


Lesenswert?

Kannst du den ganzen Code mal hereinstellen ? wie hoch ist denn deine 
ADC Clock, main clk etc ?
1
void AdcInit (void)
2
{
3
    ADC10CTL1 |= INCH_5 | ADC10SSEL0 | ADC10SSEL1 | ADC10DIV_7;   // ADC IN an P1.5, ADC CLK = SMCLK/8
4
    ADC10CTL0 = SREF_1 | ADC10SHT_3 | REF2_5V | REFON | ADC10ON;  // SHT 64x ADC10CLKs, VREF 2.5V, ADC ON
5
    ADC10AE0 |= AdcInput;                                         // ADC Input Enable an P1.5
6
}

Typische ADC Einstellung als Beispiel.

von Steffe (Gast)


Lesenswert?

Danke für dein Interesse.
Main clock sind ca. 8 MHz, sonstige ADC-Einstellungen mache ich nicht, 
d.h. ADClock ohne Vorteiler. Ist das zu schnell?
Ich kann heute abend mal ein komplettes Minimalprogramm machen.
Und auch mal die Clock auf 1 MHz reduzieren.

von Bernd N (Gast)


Lesenswert?

Ich denke ADC Clock solltest du dir ansehen. Ich kann dir auch einen 
Beispielcode anhängen. Dieser Code gibt dir die Spannung in Volt auf dem 
USB Application COM Port zurück (Back Channel UART). Die Messung ist 
recht genau und kompensiert.

Also wenn das helfen würde dann lass es mich wissen.

von Bernd N (Gast)


Lesenswert?

Ich habe mal ins Datenblatt geschaut, ADC Clock Max wird hier mit 6,3 
MHz angegeben.

ADC10OSC oscillator frequency f 3 V 3.7 6.3 MHz

von Steffe (Gast)


Lesenswert?

Hi und danke,

mit ADC10DIV_7 ist die Spannung des offenen ADC-Pins bei ca. 0.6 V.
Ich werde es heute abend nach Möglichkeit mit einem OP versuchen.

Bzgl. Masseverbindung: das Verhalten ist auch ohne PC-Verbindung das 
gleiche, nur weniger Rauschen:

Prozessor im Reset:     0 mV
Prozessor/AD läuft:    25 mV
Netzteil an DRV8801:   12 mV
AD u. Netzteil:        38 mV
Netzteilan, Proz. aus:  0 mV

Last nicht verbunden, gemessen an GND und CS vom Modul.

Die 12 mV sind wohl der Offset-Fehler vom DRV8801.
Wieso der AD so rück-wirkt kann ich leider noch nicht mal vermuten.

von Steffe (Gast)


Lesenswert?

Hier noch der Code (für CCS):
1
#include "msp430g2231.h"
2
3
4
void main(void)
5
{
6
  WDTCTL = WDTPW + WDTHOLD;
7
  
8
  DCOCTL = 0;
9
  BCSCTL1 = CALBC1_1MHZ;
10
  DCOCTL = CALDCO_1MHZ;
11
12
  P1OUT = 0;  // "unchanged" after reset
13
  
14
  ADC10AE0 = BIT1;    
15
  ADC10CTL0 = //ADC10SHT_2  // sample-and-hold time (64)
16
        + MSC    // 
17
        //+ REF2_5V  //  
18
        //+ REFON    // 
19
        + ADC10ON   // ADC on
20
        + ADC10IE  // ADC interrupt enable
21
        ; 
22
  ADC10CTL1 = INCH_1       // Channel
23
        + ADC10DIV_7  // /8
24
        //+ ADC10SSEL_3   // ADCLOCK / SMCLK
25
        //+ CONSEQ_0    // Conversion sequence (single channel)
26
        //+ CONSEQ_1    // Conversion sequence (scan)
27
        + CONSEQ_2    // Conversion sequence (repeat channel)
28
        //+ CONSEQ_3    // Conversion sequence (repeat scan)
29
        ;
30
  ADC10CTL0 |= ENC 
31
        + ADC10SC;               // Enable and start conversion
32
  
33
  
34
  __bis_SR_register(GIE);
35
  
36
  while(1);
37
}
38
39
40
41
#pragma vector=ADC10_VECTOR
42
__interrupt void ADC10_ISR (void)
43
{
44
  #define FACTOR 4
45
  static unsigned int avg = 0;
46
47
  avg = avg + ADC10MEM - (avg / FACTOR);
48
    unsigned int pv = avg / FACTOR;
49
    
50
    /*
51
    ADC10CTL0 |= ENC 
52
        + ADC10SC;               // Enable and start conversion
53
  */   
54
}


An einem 10k Poti ist die Rückwirkung auch etwas zu sehen.

von Steffe (Gast)


Lesenswert?

Hier ist eine Diskussion im TI board:

http://e2e.ti.com/support/applications/motor_drivers/f/38/t/205575.aspx
1
Posted by Jose Quinones
2
on Aug 02 2012 16:13 PM
3
Expert7410 points
4
5
Hi Rapahel,
6
7
To answer your question, yes, the VPROPI output operates regardless of what the ENABLE input is doing or whether there is current or not on the H Bridge. It is a separate block and it works standalone.
8
9
As you specified, the SENSE resistor is basically grounded when there is no current. In this case, the amplifier is an undefined state. Design tells me there is about +/- 10 mV of bias in the inputs, so you can see as much as 50 mV bias at the output.
10
11
Hope this answers the question, but do let me know if there is anything else I can help you with. Best regards,
12
13
Jose Quinones

Das beantwortet allerdings nicht die Frage nach dem ADC-Einfluss

von Bernd N (Gast)


Lesenswert?

Wo in deinem Code ist eine Ausgabe des gemessenen Wertes ? Ebenso hast 
du keine Referenz ausgewählt. Ist das wirklich der Code mit dem du 
arbeitest ?
1
 ADC10CTL0 = //ADC10SHT_2  // sample-and-hold time (64)
2
        + MSC    // 
3
        //+ REF2_5V  //  
4
        //+ REFON    // 
5
        + ADC10ON   // ADC on
6
        + ADC10IE  // ADC interrupt enable
7
        ;

von Steffe (Gast)


Lesenswert?

Hi,

die Ausgabe des Wertes hat keinen Einfluss auf den Pin, daher habe ich 
das weggelassen :-)
Ausserdem kann man im Debugger sehen, was sich tut (sofern er denn 
angeschlossen ist).

Und wenn ich nicht irre, ist auch keine Auswahl eine Auswahl der 
Referenz, nämlich Vcc und GND.
Ich hatte aber auch mit der 1.5 V - Referenz Probleme (aber keine 
Messwerte mehr im Kopf, heute abend will ich es nochmal probieren).

Gibt es denn ein Problem mit den Einstellungen?

von Bernd N (Gast)


Angehängte Dateien:

Lesenswert?

Am einfachsten ist es mal einen Versuch mit funktionierenden Code 
durchzuführen. Wenn du dann immer noch ein Problem hast dann liegt es 
sicherlich an deiner Eingangsschaltung bzw. Masse Probleme etc.

Im Anhang mal ein funktionierender Code, ist das Problem immer noch da 
dann weißt du das du die Fehlersuche innerhalb der Software erst einmal 
vergessen kannst.

Achtung! Ich verwende das Launchpad Rev1, also möglicherweise mußt du 
die Brücken anders stecken.

von Steffe (Gast)


Lesenswert?

Hier mal Links auf Produktseite, Datenblatt und Family User's Guide 
(MSP430x2xx):

http://www.ti.com/product/msp430g2231
http://www.ti.com/lit/gpn/msp430g2231
http://www.ti.com/litv/pdf/slau144j

Die Errata enthalten übrigens nichts über den ADC10.

von Steffe (Gast)


Lesenswert?

Danke Bernd, ich werd's ausprobieren.

von Steffe (Gast)


Lesenswert?

Also mit deinem Code konnte ich vorhin auch den Einfluss des ADCs sehen, 
aber offenbar spinnt meine Messtechnik, denn mit reduzierter Sample-Zeit 
und der 2.5 V Referenz habe ich am Oszi 90 mV Rauschen aber den 
passenden ADC-Wert, auch, wenn kontinuierlich gemessen wird (d.h. 0x5 
für die 12 mV Offset des DRV8801).

Wenn ich noch etwas zum Thema rausfinden sollte, melde ich mich wieder.
Danke für deine Hilfe!

von Bernd N (Gast)


Lesenswert?

Naja, 512 Messwerte mitteln ist gleichbedeutend mit einem Tiefpass. Das 
macht also durchaus Sinn...

>> denn mit reduzierter Sample-Zeit und der 2.5 V Referenz habe ich am Oszi
>> 90 mV Rauschen aber den passenden ADC-Wert

Deine 12mV kannst du dann noch per Software kompensieren, ist im Code eh 
schon enthalten, mußt nur deine "rohen" Messwerte anpassen.

>> Also mit deinem Code konnte ich vorhin auch den Einfluss des ADCs sehen

Erklär das mal so das ich eine Idee bekomme.

von Steffe (Gast)


Lesenswert?

Die 90 mV sind schon der Mittelwert, laut Oszi.
Auch mit deinem Code konnte ich den Einfluss des ADCs auf das zu 
messende Signal feststellen, d.h. es wurde hochgezogen, sobald gewandelt 
wurde, und nach der Wandlung hat es sich dann wieder entladen.
Ich traue aber meinen Oszi-Messungen nicht mehr, und ich konnte das 
beschrieben Verhalten gestern abend auch nicht mehr reproduzieren.

Da nun aber mit der internen Referenz und bei etwas reduzierter 
Messfrequenz auch bei "meiner" kontinuierlichen Messung der ADC-Wert den 
Erwartungen entspricht, ist das Problem für mich erstmal gelöst.

Nochmals meinen Dank.

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.