Probleme beim Poti über ADC auslesen

OP #4473542
Lesenswert?

Hallo zusammen. Ich möchte einen Poti auslesen und auf dem Terminal 
ausgeben.
Das Terminal geht, der Poti geht Hardware-mäßig auch. Die LED auf dem 
Bild Lässt sich mit dem Fader dimmen.

GND ist mit AREF Verbunden.
Der Abgriff vom Poti geht auf den Eingang 0.
Anscheinend hab ich ein Programmier bzw Verkabelungsproblem.
Sieht jemand den Fehler?

Hier der Code:
1
#include <avr/interrupt.h>
2
#include <avr/io.h>
3
#include <stdio.h>
4

5
#define F_CPU 16000000
6
#include <util/delay.h>
7

8
#define BAUD 250000
9

10

11
 #define BAUD_PRESCALLER (((F_CPU / (BAUD * 16UL))) - 1) // Für Terminal
12

13
volatile unsigned char adc_wert;
14

15

16
 //############################################################################
17
 //Terminal Zeug
18
void USART_printS(char* StringPtr){
19
 
20
while(*StringPtr != 0x00){
21
  while(!(UCSR0A & (1<<UDRE0)));
22
    UDR0 = *StringPtr;
23
  StringPtr++;}
24
 
25
}
26

27
void USART_printI(int wert){
28
 
29
 char x[]="\n";
30
 char Ausgabe[5]={0,0,0,0,0};
31
 
32
 itoa(wert,Ausgabe,10);
33
 strcat(Ausgabe,x);
34
 USART_printS(Ausgabe);
35
  
36
}
37
//############################################################################
38

39

40
//############################################################################
41
//AD Werte einlesen
42
ISR (ADC_vect)
43
//############################################################################
44
{
45

46
 
47
  ADCSRA = 0; 
48
  
49
  adc_wert =(unsigned char)(ADC);
50
   
51
  ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADIE);
52
}
53

54

55
void setup() {
56

57
//ADC initialisieren
58
  ADMUX = (1<<REFS0);
59
  //Free Running Mode, Division Factor 128, Interrupt on
60
  ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADIE); 
61

62

63
      // UART TERMINAL
64

65
 UBRR0H = (uint8_t)(BAUD_PRESCALLER>>8);
66
 UBRR0L = (uint8_t)(BAUD_PRESCALLER);
67
 UCSR0B = (1<<RXEN0)|(1<<TXEN0);
68
 UCSR0C = (3<<UCSZ00);
69
}
70

71
void loop() {
72
  // put your main code here, to run repeatedly:
73
   
74
    
75
     USART_printI(adc_wert);
76
     _delay_ms(100); 
77
   
78
   
79
 
80
}
Angehängte Dateien:
OP #4473558
Lesenswert?

Arduinomann schrieb:
> Thgomas T. schrieb:
>> GND ist mit AREF Verbunden.
>
> Was soll das bewirken bzw was hast du dir dabei gedacht?
>
> Vielleicht malst du lieber mal einen anständigen Schaltplan damit
> man dein Chaos verstehen kann.

Habe bewusst ein Foto vom realen aufbau gemacht damit potentielle 
Verdrahtungsfehler enddeckt werden können.

Aber im Endeffekt ist das Poti Zwischen 5V und GND und der Abgriff geht 
auf ADC0 bzw A0 beim Arduino Mega.

Die LED ist ja nur zur Kontrolle da

AREF soll GND als Bezugspotential haben, AVCC ist auf 5V oder ist das so 
nicht richtig.


Mein Fehler ist dass sich nichts tut. Auf auf dem Terminal ist ein 
konstanter Wert von 255
(Firma: matzetronics) #4473649
Lesenswert?

Thgomas T. schrieb:
> Jetzt ist der Wert vom ADC
> zwischen 67 und 225, je nach Faderposition.

