Hallo Forum,
ich bin gerade dabei ein Projekt von ATmega8 (4MHz) auf ATmega168
(18,432MHz) zu transferieren, aber der ADC will nicht so richtig
arbeiten.
Ich lese über den ADC-Eingang einen NTC-Wert, verwende die internen 1,1V
als Referenz und habe dafür die Spannungsteiler (wegen 2,56V beim mega8)
angepasst.
Nach dem Reset bekomme ich beim ersten Lesen des ADC einen plausiblen
Wert, jedes weitere Lesen liefert nur 1023.
Habe schon einiges probiert. Vielleicht könnt ihr mich auf eine
Eigenschaft oder Fehler aufmerksam machen.
Lg,
Tungsten
1 | void init_adc(){
|
2 | // Set ADC reference
|
3 | ADMUX |= (1 << REFS1) | (1 << REFS0); // Internal 1.1V Voltage Reference with external cap at AREF
|
4 |
|
5 | ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // Prescaler 128
|
6 |
|
7 | ADCSRB |= (0 << ADTS2) | (0 << ADPS1) | (0 << ADPS0); // Free Running mode
|
8 | //ADCSRA |= (1 << ADATE); // Enable ADC Interrupt
|
9 |
|
10 | ADCSRA |= (1 << ADEN);// Enable ADC
|
11 |
|
12 | ADCSRA |= (1 << ADSC); // Start conversions
|
13 | }
|
14 | void setchannel_adc(uint8_t channel)
|
15 | {
|
16 | ADMUX &= 0b11110000; //clean channel
|
17 | channel = channel & 0b00001111;
|
18 | ADCSRA &= ~(1 << ADEN);
|
19 | ADMUX = channel; //set channel
|
20 | ADCSRA |= (1 << ADEN);
|
21 | }
|
22 |
|
23 | /*
|
24 | * read from adc channel
|
25 | */
|
26 | uint16_t read_adc(uint8_t channel)
|
27 | {
|
28 | setchannel_adc(channel);
|
29 | ADCSRA |= (1 << ADSC); // Start conversion
|
30 | while( !(ADCSRA & (1<<ADIF)) ); // Wait for conversion to complete
|
31 | uint16_t adc = ADC;
|
32 | ADCSRA |= (1 << ADIF); // Clear ADIF by writing one to it
|
33 | return(adc);
|
34 | }
|
Aufruf:
1 | uint16_t ntcValue = read_adc(1);
|