Ideen gesucht: Spannungs-Signalwandlung

Der chaotische Hauptfaden

Moderatoren: Heaterman, Finger, Sven, TDI, Marsupilami72, duese

Antworten
Benutzeravatar
KampfKeks_MRZ
Beiträge: 362
Registriert: So 11. Aug 2013, 17:52
Wohnort: 52399 Merzenich
Kontaktdaten:

Ideen gesucht: Spannungs-Signalwandlung

Beitrag von KampfKeks_MRZ »

Hallo zusammen,

ich bin auf der Suche nach Ideen...

Folgendes Problem:

Ich muss eine Spannung von 40-60V umsetzen in ein 0-10V umsetzen. Die Bereiche <40 und >60V sind dabei uninteressant.
Desweiteren muss ich ein Spannungssignal von -100mV bis +100mV in 0-10V umsetzen. Dieses Signal kommt aus dem Shunt, der in der Minus-Leitung zu den 40-60V liegt.

Für den Messaufnehmer (der NICHT tauschbar ist) muss das ganze dann noch galvanisch getrennt sein... :roll: Sonst wärs nicht sooo schwierig

Ich würde da tatsächlich auf eine µC zurückgreifen, um die Kalibrierung und so zu bewerkstelligen... Leider fehlt mir die Idee für die Kopplung der Signale an einen Analogeingang sowie für den galvanisch getrennten Analogausgang...
Bei der großen Spannung macht es ja Sinn, nur den Bereich der 40-60 zu messen, zwecks genauigkeit... bei den 200mV mit Symmetrieren und so? Da hab ich gar keine Ahnung von... Habt ihr da Vorschläge für mich?

Das ganze soll auf einer Platine entstehen, gerne stelle ich wenn fertig die Daten und Software zur Verfügung...

Gruß Rainer
Farbe
Beiträge: 410
Registriert: So 29. Sep 2013, 16:06

Re: Ideen gesucht: Spannungs-Signalwandlung

Beitrag von Farbe »

Wie belastbar und schnell sind den die Signale?

Ich würde das Analog machen.
Beim 40-60V Signal würde ich (wenn belastbar genug) mit Widerständen auf z.b. 4-6V unterteilen(1zu10).
Dann ist das Signal schonmal easy mit Operationsverstärkern manipulierbar. Je nach Operationsverstärker / verfügbarer Betriebsspannung würde ich das Signal möglichst wenig runter teilen. Danach mit einem (negativem) Offset versehen und auf 0-10V verstärken. Am Eingang vielleicht noch ein paar Schutzdioden nach Betriebsspannung.
Fertig sind die 0-10V aus 40-60V.

Für die -100mV bis +100mV kann man das Genauso machen. Mit einem OP 50 fach verstärken und 5V offset hinzufügen. Fertig sind die 0-10V.

Die Galvanische Trennung macht man dann mit Isolationsverstärkern / Trennverstärkern. Da gäbe es z.b. den AMC1100 von TI der ist für shunt Messungen gedacht. Ob man den jetzt am Eingang (direkt am Signal) oder am Ausgang (erst auf 0-10V bringen) nimmt ist egal (der AMC1100 geht nicht für 0-10V! dafür gibts andere z.b. ISO120) . Als Versorgung der isolierten Seite kann man dann diese kleinen 2W isolierten DC/DC Wandler verwenden.
E_Tobi
Beiträge: 640
Registriert: Mo 12. Aug 2013, 22:26

Re: Ideen gesucht: Spannungs-Signalwandlung

Beitrag von E_Tobi »

Moin,

um Analogsignale über potentialbarrieren zu bringen gibts mehrere Varianten. Die letzte Entwicklung sind Delta-Sigma-Wandler, die auf dem anderen Ende mit passender UC-Hardware umgesetzt werden.
Sonst bleibt ein Prozessor mit ADC und Messverstärker auf der "heißen" Seite, mit Busverbindung auf die kalte.

Für die letzte Variante stellt sich die Frage ob es wirklich potentialfrei sein muss? Man könnte die Strommessung die ich hinter den +/-100mV vermute (Edit:Ja, steht sogar da) über einen isolierten Hallsensor erschlagen, und die Spannungsmessung über einen hochohmigen Differenzverstärker?

Unterm Strich bräuchten wir mehr Input über die Applikation, um die passendste Variante vorschlagen zu können...

Grüße
Zuletzt geändert von E_Tobi am So 25. Jul 2021, 12:17, insgesamt 1-mal geändert.
Benutzeravatar
KampfKeks_MRZ
Beiträge: 362
Registriert: So 11. Aug 2013, 17:52
Wohnort: 52399 Merzenich
Kontaktdaten:

Re: Ideen gesucht: Spannungs-Signalwandlung

Beitrag von KampfKeks_MRZ »

Danke euch schon mal!

Okay, das ist viel Input für mich, mit Analogtechnik hab ichs nicht so... ADC vom µC geht, der Rest eher so lala...

Zur Applikation:

Es geht um die Betriebsüberwachung einer 48V Batteriebank. Spannungsmessung selbiger, und Lade-/Entladestrom, gemessen über einen 500A/100mV-Shunt.