ADC ist auch ein 10-bit wert, kein 'unsigned char'. D.h. entweder setzt 
du den ADC auf linksbündig (ADLAR = 1) und liest nur ADCH, oder du lässt 
ADLAR auf 0 und liest ADC als ein uint16_t und arbeitest weiter mit dem 
10-bit Wert.

Wenn du AREF auf externe Referenz stellst, dann kannst du es aufs 
'obere' Ende des Faders stecken, also bei dir auf vermutlich +5V. Oder 
du stellst es per REFS auf VCC intern, dann bleibt nur den 100nF an AREF 
und es wird als Referenz die Versorgungsspannung des MC benutzt.
Nur zum Verständnis: AREF bestimmt das obere Ende des ADC Bereichs - das 
untere Ende ist immer GND.
OP #4474370
Lesenswert?

Matthias S. schrieb:
> Thgomas T. schrieb:
>> Jetzt ist der Wert vom ADC
>> zwischen 67 und 225, je nach Faderposition.
>
> ADC ist auch ein 10-bit wert, kein 'unsigned char'. D.h. entweder setzt
> du den ADC auf linksbündig (ADLAR = 1) und liest nur ADCH, oder du lässt
> ADLAR auf 0 und liest ADC als ein uint16_t und arbeitest weiter mit dem
> 10-bit Wert.
>
> Wenn du AREF auf externe Referenz stellst, dann kannst du es aufs
> 'obere' Ende des Faders stecken, also bei dir auf vermutlich +5V. Oder
> du stellst es per REFS auf VCC intern, dann bleibt nur den 100nF an AREF
> und es wird als Referenz die Versorgungsspannung des MC benutzt.
> Nur zum Verständnis: AREF bestimmt das obere Ende des ADC Bereichs - das
> untere Ende ist immer GND.

Super danke! Das mit dem 10 Bit Wert war das Problem.

Wenn ich jetzt die Werte über den Fader plotte dann fallen mir 2 Sachen 
auf.

1. Der ganz unterste Wert ist 65, ganz oben ist 996. Gibt es 
schaltungstechnisch eine Möglichkeit das zu "kalibrieren sodass ganz 
unten = 0 und ganz oben = 1023 ist?

2.
Wie im Plot zu sehen ist der Anstieg bei weitem nicht linear. Gerade am 
Anfang und am Ende sind es riesen Sprünge. Wie behebt man das am besten?
Als Fader benutze ich natürliche Lineare. Siehe hier:

https://www.reichelt.de/Schiebepotis/RS60112-LIN10K/3/index.html?&ACTION=3&LA=5000&GROUP=B28&GROUPID=3713&ARTICLE=73865&START=0&SORT=artnr&OFFSET=16

Ich lese auch nur einen Kanal aus, aber das sollte egal sein oder?
Angehängte Dateien:
#4474386
Lesenswert?

@  Thgomas Thomas (helyxc)


>Wenn ich jetzt die Werte über den Fader plotte dann fallen mir 2 Sachen
>auf.

Wo denn? WIR sehen nichts, siehe Netiquette

>1. Der ganz unterste Wert ist 65, ganz oben ist 996. Gibt es
>schaltungstechnisch eine Möglichkeit das zu "kalibrieren sodass ganz
>unten = 0 und ganz oben = 1023 ist?

Im Normalfall muss man da nichts machen. Aber es fehlt ein kleiner 
Kondensator, 10-100nF an deinem Analogeingang. Den braucht der ADC beim 
abtasten.

Dann miss mal die Eingangsspannung am ADC mit dem Multimeter bei 
min/max. Möglicherweise ist dein Fader der Übeltäter, der kann 
mechanisch/elektrisch nicht 0V und volle Spannung. Kann man leicht 
messen.

>Wie im Plot zu sehen ist

Ich seh nichts!

> der Anstieg bei weitem nicht linear. Gerade am
>Anfang und am Ende sind es riesen Sprünge.

