mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik dsPIC30F4013, ADC macht Probleme


Autor: Gustav (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich versuche grade den ADC vom dsPIC zum "laufen" zu bringen, leider 
bisher erfolglos.
Den Code packe ich hier einfach mal rein:
void Init_ADC(void)
{
        //ADCON1 Register
        //Set up A/D for Automatic Sampling
        //Use Timer3 to provide sampling time
        //Set up A/D conversrion results to be read in 1.15 fractional
        //number format.
        //All other bits to their default state
        ADCON1bits.FORM = 3;
        ADCON1bits.SSRC = 2;
        ADCON1bits.ASAM = 1;

        //ADCON2 Register
         ADCON2bits.VCFG = 0;         //Internal V+ / V-
     ADCON2bits.SMPI = 15;      //Set up A/D for interrupting after 16 samples get filled in the buffer  

        //ADCON3 Register
        //Total Conversion Time= 1/Sampling Rate = 100 microseconds
        //For fosc=117.968MHz, Tcy = 33.91 ns = Instruction Cycle Time
        //We will set up Sampling Time using Timer3 & Tad using ADCS<5:0> bits
        //All other bits to their default state
        //Let's set up ADCS arbitrarily to 38
        //So Tad = Tcy*(ADCS+1)/2 = 661.2 nanoseconds
        //So, the A/D converter will take 14*Tad periods to convert each sample
        ADCON3bits.ADCS = 38;

        //Set up Timer 3 Trigger
     
        TMR3 = 0x0000;      
      PR3 = 0x0BAF;
    IFS0bits.T3IF = 0;
        IEC0bits.T3IE = 0;
    T3CONbits.TCS = 0;
    T3CONbits.TCKPS=0;

        //ADCHS Register
        //Set up A/D Channel Select Register to convert AN5 on Mux A input
        ADCHS = 0x0005;


      //ADCSSL Register
        //Channel Scanning is disabled. All bits left to their default state
        ADCSSL = 0x0000;

        //ADPCFG Register
        //Set up channels AN5 as analog inputs and configure rest as digital
        //entered main() out of reset
        ADPCFG = 0xFFFF;
        ADPCFGbits.PCFG5 = 0;

        //Clear the A/D interrupt flag bit
        IFS0bits.ADIF = 0;

        //Set the A/D interrupt enable bit
        IEC0bits.ADIE = 1;

        //Turn on the A/D converter
        //This is typically done after configuring other registers
        ADCON1bits.ADON = 1;

        //Start Timer 3
        T3CONbits.TON = 1;
}

void __attribute__((__interrupt__)) _ADCInterrupt(void)
{
        //Clear the Timer3 Interrupt Flag
        IFS0bits.T3IF = 0;

        int i = 0;

        //Clear the A/D Interrupt flag bit or else the CPU will
        //keep vectoring back to the ISR
        IFS0bits.ADIF = 0;
        
        //Put the A/D conversion results to sigCmpx.real
        adcPtr = &ADCBUF0 ;
        
    for (i=0;i<16;i++)
          {
         (*p_sigCmpx).imag = 0x0000;
               (*p_sigCmpx++).real = *adcPtr++;         
      }
        
    if (p_sigCmpx > &sigCmpx[FFT_BLOCK_LENGTH-1])
      {
       SamplesReadyFlag ++;   // Sampling completed
         IEC0bits.ADIE = 0;    // Disable ADC interrupt
      }  
  
}

Mein Problem ist, dass meine Ergebnisse einfach nicht stimmen. Im 
AD-Buffer stehen immer die gleichen Werte egal was ich an AN5 anstelle.
Ansonsten scheint der Code ganz gut zu "laufen", zumindest kann ich in 
die Interrupt-Routine reindebuggen.
Ich weiss leider auch nicht was ich jetzt noch großartig verändern soll, 
eigentlich sind alle wichtigen Einstellungen vorgenommen wurden.

Gruß Gustav

Autor: Gustav (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also wenn ich mein Programm mit MPLAB simuliere, also ein 
Stimulus-Workbook erstelle, funktioniert es ganz wunderbar.
Wenn ichs hingegen auf dem Controller laufen bekomme ich verdammt 
komische werte oder immer die gleichen....

Autor: Gustav (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
So habe noch mal ein Bild geschossen!

Autor: Gerhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

möglicherweise wartest du nicht lange genug nach dem Umschalten auf 
einen anderen Kanal. Wie sieht dein Schaltplan aus ? Hast du einen 
Vorwiderstand an Eingängen ? Ein Vorwiderstand wirkt sich schlecht aus.

Du könntest mal versuchen die Wartezeit nach dem Umschalten des MUX zu 
erhöhen. Ist schon ne Weile her, dass ich mich damit beschäftigt habe - 
weiss deshalb nicht mehr welche Grösse das war.

Gerhard

Autor: Gustav (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HHmmmmm, Channel Scanning ist deaktiviert eigentlich kann es daran nicht 
liegen, habe eben mal ein bisschen an den Tad Zeiten rumgespielt, hat 
leider auch nichts gebracht.
Aber ist sowieso komisch, bei einem 12ADC sollte der maximale Wert wohl 
nicht höher als 2^12 liegen, ich erhalte als Ergebnis manchmal 65xxx^^. 
Passt nicht so ganz.

Gustav

Autor: Gerhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

die dsPIC's können Zahlen als int oder als Fract darstellen. Was hast du 
eingestellt ?

Gerhard

Autor: Gustav (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fract

Autor: Gustav (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber trotzdem kann der Wert ansich ja nicht größer sein als 2^12 oder 
irre ich da??

Autor: Dieter Werner (dds5)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Int und fract sind nur andere Begriffe für rechtsbündige bzw. 
linksbündige Ausrichtung des 12 Bit Ergebnisses im 16Bit Register.

Autor: Gustav (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber das Problem ist ja, dass ich scheinbar völlig willkürliche Werte 
erhalte, der AN5 liegt auf sauberen 2.5 V.

Autor: Gustav (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für eure Hilfe, mein "Problem" hat sich glücklicherweise erledigt.
Die ADC-Routine oben arbeitet korrekt, ich hab was anderes verpeilt^^.

Gruß Gustav

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.