Um Potentialfrei führt absolut KEIN Weg drum herum, a) da das Interne BMS unbekannt ist - nein Auslesen und in die andere Steuerung bringen geht mangels Schnittstelle nicht - und b) die empfangende Steuerung für andere Anwendungen nicht auf das Batteriepotential gezogen werden darf.
Die Batteriebank an sich mit dem BMS ist auch NICHT veränderbar und nicht bebastelbar... Es muss wirklich sauber extern erfasst werden.

Der verwendete Shunt zeigt, dass es sich um ein paar mA fürs Messen nicht dreht... Eine Messschaltung aus den 48V zu versorgen wäre auch kein Problem. Das fällt wohl nicht nennenswert ins Gewicht. Beim Shunt nehme ich an, darf man das ganze nicht so arg belasten...

Edith sagt noch:

1024Bit wären völlig ausreichend für die Auflösung
Farbe
Beiträge: 410
Registriert: So 29. Sep 2013, 16:06

Re: Ideen gesucht: Spannungs-Signalwandlung

Beitrag von Farbe »

Das hört sich ganz nach "Trennverstärker reicht aus" an. Das ist nicht super schnell und nicht super low power aber total easy.
Die Ops bräuchtest du sowieso um das Signal auf deinen ADC Bereich zu bringen. Also wieso nicht direkt auf 0-10V bringen und dann nen Trennverstärker dahinter.
Bei 500A Messstrom sollten die 20-30mA für die Ops locker drin sein.

Hier ist schonmal das offset und Verstärker gedöns. Danach brauchst du noch den Trennverstärker. Die Potis kannst du auch durch fix Widerstände ersetzen.
R9 und R6 der 2. Schaltung sind nicht unbedingt nötig, dann wäre aber eine krumme offset Spannung nötig (rund 102,05mV).
Überspannung Sicherung Dioden und Abblock C fehlen da komplett.
Dateianhänge
Bildschirmfoto 2021-07-25 um 00.35.13.jpg
Gary
Beiträge: 4851
Registriert: Mo 12. Aug 2013, 01:02

Re: Ideen gesucht: Spannungs-Signalwandlung

Beitrag von Gary »

Ich habe da was

KFD12JVTN

https://bmsplus-shop.com/wp-content/upl ... er-KFD.pdf

Ich kann nicht garantieren das es noch gut ist, aber ich gehe davon aus. Spannung wäre damit erledigt.
Benutzeravatar
zauberkopf
Beiträge: 9481
Registriert: So 11. Aug 2013, 15:33
Wohnort: gefährliches Halbwissen

Re: Ideen gesucht: Spannungs-Signalwandlung

Beitrag von zauberkopf »

Also, die Spannungsmessung sehe ich als gelöst an..
Die Isolation, würde ich auf 2 Arten lösen : Analog, mittels Optokoppler ( solcher mit ner Monitor-diode.. )
... oder 2 Kontroller und 2 Optokoppler und RS232.
SPI wäre auch ne Idee..
Also ADC auf der Batterie Seite -> 3 Optokoppler, Kontroller auf der anderen Seite.
sysconsol
Beiträge: 4059
Registriert: Fr 8. Jul 2016, 17:22

Re: Ideen gesucht: Spannungs-Signalwandlung

Beitrag von sysconsol »

Zwei Optokoppler und zwei OPV sollten dafür ausreichen. Der zweite OPV gibt dem ersten Feedback über den zweiten OK.

Denkfehler?
sysconsol
Beiträge: 4059
Registriert: Fr 8. Jul 2016, 17:22

Re: Ideen gesucht: Spannungs-Signalwandlung

Beitrag von sysconsol »

Noch eine Idee: Spannungs-Frequenz-Wandler und damit auf einen Übertrager.
So machen das beispielsweise rotierende Messumformer.
Benutzeravatar
xoexlepox
Beiträge: 4814
Registriert: So 11. Aug 2013, 19:28
Wohnort: So etwa in der Mitte

Re: Ideen gesucht: Spannungs-Signalwandlung

Beitrag von xoexlepox »

Und noch eine Variante: Ein Dreieck- (oder Sägezahn-) Generator und ein Komparator: Dann wird aus dem analogen Signal ein PWM-Signal, und die Linearität des Optokopplers ist ziemlich egal.
Benutzeravatar
KampfKeks_MRZ
Beiträge: 362
Registriert: So 11. Aug 2013, 17:52
Wohnort: 52399 Merzenich
Kontaktdaten:

Re: Ideen gesucht: Spannungs-Signalwandlung

Beitrag von KampfKeks_MRZ »

Guten Morgen zusammnen,

Das ist ja richtig viel Input, was da von euch gekommen ist, Danke dafür!

Also, ich fange mal an... Ich glaube, Sägezahn, Frequenz und Co sind für die Anwendung tatsächlich totaler Overkill...

@Gary: Vielen Dank, aber irgendwie hat mich die Selbstbau-Leidenschaft mal wieder erfasst :lol: :lol:

@Farbe: Das wird der Ansatz sein. Ausreichend wäre das ganze mit einem Trennverstärker auf jeden Fall! Ich kämpfe gerade mit mir - Soll ich jetzt sowas ganz einfach bauen, nur für diese Anwendung, oder bau ich irgendwas kalibrierbares, was mehreres kann, und dann eben auch universeller ist... :roll: :roll:

