Hallo in die Runde,
ich bin mir nicht sicher ob ich das richtig verstanden habe was ich bis
jetzt über den ADC gelesen/gelernt habe. Ich möchte gerne bei dem Atmega
328p die Spannung an einem Akku messen. Als Referenz möchte ich die
interne 1,1 Volt nehmen ADC Eingang ist ADC3 (siehe Datenblatt Seite
317. Nun habe ich dazu folgenden Code geschrieben:
1 | #define ADC_MUX_MASK ((1<<MUX3)|(1<<MUX2)|(1<<MUX1)|(1<<MUX0))
|
2 |
|
3 | void setup() {
|
4 | ADMUX = (1 << REFS1) | (1 << REFS0); //Interne 1.1 Volt
|
5 | ADCSRA |= (1 << ADPS2) | (1 << ADPS1); // Frequenzvorteiler
|
6 | }
|
7 |
|
8 | void loop() {
|
9 | adcval = ADC_Read(3);
|
10 | //mach was mit adcval
|
11 | }
|
12 |
|
13 | int ADC_Read(int kanal) {
|
14 | int a;
|
15 | ADMUX = (ADMUX & ~ADC_MUX_MASK) | (kanal & ADC_MUX_MASK);
|
16 | ADCSRA |= (1 << ADEN); //ADC starten
|
17 | delay(250);
|
18 | ADCSRA |= (1 << ADSC); //DUMMY erste Messung
|
19 | while (bitRead(ADCSRA, ADSC)); //warten bis Messung beendet ist
|
20 | a = ADC; //ADC auslesen
|
21 | a = 0;
|
22 |
|
23 | for (int i = 0; i < 5; i++) { //Mehrfachmessung starten
|
24 | ADCSRA |= (1 << ADSC); //Erste Messungen
|
25 | while (bitRead(ADCSRA, ADSC)); //warten bis Messung beendet ist
|
26 | a += ADC;
|
27 | }
|
28 | a = a / 5;
|
29 |
|
30 | return a;
|
31 | }
|
Ich bin mir ein wenig unsicher ob der Code stimmt, da Anfänger und das
Ergebnis sobald ich eine LED an PB5 mit HIGH einschalte der ADC Wert um
20 sinkt (475 ohne LED 455 mit eingeschalteter LED). Am AREF sitzt wie
unter
https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Analoge_Ein-_und_Ausgabe
beschrieben ein Kondensator.
Ich bin für jeden Tipp Dankbar
Viele Grüße
Torsten