MSP430 Messung einer externen Spannung

OP #2086021
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.
OP #2086349
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?
OP #2086442
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?
OP #2087449
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?
#2087456
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?
OP #2087484
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.
Gast #2088790
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.
OP #2088850
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?
Gast #2089257
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.

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