Ich werde auf jeden Fall heute Abend mal anfangen, was zu malen, und werde berichten.
Gary
Beiträge: 4851
Registriert: Mo 12. Aug 2013, 01:02

Re: Ideen gesucht: Spannungs-Signalwandlung

Beitrag von Gary »

Jetzt habe ich mal rein geglotzt, ging gar nicht so leicht auf.
Es ist ein HCPL-7840 Isolation Amplifier verbaut, und natürlich Hühnerfutter.

Conrad kann den in 56 Wochen liefern, nur 7,37€
Mouser hat noch 37 Stück, etwas billiger
Farnell - Bestellen Sie heute nach, Bestand kommt in der Woche vom 11.11.22
E_Tobi
Beiträge: 640
Registriert: Mo 12. Aug 2013, 22:26

Re: Ideen gesucht: Spannungs-Signalwandlung

Beitrag von E_Tobi »

Ähnlich zur Variante von Xoexlepox wäre evtl. ein kleiner, billiger Digital-Isolator wie SI8421 einsetzbar.
Delta-Simga-Artig, so vielleicht:
DS.PNG
Das wäre selbstschwingend, und würde auf der Signalseite keine weiteren Bauteile mehr erfordern.
Die Strommessung könnte man mit einem vorgelagerten Messverstärker erst noch vom Pegel her anpassen.
Anse
Beiträge: 2278
Registriert: Mo 12. Aug 2013, 21:30
Wohnort: Bühl (Baden)

Re: Ideen gesucht: Spannungs-Signalwandlung

Beitrag von Anse »

Ich hab kürzlich erst genau das gebaut, was Du suchst. Ok, die galvanische Trennung erfolgt erst auf der Interface Seite zum Fahrzeug hin. Darum ist sie nicht im Plan. Auch der µC, welcher den ADC ausliest ist nicht drauf. Aber ansonsten kann die Schaltung ziemlich genau, was Du willst und läuft im täglichen Betrieb. Nachteil sind allerdings recht teure und schwer beschaffbare Komponenten.
Die Versorgung des µCs würde ich über einen galvanisch getrennten DCDC machen und die Daten über eine iCoupler Device gelöst z.B. ADUM1201.
Bild_2021-07-25_144121.png
sysconsol
Beiträge: 4059
Registriert: Fr 8. Jul 2016, 17:22

Re: Ideen gesucht: Spannungs-Signalwandlung

Beitrag von sysconsol »

Trennverstärker bei Wikipedia.
Ganz ohne schwer beschaffbare spezielle Spezialkomponenten umsetzbar.

Ich hätte das Feedback über den Ausgang vom zweiten OPV erledigt.
sysconsol
Beiträge: 4059
Registriert: Fr 8. Jul 2016, 17:22

Re: Ideen gesucht: Spannungs-Signalwandlung

Beitrag von sysconsol »

Und noch eine Anregung:
Optokoppler-als-Poti.gif
Benutzeravatar
KampfKeks_MRZ
Beiträge: 362
Registriert: So 11. Aug 2013, 17:52
Wohnort: 52399 Merzenich
Kontaktdaten:

Re: Ideen gesucht: Spannungs-Signalwandlung

Beitrag von KampfKeks_MRZ »

Vielen Dank für die ganzen Anregungen.

Sind alle notiert, und bei Zeiten werde ich das geeignete heraussuchen.

Irgendwie muss sowas bei mir ja immer größer werden *vor den Kopf klatsch.

Hatte da noch ne angefangene Platine da, mit Display und diversen Schnittstellen, u.A. eben auch nem W5100. Ich vertiefe gerade meine Anfänge in C++, Bascom ist mir irgendwie für sowas zu buggy und es gibt auch zu wenige Beispiele...

Jetzt kommt das erste Problem:

Ich muss für die Display-Ansteuerung ASCII-Zeichen über TWI versenden, leider auch solche, die "nicht darstellbar" sind. Grundsätzlich ist das Protokoll vom Display gut verständlich, aber ich tu mich mit der Umsetzung in C gerade recht schwer, google hilft mir da gerade irgendwie nicht weiter.

1. Frage:

Wie wandle ich denn ein eine int-Zahl in ein char um? Bin da zu blöd für... sprintf() ist wohl die Lösung, aber wie muss ich das schreiben?

2. Frage:

Kann ein Array vom Typ "char" auch diese "nicht dastellbaren"-ASCII zeichen speichern?

3. Frage:

Wie packe ich mehrere chars zusammen in ein char-Array rein?

Wäre toll, wenn ich mir da helfen könntet...

Klar werde ich bei Fertigstellung alles dazu hier für euch veröffentlichen...

Gruß Rainer


[Edith sagt noch]

Die Potentialtrennung wird vorraussichtlich folgendermaßen erfolgen:

Es werden Messmodule entwickelt, die einen kleinen DCDC enthalten, und per Optokoppler auf den Bus brabbeln. Aber das ist erst ein späterer Step. Das gibt mir auch die Möglichkeit, verschiedenste Module zu nutzen, und diese auch an verschiedenen Stellen anzubringen.
Anse
Beiträge: 2278
Registriert: Mo 12. Aug 2013, 21:30
Wohnort: Bühl (Baden)

Re: Ideen gesucht: Spannungs-Signalwandlung

Beitrag von Anse »

