Forum: Mikrocontroller und Digitale Elektronik Arduino ADC liest Unsinn


von someone (Gast)


Lesenswert?

Ich will einen Arduino Uno als einfachen logger verwenden (mit 
SD-shield).

Das schreiben auf die SD Karte funktioniert, nur der ADC ließt offenbar 
Blödsinn.
1
#include <SPI.h>
2
#include <SD.h>
3
4
const int chipSelect = 4;
5
  File dataFile;
6
7
uint16_t *buff;
8
uint8_t buffcnt;
9
void setup() {
10
  // put your setup code here, to run once:
11
  buff=(uint16_t*)malloc(128);
12
  buffcnt=0;
13
  SD.begin(chipSelect);
14
 
15
  
16
17
}
18
void save(){
19
  dataFile=SD.open("log.dat", FILE_WRITE);
20
  for(int i=0;i<64;i++){
21
    dataFile.println(buff[i]);
22
    }
23
  dataFile.close();
24
  }
25
26
void loop() {
27
  uint16_t voltage=analogRead(0);
28
  buff[buffcnt]=voltage;
29
  if(buffcnt=64){
30
    buffcnt=0;
31
    save();
32
    delay(10000);
33
    
34
  }
35
  
36
  
37
  
38
  
39
40
}

Zu Testzwecken habe ich A0 hart auf GND gelegt und erhalte recht 
zufällig anmutende Werte zwischen 0 und 2^16 wobei 0 deutlich öfter 
auftritt als durch eine Gleichverteilung zu erklären wäre, aber deutlich 
<10% der Messwerte sind unter 128, exakt 0 vielleicht jeder 50.

von Mein grosses V. (vorbild)


Lesenswert?

someone schrieb:
> if(buffcnt=64)
            ^
            ^
            ^

von Sascha (Gast)


Lesenswert?

Schaltplan und die Setup-Routine vom ADC bitte.

von Sascha (Gast)


Lesenswert?

2^16 ist bei einem 10 Bit ADC übrigens recht schwer.

von M. K. (sylaina)


Lesenswert?

someone schrieb:
> Zu Testzwecken habe ich A0 hart auf GND gelegt und erhalte recht
> zufällig anmutende Werte zwischen 0 und 2^16

Spricht für floaten. Sicher, dass du eine gute elektrische Verbindung 
zum Kanal 0 hast? Ich denke du hast hier einen Wackler.

von Heiko G. (heikog)


Lesenswert?

someone schrieb:

> void loop() {
>   uint16_t voltage=analogRead(0);
>   buff[buffcnt]=voltage;
>   if(buffcnt=64){
>     buffcnt=0;
>     save();
>     delay(10000);
>
>   }

Ist das der aktuelle Sourcecode? Da fehlt noch ein ++, dadurch bleibt 
bufcnt immer auf 0 stehen (bzw. wird durch if(buffcnt=64) immer auf 64 
gehalten. Dadurch sollte immer nur der zufällige Inhalt des Buffers 
zyklisch ausgegeben werden.

von W.G. (Gast)


Lesenswert?

Heiko G. schrieb:
> someone schrieb:
>
>> void loop() {
>>   uint16_t voltage=analogRead(0);
>>   buff[buffcnt]=voltage;
>>   if(buffcnt=64){
>>     buffcnt=0;
>>     save();
>>     delay(10000);
>>
>>   }
>
> Ist das der aktuelle Sourcecode? Da fehlt noch ein ++, dadurch bleibt
> bufcnt immer auf 0 stehen (bzw. wird durch if(buffcnt=64) immer auf 64
> gehalten. Dadurch sollte immer nur der zufällige Inhalt des Buffers
> zyklisch ausgegeben werden.

Außerdem

>>   if(buffcnt=64){

soll wohl heißen

>>   if(buffcnt==64){

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.