Forum: Mikrocontroller und Digitale Elektronik Mit Modellbau Fernsteuerung und Arduino, Proportional Hydraulikventile steuern


von Tobias E. (universum-schierling)


Angehängte Dateien:

Lesenswert?

Hallo zusammen, mein Name ist Tobias und ich benötige Hilfe bei 
folgendem Projekt:
Wie es das Thema schon sagt, möchte ich 3 Proportional 4/3Wege Ventile 
mit einer Modellbau Fernsteuerung steuern.

Das ganze soll über einen Arduino uno/due laufen.
Dieser soll über eine Stromregelung ein PWM Signal ausgeben das ich dann 
mit einer Transistor Endstufe weiter verarbeite.
Die Strom Messung soll über einen Shunt Widerstand erfolgen.
Betrieblich verbauen wir bei uns STW Steuerungen, diese haben Ausgänge, 
wie am Schaltbild dargestellt. So in der Art würde ich die Strom Messung 
nachbauen.

Eckpunkte der Projekts:

-Ventile 3 Stück
  Elektrische Kenngrößen:
  Nennspannung:  24 V DC
  Nennmagnetstrom:  0,63 A (24 V)
  Nennwiderstand (R20): 24,0 Ω (24 V)
  Leistungsaufnahme max.: 9,6 W (bei Nennmagnetstrom)
  Einschaltdauer: 100% ED
  Ansteuerung: PWM-Signal
  PWM-Frequenz: typisch 140 Hz (applikationsabhängig)
-Arduino uno bzw duo/mega wegen der Anzahl an Ein- Ausgängen
-Fernsteuerung ist eine Servonaut Zwo4 Hs16 (Empfänger arbeitet mit 
normalen 1-2ms PWM Signal)

Fragen:

Wie bekommen ich den Knüppelausschlag der Fernsteuerung in einen 
Speicher, lese diesen dann wieder aus, setze ihn um in ein PWM Signal 
und gebe dieses an einem Pin aus.

Zusätzlich muss parallel dazu ja eine Strom Messung gemacht werden, in 
Form von einer Spannungsabfall Messung und dem vergleich zum 
Knüppelausschlag an der Fernsteuerung. Wie bekomme ich diesen Wert 
eingelesen und wie kann ich durch diese Größe dann das PWM Signal am 
Ausgang beeinflussen.

Ich habe kaum Erfahrungen in Programmierung, habe schon einige Beispiele 
am Arduino gemacht, momentan ergeben sich für mich aber noch keine 
logischen Verknüpfungen, da es so viele verschiedene Bibliotheken in der 
Arduino IE gibt.

von MaWin (Gast)


Lesenswert?

Tobias E. schrieb:
> Wie bekommen ich den Knüppelausschlag der Fernsteuerung in einen
> Speicher

Einfach das Empfangersignal (meist 4.8V Impuls, 5V geht auch) in einen 
Arduino-Digitaleingang stecken und bei Flankenwechsel (Interrupt) die 
Zeit (Mikrosekunden, Timer) ermitteln, liegt zwischen 1000 und 2000 je 
nach Knüppelstellung. Schwieriger ist es schon, dann noch ein gestörtes 
Signal und einen Impulsausfall (50000us kein Flankenwechsel) zu 
erkennen.

Tobias E. schrieb:
> Wie bekomme ich diesen Wert eingelesen

Analogeingang. Die besseren smart hogh side switches liefern schon ein 
stromabhängiges Spannungssignal.

Es ist bei den ganzen ProFET, IntelliGET, SmartFET eher schwierig, einen 
für deinen geringen Strom zu finden, damit der Messbereich ausreichende 
Auflösung bietet

- 24V capable
- schnell genug fur 140Hz PWM
- current sense Ausgang
- diagnostic Ausgang
- Ansteuerung mit Logiksignal, nicht open collector Ausgang

Ich hab keine Lust, den fur dich passenden zu suchen


https://www.infineon.com/cms/de/product/power/smart-low-side-high-side-switches/high-side-switches/profet-plus-24v-automotive-smart-high-side-switch/
https://www.st.com/en/automotive-analog-and-power/high-side-switches-for-24v-board-net.html
http://www.ti.com/lit/pdf/slvae08
https://www.renesas.com/us/en/products/automotive-products/automotive-power-devices/automotive-protected-and-intelligent-power-switches
https://www.nxp.com/docs/en/supporting-information/DWF13_AMF_AUT_T1023.pdf
https://www.rohm.de/products/power-management/ipds/smart-high-side-switch-ics

von Tobias E. (universum-schierling)


Lesenswert?

Hallo und Danke für deine Worte, leider bin ich von Theorie und Praxis 
noch zu weit weg als das ich damit was anfangen kann.

Der Schaltungsaufbau für eine Strommessung ist mir klar, auch bei der 
Leistungsverstärkung, Löschdiode usw habe ich keine Fragen, es geht mir 
um den Programmaufbau.

Ich lese die Empfänger Signale ein, da fängt es schon an, lese ich alle 
3 nacheinander in einen Speicher ein und verarbeite sie dann weiter. 
Oder lese ich ein Signal ein, verarbeite es weiter, gib es aus, Regel 
über die Strommessung nach und fange dann mit dem 2ten Kanal an..... 
also wie eine reine Ablaufsteuerung?

Dann verstehe ich noch nicht recht die Verwendung der Bibliotheken und 
wie diese untereinander kompatibel sind, vor allem die verwendeten 
Timer.

Ich google, lese und probiere wie verrückt, aber leider komme ich auf 
keinen grünen zweig ohne Hilfe.

Ich mache so viel wie Mögliche Beispiele durch um etwas dazu zu lernen, 
doch ehrlichgesagt, bilden sich bei mir kaum Verknüpfungen im Gehirn :-)

Gruß Tobias

von NichtWichtig (Gast)


Lesenswert?


von MaWin (Gast)


Lesenswert?

Tobias E. schrieb:
> leider bin ich von Theorie und Praxis noch zu weit weg

Es ist doch schon Arduino, also wie Lego

https://create.arduino.cc/projecthub/kelvineyeone/read-pwm-decode-rc-receiver-input-and-apply-fail-safe-6b90eb

Und es ist nur 1 Ansteuerchip wie S19683B50A für das Ventil der 0-2.5V 
je nach Strom liefert und damit deinem ESX3CM entspricht, einfacher kann 
es nicht werden.

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

MaWin schrieb:
> Analogeingang. Die besseren smart hogh side switches liefern schon ein
> stromabhängiges Spannungssignal.

Die sind für eine vernünftige Stromregelung (die ja hauptsächlich die 
Temperaturänderung der Spule ausgleichen soll) leider reichlich ungenau. 
Bei geringer Auslastung (z.B. 5% vom Nennstrom) sind da gut und gerne 
+-30% Abweichung drin. Zusätzlich können die nur den Strom während der 
An-Zeit der PWM messen und nicht den Freilaufstrom. Der ist aber bei 
einem solchen Ventil nicht vernachlässigbar.

Externer Shunt ist auf jeden Fall notwendig wenns einigermaßen genau 
werden soll.

Matthias

von Wolfgang (Gast)


Lesenswert?

Μαtthias W. schrieb:
> Externer Shunt ist auf jeden Fall notwendig wenns einigermaßen genau
> werden soll.

Das ist genau das richtig Stichwort: Wie genau muss es denn werden?
Welche Induktivität besitzen das Ventile?

Tobias E. schrieb:
> Wie bekommen ich den Knüppelausschlag der Fernsteuerung in einen
> Speicher,

z.B. mit einem Timer des µC und der Capture-Funktion.

> Wie bekomme ich diesen Wert
> eingelesen und wie kann ich durch diese Größe dann das PWM Signal am
> Ausgang beeinflussen.

Das PWM-Signal für das Ventil kannst du wieder mit einem Timer erzeugen.

von Tobias E. (universum-schierling)


Lesenswert?

