Forum: Mikrocontroller und Digitale Elektronik spannung/ strom messung mit msp430


von jarmi (Gast)


Lesenswert?

Hallo Kollegen,

entschuldigt bitte die komplette Newbie-Frage.
ich habe paar verständniss Fragen

ich betreibe mein msp430F4xxx mit einer Batterie, nun möchte ich wissen 
wie man die Spannung, bzw. strom mit dem ADC messen kann.


Danke
Gruß
jarmi

von Bernd N (Gast)


Lesenswert?

U = R*I oder hat sich da was geändert ? :-)

Einfach eine Spannung an den ADC Eingang anlegen und fertig. Mittels 
ohmschen Gesetz den entsprechenden Spgs. Teiler berechnen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Und was ist jetzt Dein Problem?

Wie der ADC softwareseitig anzusteuern ist, oder welche Hardware Du an 
den ADC anschließen musst, um "die" Spannung oder "den" Strom messen zu 
können?

Ersteres wird von TI in Codebeispielen beschrieben, die es für die 
unterschiedlichen MSP430-Familien gibt, studiert man diese und die 
jeweiligen Programmierhandbücher, sollte man die Vorgänge nachvollziehen 
können.

Letzteres hängt ein bisschen davon ab, was "die" Spannung und "der" 
Strom sind, die Du da messen willst - etwa die Spannung der den MSP430 
versorgenden Batterie? Und den Eigenstrombedarf?

von jarmi (Gast)


Lesenswert?

Hallo,
das ohmische Gesetz hat sich meines wissen noch nicht geändert. ich 
suche aber fleißig nach neue Regeln.



>>Einfach eine Spannung an den ADC Eingang anlegen und fertig. Mittels
>>ohmschen Gesetz den entsprechenden Spgs. Teiler berechnen.
soweit bin ich auch drauf gekommen :p

haben Sie vielleicht eine detailerte BEschreibung dafür, Bitte?

von Bernd N (Gast)


Lesenswert?

>> detailerte BEschreibung

wofür ? für den Spannungsteiler ? wie wärs wenn du mal erklärst was du 
machen willst.

Beispiel, ich möchtem mit dem ADC eine Spannung von 1000V messen.

von jarmi (Gast)


Lesenswert?

@ Rufus Τ. Firefly

ich möchte wissen:
- welche Hardware darf ich an welche pin anschliessen?
- wie wird die Spannung vom ADC ausgelesen?
- Batterie Und verfügbare Eigenstrombedarf ermitteln?


Danke für die schnelle Antwort

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

jarmi schrieb:
> - welche Hardware darf ich an welche pin anschliessen?

Jede dafür geeignete an jeden dafür geeigneten.

Was bitte soll man auf so eine Frage antworten?

> - wie wird die Spannung vom ADC ausgelesen?

Das steht -- wie ich bereits beschrieben habe -- in den 
Quelltextbeispielen, die es von TI für die unterschiedlichen 
MSP430-Varianten gibt. Das steht auch in verschiedenen Büchern und 
Online-Tutorials.

Obendrein ist der ADC im Users's Manual der jeweiligen MSP430-Variante 
beschrieben.

> - Batterie Und verfügbare Eigenstrombedarf ermitteln?

Dieser Satz keine Frage. Spannungen misst man, in dem man sie entweder 
direkt an einen ADC-Eingang anschließt (dann aber muss absolut 
sichergestellt sein, daß die Spannung nicht höher werden kann als der 
ADC-Eingang erlaubt, also auf keinen Fall größer als die 
Betriebsspannung des MSP430 - übrigens darf sie auch nicht negativ 
werden) oder aber über einen geeignet dimensionierten Spannungsteiler an 
einen ADC-Eingang anschließt. Der Spannungsteiler sollte so hochohmig 
wie möglich sein, um die Spannungsquelle nicht unnötig zu belasten, darf 
aber auch nicht so hochohmig sein, daß der Innenwiderstand des 
ADC-Eingangs die Spannungsteilung merklich beeinflusst.

Ein ADC kann nur Spannungen messen, also gilt es zur Strommessung das 
Ohmsche Gesetz (ohne 'i') anzuwenden und mit einem geeignet 
dimensionierten Messwiderstand zu arbeiten, durch den der zu messende 
Strom fließt. Die über diesem abfallende Spannung wird dann gemessen.

von jarmi (Gast)


Lesenswert?

Hallo,
nach dem ich mich gestern  ein bisschen mit SD16 beschäftigt habe,
habe ich trptzdem noch ein paar Verständniss lücken.

Zum einen: im Rigister SD16_A6 siehe ich SD16IV immer auf 0x0004, es 
ändert sich nicht obwohl ich A0+ und A1+ aktiviert habe?

zumanderen in der SD16A_Vector ISR zeigt SD16IV = 0xDAEA gleichzeitig 
(was SD16MEM0) entspricht?
angenommen SD16MEM0 einen richtigen wert ausgibt, wie lese ich die 
Spannung daraus?

ich hoffe sie können mich weiter hilfen.
hier meine Programmierung:


>> main()
{
  drv_SD16_Init();
  startA0_Mesurement(); //SD16CCTL0|=SD16SC;
  startA1_Mesurement(); //SD16CCTL1|=SD16SC;
}

>>void drv_SD16_Init(void)
{

  BATCTL1_HIGH; //A0
  BATCTL2_HIGH; //A1

  // Configure SD16

  SD16INCTL0 |= SD16INTDLY_0 + SD16INCH_0 ;         // Select Channel A0

  SD16INCTL1 |= SD16INTDLY_0 + SD16INCH_1 ;      // Select Channel A1
  SD16CCTL1 |= SD16IE;                      // Single conv,enable 
interrupt
  SD16CCTL0 |= SD16IE;

  SD16CTL = SD16REFON + SD16SSEL_1;     //  1.2V ref | SMCLK
}


