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


von Karl L. (denke)


Angehängte Dateien:

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):


1
#define ADC_VREF_TYPE 0x00
2
3
unsigned int read_adc(unsigned char adc_input)
4
{ 
5
   unsigned int i;
6
   ADMUX=adc_input; //|ADC_VREF_TYPE;
7
   // Start the AD conversion
8
   ADCSRA|=0x40;       //dummy readout
9
   // Wait for the AD conversion to complete
10
   while ((ADCSRA & 0x10)==0){;}
11
   ADCSRA|=0x10; 
12
   result = ADCW; 
13
   result = 0;
14
   for (i=0; i<4; i++)
15
        {
16
                ADCSRA|=0x40;
17
                // Wait for the AD conversion to complete
18
                while ((ADCSRA & 0x10)==0){;} 
19
                result += ADCW;
20
        }
21
   result /= 4;
22
   return result;
23
}         
24
25
void main(void)
26
{ 
27
   // Analog Comparator initialization
28
   // Analog Comparator: Off
29
   // Analog Comparator Input Capture by Timer/Counter 1: Off
30
   ACSR=0x80;
31
   ADCSRB=0x00;
32
33
   // ADC initialization
34
   // ADC Clock frequency: 125,000 kHz
35
   // ADC Voltage Reference: AVCC pin
36
   // Digital input buffers on ADC0: On, ADC1: On, ADC2: Off, ADC3: Off
37
   // ADC4: Off, ADC5: Off, ADC6: Off, ADC7: Off
38
   DIDR0=0xFF; //war FC
39
   ADMUX=ADC_VREF_TYPE;
40
   ADCSRA=0x87;
41
42
while (1)
43
{
44
   if (bit_620ms != 0)
45
         {
46
             bit_620ms = 0;
47
                        adc_0 = read_adc (0x00);
48
                        adc_1 = read_adc (0x01);
49
                        
50
                                        
51
                        test_03 = adc_0/16; 
52
                        test_04 = adc_0%16;
53
                        test_04 = (test_04<<4);
54
                        can_data8[6] |= test_03;
55
                        can_data8[7] |= test_04; 
56
                        
57
                        test_01 = adc_1/16; 
58
                        test_02 = adc_1%16;
59
                        test_02 = (test_02<<4);
60
                        can_data8[4] |= test_01;
61
                        can_data8[5] |= test_02; 
62
                        
63
                        if (adc_0 == adc_1)
64
                                { 
65
                                        can_data8[1] |= 0xFF;
66
                                }
67
                        else
68
                                { 
69
                                        can_data8[1] |= 0x66;
70
                                }   
71
                                
72
                        CAN_SET_CHANNEL(CHANNEL_8);
73
                        conf_tx = can_tx_MOb8.ctrl;
74
                        pt_candata_tx = can_tx_MOb8.pt_donne;
75
                        can_tx_id = can_tx_MOb8.id;
76
                        SendCanMsg();
77
                        
78
                 
79
         }
80
81
}

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

von denke (Gast)


Lesenswert?

Hallo nochmal,

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

Danke

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.