Anfängerfrage

Hallo Ihr,

mein Anliegen ist:
ich möchte gerne über einen PWM ausgang mit Schieberegler(VB.net) eine bestimmte Voltzahl
(0-5) einstellen - bis dahin keine Problene funktioniert!
Nun - da bei der Regelung mit der Voltzahl (0-5) auch der Strom fällt (mA) möchte ich gerne
fragen ob jemand für mich eien Lösung hat - den Strom (mA) konstant auf 20 mA zu halten
(Regelbar);

Besten Dank im vorraus

Euer Anfänger
mili

hi,

willkommen im forum.

nur zur sicherheit: Du weißt schon, daß Du bei PWM immer nur 0V oder 5V rausbekommst? nur halt als rechteck.

gruß stefan

Und den Strom den der Arduino am PWM-Pin-Ausgang liefert, kannst du nicht direkt regeln.

Da musst du dir sicher etwas anderes ausdenken.

Bin selbst Anfänger würde aber behaupten dass du über PWM einen "externen Spannungsregler" ansteuern musst. Schau dir mal das hier an... könnte ggfs genau das sein was du suchst: Digitale Spannungsregelung mit MOSFET und Arduino (Teil 1) | Der Elektronik Freak
Digitale Spannungsregelung mit MOSFET und Arduino über PWM (Teil 3) | Der Elektronik Freak

Vorab: meine Vorredner haben recht, aber das ist für deinen Fall glaube ich, grad nicht relevant.

Du kannst über PWM den Mittelwert der Spannung am Pin ändern.
Das ist richtig.

Aber der Strom, der fließt, der hängt von der Last ab, die am Pin hängt.
Strom und Spannung kannst du unabhängig voneinander nicht regeln.

Man kann sicherlich auch den Strom regeln (und die Spannung damit aber auch).
Ich verstehe dein Anliegen so, dass du am Pin einen Verbraucher hast, und durch den 20mA fließen lassen möchtest?

Dazu bräuchte es eine Strommessung (wahrscheinlich)

Vielleicht beschreibst du etwas ausführlicher, was du tun willst, dann findet sich sicherlich eine Lösung.

Man kann einen Widerstand in den Verbraucherpfad einfügen und dessen Spannungsabfall messen, um daraus einen Regelkreis zu bauen.

PWM-Ausgang wird mit Kondensator gepuffert, geht auf den Verbraucher, danach einen Messwiderstand von 10Ohm gegen Masse. Den Analogeingang mit möglichst kleiner Referenzspannung betreiben, damit halbwegs eine Auflösung erreicht wird.

Die Frage ist allerdings welchen Innenwiderstand ein Verbraucher überhaupt hat um die 20mA zu verbrauchen. reichen die 5V dazu überhaupt? bzw am Messwiderstand verlierst du ja auch noch 0,2V ungefähr bei 20mA.

Jedenfalls dann aus dem Messwert von 0,2V den PWM Ausgangswert generieren und nachregeln. Muss man vermutlich ausprobieren.

Ich denke, dein Problem gliedert sich in mehrere Teile.

z.B.: wie kannst du den Strom messen, der fließt?
wie kannst du die Spannung steuern (Ich denke, um Hautwiderstand zu messen, ist eine reine gleichspannung nötig, PWM nützt da nix)

Und dann: wie kriege ich das auf den PC (ich denke dein Visual Basic läuft auf dem PC?)

Erzähle doch mal was über dein Projekt, dann bekommst du auch Hilfe.

Zu deiner HIGH-/Lowbyte Frage:
Der Arduino ist ein 8-Bit Prozessor, er arbeitet also mit Bytes. Wenn du nun Integerzahlen verarbeiten willst (16 bit) dann behilft sich der Arduino damit, dass er die 16bit in 2 Bytes abspeichert, eben dem Highbyte und dem Lowbyte.

Aber das ist eine abstrakte Erklärung.
Ohne deinen Code und dein genaues Problem ist das alles Kaffeesatzleserei.

Tja,

