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.
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
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
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.
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
Μα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.
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.
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.
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; }
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?
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.
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.