Victron energy BMV700 analog Wert ausgeben

Hallo zusammem.

Ich lese mit meinem arduino mega die Daten vom victron energy Bmv700 ein und möchte den Ladezustand in % an eine Steuerung mit einem 0-10V signal senden.
Das einlesen der Daten am Arduino funktioniert. Den Ladezustand (im Code VE_soc) möchte ich am Pin 13 980Hz als Pwm Signal an einen Pwm/0-10V Wandler senden und mit meiner Comexio Steuerung einlesen.

Verwendeter Wandler:
1-3KHZ 0-10V PWM Digital Analog Wandler Modul, PWM zu Spannung Converter Modul https://amzn.eu/d/6VTTO19

Kalibriert habe ich den Wandler laut Beschreibung. Tastverhältnis 50% und auf 5,4 V einstellen (hab auch schon 5V versucht).
Das Senden sowie das Signal umwandlen funktioniert soweit. Doch alle werte unter 90% weichen vom echten Wert der Anzeige ab (10%).
An was kann es liegen?
Liegt es an der Frequenz?
Liegt es am delay?
Liegt es am verwendeten Datentyp des Ladezustandes?

Vielleicht kann mir ja jemand weiterhelfen.

Der verwendete Code is folgender:

VEDirect Arduino

Copyright 2018, 2019, Brendan McLearie
Distributed under MIT license - see LICENSE.txt

See README.md

File: ReadVEDirect.ino / ReadVEDirect.cpp
- Provides example use of the VEDirect library
******************************************************************/

#include "Arduino.h"
#include "VEDirect.h"

// 32 bit ints to collect the data from the device
int32_t VE_soc, VE_power, VE_voltage, VE_current;
// Boolean to collect an ON/OFF value
uint8_t VE_alarm;

// VEDirect instantiated with relevant serial object
VEDirect myve(Serial3);

void setup() {
Serial.begin(9600); // Adjust as needed
}

void loop() {
Serial.println("Reading values from Victron Energy device using VE.Direct text mode");
Serial.println();

// Read the data
if(myve.begin()) { // test connection
VE_soc = myve.read(VE_SOC);
VE_power = myve.read(VE_POWER);
VE_voltage = myve.read(VE_VOLTAGE);
VE_current = myve.read(VE_CURRENT);
VE_alarm = myve.read(VE_ALARM);
} else {
Serial.println("Could not open serial port to VE device");
while (1);
}

// Print each of the values
Serial.print("State of Charge (SOC): ");
Serial.println(VE_soc, DEC);
Serial.print("Power: ");
Serial.println(VE_power, DEC);
Serial.print("Voltage ");
Serial.println(VE_voltage, DEC);
Serial.print("Current ");
Serial.println(VE_current, DEC);
Serial.print("Alarm ");
Serial.println(VE_alarm, DEC);
Serial.println();

AnalogWrite(13,VE_soc);

// Copy the raw data stream (minus the \r) to Serial0
// Call read() with a token that won't match any VE.Direct labels
Serial.println("All data from device:");
myve.read(VE_DUMP);
Serial.println();
delay(10000);
}

## Footer

© 2022 GitHub, Inc.

### Footer navigation

* [Terms](https://docs.github.com/en/github/site-policy/github-terms-of-service)
* [Privacy](https://docs.github.com/en/github/site-policy/github-privacy-statement)
* [Security](https://github.com/security)
* [Status](https://www.githubstatus.com/)

Ich sehe in deinen Links nirgend wo die Wandlung Analog zu PWM, jede Wandlung ist behaftet mit Fehlern, Verlust, gerade mit günstigen Teilen, glaube nicht das es klappt unter 10% Genauigkeit.
Vielleicht kommt der Comexio mit Hex zu recht dann braucht man keine Wandlung.

Leider hat die Steuerung nur Analog Eingänge mit 0-10V.
Einen einfachen Prozentwert von 0-100 muss doch über Pwm /0-10V wandlen gehn ohne großartigen Verluste oder nicht?

ISt hier nicht kleiner Denkfehler?
AnalogWrite erzeugt ein PWM Signal 0 bis 255, mit % ist der Wert aber 0 bis 100.
Versuch mall die % map'en dadurch wird der wert nicht so 'Schmal'

signal = map(VE_soc, 1,100,1,255);
AnalogWrite(13,signal);

Kann sein das der Compiler meckert wegen VE_soc wen ja, dann die Variablere umbenennen . Mache Schluss für Heute, viel Erfolg :wink:

Was ich nicht so ganz verstehe ist, dass das verlinkte Modul für ein Signal zwischen 1kHz und 3kHz ausgelegt ist, es aber mit 13,980kHz angesteuert werden soll. Da passt doch etwas nicht.

Gibt es ein link dazu? Ich habe nur gefunden dass das min 12V VCC braucht, habe kein Eingang für externe Frequenz gesehen, oder soll das PWM Signal die 19 KHz haben?

Lesefehler :slight_smile:
An PIN13 möchte er 980 Hz ausgeben.

Danke für den Vorschlag, ich werde es mal versuchen.
Ja das Modul ist für 1-3kHz ausgelegt (steht zumindestens in dieser Amazon Chinesisch-Englischen Beschreibung. Sind diese 20 Hz Unterschied das Problem? Mann kann doch die Frequenz des Pwm Signals auch ändern, falls es noteendig ist.
Das Wandler Modul habe ich mit 24VDC versorgt.

Ah jetzt ja ... habe ich es kapiert. Danke.

Ob die fehlenden 20Hz das Problem sind weiß ich nicht, aber wenn als Untergrenze 1kHz angegeben ist, könnte es ja eine Ursache sein.

Was ich nicht verstehe, ist warum den SOC Wert wandeln, der wird doch von analog in % umgerechnet im Victron, also ist schon fehlerhaft, ist nicht besser den Analogen Wert benutzen?. Einziger Problem könnte sein die GND verbindung zw den Gerätschaften wen der Victron intern mit Plus als GND arbeitet, was so manche Regler machen.

Was für IC ist da drauf gelötet auf dem Modul?

Also ich lese sämtliche Daten vom victron BMV700 (Ladeanzeige) über die serielle Schnittstelle ein (serial3 am Board). Diesen Wert habe ich Analog am Arduino . Das Problem is nun, dass ich diesen Wert in die neben verbaute Steuerung bringen muss. Deshalb der PWM / 0-10V Wandler. Die Steuerung (Comexio I/O Server) hat nur einen 0-10v analog Eingang. Ansonsten keine Chance dieses serielle Uart Signal vom victron einzulesen. Hoffe ich uabs verständlich erklärt.

Habe das schon im#1 so verstanden, war jetzt denk Fehler.
Welche Comexio benutzt du, hat die nicht zufällig I2C?

Cwn9 PC817 Sharp
78M12 PYAI

Leider nicht

Comexio COMEXIO IO-SERVER

Nicht den Optokoppler nur der 8Beiniger IC :wink:

Steht leider nichts oben am ic