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
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.
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?
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?
>> 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.
@ 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
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.
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 }
Hallo, gibt es eine formel oder ähnliches, mit der ich aus dem gemessenen Wert: SD16MEM0 die Spannung ausrechnen kann? Danke
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?
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??
soll ich die 3 Eck regel verwenden, sprich 0xFFFF --> 1,2v 0xdc12 --> x?
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 ????
Wenn ich mich nicht täusche dann gilt 0,6V -----> 0xFFFF bei unipolarer
Messung.
>> 0.42v und 56512??
Das kommt dann schon hin.
@ 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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.