Forum: Mikrocontroller und Digitale Elektronik MSP430 Messung einer externen Spannung


von Stefan M. (stefan_m)


Lesenswert?

Hi,

ich will von einem L6235 der eine U71MX antreibt, das Tachosignal 
messen. Dieses ist gepulst mit Uss=4,2V, ton=280µs und toff=4,2ms.

Nachdem ich nun schon seit Tagen mit Labview rumprobiert habe und mich 
diese Art der Entwicklung einfach nur ankotzt, da es einfach mal total 
unübersichtlich ist, frage ich mich ob ich diese Messung nicht auch mit 
meinem µC bewerkstelligen kann.

Eigentlich will ich nur die Anlaufzeit der U71MX messen.
Wenn ich also den Mittelwert meiner Tachospannung nehme, müsste man dann 
doch bei einer Aufnahme von 1 Messwert pro ms eine anständige Kurve 
zustande kriegen. Die Frage ist nur wie man das realisieren kann?

Kann man dieses Spannungssignal einfach an einen I/O Pin des 
MSP430Fg4618 führen, dieses dann umrechnen und in eine Dateischreiben? 
Bzw. in den Speicher und von da dann an den PC übertragen und in eine 
Dateischreiben.

Das müsste doch gehen, oder? Wie geht man dabei am besten vor? Also, 
Unterteilung in Teilprojekte.
Ich hab da immer so meine Probleme solche Dinge zu strukturieren und 
will am liebsten immer alles auf einmal ^^ Deswegen frag ich ;)

Viele Grüße,

Stefan M.

von Jörg S. (joerg-s)


Lesenswert?

Stefan Marx schrieb:
> Kann man dieses Spannungssignal einfach an einen I/O Pin des
> MSP430Fg4618 führen, dieses dann umrechnen und in eine Dateischreiben?
> Bzw. in den Speicher und von da dann an den PC übertragen und in eine
> Dateischreiben.
Ich würde ein USB/RS232 Anschluss an den MSP machen und das direkt 
übertragen.

von Stefan M. (stefan_m)


Lesenswert?

Jörg S. schrieb:
> Ich würde ein USB/RS232 Anschluss an den MSP machen und das direkt
> übertragen.

Also ist es möglich, dass der µC das verarbeitet :)
Ich hab den auf einem Experimenter Board, wo eine RS232 zur Verfügung 
steht.

Was ich bisher noch nicht rausgefunden habe...ich kann mit CCE zwar den 
Code für den µC schreiben, aber eine Consolenanwendung kann man damit 
nicht realisieren, oder? Weil irgendwie muss doch die Datei erzeugt 
werden?

von Jörg S. (joerg-s)


Lesenswert?

>Also ist es möglich, dass der µC das verarbeitet :)
Wüsste nicht was dagegen spricht.

>eine Consolenanwendung kann man damit nicht realisieren, oder?
Terminals, auch welche die speichern, gibt es wie Sand am Meer.

von Stefan M. (stefan_m)


Lesenswert?

Jörg S. schrieb:

> Terminals, auch welche die speichern, gibt es wie Sand am Meer.
Sowas wie das Hyperterminal.

Wie sieht dann das Konzeot aus, nachdem mein µC das Signal verarbeitet?
Der Spannungspegel an dem PIN muss dann mit dem A/D Wandler in einen 
Digitalenwert umgewandelt werden. Und diesen übergebe ich dann der RS232 
sozusagen.... ist das zu einfach gedacht?

von Helfer (Gast)


Lesenswert?

Nö. So einfach ist das. Und im Artikel RS232 sind Tips, wie man die 
Daten auch grafisch visualisieren kann.

von Stefan M. (stefan_m)


Lesenswert?

Was darf denn da so maximal an Spannung und Strom an den jeweiligen PIN 
anliegen?

Spiele gerade mit einem BeispielCode rum, der dass Signal für den ADC12 
selbst erzeugt und dann je nach größe eine LED an oder abschaltet.

Kurioserweise schaltet sich die Diode ab, wenn ich mein Oszi an diesen 
Pin hänge, um die Spannung zu messen.
1
#include "msp430xG46x.h"
2
3
void main(void)
4
{
5
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
6
  ADC12CTL0 = SHT0_2 + ADC12ON;             // Sampling time, ADC12 on
7
  ADC12CTL1 = SHP;                          // Use sampling timer
8
  ADC12IE = 0x01;                           // Enable interrupt
9
  ADC12CTL0 |= ENC;
10
  P6SEL |= 0x01;                            // P6.0 ADC option select
11
  P5DIR |= 0x02;                            // P5.1 output
12
13
  while (1)
14
  {
15
    ADC12CTL0 |= ADC12SC;                   // Start sampling/conversion
16
    __bis_SR_register(LPM0_bits + GIE);     // LPM0, ADC12_ISR will force exit
17
  }
18
}
19
20
#pragma vector = ADC12_VECTOR
21
__interrupt void ADC12_ISR(void)
22
{
23
  if (ADC12MEM0 >= 0x7ff)                   // ADC12MEM = A0 > 0.5AVcc
24
    P5OUT |= 0x02;                          // P5.1 = 1
25
  else
26
    P5OUT &= ~0x02;                         // P5.1 = 0
27
28
  __bic_SR_register_on_exit(LPM0_bits);     // Exit LPM0
29
}

Wie müsste ich PIN6.0 denn configurieren, damit ich ein Signal 
draufgeben kann?

von Jörg S. (joerg-s)


Lesenswert?

>Was darf denn da so maximal an Spannung und Strom an den jeweiligen PIN
>anliegen?
Wenn du die 2,5V Referenz nimmst 2,5V, bei 1,5V Referenz dann maximal 
1,5V :)
Strom wird hoffentlich nicht viel fliessen, sonst ist was kaputt.

>Wie müsste ich PIN6.0 denn configurieren, damit ich ein Signal
>draufgeben kann?
Du meinst die Aussenbeschaltung?

von Stefan M. (stefan_m)


Lesenswert?

Jörg S. schrieb:

> Strom wird hoffentlich nicht viel fliessen, sonst ist was kaputt.
 Sind 20 mA viel? g Bin bei sowas immer ganz schnell ^^

> Du meinst die Aussenbeschaltung?
Außenbeschaltung? Ja wenn ich eben meine Spannung vom Tachosignal auf 
den PIN lege und dann sehen will, ob die Spannung zum Beispiel > 
0.5*Vref oder so

Bei dem Beispiel kommt die Spannung ja irgendwie von Innen, die dann 
diese Bedingung erfüllt.

von Stefan M. (stefan_m)


Lesenswert?

Hab mal noch ne andere Frage.

Wenn mein ADC nun das Signal umgerechnet hat und in den Memoryplatz 0 
geschrieben hat, wohin kann ich diesen Wert dann ausgeben? Also, 
irgendwie muss ich ja wissen, ob die Umwandlung nun korrekt von statten 
ging?

von Serieller (Gast)


Lesenswert?

> Also, irgendwie muss ich ja wissen, ob die Umwandlung nun korrekt von
> statten ging?

Das weisst du, wenn die __interrupt void ADC12_ISR(void) aufgerufen 
wird.

> Wenn mein ADC nun das Signal umgerechnet hat und in den Memoryplatz 0
> geschrieben hat, wohin kann ich diesen Wert dann ausgeben?

Du kopierst dir in ADC12_ISR() den Wert aus ADC12MEM0 in eine Variable 
und setzt dir einen Merker/Flag.

Im Hauptprogramm kontrollierst du laufend den Merker, machst ggf. die 
Ausgabe und resettest den Merker.

Artikel Interrupt lesen und besonders auf atomaren Datenzugriff und 
volatile Kennzeichnung achten.

Artikel FAQ lesen und die Frage "Wie kann ich Zahlen auf LCD/UART 
ausgeben?" auf deine Hardware (Display? UART?) anpassen.

von Stefan M. (stefan_m)


Lesenswert?

Ok. Danke Sellerie :)

Hab hier nochmal eine Frage zu Vref bzw. AVcc.