Wie stellst du sicher, daß deine Eingangsgröße (Faderposition) sich 
gleichmäßig verändert?
OP #4474418
Lesenswert?

Falk B. schrieb:
> Was ist deine X-Achse? Hast du dort EXAKT die Position des Faders
> gemessen?

X ist Zeit, ich hab den Fader gleichmäßig hochgezogen. Ich habe direkt 
den Wert des ADCs geplottet.

Aber es scheint wohl am Fader zu liegen auch die Spannung ist SEHR 
unlinear. Muss man den speziell beschalten?  Ich habs mit einem 2. 
Baugleichen auch getestet. Genauso unlinear
Nach vll 10% des weges ist er schon auf 2.1V das passt auch zum Plot
(Firma: matzetronics) #4474425
Lesenswert?

Thgomas T. schrieb:
> Aber es scheint wohl am Fader zu liegen auch die Spannung ist SEHR
> unlinear. Muss man den speziell Beschalten oder hab ich vll nen
> schlechten Fader erwischt?

Was hast du denn für einen Widerstandswert gewählt? Das sollten nicht 
viel mehr als 5k sein, ansonsten musst du unbedingt den o.a. kleinen 
Kondensator zwischen ADC Eingang und GND schalten. Mit einem Ohmmeter 
kannst du auch mal sehen, ob der Schleifer des Faders in Mittelstellung 
gegen beide Enden den gleichen Wert hat. Nur, wenn das der Fall ist, 
hast du einen linearen erwischt.
OP #4474431
Lesenswert?

Matthias S. schrieb:
> Thgomas T. schrieb:
>> Aber es scheint wohl am Fader zu liegen auch die Spannung ist SEHR
>> unlinear. Muss man den speziell Beschalten oder hab ich vll nen
>> schlechten Fader erwischt?
>
> Was hast du denn für einen Widerstandswert gewählt? Das sollten nicht
> viel mehr als 5k sein, ansonsten musst du unbedingt den o.a. kleinen
> Kondensator zwischen ADC Eingang und GND schalten. Mit einem Ohmmeter
> kannst du auch mal sehen, ob der Schleifer des Faders in Mittelstellung
> gegen beide Enden den gleichen Wert hat. Nur, wenn das der Fall ist,
> hast du einen linearen erwischt.

10k hat er.
hier ist der Link. 
https://www.reichelt.de/Schiebepotis/RS60112-LIN10K/3/index.html?&ACTION=3&LA=5000&GROUP=B28&GROUPID=3713&ARTICLE=73865&START=0&SORT=artnr&OFFSET=16

ADC Eingang ist ADC0, und nicht AREF. richtig?
In der Mittelstellung hat er 2.3V. Wie meinst du gegen beide enden?

Ich hab einmal zwischen GND und Schieber gemessen und einmal zwischen 5V 
und Schieber. Beim letzterem sind es -2.3V
Gast #4474459
Lesenswert?

Thgomas T. schrieb:
> Falk B. schrieb:
>> Was ist deine X-Achse? Hast du dort EXAKT die Position des Faders
>> gemessen?
>
> X ist Zeit, ich hab den Fader gleichmäßig hochgezogen. Ich habe direkt
> den Wert des ADCs geplottet.
>
> Aber es scheint wohl am Fader zu liegen auch die Spannung ist SEHR
> unlinear. Muss man den speziell beschalten?  Ich habs mit einem 2.
> Baugleichen auch getestet. Genauso unlinear
> Nach vll 10% des weges ist er schon auf 2.1V das passt auch zum Plot

Audio-Potis sind gern mal logarithmisch.
OP #4474505
Lesenswert?

c-hater schrieb:
> Thgomas T. schrieb:
>
>> Aber es scheint wohl am Fader zu liegen auch die Spannung ist SEHR
>> unlinear.
>
> Böser Verdacht: War eventuell die LED noch irgendwie angeschlossen?
>
> Außerdem gibt es natürlich reichlich Schieberegler mit logarithmischer
> Kennlinie, welche tatsächlich gewollt nichtlinear sind.

