10k Poti mit Arduino

Gast #5780642
Lesenswert?

Moin,
ich würde gerne den Wert eines 10k Poti mit einem Arduino einlesen. 
Leider funktioniert das nur bedingt.

Zunächst einmal verwende ich ein 5 V Schaltnetzteil von Meanwell und 
versorge damit über den VIN-Pin meinen Arduino. Die 5 V wollte ich auch 
dem Poti bereitstellen. Wenn ich den Poti jedoch betreibe erscheint z.B. 
bei der hälfte statt 1023/2 = 511 der Wert 800. Wenn ich den Poti direkt 
am 5V Pin vom Arduino anschließe, läuft alles wunderbar. Jedoch wollte 
ich die 5 V überall auf meiner Platine über das Netzteil zur Verfügung 
stellen und eigentlich müsste dann am Arduino Pin auch mein Wert 2,5V 
über den Poti ankommen, auch wenn von Extern mit 5V versorgt.  Oder irre 
ich mich?

--
Betreff korrigiert
-rufus
Gast #5780652
Lesenswert?

V+ und V- (5V Netzteil) direkt an der Arduni VIN und GND. Vom Netzteil 
V+ und V- außerdem direkt auf die Protoplatine. Aber ich bekomme immer 
den Wert 800 statt 511. Wenn ich den Poti am 5V Pin des Arduino 
anschließe, geht es ...
Gast #5780663
Lesenswert?

Vin geht an einen 5V Festspannungsregler. Der erwartet natürlich Vin > 
Vout und da du mit 5V rein gehst kommen <5V raus. Angenommen du nutzt 
Vdd als Vref für den ADC und die externen 5V für das Poti sind alle ADC 
Werte höher als angenommen, da Vref niedriger ist als du annimmst.

Die externen 5V kommen an den 5V Pin des Arduino und nicht Vin.
Gast #5780665
Lesenswert?

10k Poti mit Arduino schrieb:
> Zunächst einmal verwende ich ein 5 V Schaltnetzteil von Meanwell und
> versorge damit über den VIN-Pin meinen Arduino.

Dort werden aber mindestens 7V benötigt.

> Wenn ich den Poti jedoch betreibe erscheint z.B.
> bei der hälfte statt 1023/2 = 511 der Wert 800

Das ist logisch, denn dein Mikrocontroller bekommt zu wenig 
Versorgungsspannung, nämlich ca. 3V. Deswegen sind die Messwerte höher 
als erwartet.

3V / 1024 = 3mV
2,5V / 3mV = 833  -> Passt ungefähr

Außerdem darf die Spannung am analogen Eingang nie höher sein, als die 
Versorgungsspannung des Mikrocontrollers.

Lösungsvorschlag:

a) Verwende ein Netzteil mit mindestens 7V an Vin. Außerdem sol das Poti 
an GND und 5V angeschlossen erden, nicht ans Netzteil.

b) Schließe das Netzteil stattdessen an den +5V Pin an
Gast #5780669
Lesenswert?

Wollte dich jetzt nicht veräppeln.

Was hast du denn für einen Arduino ?


Wenn es einer mit 3,3 V ist dann würde der Wert nämlich
passen.Bei VCC 3,3V wären 2,5V ungefähr der Wert 800.

Eingang richtig konfiguriert....ach ne dann würde der Fehler nicht
auftauchen, wenn du das vom Board direkt versorgst.

Darum messe mal deine Spannung am RAW Eingang bzw VCC.....
Gast #5780689
Lesenswert?

10k Poti mit Arduino schrieb:
> UNd an AREF 3,3

Aha. Dann müsste dein Messwert jetzt 1023 (nicht 800) sein. Denn du hast 
eine Referenz-Spannung von 3,3V, das wäre die maximal messbare Spannung.

Wo kommen die 3,3V denn her? Wenn dein Mikrocontroller mit 5V versorgt 
wird, muss da irgendwo noch eine 3,3V Quelle sein.

Welchen Arduino verwendest du?
Arduino Uno R3 wird es wohl kaum sein, denn der hat mit 3,3V nichts zu 
tun.
Gast #5780692
Lesenswert?

Hab das Problem gefunden, aber noch keine Lösung. Ich verwende ja für 
meinen Thermistor 3,3V. Von den 3,3V geht ein Strang auf AREF. Das war 
ein Lösungsvorschlag von der Adafruit-Webseite, um die Genauigkeit zu 
erhöhen. Schließe ich 5V an VREF funktioniert es. Jetzt bleibt die 
Frage, wenn ich an VREF nichts anschliesse, wieso es dann nicht geht. 
Muss ich an VREF stets eine Spannungsquelle anschließen, wenn ich andere 
Bauteile von extern betreibe?
Gast #5780695
Lesenswert?

10k Poti mit Arduino schrieb:
> Ich verwende ja für meinen Thermistor 3,3V.

Zeige deinen Schaltplan und den Quelltext. benenne alle verwendeten 
Bauteile. Ich habe keine Lust mehr, dir jedes relevante Detail einzeln 
aus der Nase zu ziehen - vor allem wenn die Wahrheiten erst kommen, 
nachdem ich bewiesen habe, dass deine Infos falsch/unvollständig sind.
Gast #5780716
Lesenswert?

