Forum: Mikrocontroller und Digitale Elektronik SAM C21 Harmony3 ADC Konfiguration


You were forwarded to this site from EmbDev.net. Back to EmbDev.net
von Markus S. (markussch)


Angehängte Dateien:

Lesenswert?

Hallo,

ich versuche auf dem ATSAMC21E15A den ADC so zu konfigurieren, das ich 
zwei Analogeingänge (AIN6+AIN7) per automatischer Sequenz einlesen kann. 
Leider liest er aber immer nur einen ein!?

Manuell kann ich beide Eingänge einlesen!

Ich habe das Projekt mit Harmony3 erstellt, s. Bild.
1
  ADC0_Enable();
2
   ADC0_ConversionStart();
3
  while ( true )
4
    {
5
        /* Wait till ADC conversion result is available */
6
        while(!ADC0_ConversionStatusGet())
7
        {
8
          //  SERCOM1_USART_Write("X", 1);
9
        };
10
 
11
        /* Read the ADC result */
12
        adc_count = ADC0_ConversionResultGet();
13
 
14
       // SERCOM3_USART_Write(&text[0], sizeof(text)-1);
15
  
16
        sprintf(txData, "ADC Count = 0x%03x, ADC Input Voltage = %d.%02d V \r\n", adc_count, adc_count,adc_count);
17
        SERCOM1_USART_Write(txData, strlen(txData));
18
 
19
        ADC0_ConversionStart();
20
        SYSTICK_DelayMs(500);
21
        /* Maintain state machines of all polled MPLAB Harmony modules. */
22
        SYS_Tasks ( );
23
}

Was mache ich falsch?

Gruß
Markus

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Markus S. schrieb:
> Leider liest er aber immer nur einen ein!?
Woran siehtst du das? Und welcher ist es? Ich habe da so einen Verdacht.

> Was mache ich falsch?
Das ist der Fehler:
> SYSTICK_DelayMs(500);
Denn im Datenblatt im Kapitel "38.6.2.12 Automatic Sequences" steht ganz 
klar, dass der Wandler gnadenlos weitertaktet und nach einem 
Wandlungsende schnellstmöglich das gerade eben gewandelte Ergebnis 
abgeholt werden muss. Wenn das nicht passiert, dann wird es 
überschrieben:
1
When a sequence starts, the Sequence Busy status bit in Sequence Status 
2
register (SEQSTATUS.SEQBUSY) will be set.
3
When the sequence is complete, the Sequence Busy status bit will be cleared.
4
Each time a conversion is completed, the Sequence State bit in Sequence 
5
Status register (SEQSTATUS.SEQSTATE) will store the input number from which 
6
the conversion is done. The result will be stored in the RESULT register, 
7
and the Result Ready Interrupt Flag (INTFLAG.RESRDY) is set.
Letztlich wandelt der also den ersten Kanal, schreibt das Ergebnis ins 
RESULT Register und setzt das Interrupt-Flag. Dann geht es nebenher 
weiter, er wandelt den zweiten Kanal, schreibt das Ergebnis ins RESULT 
Register und setzt das Interrupt-Flag. Damit sind alle Kanäle gewandelt, 
die Sequenz zu Ende und das SEQBUSY wird zurückgesetzt.


Und du hast dank deiner unnötigen halben Sekunde Tiefschlaf die Zeit 
verplempert, währen der du das erste Ergebnis hättest holen können und 
müssen.

Nicht ganz umsonst wird da für die zeitnahe Bearbeitung extra ein 
Interrupt ausgelöst.

Probiers mal in die Richtung:
1
  while ( true )
2
    {
3
        ADC0_ConversionStart();
4
5
        while(!ADC0_ConversionStatusGet()) {}
6
        adc_count6 = ADC0_ConversionResultGet();
7
8
        while(!ADC0_ConversionStatusGet()) {}
9
        adc_count7 = ADC0_ConversionResultGet();
10
11
        sprintf(txData, "ADC 6 : 0x%03x -  ADC 7 : 0x%03x", adc_count6 ,adc_count7);
12
13
        SERCOM1_USART_Write(txData, strlen(txData));
14
15
        /* Maintain state machines of all polled MPLAB Harmony modules. */
16
        SYS_Tasks ( );
17
  
18
        // Und wenns denn unbedingt sein muss, dann hier Zeit verplempern...
19
}

> Was mache ich falsch?
Rein organisatorisch: du machst zu viele Threads für das selbe Thema 
auf...

: Bearbeitet durch Moderator
von Markus S. (markussch)


Lesenswert?

Danke, das war der Fehler, jetzt funktioniert es!

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.