Die LED ist angeschlossen, warum?

Ja, aber laut Bestellung sind es lineare. Selbst für log. wären die 
Dinger so wie sie jetzt funktionieren Müll da sie bei 10% sofort auf 2V 
springen  dann wieder langsamer machen und dann wieder abgehen. Siehe 
Plot
(Firma: matzetronics) #4474529
Lesenswert?

Thgomas T. schrieb:
> Die LED ist angeschlossen, warum?

Die verbiegt dir durch ihren Strom natürlich völlig die Kennlinie des 
Faders. Musst du entfernen.

Thgomas T. schrieb:
> Wie meinst du gegen beide enden?

Thgomas T. schrieb:
> Mit einem Ohmmeter
>> kannst du auch mal sehen, ob der Schleifer des Faders in Mittelstellung
>> gegen beide Enden den gleichen Wert hat.

Ich meine, das du den Widerstand des Faders von Schleifer zu beiden 
Enden der Kohlebahn messen solltest (ein Schiebe- als auch ein Drehpoti 
haben sowohl Anfang als auch Ende der Kohlebahn). In Mittelstellung des 
Faders sollten das etwa gleiche Widerstände sein.

Zur Verkabelung: An einem Ende sollte der Fader auf Masse liegen. Das 
andere Ende liegt auf +5V und der Schleifer geht zum ADC0 Eingang.
OP #4474948
Lesenswert?

Matthias S. schrieb:
> Thgomas T. schrieb:
>> Die LED ist angeschlossen, warum?
>
> Die verbiegt dir durch ihren Strom natürlich völlig die Kennlinie des
> Faders. Musst du entfernen.
>
> Thgomas T. schrieb:
>> Wie meinst du gegen beide enden?
>
> Thgomas T. schrieb:
>> Mit einem Ohmmeter
>>> kannst du auch mal sehen, ob der Schleifer des Faders in Mittelstellung
>>> gegen beide Enden den gleichen Wert hat.
>
> Ich meine, das du den Widerstand des Faders von Schleifer zu beiden
> Enden der Kohlebahn messen solltest (ein Schiebe- als auch ein Drehpoti
> haben sowohl Anfang als auch Ende der Kohlebahn). In Mittelstellung des
> Faders sollten das etwa gleiche Widerstände sein.
>
> Zur Verkabelung: An einem Ende sollte der Fader auf Masse liegen. Das
> andere Ende liegt auf +5V und der Schleifer geht zum ADC0 Eingang.

Habe die LED entfernt jetzt wirds noch komischer. Nach 5% des Faderwegs 
ist er schon auf 4,5V.

Der Wert ist in der Mitte 4,7kOhm zu beiden seiten hin gemessen.

Irgendwie macht das keinen Sinn für mich.
Gast #4475001
Lesenswert?

Thgomas T. schrieb:

>> Zur Verkabelung: An einem Ende sollte der Fader auf Masse liegen. Das
>> andere Ende liegt auf +5V und der Schleifer geht zum ADC0 Eingang.
>
> Habe die LED entfernt jetzt wirds noch komischer. Nach 5% des Faderwegs
> ist er schon auf 4,5V.
>
> Der Wert ist in der Mitte 4,7kOhm zu beiden seiten hin gemessen.
>
> Irgendwie macht das keinen Sinn für mich.

Für niemanden. Da aber sicher ist, dass die physikalischen Gesetze 
allgemein gültig sind, kann der Fehler nur in deinem Aufbau oder deiner 
Ansteuerung liegen.

Z.B. würde ein fälschlicherweise auf Ausgang mit H-Pegel programmierter 
PortA0 den Effekt recht gut erklären können.