KampfKeks_MRZ hat geschrieben: So 1. Aug 2021, 22:41 1. Frage:

Wie wandle ich denn ein eine int-Zahl in ein char um? Bin da zu blöd für... sprintf() ist wohl die Lösung, aber wie muss ich das schreiben?
Das Stichwort heißt ASCII: In der C Standard Librarys gibt es ne Menge Funktionen dazu. z.B. itoa(). Wandelt einen Integer in einen String um, welcher selbst wiederum aus Chars besteht. Wenn es nur um einzelne Ziffern geht: Char c = 48 + ZalhZumUmwandel
Der Standard ASCII Satz definiert 128 Zeichen. Da TWI aber 8 Bit breit ist, könntest Du sogar noch mal 128 Zeichen selbst definieren. Dazu müssten wir aber wissen, was das für ein Display ist.
Aber vielleicht zum Verständnis: Ein Char kann jeweils nur ein Buchstabe, eine Zahl, ein Satzzeichen oder ein Steuerzeichen speichern. Wenn du die Zahl "123" in Chars umwandeln lässt wird daraus "[049], [050], [051], [00]". Die 0 am Ende ist der Terminator. So erkennt der Controller, dass der String zu enden ist. Wird er vergessen kann es sehr eigenartige und schwer reproduzierbare Fehler geben.
KampfKeks_MRZ hat geschrieben: So 1. Aug 2021, 22:41 2. Frage:

Kann ein Array vom Typ "char" auch diese "nicht dastellbaren"-ASCII zeichen speichern?
Vielleicht keine Char Array verwenden, sondern ein uint8_t Array. Da passen mehr Zeichen rein. Im Grunde ist es egal. Es braucht den gleichen Platzt im Speicher.
KampfKeks_MRZ hat geschrieben: So 1. Aug 2021, 22:41 3. Frage:

Wie packe ich mehrere chars zusammen in ein char-Array rein?
Siehe Oben: itoa();
Es gibt aber noch eine menge weiterer Funktionen zur Manipulation solcher Strings (char Arrays). Z.B. Zum zusammen hängen und trennen.
Von sprintf() und co. würde ich auf dem Mikrocontroller abraten. Fressen sehr viel Speicher und sind absolut overkill sind für Deine Anwendungen.

Allgemein fehlt aber noch etwas Input zum zielführender zu antworten.
Benutzeravatar
KampfKeks_MRZ
Beiträge: 362
Registriert: So 11. Aug 2013, 17:52
Wohnort: 52399 Merzenich
Kontaktdaten:

Re: Ideen gesucht: Spannungs-Signalwandlung

Beitrag von KampfKeks_MRZ »

Hmm, ich befürchte, dann habe ich möglicherweise einen Knoten im Hirn...

Ich fange mal vorne an:

Display-Datasheet

Angeschlossen ist das Display - samt einiger anderer Komponenten per TWI/I2C.

Folgenden Code hab ich mir für die Schnittstelle schon mal gebaut:

TWI-Interface:

Den Code habe ich mir teilweise ergoogelt, im Datenblatt nachvollzogen und geschrieben.

Code: Alles auswählen

// TWI Initialiseren
void TWIInit(void)
{
	post(0xF2);
	set_high(LED_I2C);
	//400kHz
	TWSR = 0x00;
	TWBR = 0x0C;
	//TWI Einschalten
	TWCR = (1<<TWEN);
	_delay_ms(250);
	set_low(LED_I2C);
}

//Start senden
void TWIStart(void)
{
	post(0x11);
	TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
	while ((TWCR & (1<<TWINT)) == 0);
}

//Stop senden
void TWIStop(void)
{
	post(0x11);
	TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
}

//Daten senden
void TWIWrite(uint8_t u8data)
{
	post(0x11);
	TWDR = u8data;
	TWCR = (1<<TWINT)|(1<<TWEN);
	while ((TWCR & (1<<TWINT)) == 0);
}

//Daten lesen ACK
uint8_t TWIReadACK(void)
{
	post(0x12);
	TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA);
	while ((TWCR & (1<<TWINT)) == 0);
	return TWDR;
}

//Daten lesen NACK
uint8_t TWIReadNACK(void)
{
	post(0x13);
	TWCR = (1<<TWINT)|(1<<TWEN);
	while ((TWCR & (1<<TWINT)) == 0);
	return TWDR;
}

//Status abfragen
uint8_t TWIGetStatus(void)
{
	post(0x10);
	uint8_t status;
	//mask status
	status = TWSR & 0xF8;
	return status;
}

Zum Senden ans Display ist folgender Code entstanden:

Das Error-Flag ist noch ein relikt vom Test, wird noch umgebaut als Return der Funktion.

Code: Alles auswählen