>>#pragma vector=SD16A_VECTOR
__interrupt void SD16A_ISR(void)
{
_NOP();
  switch (SD16IV)
  {
  case 2:                                   // SD16MEM Overflow
    break;
  case 4:                                   // SD16MEM0 IFG
      SD16CCTL0 &= ~SD16IFG;
      startA0_Mesurement();
      mem0=SD16MEM0;
    break;
  case 6:                                   // SD16MEM1 IFG
     SD16CCTL1 &= ~SD16IFG;
     startA1_Mesurement();
      mem1=SD16MEM1;
    break;
  case 8:                                   // SD16MEM2 IFG
    break;
  }
 // __low_power_mode_0();                   // Exit LPM0
}

von jarmi (Gast)


Lesenswert?

Hallo,

gibt es eine formel oder ähnliches, mit der ich aus dem gemessenen Wert: 
SD16MEM0 die Spannung ausrechnen kann?

Danke

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ja. Du kennst die Höhe der Referenzspannung, Du kennst das Ergebnis der 
ADC-Wandlung. Was brauchst Du mehr?

Hinweis:
Wenn z.B. die Referenzspannung 2 V ist, und der ADC "Vollausschlag" 
liefert, wie hoch mag da wohl die gemessene Spannung sein?

Und wenn der ADC 0 liefert, wie hoch dann?

von jarmi (Gast)


Lesenswert?

ich verwende die interne Reference 1.2V, dem entsprechend zeigt SD16MEM0 
= 56512.
mit dem Osci habe ich am A0.0+ 0.42V.

wie finde ich das verhältniss zwischen die 0.42v und 56512??

von jarmi (Gast)


Lesenswert?

soll ich die 3 Eck regel verwenden, sprich

0xFFFF --> 1,2v
0xdc12 --> x?

von jarmi (Gast)


Lesenswert?

die werte passen doch nicht zusammen.

mit dem Osci habe ich 0.43v gemessen (was ich auch messen möchte).

mit dem SD16 bekomme ich SD16MEM0=56512

internes Ref: 1,2v

mein Rechen Weg:
0v   -----> 0x0000
x.v  -----> 0xDCDD = 56541
1,2v -----> 0xFFFF = 65536

x= (56541*1,2)/65536 ==> 1,03V ????

von Bernd N (Gast)


Lesenswert?

Wenn ich mich nicht täusche dann gilt 0,6V -----> 0xFFFF bei unipolarer 
Messung.

>> 0.42v und 56512??

Das kommt dann schon hin.

von jarmi (Gast)


Lesenswert?

@ Bernd, vielen Dank, das habe ich auch vergissen...

nach dem Rechnen bekomme ich:
x= (56551*0,6)/65536 = 0,5177V
gemessen : 0,428v


Danke für die Schnelle Antwort

von jarmi (Gast)


Lesenswert?

Hallo,
endlich habe ich mein SD16 zum laufen gebracht, der letzte Fehler lag am 
SD16LSBACC. diese sollte auf 0 gesetzt werden(zumindest bei mir).
Danke für die Hilfe und die Hinweise.

von jarmi (Gast)


Lesenswert?

Hallo Freunde,

nach paar experimente mit SD16 habe ich immernoch paar probleme :( ,

die SD16-ISR()wird aufgerufen im Register zeigen
zb. SD16MEM0=0xB722 und SD16IV = 4;

in der ISR zeigen SD16MEM0=0 und SD16IV = 46782;
wobei SD16IV sich doch nur bis 16 variieren?
der Breakpunt ist in Case 4 gesetzt aber der zeiger kommt da nicht an...

mit dem befehl mem0 = SD16MEM0; wird auch nur 0 gelesen,obwohl im 
Register
SD16MEM0=0xB722 steht.

weiss jemanden vielleicht was ich falsch mache?
Danke


void drv_SD16_Init()
{
  P4DIR=0xFF;

  mesureBATCTL1();
//  mesureBATCTL2();

  SD16CTL = SD16REFON+SD16SSEL_1;    // 1.2V ref, SMCLK
  // CH A0.0+
  SD16INCTL0 |= SD16INCH0+SD16INTDLY0; // Interrupt on 4th sample
  SD16CCTL0  |= SD16UNI+SD16IE;        // Enable interrupt
  // CH A1.0+
//  SD16INCTL1 |= SD16INCH1+SD16INTDLY0; // Interrupt on 4th sample;
//  SD16CCTL1  |= SD16OSR_1024+SD16UNI+SD16IE;
  SD16CCTL0|=SD16SC;
  for (int i = 0; i < 0x3600; i++);   // Delay for 1.2V ref startup
  _EINT();
}


#pragma vector=SD16A_VECTOR
__interrupt void SD16AISR(void)
{
  //mem0 = SD16MEM0;
  //mem1 = SD16MEM1;
  switch (__even_in_range(SD16IV, 16))
  {
    case 2:                      // SD16MEM Overflow
      break;
    case 4:                      // SD16MEM0 IFG
      SD16CCTL0 &=~SD16IFG;      // clear Interrupt Flag
      mem0 = SD16MEM0;
      //SD16CCTL0 &=~SD16SC;
      //BATCTL1_LOW();
      break;
    case 6:                      // SD16MEM1 IFG
      SD16CCTL1 &=~SD16IFG;      // clear Interrupt Flag
      mem1 = SD16MEM1;
      //SD16CCTL1 &=~SD16SC;
      //BATCTL2_LOW();
      break;
    case 8:                      // SD16MEM2 IFG
      break;
  }

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.