Überprüfen kannst du die Sache sehr leicht mit Hilfe einer Messung der 
Stromaufnahme der Gesamtschaltung. Sehr wahrscheinlich ist die in der 
"unteren" (GND-seitigen) Endlage des Schiebereglers um ein mehrfaches 
höher als in der oberen.
Gast #4475012
Lesenswert?

Meine Güte, 1x1des Debuggens.
Erstmal die Komponenten isoliert testen. Divide and conquer.

Also. Poti raus und mit dem Multimeter eine Wiederstandskurve aufnehmen.
Dann 5V/0V ans Poti und Spannungskurve aufnehmen.
Passen die zusammen? Passen die zur Kurve am uC?

Wie ist die Spannung am offenen ADC Eingang? (Messen mit MM) wie ist die 
Spannung wenn der Ausgang belastet wird? ( z.b. mit 1k gegen GND)
Grüße
M
(Firma: matzetronics) #4475156
Lesenswert?

Hannäs schrieb:
> Schließ den Fader auf der 5V-Seite
> einfach statt dessen an REF an

Ohne Treiber ist AREF viel zu schwach, um eine 10 kOhm Last zu treiben. 
Das wird also nicht gehen. Stattdessem empfehle ich, einfach mal ein 
normales Multimeter mit an den Schleifer anzuschliessen und die Spannung 
beim Schieben zu verfolgen. Das muss ja in der Mitte des Faders etwa die 
Hälfte der Betriebsspannung sein.

Dann bitte noch zweimal überprüfen, ob der Schleifer auch wirklich auf 
ADC0 engeschlossen ist, und die Initialisierung immer noch die gleiche 
ist, die oben benutzt wurde. Bei 16MHz F_CPU ist der Vorteiler von 128 
gerade richtig, viel schneller sollte der ADC nicht getaktet werden.
#4475276
Lesenswert?

@  Thgomas Thomas (helyxc)

>X ist Zeit, ich hab den Fader gleichmäßig hochgezogen. Ich habe direkt
>den Wert des ADCs geplottet.

Naja, ob das wirklich sooo gleichmäßig war?

>Aber es scheint wohl am Fader zu liegen auch die Spannung ist SEHR
>unlinear. Muss man den speziell beschalten?

Nein.

>  Ich habs mit einem 2.
>Baugleichen auch getestet. Genauso unlinear

Wenn schon, dann nichtlinear. Aber ich vermute einen Fehler im Aufbau 
oder der Messung. So schlecht sind die Dinger keinesfalls.
Gast #4475378
Lesenswert?

Matthias S. schrieb:
> Hannäs schrieb:
>> Schließ den Fader auf der 5V-Seite
>> einfach statt dessen an REF an
>
> Ohne Treiber ist AREF viel zu schwach, um eine 10 kOhm Last zu treiben.
> Das wird also nicht gehen.

Natürlich geht das. Die 0.25mA schafft AREF locker. Aber wenn Du später 
vorhast, da 8 oder 16 Silder parallel anzuschließen, dann brauchst Du 
natürlich einen Treiber.
#4475403
Lesenswert?

@  Hannäs (Gast)


>>> Schließ den Fader auf der 5V-Seite
>>> einfach statt dessen an REF an
>
> Ohne Treiber ist AREF viel zu schwach, um eine 10 kOhm Last zu treiben.
> Das wird also nicht gehen.

>Natürlich geht das. Die 0.25mA schafft AREF locker.

Ist trotzdem sinnlos, weil der Arduino im Normalzustand VCC als VREF 
nutzt.
Gast #4475478
Lesenswert?

Thgomas T. schrieb:
> //AD Werte einlesen
> ISR (ADC_vect)
> //###################################################################### ######
> {
>
>
>   ADCSRA = 0;
>
>   adc_wert =(unsigned char)(ADC);
>
>   ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADIE);
> }

ADCSRA auf Null und dann ADPS Bits für 2MHz statt für 125kHz? Villeicht 
die ADPS auch so wie im ADC Setup stzen.
OP #4476982
Lesenswert?

