Hallo zusammen,
ich beschäftige mich derzeit mit dem Launchpad, respektive mit dem
MSP430g2231 ADC10.
Ich habe das Board seit ein paar Tagen und habe ein kleines Testprogram
für den ADC10 geschrieben. Ich verwende die interne 1,5V Referenz und
messe mit dem ADC 256 samples und gebe den Meßwert, über USB, an einem
Terminal aus.
Meine Frage bezieht sich auf den ADC... vorweg, ich habe keinerlei
Erfahrung mit dem MSP ADC10 und daher weiß ich nicht ob die
Einstellungen (ADC Clock) etc. richtig vorgenommen ist. Das Program
funktioniert soweit aber die letzten Stellen sind recht unruhig und das
obwohl ich schon reichlich Mittelwertbildung betreibe.
Die Initialisierung sieht so aus:
1 | void main (void)
|
2 | {
|
3 | WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
|
4 | BCSCTL1 = CALBC1_1MHZ;
|
5 | DCOCTL = CALDCO_1MHZ; // SMCLK = DCO = 1MHz
|
6 |
|
7 | P1SEL |= TXD;
|
8 | P1DIR |= 0x43; // Set Led1, Led2, TXD to output direction
|
9 |
|
10 | ADC10CTL1 = INCH_5;
|
11 | ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON;
|
12 | ADC10AE0 |= 0x10;
|
13 |
|
14 | __bis_SR_register(GIE); // interrupts enabled
|
15 |
|
16 | while (1) {
|
17 | AdcValOut (getAdcValue ());
|
18 | P1OUT ^= LED2;
|
19 | delay (); // ~ 4x per Second
|
20 | }
|
21 | }
|
Die Wandlerroutine so:
1 | // adc loop
|
2 | int16_t getAdcValue (void)
|
3 | {
|
4 | uint16_t AvgCount = 0;
|
5 | int32_t AvgSum = 0;
|
6 |
|
7 | for (AvgCount = 0; AvgCount < 256; AvgCount ++) {
|
8 | ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start
|
9 | while (ADC10CTL1 & ADC10BUSY); // ADC10BUSY?
|
10 | AvgSum += ADC10MEM; // Average over 256 samples
|
11 | }
|
12 | return (((AvgSum >> 8) *15000) / 1024);
|
13 | }
|
Hoffe ihr habt eine Idee hierzu.