www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP ADC Problem bei Spannungsänderung am Eingang (AT90CAN32)


Autor: Karl Lehnen (denke)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe im Forum und im Internet allgemein schon gesucht konnte aber 
nicht zu meinem Problem finden.

Ich habe gestern versucht 2 ADC Kanäle an einem AT90CAN32 Controller in 
Betrieb zu nehmen. Das Wesentliche im Quellcode sieht folgendermaßen aus 
(bitte habt Verständnis das ich hier nicht den gesammten code poste):


#define ADC_VREF_TYPE 0x00

unsigned int read_adc(unsigned char adc_input)
{ 
   unsigned int i;
   ADMUX=adc_input; //|ADC_VREF_TYPE;
   // Start the AD conversion
   ADCSRA|=0x40;       //dummy readout
   // Wait for the AD conversion to complete
   while ((ADCSRA & 0x10)==0){;}
   ADCSRA|=0x10; 
   result = ADCW; 
   result = 0;
   for (i=0; i<4; i++)
        {
                ADCSRA|=0x40;
                // Wait for the AD conversion to complete
                while ((ADCSRA & 0x10)==0){;} 
                result += ADCW;
        }
   result /= 4;
   return result;
}         

void main(void)
{ 
   // Analog Comparator initialization
   // Analog Comparator: Off
   // Analog Comparator Input Capture by Timer/Counter 1: Off
   ACSR=0x80;
   ADCSRB=0x00;

   // ADC initialization
   // ADC Clock frequency: 125,000 kHz
   // ADC Voltage Reference: AVCC pin
   // Digital input buffers on ADC0: On, ADC1: On, ADC2: Off, ADC3: Off
   // ADC4: Off, ADC5: Off, ADC6: Off, ADC7: Off
   DIDR0=0xFF; //war FC
   ADMUX=ADC_VREF_TYPE;
   ADCSRA=0x87;

while (1)
{
   if (bit_620ms != 0)
         {
             bit_620ms = 0;
                        adc_0 = read_adc (0x00);
                        adc_1 = read_adc (0x01);
                        
                                        
                        test_03 = adc_0/16; 
                        test_04 = adc_0%16;
                        test_04 = (test_04<<4);
                        can_data8[6] |= test_03;
                        can_data8[7] |= test_04; 
                        
                        test_01 = adc_1/16; 
                        test_02 = adc_1%16;
                        test_02 = (test_02<<4);
                        can_data8[4] |= test_01;
                        can_data8[5] |= test_02; 
                        
                        if (adc_0 == adc_1)
                                { 
                                        can_data8[1] |= 0xFF;
                                }
                        else
                                { 
                                        can_data8[1] |= 0x66;
                                }   
                                
                        CAN_SET_CHANNEL(CHANNEL_8);
                        conf_tx = can_tx_MOb8.ctrl;
                        pt_candata_tx = can_tx_MOb8.pt_donne;
                        can_tx_id = can_tx_MOb8.id;
                        SendCanMsg();
                        
                 
         }

}

Das funktioniert auch direkt nach dem Einschalten der Betriebsspannung! 
Ich kann im Identiefier den ich alle 620ms sende sehen das mir die 
Sapnnung, die ich an die beiden ADC's angelegt habe, angezeigt wird - 
sehr genau, wie ich es mir vorstelle (siehe Bild canoe_adc_02.GIF im 
Anhang). Die 0x07F entsprechen rechnerisch 0,62V, die ich messtechnisch 
exat bestätigen kann.
Wenn ich die Betriebsspannung abschalte und die zu messenden Spannungen 
am ADC Eingang ändere, dann wieder die Betriebsspannung einschalte 
bekomme ich die geänderten Spannungswerte ebenfalls richtig angezeigt.

Nun mein Problem: Die Anzeige der richtigen Werte ist nur nach dem 
Einschalten ohne Änderung der zu messenden Spannung gewähleistet. Wenn 
ich die zu messende Spannung am ADC Eingang ändere, und zwar egal ob die 
Spannung größer oder kleiner wird, läuft einer der beiden Variablen z.B. 
gegen 0x3FF (oder auch 0x0FF) und dann passiert gar nichts mehr!
Zum Verständnis versuche ich es nochmal zu formulieren. Auch wenn die zu 
messende Spannung kleiner wird, wird der Wert, welcher mir für diese 
Spannung angezeigt wird größer. Das geht solange bis an der Stelle 16^0 
und 16^1 ein FF steht. Danach ändern sich die Werte gar nicht mehr.

Kann mir jemand helfen? Ich bin für jeden Gedankenanstoß dankbar.

Gruß,

Karl

Autor: denke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nochmal,

gerade habe ich den Fehler selber gefunden!
Tückischer Zuweisungsoperator |=.

Danke

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.