spannung/ strom messung mit msp430

Persönliche Seite #1965972
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?
Gast #1965976
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?
Gast #1965980
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
Persönliche Seite #1965998
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.
Gast #1969027
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
}
Gast #1973845
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 ????
Gast #1977107
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;
  }

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren