Forum: Mikrocontroller und Digitale Elektronik MSP430 ADC10 immer selber Wert


von Chris S. (chris_si)


Lesenswert?

Hallo!
Ich bin zurzeit fast am verzweifeln an der Initialisierung vom ADC10 am 
MSP430F5229. Jedesmal wenn ich den Wert auslesen möchte bekomme ich den 
Wert 1023, egal welche Spannung anliegt. Anbei mein Programmcode:
1
void init_ADC(void)
2
{
3
  P6SEL &= 0x02;                        // P6.0 ADC option select 
4
  ADC10CTL0 &= ~ADC10ENC;          // Disable ADC10  
5
  ADC10CTL0 |= ADC10ON;                  // ADC12ON / reference on Avcc
6
  ADC10MCTL0 &= ADC10SREF_0;            // zwischen avcc und avss
7
  ADC10MCTL0 &= ADC10INCH_1;            // A1 also P6.1 als eingang
8
  ADC10CTL0 |= ADC10SHT_2;              // sapmle and hold 16 clock cycles
9
  ADC10CTL1 |= ADC10SSEL_3;             // sMCLK
10
  ADC10CTL1 |= ADC10DIV_7;              
11
  ADC10CTL1 |= ADC10CONSEQ_0;          //single channel conversation
12
  ADC10CTL1 |= ADC10SHP;                //sampling timer
13
  ADC10CTL1 |= ADC10SR;                 
14
  ADC10CTL2 |= ADC10PDIV_2;              // Mckl predevider /64
15
  ADC10CTL2 |= ADC10RES;          // 10 bit ergebniss
16
}
17
18
19
unsigned int sampling_ADC(void)
20
{
21
  ADC10CTL0 |= (ADC10SC + ADC10ENC);   // Sampling open
22
  while ((ADC10CTL1 & ADC10BUSY) == 1);   // ADC12BUSY?
23
  return(ADC10MEM0);  // return the value read from ADC 
24
}

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Die an dieser Stelle übliche /Standardfrage/:

Hast Du Dir schon mal die Source-Code-Beispiele von TI angesehen, die es 
auch für den von Dir verwendeten MSP430 gibt?

http://www.ti.com/lit/zip/slac555

Darin enthalten
1
msp430f522x_adc10_01.c            ADC10, Sample A0, AVcc Ref, Set P1.0 if A0 > 0.5*AVcc
2
msp430f522x_adc10_02.c            ADC10, Sample A0, 1.5V Shared Ref, Set P1.0 if A0 > 0.5V
3
msp430f522x_adc10_03.c            ADC10, Sample A10 Temp, TA0.1 Trigger, Set P1.0 if Temp++ ~2C
4
msp430f522x_adc10_04.c            ADC10, Sample A1, Signed, Set P1.0 if A1 > 0.5*AVcc
5
msp430f522x_adc10_05.c            ADC10, Sample A11, Lo_Batt, Clear P1.0 if AVcc < 2.3V
6
msp430f522x_adc10_06.c            ADC10, Internal Reference toggle
7
msp430f522x_adc10_07.c            ADC10, DMA Sample A1 64x, AVcc, Repeat Single, DCO
8
msp430f522x_adc10_10.c            ADC10, DMA Sample A2-0, 8-bit Res, Single Sequence, DCO
9
msp430f522x_adc10_11.c            ADC10, Sample A0, 1.5V Ref, TA0.1 Trig, Set P1.0 if A0>0.5V
10
msp430f522x_adc10_12.c            ADC10, Sample A5, 1.5V Ref, TA0.0 Trig, Ultra-Low Pwr
11
msp430f522x_adc10_13.c            ADC10, DMA Sample A1 32x, 2.5V Ref, TB0 Trig, DCO
12
msp430f522x_adc10_14.c            ADC10, DMA Sample A1-0 32x, AVcc, Repeat Seq, DCO
13
msp430f522x_adc10_15.c            ADC10, DMA Sample A11 32x to Flash, Int Ref, DCO
14
msp430f522x_adc10_21.c            ADC10, Window Comparator, 2.5V ref, Timer trigger, DCO

von Stefan S. (mexakin)


Lesenswert?

Chris S. schrieb:
> return(ADC10MEM0);  // return the value read from ADC
du liest channel 0 aus,

Chris S. schrieb:
> ADC10MCTL0 &= ADC10INCH_1;

Hast du wirklich INCH_1 da drauf gelegt mit &= ich hätte |= getippt.

Und ja bei TI immer mit Bsp Code anfangen und dann adaptieren und dann 
FamilyUserguide lesen bis alles geht, ist eigentlich immer nur eine 
Frage der Zeit.
Viele Erfolg

von Dirk (Gast)


Lesenswert?

Chris S. schrieb:
1
>  ADC10MCTL0 &= ADC10SREF_0;            // zwischen avcc und avss
2
>  ADC10MCTL0 &= ADC10INCH_1;            // A1 also P6.1 als eingang


ein ODER
1
  ADC10MCTL0 &= ADC10SREF_0;            // zwischen avcc und avss
2
  ADC10MCTL0 |= ADC10INCH_1;            // A1 also P6.1 als eingang

oder kürzer
1
  ADC10MCTL0 = ADC10SREF_0 + ADC10INCH_1;

von Chris S. (chris_si)


Lesenswert?

Stefan S. schrieb:

> Chris S. schrieb:
>> return(ADC10MEM0);  // return the value read from ADC
> du liest channel 0 aus,


Und wie lese ich die anderen Channel aus? Dachte es gibt nur das ADCMEM0 
Register

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Chris S. schrieb:
> Und wie lese ich die anderen Channel aus? Dachte es gibt nur das ADCMEM0
> Register

Wirf mal einen Blick in den "Family User's Guide". Da ist der ADC10 
ausführlich beschrieben.

von Chris S. (chris_si)


Lesenswert?

Rufus Τ. F. schrieb:
> Wirf mal einen Blick in den "Family User's Guide". Da ist der ADC10
> ausführlich beschrieben.

Ja dem User Guide entnehme ich nur:

"The conversion result is accessible using the ADC10MEM0 register 
independently of the conversion mode
selected by the user. When a conversion result is written to ADC10MEM0, 
the ADC10IFG0 is set."

Deshalb bin ich davon ausgegangen dass jedes Sampling Ergebnis (egal von 
welchem Eingang A0 ...A1 usw) in ADC10MEM0 gelegt wird.

von Stefan S. (mexakin)


Lesenswert?

A0 MEM0; A1 MEM1 usw. und die MEMs kannst du über INCH mit verschiedenen 
Channels belegen, oder einfach standart lassen.

Rest wie schon gesagt, anfangen mit nem Standartbeispiel und dann weiter 
vorarbeiten mit FamilyUserGuide und Forum, das klappt, hat bei mir ja 
auch funktinoiert :)

von Dirk (Gast)


Lesenswert?

Stefan S. schrieb:
> A0 MEM0; A1 MEM1 usw. und die MEMs kannst du über INCH mit verschiedenen
> Channels belegen, oder einfach standart lassen.

Hmm, der MSP430F5229 hat nur einen ADC10 mit einem ADC10MEM0-Register.

Ein MSP430F5328 hingegen hat einen ADC12 mit ADC12MEMx-Register 
(x=0-15).


... oder man schaut in die Header-Datei, um zu wissen, was der µC kann:

msp430f5229.h
1
#define ADC10MEM0_            0x0752    /* ADC10 Conversion Memory 0 */

msp430f5328.h
1
#define ADC12MEM0_            0x0720    /* ADC12 Conversion Memory 0 */
2
...
3
#define ADC12MEM15_           0x073E    /* ADC12 Conversion Memory 15 */

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.