Forum: Mikrocontroller und Digitale Elektronik Mehrere ADC Kanäle simultan messen


von Sönke Heidkamp (Gast)


Angehängte Dateien:

Lesenswert?

Hallo, ich ahbe folgendes Problem:

Für mein DUO-LED Fahrradlicht betreibe ich zwei Step-Down Wandler für 
bis zu 1A und um das Tastverhältnis der PWMs zu regeln, möchte ich die 
Ströme über zwei 0,5Ohm Shunts gegen Masse mit 10-facher Verstärkung 
messen. Wenn ich einen einzelnen Kanal betreibe, funtkioniert die 
Schaltung. Wenn ich einen anderen betreibe auch, aber beide zusammen mit 
der Batterie Überwachung verfälscht das Ergebnis der Messung um den 
gefühlten faktor 10 nach unten.

Hier meine Interrupt Routine:

SIGNAL(SIG_ADC)
{
  if(ADC_COUNT)
    ADC_TMP+=(ADC<<1);

  ADC_COUNT++;

  if(ADC_COUNT>1)
  {
    switch(ADC_CHANNEL)
    {
    case(0):                  // BATTERY
      UBAT=ADC_TMP;
      ADC_CHANNEL=1;
      ADMUX|= 0b01001001;            // AREF/right/2-CH amp./10*ADC1->0
    break;

    case(1):                  // NEAR LED
      I1=ADC_TMP;
      if((I_SET>I1) && (OCR1A>400)){
        OCR1A--;}
      else if((I_SET<I1) && (OCR1A<1022)){
        OCR1A++;}
      ADC_CHANNEL=2;
      ADMUX|= 0b01001101;            // AREF/right/2-CH amp./10*ADC3->2
    break;

    case(2):                  // FAR LED
      I2=ADC_TMP;
      if((I_SET>I2) && (OCR1B>400)){
        REDOFF
        GREENON
        OCR1B--;}
      else if((I_SET<I2) && (OCR1B<1022)){
        REDON
        GREENOFF
        OCR1B++;}
      ADC_CHANNEL=0;
      ADMUX|= 0b01000111;            // AREF/right/8 unipol./ADC7
    break;
    }
    ADC_COUNT=0;
    ADC_TMP=0;
  }

  ADCSRA|= (1<<ADSC);                //start next Conversion*/
}

Ich verzweifle an diesem Fehler, vielleicht kann mir ja jemand einen 
heißen Tipp geben, was man beachten muss um mehrere Kanäle quasi 
parallel zu messen.

mfg Sönke

von Gerhard (Gast)


Lesenswert?

Hallo

ich kenne mich mit ATMEL nicht aus. Aber bei den PIC's gilt, dass man 
beim Umschalten von einem Kanal auf einen anderen erst mal ein bisschen 
warten muss, damit sich die Multiplexer-Eingangs-Kapazität auf den neuen 
Spannungswert aufgeladen hat. Das ist bei ATMEL vermutlich genauso. Also 
studier nochmal das datenblatt, ob da nicht auch so eine Wartezeit 
vorgesehen ist, denn nach so einem Fehler sieht es für mich aus.

Gruß
Gerhard

von MWS (Gast)


Lesenswert?

Hier ist Dein Fehler:
1
ADMUX|= 0b01001001;            // AREF/right/2-CH amp./10*ADC1->0
2
...
3
ADMUX|= 0b01001101;            // AREF/right/2-CH amp./10*ADC3->2
4
...
5
ADMUX|= 0b01000111;            // AREF/right/8 unipol./ADC7
Du darfst nicht verodern, nach 3 Durchgängen ist ein sich nicht mehr 
ändernder Zustand erreicht.

Außerdem ist Deine Bitschreibweise unübersichtlich.

von Sönke Heidkamp (Gast)


Lesenswert?

DAAANNKEEE!!

Ich hatte zunächst immer nur die Bits getoggelt,aber weil der Ausdruck 
zu lang war habe ich die Binärzahlen eingesetzt und das |= vergessen. 
Irgendwann sihet man es einfach nicht mehr, auch wenn ich wusste, dass 
es an diesem Befehl liegen muss.

VIELEN DANK!!!
Im endeffekt hat er von ADC3 nach 2 mit 200 facher auflösung gegen 5V 
gemessen. Daher auch der um den Faktor 20 kleinere Strom...

mfg Sönke

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.