void display_write(char data_buffer[32])
{
	uint8_t length = 0;
	uint8_t buf = 0;
	uint8_t bcc = 0;
	uint8_t count = 0;

	
	TWIStart();
	TWIWrite(disp_wr);	//Schreibadresse Display
	buf = 0x11;	
	TWIWrite(buf);	//DC1 senden
	length = strlen(data_buffer);
	bcc = buf + length;
	TWIWrite(length);	//Länge senden
	for (uint8_t i = 0; i < length; i++)	//Daten senden
	{
		count = i - 1;	
		buf = (int) data_buffer[count];
		if (buf == 255)
		{
			buf = 1;
		}
		TWIWrite(buf);
		bcc = bcc + buf;
	}
	TWIWrite(bcc);	//Checksumme senden
	TWIStop();
	_delay_us(50);
	TWIStart();
	TWIWrite(disp_rd);
	buf = TWIReadNACK();
	TWIStop();
	if (buf == 0x06)
	{
		err_flag = 1;
		err_nr = 1;
	}
}
Irgendwie habe ich das Gefühl, dass es cleverer wäre, die Befehle nur in Hex zu verarbeiten, und nur anzuzeigende Texte im String zu verarbeiten...

Danke euch,

Ein ratloser Rainer...
Benutzeravatar
Fritzler
Beiträge: 12578
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: Ideen gesucht: Spannungs-Signalwandlung

Beitrag von Fritzler »

Für TWI empfehl ich dir ne lib, die AVR periph ist da etwas "behindert" aufgebaut:
http://www.peterfleury.epizy.com/avr-software.html
KampfKeks_MRZ hat geschrieben: So 1. Aug 2021, 22:41 Wie wandle ich denn ein eine int-Zahl in ein char um? Bin da zu blöd für... sprintf() ist wohl die Lösung, aber wie muss ich das schreiben?
Wenn dann snprintf!
Das schreibt nicht mehr als der Buffer groß ist.
Der GCC ist in den neueren Versionen dann sogar schlau genug dir Warnungen an den Kopf zu werfen wenn der Buffer doch zu klein is.
Sone Überschreiber sind schwer zu finden, selbst für Leute, die das beruflich machen.

Code: Alles auswählen

char buf[32];
uint32_t zahl = 1337;
int anzahlZeichen;
anzahlZeichen = snprintf(buf, sizeof(buf), "eine Zahl: %u", zahl);
displayout(buf, anzahlZeichen);
Die Formatierungsmöglichkeiten stehen hier:
https://www.cplusplus.com/reference/cstdio/printf/
Am besten mal auf nem PC ausprobieren.
KampfKeks_MRZ hat geschrieben: So 1. Aug 2021, 22:41 Kann ein Array vom Typ "char" auch diese "nicht dastellbaren"-ASCII zeichen speichern?
Son Array ist per Definition erstmal strunzdoof!
Was daraus Zeichen "macht" sind zeichensätze wie ASCI.
Davon gibts blöderweise mehrere Versionen ab Zahl 128.
Wenn im Array das "Umlauteasci" gespeichert ist und das Display hat eine andere Zeichentabelle/Zeichensatz, dann gibts Sonderzeichen statt ü.
Dann gibts noch Multibytestrings (wchar) und UTF8 :mrgreen:
Du musst also das Array durchgehen und auf die UMlaute prüfen und diese ersetzen zu dem was das Display haben will.
KampfKeks_MRZ hat geschrieben: So 1. Aug 2021, 22:41 Wie packe ich mehrere chars zusammen in ein char-Array rein?
Strings Zusammenbauen oder einzelne zeichen reinpacken?
Anse hat geschrieben: So 1. Aug 2021, 23:09 Von sprintf() und co. würde ich auf dem Mikrocontroller abraten. Fressen sehr viel Speicher und sind absolut overkill sind für Deine Anwendungen.
Absolutistische Aussagen sind immer falsch! :mrgreen:
Aufm AVR mit 8k Flash gilt das sicherlich, bei nem AVR mit 32k+ nicht mehr.
Für ARM Kerne hats nichtmal mehr ein Geschwindigkeitsproblem.
Zudem muss man ja nicht gleich die ganze floatlib mitschleppen, dann wirds auf einmal süß klein.
printf und Konsorten sind für Anfänger auch besser als sich den String per Hand zusammenzubauen, das ist nur Fehlerträchtig.
printf formatiert dann auch noch schön, bei itoa muss man händisch nachfummeln.
Benutzeravatar
ferdimh
Beiträge: 9379
Registriert: Fr 16. Aug 2013, 15:19

Re: Ideen gesucht: Spannungs-Signalwandlung

Beitrag von ferdimh »

Diese Schaltung könnte in "The art of electronics" als "Schlechte Schaltung" stehen...
Bild

Tatsächlich wird der Fehler kompensiert. Aber, wenn die Regelschleife tatsächlich gut funktionieren WÜRDE (Was sie beigegebener Verstärkung eher nicht tut) sogar zweimal, denn der "kompensierende" Optokoppler zeigt ja auch Temperatur- und altersabhängiges Verhalten.
Es gibt zu dem Zweck Optokoppler mit zwei Photodioden, dann funktionierts auch halbwegs. Hier bleibt lediglich ein erschreckend großes Rauschen zurück.

Mein Favorit bleibt irgendeine Form des Modulators. Das ist leider auch nicht ganz einfach (Lies: Ich habe gerade ein vergleichbares Problem aufm Tisch und noch keine überzeugende Lösung).
sysconsol
Beiträge: 4059
Registriert: Fr 8. Jul 2016, 17:22

Re: Ideen gesucht: Spannungs-Signalwandlung

Beitrag von sysconsol »