1
// 3-Pin Ventilator
2
const int motorPin_Fan1 = 3;
3
int speed_Fan1; //Variable to store Speed, by defaul 0 PWM
4
int flag_Fan1;
5
const int potiPin_Fan1 = A2;
6
const int tachoPin_Fan1 = 2;        // Pin des Tachosignals des Lüfters
7
// Variablen
8
int fanSpeed_Fan1 = 0;              // Variable für die Lüftergeschwindigkeit
9
int fanMin_Fan1 = 50;
10
int potiVar_Fan1 = 0 ;              // Variable zum speichern des Potentiometereingangs
11
int abfrZeit_Fan1 = 1000;           // Zeitabstand für die Abfragen des Tachosignals
12
long tachoMillis_Fan1 = abfrZeit_Fan1;   // Zeitabstand für Pulse Stretching Funktion
13
float rps_Fan1 = 0;                 // Variable mit Kommastelle zur Berechnung der Umdrehungen pro Sekunde
14
int rpm_Fan1 = 0;                   // Variable für die gemittelte Drehzahl
15
float umdrZeit_Fan1 = 0;            // Variable mit Kommastelle für die Zeit pro Umdrehung des Lüfters
16
float flankenZeit_Fan1 =0;          // Variable mit Kommastelle für die Zeit pro Puls des Lüfters
17

18
 // 3-Pin Ventilator
19
  pinMode(motorPin_Fan1, OUTPUT); //Set pin 3 as an OUTPUT
20
  pinMode(potiPin_Fan1, INPUT) ;      // Setzt den LEDPin als Ausgang
21
  pinMode(tachoPin_Fan1, INPUT);      // Setzt den Tacho Pin als Eingang
22

23
TCCR2B = (TCCR2B & 0b11111000) |0x01; // funktioniert noch nicht so, läuft ruckartig an.
24

25
  Serial.begin(9600); //Init serial communication
26

27
void loop()
28
{
29
  int temp, fan1;
30
  fan1 = Fan3Pin_out();
31
  LCD_out(temp, fan1);
32

33
}
34

35

36
// Lüfter 1 mit 3 Pin Anschluss
37
int Fan3Pin_out() {
38
potiVar_Fan1 = analogRead(potiPin_Fan1) ;               // Liest das Potentiometer aus
39
  fanSpeed_Fan1 = map(potiVar_Fan1, 50, 1023, fanMin_Fan1, 255);   // Verteilt den PWM Wert über den Messbereich des Potis
40
   Serial.println("potiVar_Fan1");
41
   Serial.println(potiVar_Fan1);
42
  // Unterer Potenziometerbereichs (0-50) = Lüfter aus
43
  if(potiVar_Fan1 < 50)
44
  {                  
45
    fanSpeed_Fan1 = 0;
46
  }
47
   
48
  analogWrite(motorPin_Fan1, fanSpeed_Fan1);     // Gibt die Variable mit PWM aus
49
   
50
  // Alle 2000ms pulse_stretch starten um die Drehzal auszulesen
51
  if((millis() - tachoMillis_Fan1) >= abfrZeit_Fan1) 
52
  {      
53
    pulse_stretch_Fan1();
54
  }
55

56
  delay(100);
57
  return speed_Fan1;
58
}
Gast #5780721
Lesenswert?

Du agierst planlos.

Zeige Quelltext und Schaltplan. Und wenn du misst, zeichne ein, wo du 
was gemessen hast.

An den Vin Pin musst du wie gesagt mindestens 7V anschließen, weil der 
Arduino sonst nur etwa 3V Spannungsversorgung hat. Wenn du dann das Poti 
an den 5V Pin anschließt, hat das auch nur 3V.

Ich würde Dir empfehlen, das Programm auf ein Minimum zu reduzieren, wo 
das Problem noch gerade erkennbar und nachvollziehbar ist. Das hilft 
Dir, den Überblick nicht zu verlieren.

So oder so kommst du nicht umhin, einen Schaltplan zu zeichnen. Du 
verzettelst dich sonst, und uns auch.
Gast #5780741
Lesenswert?

Gute Entscheidung.

Folgende Spannungen sind hier relevant:

Der ADC vergleicht seine Eingangsspannung mit Aref. Aref kann wahlweise 
von extern zugeführt werden, oder intern erzeugt werden (ist 
programmierbar).

Sowohl die Spannung an Aref als auch am analogen Eingang darf nicht 
höher als die Stromversorgung des Mikrocontrollers sein, welche du am 
+5V Pin messen kannst.

Der Spannungsregler auf dem Board benötigt mindestens 7V an Vin, um 
daraus 5V zu erzeugen.
Gast #5780751
Lesenswert?

Hi

>Ich gehe nochmals alles Schritt für Schritt durch und werde mich melden,
>wenn ich alles sauber niedergeschrieben habe.

Dann korrigiere gleich den Fehler

ADC value = Vi * 1023 / Varef

in Datenblatt konformes

ADC = VIN * 1024/VREF

MfG Spess

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