www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430 Messung einer externen Spannung


Autor: Stefan M. (stefan_m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg S. (joerg-s)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan M. (stefan_m)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Jörg S. (joerg-s)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan M. (stefan_m)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Helfer (Gast)
Datum:

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

Autor: Stefan M. (stefan_m)
Datum:

Bewertung
0 lesenswert
nicht 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.
#include "msp430xG46x.h"

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  ADC12CTL0 = SHT0_2 + ADC12ON;             // Sampling time, ADC12 on
  ADC12CTL1 = SHP;                          // Use sampling timer
  ADC12IE = 0x01;                           // Enable interrupt
  ADC12CTL0 |= ENC;
  P6SEL |= 0x01;                            // P6.0 ADC option select
  P5DIR |= 0x02;                            // P5.1 output

  while (1)
  {
    ADC12CTL0 |= ADC12SC;                   // Start sampling/conversion
    __bis_SR_register(LPM0_bits + GIE);     // LPM0, ADC12_ISR will force exit
  }
}

#pragma vector = ADC12_VECTOR
__interrupt void ADC12_ISR(void)
{
  if (ADC12MEM0 >= 0x7ff)                   // ADC12MEM = A0 > 0.5AVcc
    P5OUT |= 0x02;                          // P5.1 = 1
  else
    P5OUT &= ~0x02;                         // P5.1 = 0

  __bic_SR_register_on_exit(LPM0_bits);     // Exit LPM0
}

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

Autor: Jörg S. (joerg-s)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Stefan M. (stefan_m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan M. (stefan_m)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Serieller (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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.

Autor: Stefan M. (stefan_m)
Datum:

Bewertung
0 lesenswert
nicht 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.
#include "msp430xG46x.h"

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;             // Stop WDT
  ADC12CTL0 = SHT0_2 + ADC12ON;         // Sampling time, ADC12 on
  ADC12CTL1 = SHP;                      // Use sampling timer
  ADC12IE = 0x01;                       // Enable interrupt
  ADC12CTL0 |= ENC;
 // P6SEL |= 0x01;                      // P6.0 ADC option select
  P6DIR |= 0x01;      // P6.0 Input
  P5DIR |= 0x02;                        // P5.1 output

  while (1)
  {
    ADC12CTL0 |= ADC12SC;                   // Start sampling/conversion
    __bis_SR_register(LPM0_bits + GIE);  // LPM0, ADC12_ISR will force exit
  }
}

#pragma vector = ADC12_VECTOR
__interrupt void ADC12_ISR(void)
{
  if (ADC12MEM0 <= 0x7ff)   // ADC12MEM = A0 < 0.5AVcc = 0.5*2,7V = 1,35V?
    P5OUT |= 0x02;          // P5.1 = 1
  else
    P5OUT &= ~0x02;         // P5.1 = 0

  __bic_SR_register_on_exit(LPM0_bits);     // Exit LPM0
}

Im Datenblat steht, dass für Vref
 
ADCTL0 = REFON              // für Vref 1.5V
oder
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?

Autor: Serieller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg S. (joerg-s)
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Serieller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/e9...

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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.