Ich würde zum U/F-Wandler greifen.
Zwei von mir zerlegte Messwellen haben das auch so gemacht.
Eine war aus den frühen 90ern, eine von 2015.
Muss sich wohl bewährt haben.
Anse
Beiträge: 2278
Registriert: Mo 12. Aug 2013, 21:30
Wohnort: Bühl (Baden)

Re: Ideen gesucht: Spannungs-Signalwandlung

Beitrag von Anse »

Fritzler hat geschrieben: Mo 2. Aug 2021, 07:13 Absolutistische Aussagen sind immer falsch!
Aufm AVR mit 8k Flash gilt das sicherlich, bei nem AVR mit 32k+ nicht mehr.
Für ARM Kerne hats nichtmal mehr ein Geschwindigkeitsproblem.
Zudem muss man ja nicht gleich die ganze floatlib mitschleppen, dann wirds auf einmal süß klein.
printf und Konsorten sind für Anfänger auch besser als sich den String per Hand zusammenzubauen, das ist nur Fehlerträchtig.
printf formatiert dann auch noch schön, bei itoa muss man händisch nachfummeln.
Darum sprach ich auch von Abraten ;) Nein, Du hast schon recht µCs haben sich weiter entwickelt.
Ich hatte mir halt vor langer Zeit mal selbst einige nützliche String-Funktionen zusammen gebastelt. Z.B. Anhängen von Einheiten oder einfügen vom Kommata.
Bei den "modernen" 32 Bit Zeugs ist das ja nicht mehr wirklich notwendig selbst zu machen.
Benutzeravatar
Zabex
Beiträge: 632
Registriert: Di 2. Jul 2013, 08:45
Wohnort: Aldenhoven
Kontaktdaten:

Re: Ideen gesucht: Spannungs-Signalwandlung

Beitrag von Zabex »

Ich würde einen billigen TL494 nehmen um aus der Eingangsspannung ein PWM-Signal zu machen. Das über einen Optokoppler "auf die andere Seite" bringen. Dort einfach auf ein R-C Glied geben um wieder eine analoge Spannung zu bekommen. Evtl. noch einen OpAmp, um den Ausgang belastbarer zu machen und den gewünschten Spannungshub einzustellen. Alternativ: Direkt mit dem Microcontroller rein digital das Puls/Pausenverhältnis hinter dem Optokoppler messen (statt den eingebauten ADC zu bemühen).
Benutzeravatar
KampfKeks_MRZ
Beiträge: 362
Registriert: So 11. Aug 2013, 17:52
Wohnort: 52399 Merzenich
Kontaktdaten:

Re: Ideen gesucht: Spannungs-Signalwandlung

Beitrag von KampfKeks_MRZ »

Vielen Dank für die ganzen Ideen - die entgültige Lösung der Trennung wird bei Zeiten dann entschieden. Was schon fest steht, ist, dass es auf jeden Fall die Modulbauweise wird, dann kann der "Chefkontrollör" nämlich direkt automatisch herausfinden, um welche Art Geber und Signal es sich handelt.


Bloß das mit dem Umwandeln in C hab ich noch immer nicht verstanden...

Beispiel:

Folgende ASCII(256!) Zeichen müssten übermittelt werden.. 011, 027, 038. Wie bekomme ich die in ein Zeichen umgewandelt, dass ich die hintereinander in ein char-Array geschrieben bekomme?


Vergesst das. Ich machs umgekehrt, ich mach die Steuerzeichen direkt in Hex, und darzustellende Texte werden direkt in entsprechende Bytes umgewandelt. Das geht ja mit

Code: Alles auswählen

buf = (int) data_buffer
Scheint so sehr viel einfacher.

Falls jemand Lust hat, mir das obige Problem anhand eines Codesbeispiels zu erklären - wäre ich trotzdem nicht abgeneigt und interessiert - man lernt ja nie aus...

Gruß Rainer
Benutzeravatar
Fritzler
Beiträge: 12578
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: Ideen gesucht: Spannungs-Signalwandlung

Beitrag von Fritzler »

Nee, das is nich Python, sondern C.
Da ist das nur ein "casting".
Benutzeravatar
KampfKeks_MRZ
Beiträge: 362
Registriert: So 11. Aug 2013, 17:52
Wohnort: 52399 Merzenich
Kontaktdaten:

Re: Ideen gesucht: Spannungs-Signalwandlung

Beitrag von KampfKeks_MRZ »

Fritzler hat geschrieben: Mo 2. Aug 2021, 17:48 Nee, das is nich Python, sondern C.
Da ist das nur ein "casting".
Öhm... Was bitte möchtest du mir sagen?

C(++) -> Sprache, die ich verwende.
Anse
Beiträge: 2278
Registriert: Mo 12. Aug 2013, 21:30
Wohnort: Bühl (Baden)

Re: Ideen gesucht: Spannungs-Signalwandlung

Beitrag von Anse »

KampfKeks_MRZ hat geschrieben: Mo 2. Aug 2021, 17:56 C(++) -> Sprache, die ich verwende.
Was jetzt, C oder C++. Das macht schon einen kleinen Unterschied.

Ich verstehe übrigen auch nicht, was Fritzler jetzt mit Python meint :?
Benutzeravatar
Fritzler
Beiträge: 12578
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: Ideen gesucht: Spannungs-Signalwandlung

Beitrag von Fritzler »