nun ich habe es hinbekommen, das ich eine Zahl z.B.: 3.678 verarbeiten kann - aber eben nur
mit einer Zahl mit Punkt;

float wert = 3.678;

sobald ein Komma sich in der Zahl befindet - funktioniert es nicht mehr Anzeige "0" der Restwert
wird ordnungsgemäß ausgegeben;

Mein Code:

takt3 = 180; // takt3 ist eine Zahl im Regelbereich 0 - 255; zu Testzwecken
digitalWrite(LEDpin,HIGH);
analogWrite(led4,takt3);

Serial.flush();

float wert = analogRead(ADC0); // mit Punkt 3.999 funktioniert es
int ber = wert * 1024; // müsste dem Highbyte entsprechen ?

int zahl1 = ber / 256;
Serial.write(zahl1);

int zahl2;
zahl2 = ber - (zahl1 * 256); // müsste dem Low- entsprechen ? funktoniert !!!
Serial.write(zahl2);

}

Ich denke (???) der Ausgabewert "analogRead(ADCO)" enthält eine Kommazahl ?????

Also wie kann ich den Wert von ADC0 richtig verarbeiten?

Liebe Grüße an alle Helfer

Mili

mili:
nun ich habe es hinbekommen, das ich eine Zahl z.B.: 3.678 verarbeiten kann - aber eben nur
mit einer Zahl mit Punkt;

das mit dem Punkt ist richtig.
Es gibt da nur einen Punkt und kein Komma.

Herzlichen Dank für die schnelle Antwort

aber - warum gehts dann nicht - hilft mir nicht
wirklich weiter - Sorry!

LG

Mili

Dann lass dir doch mal die Zahl aus dem ADC0 direkt im Serial Monitor anzeigen.

Ich kann mir nicht vorstellen, dass da eine Zahl mit Komma rauskommt.

analogRead liefert eine INT Größe

Ein Blick in die Reference hilft hier ungemein weiter: Reference: analogRead()

Du machst hier ziemlich viel wirres Zeug.

du holst einen INT-Wert (2 byte) den speicherst du in einer float Variablen (4 byte, aber eben float.

dann behandelst du die float variable wieder wie eine INT und versuchst Bits zu shiften.

Das ist, verzeih mir den Ausdruck, Bullshit.

Ich habe immer noch nicht verstanden was du mit dem HIGH und LOW byte willst.
Was genau braucht dein empfangendes Programm denn?

Versuchs mal so: (Mit gestartetem Seriellen Monitor)

void setup() {
  Serial.begin(9600);  
}

void loop() {
  int Wert = analogRead(A1);   // int AD-Wert Speichern
  byte lowbyte = Wert;            // den int Wert (16bit) in byte (8bit) schreiben. Alles >8Bit wird abgeschnitten
  byte highbyte = Wert >> 8;   // den int Wert um 8 bit nach rechts verschieben (die unteren 8 bit gehen verloren)
  Serial.println("\tDezimal\tHEX");
  Serial.print("Wert:\t  ");Serial.print(Wert);  Serial.print("\t");  Serial.println(Wert,HEX);
  Serial.print("lowbyte:  ");Serial.print(lowbyte);  Serial.print("\t");  Serial.println(lowbyte,HEX);
  Serial.print("highbyte: ");Serial.print(highbyte);  Serial.print("\t");  Serial.println(highbyte,HEX);
  Serial.println();
  delay(1000);
}

Das gibt dann so eine Ausgabe:

	     Dezimal	HEX
Wert:	  446	  1BE
lowbyte:  190	  BE
highbyte: 1	    1

	     Dezimal	HEX
Wert:	  413	  19D
lowbyte:  157	  9D
highbyte: 1	    1

	     Dezimal	HEX
Wert:	  374	  176
lowbyte:  118	  76
highbyte: 1	    1

USA: 1,234,567.89
EU: 1.234.567,89

Wer den Markt dominiert, bestimmt das Zahlenformat. (Ich wollte erst schreiben "wer den Computer erfunden hat", aber da hätte ich Herrn Zuse und anderen Unrecht getan.)