www.mikrocontroller.net

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

Autor: Karl Lehnen (denke)
Datum: 09.04.2008 11:50
Dateianhang: canoe_adc_02.GIF (3,2 KB, 10 Downloads)
preview image for canoe_adc_02.GIF

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: 09.04.2008 12:02

Hallo nochmal,

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

Danke

Antwort schreiben

Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos verwenden, Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net