Moin Moin, Entschuldigt bitte diese Frage. Ich habe natürlich die Suchfunktion vorher benutzt :-) ENV: ATmega8, WIN-AVR-20100110 Reicht es aus den ADC nur einmalig für folgende single conversion auf verschiedenen Kanälen mit der "dummy conversion" zu initialisieren? Laut Datenblatt sind die verschiedenen Kanäle eines ADC über einen MUX aufgeteilt und so sollte eine einmalige initialisierung ausreichen. Ich bin mir da aber nicht zu 100% sicher. ADC_init() wird im main vor der main-loop aufgerufen und rd_ADC() dann n-mal für verschiedene Kanäle in der main-loop.
1 | #define ADC_LOOP 128
|
2 | |
3 | void
|
4 | ADC_init(void) { |
5 | |
6 | uint8_t result; |
7 | |
8 | // External Vref, single conversion (default set ADMUX reg)
|
9 | // Left adjusted result in ADCH for 8 bit result
|
10 | ADMUX |= (1<<ADLAR); |
11 | |
12 | // Enable ADC, 250Khz ADC clock
|
13 | ADCSRA |= (1<<ADEN) |(1<<ADPS2) | (1<<ADPS0); |
14 | |
15 | // Initial conversion for warm up
|
16 | ADCSRA |= (1<<ADSC); |
17 | while (ADCSRA & (1<<ADSC) ); |
18 | result = ADCH; |
19 | }
|
20 | |
21 | uint8_t
|
22 | rd_ADC(uint8_t channel) { |
23 | |
24 | uint16_t result = 0; |
25 | uint8_t cnt = 0; |
26 | |
27 | ADMUX |= (1<<channel); |
28 | |
29 | // run conversion ADC_LOOP times and build averange
|
30 | for(cnt = 0; cnt <= ADC_LOOP; cnt++) { |
31 | |
32 | ADCSRA |= (1<<ADSC); |
33 | while (ADCSRA & (1<<ADSC) ); |
34 | result += ADCH; |
35 | }
|
36 | |
37 | result /= ADC_LOOP; |
38 | ADMUX &= ~(1<<channel); |
39 | |
40 | return (uint8_t)result; |
41 | }
|
Danke für eure Geduld! Gruß Karsten