Matthias S. schrieb:
> Joel schrieb:
>>>
>>>   ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADIE);
>>> }
>>
>> ADCSRA auf Null und dann ADPS Bits für 2MHz statt für 125kHz? Villeicht
>> die ADPS auch so wie im ADC Setup stzen.
>
> Ahh, siehste, hatte ich völlig übersehen. Nee, 2MHz gehen natürlich
> nicht, da kommt nur Müll aus dem ADC.

Ahhh. Ja guter Punkt. Ist behoben.

So ich habe jetzt meinen Aufbau minimiert, Dh alles weggemacht was nicht 
dafür gebraucht wird. Jetzt geht es wunderbar. Keine Ahnung wo der 
Fehler war.

Vielen Dank an alle.

Noch ein paar abschließende Fragen.

Ich habe als Referenz ja die Interne genommen. Muss trotzdem ein 
Kondensator zwischen den Pins AREF und GND?

Und muss jetzt bzw sollte auch ein Kondensator zwischen ADC0 und GND?

Danke
(Firma: matzetronics) #4476992
Lesenswert?

Thgomas T. schrieb:
> Muss trotzdem ein
> Kondensator zwischen den Pins AREF und GND?
Ja. Wenn du richtig stabile Werte haben willst, sollte man AVcc sogar 
über ein LC Glied (10µH / 100nF) ziehen, wie in den AVR Grundlagen bei 
Atmel beschrieben.
>
> Und muss jetzt bzw sollte auch ein Kondensator zwischen ADC0 und GND?

Ein kleiner 10nF hilft bei der schnellen Ladung des internen S&H 
Kondensators und filtert auch ein wenig. Er wirkt zwar auch als 
Tiefpass, aber du willst ja Potis abfragen und keinen Ultraschallsensor. 
Also bau ihn ein.

Sascha schrieb:
> Die internen ADCs sind erstaunlich gut und liefern bei 2Mhz noch 9 Bit
> und bei 4 Mhz noch 7-8.

Wir haben aber gerade gesehen, das es nicht geht - das sagen auch die 
Specs des ADC im Datenblatt. Ausserdem schwankt das auch noch von Fab zu 
Fab.
Gast #4477008
Lesenswert?

Thgomas T. schrieb:

> So ich habe jetzt meinen Aufbau minimiert, Dh alles weggemacht was nicht
> dafür gebraucht wird. Jetzt geht es wunderbar. Keine Ahnung wo der
> Fehler war.

Das ist schlecht. Das Minimum, was man als homo sapiens (= "denkender" 
(!!!) Mensch) aus sowas mitnehmen sollte, ist eine stimmige Erklärung 
für das beobachtete Verhalten.

Und das Kriterium für "stimmig" ist: man muss das "Fehlverhalten" auf 
Wunsch reproduzieren können. Erst das zeigt, dass man den (eigenen?) 
Fehler wirklich begriffen hat.
(Firma: matzetronics) #4477168
Lesenswert?

Sascha schrieb:
> Das Datenblatt sagt imho nur, dass man für volle Auflösung nicht über
> 500kHz gehen sollte.

imho reicht eben nicht, da hilft nur nachlesen:

> By default, the successive approximation circuitry requires an input clock
> frequency between 50kHz and 200kHz. If a lower resolution than 10 bits is
> needed, the input clock frequency to the ADC can be as high as 1000kHz to
> get a higher sample rate.

Also, es sind max. 200kHz für volle Auflösung und bis zu 1Mhz für 
geringere. Immer noch sehr weit weg von 2MHz.
Wenn sowas bei dir geht, heisst es nämlich noch nicht, das man die Specs 
für immer und vor allem für Anfänger ignorieren sollte. Die sind ja bei 
Atmel auch keine Trottel, die keine Ahnung von ihrer Hardware haben.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren