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