In dem Beispiel hier msp430xG46x_adc12_01.c

Wird das AVcc irgendwo definiert? Meiner Meinung nach nicht.
1
#include "msp430xG46x.h"
2
3
void main(void)
4
{
5
  WDTCTL = WDTPW + WDTHOLD;             // Stop WDT
6
  ADC12CTL0 = SHT0_2 + ADC12ON;         // Sampling time, ADC12 on
7
  ADC12CTL1 = SHP;                      // Use sampling timer
8
  ADC12IE = 0x01;                       // Enable interrupt
9
  ADC12CTL0 |= ENC;
10
 // P6SEL |= 0x01;                      // P6.0 ADC option select
11
  P6DIR |= 0x01;      // P6.0 Input
12
  P5DIR |= 0x02;                        // P5.1 output
13
14
  while (1)
15
  {
16
    ADC12CTL0 |= ADC12SC;                   // Start sampling/conversion
17
    __bis_SR_register(LPM0_bits + GIE);  // LPM0, ADC12_ISR will force exit
18
  }
19
}
20
21
#pragma vector = ADC12_VECTOR
22
__interrupt void ADC12_ISR(void)
23
{
24
  if (ADC12MEM0 <= 0x7ff)   // ADC12MEM = A0 < 0.5AVcc = 0.5*2,7V = 1,35V?
25
    P5OUT |= 0x02;          // P5.1 = 1
26
  else
27
    P5OUT &= ~0x02;         // P5.1 = 0
28
29
  __bic_SR_register_on_exit(LPM0_bits);     // Exit LPM0
30
}

Im Datenblat steht, dass für Vref
1
 
2
ADCTL0 = REFON              // für Vref 1.5V
oder
1
ADCTL0 = REFON + REF2_5V    // für Vref 2.5V
gesetzt werden muss.

Auf welche AVcc bzw. Vref greift dann dieses Beispiel zurück? Kann man 
auch ein externes Vref zum Vergleich eines Messsignals anlegen?

von Serieller (Gast)


Lesenswert?

Weiss ich nicht, mir liegt das Datenblatt nicht vor. Erste Suchseite von 
Google mit "msp430xG46x datasheet" liefert auf den ersten Blick auch 
nichts passendes.

von Jörg S. (joerg-s)


Lesenswert?

Wenn ich mir den L6235 so ansehe, scheint mir eine Frequenzmessung 
vielleicht zielführender zu sein als das ganze erst analog zu "glätten".

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Serieller schrieb:
> Weiss ich nicht, mir liegt das Datenblatt nicht vor.

msp430.com ist die TI-eigene Einstiegsseite, auf der man mit ein paar 
Klicks sowohl Datenblatter und User Guides als auch AppNotes und 
Beispielcode findet.

von Serieller (Gast)


Lesenswert?

Mein Fheler, hatte nach msp430xG46x gesucht statt nach dem aktuellen 
Vertreter MSP430Fg4618.

Das Datenblatt ist sehr spartanisch, was die Beschreibungen betrifft.
http://focus.ti.com/lit/ds/symlink/msp430fg4618.pdf

Eine bessere Erklärung gibt es in
http://www.swarthmore.edu/NatSci/echeeve1/Class/e91/Lectures/E91%286%29A2D.pdf

Das Bit REFON würde in ADC12CTL0 gesetzt, ist es aber nicht. Daher 
greift das Beispiel auf eine externe Referenzspannung zurück. Und zwar 
auf V+ = AVcc und V- = AVss, wenn ich das richtig deute (ADC12MEMCTL0 
Bits SREF0..2 alle 0) => Folien 4 und 8 im 2. Link.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Serieller schrieb:
> Das Datenblatt ist sehr spartanisch, was die Beschreibungen betrifft.

Deswegen gibt es ja den jeweiligen "Family User's Guide", der 
ausführliche Beschreibungen der Peripherie enthält, und die 
Codebeispiele, die die Nutzung der verschiedenen Peripherieelemente 
beschreiben.

Mit der Kombination sollte man ganz gut zurechtkommen.

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.