Hier gehts doch um Zahlumwandlung zu String?
Da kannste doch nicht einfach was nach int casten und wohin speichern.
On the fly Umwandlungen machen eher Hochsprachen udn das sind C/C++ lange nicht.

Also sag eher was die Zeile jetz machen soll, sonst führt das zu nix.
Benutzeravatar
Hightech
Beiträge: 11306
Registriert: So 11. Aug 2013, 18:37

Re: Ideen gesucht: Spannungs-Signalwandlung

Beitrag von Hightech »

KampfKeks_MRZ hat geschrieben: Mo 2. Aug 2021, 17:56
Fritzler hat geschrieben: Mo 2. Aug 2021, 17:48 Nee, das is nich Python, sondern C.
Da ist das nur ein "casting".
Öhm... Was bitte möchtest du mir sagen?

C(++) -> Sprache, die ich verwende.
Dann sollstest du dir dringent mal die Typen von C, C++ anschauen und wie man damit umgeht und was ein typ casting ist.
Wenn dir jetzt jemand die Lösung präsentiert und du die zwar verwendest aber überhaupt nicht verstehst was da passiert, kommst du in C,C++ keinen Schritt vorran und läufst gegen die nächste Wand!!

mit buf = (int) data_buffer erlärst du halt blos, data_buffer ist ein INT, egal was da drin steht, dann steht halt in buf 5 als Zahl drin.
So geht das in C nicht !
Benutzeravatar
Hightech
Beiträge: 11306
Registriert: So 11. Aug 2013, 18:37

Re: Ideen gesucht: Spannungs-Signalwandlung

Beitrag von Hightech »

Benutzeravatar
Hightech
Beiträge: 11306
Registriert: So 11. Aug 2013, 18:37

Re: Ideen gesucht: Spannungs-Signalwandlung

Beitrag von Hightech »

Benutzeravatar
Fritzler
Beiträge: 12578
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: Ideen gesucht: Spannungs-Signalwandlung

Beitrag von Fritzler »

Du hast das wichtigste Buch zu C vergessen:
https://de.wikipedia.org/wiki/The_C_Pro ... g_Language
Benutzeravatar
Hightech
Beiträge: 11306
Registriert: So 11. Aug 2013, 18:37

Re: Ideen gesucht: Spannungs-Signalwandlung

Beitrag von Hightech »

Ich zeige hier mal einen Code von einem Projekt. Dort wird Temperatur gemessen und auch auf einem I2C LC-Display ausgegeben:

Das ist der Display-Ausgabeteil mit itoa wird der Integerwert in eine Zeichenkette umgewandelt.

Code: Alles auswählen

printf_lcd(0,2,"EIS:",10);
  
  itoa(t_out,buffer,10);
  write_byte_lcd(8,2,warn);
  printf_lcd(9,2,buffer,10);
  
  printf_lcd(14,2,"C",10);
  write_byte_lcd(13,2,0x80);
Oder auch so, aus einem anderen Projekt:

Code: Alles auswählen

char *bu="0";
		lcd_gotoxy(0,2);
	    lcd_puts("fl0:");
	    lcd_gotoxy(5,2);
	    itoa(fl0,bu,10);
	    lcd_puts(bu);


Code: Alles auswählen

//************************************************************************
// Projekt Includes
//************************************************************************
#include "defines.h"                        // Projektdefinitionen
#include "lcd_dip204ks0073_spi_avr.c"       // LCD-Funktionen
#include "ADC_Messung.h"
#include "taster.c"
//************************************************************************
// AVR/GCC Includes
//************************************************************************
#include <avr/eeprom.h>
#include <stdbool.h> 
#include "main.h"
#include <avr/interrupt.h>
#include <avr/io.h>                         // IO-Grundfunktionen
#include <util/delay.h>                     // Pausenfunktionen
#include <string.h>                         // Stringfunktion
#include <stdio.h>                          // Standardfunktion
#include <stdlib.h>                         // Standardbibliothek

//************************************************************************
// Variablenbereich
//************************************************************************
struct lcd_struc lcd;       // LCD Datensatz
unsigned char temp  = 0;    // Testvariable
unsigned char temp2 = 1;    // Testvariable
unsigned int mess[1];
char buffer[4];
char warn;
int time;
bool motor=false;
bool kompr=false;
bool pause=false;
bool kpause=false;
int t_pause=0;
int t_timer=0;
int k_timer=0;

int t_tab[]=
{
15,16,18,19,20,21,22,23,24,25,
26,27,28,29,31,32,33,35,36,38,
39,41,42,45,47,48,49,51,52,54,
56,57,60,62,65,66,68,72,75,78,
80,81,83,85,87,89,92,95,97,99,
102,105,107,110,112,114,116,118,121,124,127
};

ISR(TIMER1_OVF_vect)
{
cli();
time++;
TCNT1=34268;

t_pause--;
k_timer--;

  if (k_timer<=0)
  {
    k_timer=0;
    kpause=false;
  }
  
  if (t_pause<=1)
    {
    pause=true;
    t_pause=0;
    }
      else 
      {	
      pause=false;
      }
  if (pause)
  {
    t_timer++;
   }
   if (t_timer>=300)
   {
     t_timer=0;
     pause=false;
     t_pause=10;
  }

 sei();
};

ISR(PCINT1_vect){
  t_pause=10;
};