Wolfgang schrieb:
> Μαtthias W. schrieb:
>> Externer Shunt ist auf jeden Fall notwendig wenns einigermaßen genau
>> werden soll.
>
> Das ist genau das richtig Stichwort: Wie genau muss es denn werden?
> Welche Induktivität besitzen das Ventile?

Die Induktivität kann ich gerne messen. Da die Steuerung der Ventile ja 
mit einem Modellbau Handsender erfolgen, bei dem man im Betrieb ja 
sowieso andauernd nachregelt, muss es nicht soo genau sein.
Man hat es mir empfohlen, grundsätzlich wird man es nicht dringend 
benötigen, da es aber mein erstes Arduino Projekt ist, währe es hald 
eine schöne Erweiterung des Funktionsumfanges gewesen. Da ich aber 
sowieso maßlos überfordert bin, lasse ich die Strom nachregelung gerne 
erst mal weg für den Anfang.

von Tobias E. (universum-schierling)


Lesenswert?

MaWin schrieb:
> Tobias E. schrieb:
>> leider bin ich von Theorie und Praxis noch zu weit weg
>
> Es ist doch schon Arduino, also wie Lego

Grundsätzlich kann man sicher irgendwelche vorhandene Projekte zusammen 
kopieren, aber eigentlich möchte ich ja Erfahrung sammeln um in Zukunft 
auch eigene Sketches erstellen zu können.

von Tobias E. (universum-schierling)


Lesenswert?

Auf jeden Fall schon mal Danke an alle die hier was Beigetragen haben.
Ich habe im Internet folgenden Sketch gefunden und auch schon getestet, 
kann mir einer dazu etwas erzählen, bzw das Programm erklären:
Was bedeutet die 0 ? //int cnt_CH_1 = 0;

Sind das der minimal und maximal Ausschlag an der Funke?
//const int hlevel = 174; //höchste gelieferte Frequenz
const int llevel = 115; //niedrigste gelieferte Frequenz

Kann mir das jemand aufdröseln und noch interessant wäre, welche 
Ausgänge damit definiert werden?
//DDRD = 0b11000011; //Setzt D2-D5 als Eingang 0 und die restlichen als 
Ausgang 1

Das letzte Kapitel der Sketches ist mir auch noch unplausibel, wird 
überhaupt an einem Ausgang was ausgegeben?
//Das ganze Kapitel // RC pulse in PWM für Motor wandeln


//Variablen
//RC-bezogen
int cnt_CH_1 = 0; //Zähler Channel 1 für Interruptroutine
int frqraw_CH_1 = 0; //Ãœbergabewert Channel 1 aus Interruptroutine
int cnt_CH_2 = 0; //Zähler Channel 2 für Interruptroutine
int frqraw_CH_2 = 0; //Ãœbergabewert Channel 2 aus Interruptroutine
int cnt_CH_3 = 0; //Zähler Channel 3 für Interruptroutine
int frqraw_CH_3 = 0; //Ãœbergabewert Channel 3 aus Interruptroutine
int cnt_CH_4 = 0; //Zähler Channel 4 für Interruptroutine
int frqraw_CH_4 = 0; //Ãœbergabewert Channel 4 aus Interruptroutine


//Programmbezogen
const int deadzone = 10;
const int hlevel = 174; //höchste gelieferte Frequenz
const int llevel = 115; //niedrigste gelieferte Frequenz
const int glevel = 310; //Grenzlevel für Ergebnis

void setup() {

  // Controller pins
  DDRD = 0b11000011; //Setzt D2-D5 als Eingang 0 und die restlichen als 
Ausgang 1
  cli(); // Clear interrupts Interrupts ausschalten

  // Register zurücksetzen
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;

  OCR1A = 20; //Output Compare Register auf Vergleichswert setzen, war 
20

  TCCR1B |= (1 << CS11); //Prescale 8
  // 16MHz/8=2MHz mit OCR1A=20 Interrupt alle 10µs

  TCCR1B |= (1 << WGM12); //CTC-Mode einschalten
  TIMSK1 |= (1 << OCIE1A); //Timer Compare Interrupt setzen

  sei(); // Set Interrupts Interrupts einschalten

  Serial.begin(9600); //serielle Verbindung etablieren


}

ISR(TIMER1_COMPA_vect) { //die Interruptroutine gibt ein Zehntel der 
Impulsbreite in µs zurück


   if (PIND & (1<<PD2)) {  //Channel 1 rechts horizontal, das ist PIN D2
    cnt_CH_1++; //wenn Eingang High dann Zähler inkrementieren

  }
  else if (cnt_CH_1) {          //wenn Eingang Low dann prüfen ob 
Zähler gestartet
    frqraw_CH_1 = cnt_CH_1 - 1; //wenn Zähler gestartet, stoppen und 
Wert übergeben

    cnt_CH_1 = 0; //Zähler zurücksetzen
  }


  if (PIND & (1<<PD3)) {  //Channel 2 rechts vertikal, das ist PIN D3
    cnt_CH_2++; //wenn Eingang High dann Zähler inkrementieren

  }
  else if (cnt_CH_2) {          //wenn Eingang Low dann prüfen ob 
Zähler gestartet
    frqraw_CH_2 = cnt_CH_2 - 1; //wenn Zähler gestartet, stoppen und 
Wert übergeben

    cnt_CH_2 = 0; //Zähler zurücksetzen
  }

   if (PIND & (1<<PD4)) {  //Channel 3 links vertikal, das ist PIN D4
    cnt_CH_3++; //wenn Eingang High dann Zähler inkrementieren

  }
  else if (cnt_CH_3) {          //wenn Eingang Low dann prüfen ob 
Zähler gestartet
    frqraw_CH_3 = cnt_CH_3 - 1; //wenn Zähler gestartet, stoppen und 
Wert übergeben

    cnt_CH_3 = 0; //Zähler zurücksetzen
  }


  if (PIND & (1<<PD5)) {  //Channel 4 links horizontal , das ist PIN D5
    cnt_CH_4++; //wenn Eingang High dann Zähler inkrementieren

  }
  else if (cnt_CH_4) {          //wenn Eingang Low dann prüfen ob 
Zähler gestartet
    frqraw_CH_4 = cnt_CH_4 - 1; //wenn Zähler gestartet, stoppen und 
Wert übergeben

    cnt_CH_4 = 0; //Zähler zurücksetzen
  }


}

void loop() {

  Serial.println(pulseToPWM(frqraw_CH_1)); //Wert für Kanal 1 an 
Console senden
  Serial.println(pulseToPWM(frqraw_CH_2)); //Wert für Kanal 2 an 
Console senden
  Serial.println(pulseToPWM(frqraw_CH_3)); //Wert für Kanal 3 an 
Console senden
  Serial.println(pulseToPWM(frqraw_CH_4)); //Wert für Kanal 4 an 
Console senden
  Serial.println(" ");
  Serial.println(" ");
  delayMicroseconds(16000); // Damit man überhaupt etwas sieht

}

// RC pulse in PWM für Motor wandeln
int pulseToPWM(int pulse) {

  if (pulse > 100) { // nur Werte > 100 verwerten, andere sind Störung 
oder Sender off

    pulse = map(pulse, llevel, hlevel, -500, 500); // 
Ausgabewertebereich verschieben

    pulse = constrain(pulse, -glevel, glevel); // und jetzt noch 
begrenzen
  } else {

    pulse = 0; // keine sinnvollen Impulse
  }

  // Ruhezone einrichten
  if (abs(pulse) <= deadzone) {
    pulse = 0;
  }

  return pulse;
}

von Norbert (Gast)


Lesenswert?

Tobias E. schrieb:
> Ich habe im Internet folgenden Sketch gefunden und auch schon getestet,
> kann mir einer dazu etwas erzählen, bzw das Programm erklären:

> Was bedeutet die 0 ? //int cnt_CH_1 = 0;

Tja, wie erklären wir dir jetzt eine Null?
Zuerst einmal, stelle dich bitte vor einen Spiegel.

…

Bevor du anfängst irgendwelche weiteren ›Sketche‹ zu ›finden‹,
wie wäre es selbständiges Atmen zu erlernen?

von Schlaumaier (Gast)


Lesenswert?

Tobias E. schrieb:
> Was bedeutet die 0 ? //int cnt_CH_1 = 0;

Ich würde mit Lesen lernen anfangen.

Tobias E. schrieb:
> //Variablen
> //RC-bezogen
> int cnt_CH_1 = 0; //Zähler Channel 1 für Interruptroutine

Schon mal in der Schule mit den Fingern bis 10 gezählt.  Da fängt man 
OHNE Finger an, dann hat man 0 Finger. Dann nimmt man 1 und schon hat 
man 1. ;)

Mein Rat. Kauf die ein Buch für 20 Euro. z.b. Arduino Kompendium. Da 
werden die Grundlagen !!! der Programmierung und des Arduinos erklärt. 
Ohne den ist das Stochern im Mist und du riskierst sogar wenn du Pech 
hast dein teuren Empfänger. Der mag auch kein "richtigen" Strom auf 
Datenleitungen.

von Tobias E. (universum-schierling)


Lesenswert?

Norbert schrieb:
> Tja, wie erklären wir dir jetzt eine Null?
> Zuerst einmal, stelle dich bitte vor einen Spiegel.

Danke für deine Kultivierte Ausdrucksweise

von Tobias E. (universum-schierling)


Lesenswert?

Schlaumaier schrieb:
> Ich würde mit Lesen lernen anfangen.
>
> Tobias E. schrieb:
>> //Variablen
>> //RC-bezogen
>> int cnt_CH_1 = 0; //Zähler Channel 1 für Interruptroutine
>
> Schon mal in der Schule mit den Fingern bis 10 gezählt.  Da fängt man
> OHNE Finger an, dann hat man 0 Finger. Dann nimmt man 1 und schon hat
> man 1. ;)

Vielen Dank für den Sachlichen Beitrag.

von Harald A. (embedded)


Lesenswert?

Die in einem Hi-Side Treiber integrierte Strommessung eignet sich in 
erster Linie für einfache Lasten, die nur statisch ein- und 
ausgeschaltet werden. Für Proportionalbetrieb ist diese Strommessung nur 
sehr eingeschränkt tauglich, da keine Strommessung in der PWM-Pause 
stattfindet (da wo der Strom über die Freilaufdiode weiter fließt). Ein 
externer Stromsensor bzw. Stromspiegel bringt hier klare Vorteile, da 
man die gesamte Periode sauber integrieren kann. Male Dir den Verlauf 
des Stromes in beiden PWM Phasen einmal auf, dann wird das klar.
Diese Ansicht wird sicherlich sogleich von den ganzen uC.net Experten 
zerrissen. Fakt ist, dass ich diese Vorgehensweise auch in x anderen 
Steuergeräten von verschiedenen Herstellern ebenfalls so vorgefunden 
habe.

Sehe gerade, so wie Du es im Eingangspost aufgemalt hast, ist es 
richtig. Es gilt zu beachten, dass die Spannung am Shunt ständig 
zwischen 24V und -0.7V hin- und her pendelt. Man braucht einen 
Stromsensor, der damit umgehen kann. Oder im Low-Side Zweig messen, da 
ist die Schaltung gutmütiger, weil es diese Spannungshübe nicht gibt.
AD8211 kommt mit der negativen Spannung klar, auch mit dem Hub.

: Bearbeitet durch User
von Forist (Gast)


Lesenswert?

Tobias E. schrieb:
> Das letzte Kapitel der Sketches ist mir auch noch unplausibel, ...

"Wichtige Regeln - erst lesen, dann posten!"
Was liest du dort unter Formatierung für C-Code?

Übersichtlicher wird es schon mal, wenn du die Code-Tags verwendest.

Und ansonsten gilt natürlich:
"Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang"

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.