#define Motor_an PORTC|= (1<<PC2)
#define Motor_aus PORTC &= ~(1<<PC2)
#define Kompr_an PORTC |= (1<<PC3)
#define Kompr_aus PORTC &= ~(1<<PC3)

// ********************************************************************
// Hauptprogramm
// ********************************************************************
int main (void) {
  
  PCMSK1|=(1<<PCINT8);  
  PCICR|=(1<<PCIE1);  
  TCNT1=0xFA12;
  TCCR1B|=(1<<CS12);
  TIMSK1|=(1<<TOIE1);
  sei();
  tasten_init();
  spi_master_init();        // Hardware-SPI Initialisierung als Master
  init_lcd();               // LCD Initialisierung im SPI-Mode
  DDRC|= ((1<<PC2)|(1<<PC3));
  DDRC &=~(1<<PC0);
  
  int t_out;
  int t_soll_out;
  int t_soll;
  Motor_aus;
  Kompr_aus;
  t_soll=eeprom_read_word((uint16_t*)0);
  t_timer=10;
  while(1) {
    
    
/*--------------------------------------------------------------------------------------------*/
/*Tasten auswerten Sollwert Temp */
/*--------------------------------------------------------------------------------------------*/
    tasten_auswerten();
  if (get_taster(RUNTERK))
    {
    t_soll--;
    taster_reset(RUNTERK);
    }
  if (get_taster(RUNTERL))
    {
    eeprom_write_word((uint16_t*)0, t_soll);
     taster_reset(RUNTERL);
    }

  if (get_taster(HOCHK))
    {
    t_soll++;
    taster_reset(HOCHK);
    }
  if (get_taster(HOCHL))
    {
    eeprom_write_word((uint16_t*)0, t_soll);    
    taster_reset(HOCHL);
    }
    if(t_soll>60){t_soll=60;};
    if (t_soll<1){t_soll=1;};	
/*--------------------------------------------------------------------------------------------*/
/*Tasten auswerten Motor und Kühlung*/
/*--------------------------------------------------------------------------------------------*/
    
    
  if(get_taster(RECHTSK))
    {
    t_timer=0;  
    k_timer=10;
    motor=!motor;
    pause=false;
    taster_reset(RECHTSK);
    }

  if (motor&&!pause)
    {
      Motor_an;
    }
    else 
    {
    Motor_aus;
    }

  if(get_taster(LINKSK))
    {
    kompr=!kompr;
    k_timer=0;
    taster_reset(LINKSK);
    }

   if ((kompr&&!kpause)&&(t_soll-35<=(t_out-3)))
    {
     Kompr_an;
    }
    
    if (!kompr|| kpause|| (t_soll-35>=(t_out)))
      {
	
      Kompr_aus;
      };
/*--------------------------------------------------------------------------------------------*/
/*Temperaturmessung*/
/*--------------------------------------------------------------------------------------------*/  mess[1]=messung(1);
      for (int i=0;i<61;i++)
    {
      warn=' ';
      if (mess[1]<15)
      {
	warn=0x3C;
      }
	if (mess[1]>127)
	{
	  warn=0x3E;
	}      
      if (mess[1]<=t_tab[i])
      {
       t_out=(i-35);
      break;
      }
    }
    
  printf_lcd(0,2,"EIS:",10);
  
  itoa(t_out,buffer,10);
  write_byte_lcd(8,2,warn);
  printf_lcd(9,2,buffer,10);
  
  printf_lcd(14,2,"C",10);
  write_byte_lcd(13,2,0x80);
    
  printf_lcd(0,0,"Kuehlung",10);
  if (kompr)
  {
  printf_lcd(0,1,"AN ",10);  
  }
  else
    
  {
  printf_lcd(0,1,"AUS",10);
  }  
  
  printf_lcd(13,0,"Mischer",10);
  
  if (pause&&motor)
      {
  printf_lcd(10,1,"PAUSE",10);  
  }
  else
    
  {
  printf_lcd(10,1,"     ",10);
  }  
  if (motor)
  {
  printf_lcd(17,1,"AN ",10);  
  }
  else
    
  {
  printf_lcd(17,1,"AUS",10);
  }  
  
  printf_lcd(0,3,"SOLL: +",10);
  
  t_soll_out=t_soll-35;
  itoa(t_soll_out,buffer,10);
  printf_lcd(9,3,buffer,1);
  
  write_byte_lcd(13,3,0x80);
  printf_lcd(14,3,"C",10);
  printf_lcd(16,3,"-",10);
  }
}
Benutzeravatar
xoexlepox
Beiträge: 4814
Registriert: So 11. Aug 2013, 19:28
Wohnort: So etwa in der Mitte

Re: Ideen gesucht: Spannungs-Signalwandlung

Beitrag von xoexlepox »

Du hast das wichtigste Buch zu C vergessen:
https://de.wikipedia.org/wiki/The_C_Pro ... g_Language
Och neee .... Das ist zwar das "Standardwerk" zu C, aber die Sprache erlernen kann man (als Anfänger) damit nicht. Das ist eher etwas, um mal spezielle Dinge nachzuschlagen und einige "Kniffe" (z.B. "structs" und "unions") daraus abzuleiten, wenn man so einigermaßen vertraut ist mit C.
Antworten