Ich habe ein MeanWell BIC-2200 Netzteil das ich gerne per CANBus steuern möchte. Die Spezifikation findet man hier:
https://www.meanwell.com/Upload/PDF/BIC-2200-E.pdf
Ich nutze einen RasPi mit Can/RS485 HAT von Waveshare und habe alles soweit konfiguriert, dass ich mit cansend senden und per candump diese Nachricht auch empfangen kann. Dieser Part scheint also zu funktionieren.
Das CanHat ist mit 250000kbits konfiguriert und per Can_High und Can_low sowei Ground_Aux mit den Netzteil verbunden.
Ich versuche nun seit längerem das Netzteil zu einer Antwort zu bewegen aber nicht funktioniert.
Ich sende z.b. "cansend 000C0300#0000", um den Status abzufragen und sollte eine Antwort mit vom Netzteil mit dem byte "01" erhalten, aber nichts wird empfangen. Nur wiederrum die gesendete Nachricht.
Der Canbus ist beim Raspi mit 120ohm terminiert.
Hat einer von euch netten Menschen noch eine Idee?
Vielen Dank schonmal :)
Der Widerstand zwischen CANH und CANL sollte 60 Ohm betragen.
Das stimmt, zum Test mit kurzem Kabel geht es aber auch mit 120 Ohm. Nur ganz ohne Terminierung geht es nicht, denn der rezessive Pegel wird nur dadurch hergestellt.
Bei ausgeschaltetem Netzteil bekomme ich im Candump das gesendete nicht zurück. Mittlerweile hab ich das Netzteil acuh zum Antworten bewegt. Allerdings reagiert es komsicherweise nur auf ein Kommando:
und zwar auf
000C0300#0000
darauf bekomme ich zuerst zweimal meine anfrage zurück.
und dann bei jedem weiteren mal einmal die anfrage und die korrekt Antwort mit 00 00 01 (Netzeil aktiv).
Hier der candump log:
1
can0000C0300[2]0000
2
can0000C0300[2]0000
3
4
can0000C0300[2]0000
5
can0000C0200[3]000001
6
7
can0000C0300[2]0000
8
can0000C0200[3]000001
9
10
can0000C0300[2]0000
11
can0000C0200[3]000001
Die Kommunikation funktioniert also grundsätzlichs, nur finde ich es auch komisch dass ich immer die Anfrage zurück bekomme, vieleicht ein Art Signalverstärker für nachfolgende Netzteile, weil man ja viele Netzteile parallel und per Can dann in Reihe schalten kann... hmm
Loopback ist aus. Wenn das Netzteil aus ist, bekomme ich auch keinerlei Reaktion in candump wenn ich etwas sende.
Jetzt nur das Problem: Kein anderes Kommando funktioniert.
cansend 000C0300#0062 sollte z.b. die Temperatur als Antwort zurückbringen, es passiert aber nicht. Sondern etwas sehr komisches:
candump zeigt wie aus einer Art Zwischenspeicher folgendes:
1
can0000C0300[2]0062
2
can0000C0200[3]000001
3
4
can0000C0300[2]0062
5
can0000C0200[3]000001
6
7
can0000C0300[2]0062
8
can0000C0300[2]0062
zweimal die ANtwort auf eine vorhereige Anfrage und dann weider das verhalten dass einfach wie beim Repeater das Originalkommando wiederholt wird. Ich versteh das nicht :/
„Signalverstärker“ kann nicht sein, es dürfte kein zweiter Teilnehmer einfach die Botschaft unter der gleichen ID noch einmal spiegeln. Das müsste irgendwie aus dem lokalen System kommen. Ansonsten hast Du bei dem 0x62 vermutlich Low- und High-Byte vertauscht, kann das sein?
Du empfängst die gesendete Botschaft? Dann stimmt schon mal
grundsätzlich etwas nicht.
Das kommt auf die Einstellung des CAN-Controllers an. Jeder CAN-Controller liest beim Senden die gesendete Botschaft auch wieder zurück. Das muss er schon alleine wegen der Arbitrierung tun. Je nach Einstellung kommt die dann auch wieder als Empfangene Botschaft an oder wird unterdrückt.
"The loopback functionality is enabled by default to reflect standard networking behaviour for CAN applications. Due to some requests from the RT-SocketCAN group the loopback optionally may be disabled for each separate socket. See sockopts from the CAN RAW sockets in RAW Protocol Sockets with can_filters (SOCK_RAW)."
Ich muss mich korrigieren, wenn ich mich richtig erinnere zeigt candump auch die eigenen gesendeten Nachrichten.
EDIT: Zeitgleich mit der Antwort von Rolf
EDIT2: Der CAN Controller INTERN liest natürlich mit, CANSEND und CANDUMP sind als Systemfunktionem aber nach meinem Verständnis nicht auf der Ebene sondern bedienen den CAN Controller ja nur. Ich kann mich aber erinnern, dass ich dieses Verhalten von candump schon einmal etwas schräg fand.
Dann ist das ja schonmal normal, dass man die Nachrichten im Candump sieht. wenn man loopback noch zusätzlich aktiviert, dass sehe ich die Nachrichten auch wenn das Netzteil aus ist.
Komischweise funktioniert die Kommunikation, also die Antowrt auf diese eine Nachricht, die funktioniert (000c0300#0000-->000c0200#000001), nur ohne Terminale Wiederstände, was für mich keinen Sinn macht, da das Raspi Bord angeblich keinen an Bord hat und in der SPezifiaktion vom Netzteil dazu auch gar nichts gesagt wird. :/
Andererseits frage ich mich, wieso wenn eine Nachricht ein Ergbnis bringt, alle anderen ins leere laufen und doppelt im Candump erscheinen. Einmal wohl das selbst gesendete und das andere veilleucht die Reflektion beim Netzteil, weil ohne Wiederstand :( .
Ich probiere mal paar andere wiederstände, irgendwas ist faul.
EDIT: Danke auf jeden fall schonmal für die Ideen.
EDIT2: Aha, ich messe im Pi-HAT einen wiedestand von 120 ohm, ist dort also wohl schon auf der platine
ohne Terminale Wiederstände, was für mich keinen Sinn macht, da das
Raspi Bord angeblich keinen an Bord hat und in der SPezifiaktion vom
Netzteil dazu auch gar nichts gesagt wird. :/
Standard ist bei CAN Teilnehmer kein integrierter Widerstand, man kann als Hersteller ja nicht wissen, ob es das physikalische Ende des Busses ist.
Andererseits frage ich mich, wieso wenn eine Nachricht ein Ergbnis
bringt, alle anderen ins leere laufen und doppelt im Candump erscheinen.
Einmal wohl das selbst gesendete und das andere veilleucht die
Reflektion beim Netzteil, weil ohne Wiederstand :( .
Ich probiere mal paar andere wiederstände, irgendwas ist faul.
Es gibt keine Reflektion von Nachrichten aufgrund eines falschen Widerstandes. Das physikalisch offene Ende (die „Reflexion“) kann keine Nachrichten speichern.
Andere Widerstände sind Blödsinn, bei ganz kurzen Kabeln kann es auch mal ohne Widerstand funktionieren, ist aber eher ein Zufallsprodukt.
120Ohm an beiden Enden oder auch nur an einem Ende bei kurzen Verbindungen sind absolut in Ordnung.
ohne Terminale Wiederstände, was für mich keinen Sinn macht, da das
Raspi Bord angeblich keinen an Bord hat und in der SPezifiaktion vom
Netzteil dazu auch gar nichts gesagt wird. :/
Standard ist bei CAN Teilnehmer kein integrierter Widerstand, man kann
als Hersteller ja nicht wissen, ob es das physikalische Ende des Busses
ist.
Es gibt auch welche mit schaltbaren Widerständen, entweder per Jumper oder sogar per Software. Aber wenn im Handbuch nix dazu steht, würde ich auch davon ausgehen, dass keiner da ist. Kann man aber einfach mit einem Multimeter nachmessen.
120Ohm an beiden Enden oder auch nur an einem Ende bei kurzen
Verbindungen sind absolut in Ordnung.
Ja. Ganz ohne funktioniert es fast nie, bei zu vielen Widerstanden gibt's irgendwann auch Probleme, weil die Last zu groß wird, aber ansonsten ist CAN da sehr robust.
Oh mein gott,
vielen Dank.
Das macht natürlich Sinn. Ich habe keine Ahnung von CAN und scheitere an solchen Basics. Das hat geklappt und erklärt auch warum 00 00 als kommando funktioniert. Dass kann man ja drehen und wenden, wie man will und es bleibt das selbe :)
Ich habe also Low und High Byte nicht richitg angeordnet ;)
Genau, das Netzteil hat keinen schaltbaren oder festen Wirderstand aber beim Board habe ich mit Multimeter 120 gemessen, auch wenn ich auf der Website von Waveshare zu diesem modell nix zu einem Widerstand finde.
Genau, das Netzteil hat keinen schaltbaren oder festen Wirderstand aber
beim Board habe ich mit Multimeter 120 gemessen, auch wenn ich auf der
Website von Waveshare zu diesem modell nix zu einem Widerstand finde.
Bereits fest eingebauter Widerstand ist häufig bei RS485 oder CAN Shields, die für „allgemeinen Experimentierbedarf“ entworfen wurden, der Fall. Vermutlich wollen die Entwickler damit das Erfolgserlebnis für Gelegenheitsuser erhöhen, die dem Widerstand nicht so viel Bedeutung zumessen. Der Widerstand ist ja eben nicht nur ein reiner Terminierungswiderstand sondern auch ein Arbeitswiderstand, damit sich die Pegel am Bus überhaupt ausbilden können (wie Falk schon schrieb). Jaja, ganz ohne Widerstand kann es auch funktionieren, aber nur in sehr engen Grenzen.
Ein erfahrener Anwender erarbeitet sich die beste Lage der Widerstände sowieso noch einmal genauer.
Andererseits frage ich mich, wieso wenn eine Nachricht ein Ergbnis
bringt, alle anderen ins leere laufen und doppelt im Candump erscheinen.
Du könntest auch einen Logik-Analysator an RXD des SN65HVD230 bzw. an RXCAN des MCP2515 klemmen und dir dort die Vorgänge auf dem CAN-Bus im Detail ansehen. Da wird vieles dann doch noch klarer.
ich mache das ganze über esphome.
Im mcp2515 ist ein TJA1050 verbaut soweit ich das verstehe.
Ich habe 2 Gegenstellen zum Test aufgebaut und die Kommunikation funktioniert hier.
Der BUS funktioniert also.
Hi und Low-bit kann ich nicht drehen, da ich einen Fehler bei 0x8000 bekomme.
Da der Wert über 255 ist.
Aber 8ch bekomme auf die 0x0000 auch keine Antwort. Deswegen Versuche ich hier mein Glück.
Die Verkabelung zum Lader checke ich heute nochmal. Angeschlossen sind CanH CanL und GND.
Gruß Udo
Wer mit CAN Bus experimentiert, dem empfehle ich einen zusätzlichen CAN Adapter zu kaufen, damit hat man eine unabhängige Kontrolle was tatsächlich auf dem Bus übertragen wird.
Ich habe von denen mehrere, weil die mir so gut gefallen und ich habe auch schon ein paar Programme dafür selbst für den PC geschrieben.
Der Link zeigt auf einen USB Adapter der FD-CAN fähig ist und kompatibel zu CAN. Es gibt einen "nur CAN" Adapter, den empfehle ich jedoch nicht zu kaufen, da FD-CAN die Zukunft ist und man nur einmalig Geld dafür ausgeben möchte.
Also der Jumper ist aktiviert. Sprich terminiert.
Das Kabel zum Lader ist ca 5cm lang. Sollte also nichts stören.
Meanwell habe ich schon angeschrieben. Leider keine Antwort.
An dem Lader hängt kein Akku.
Das sollte aber nicht das Problem sein oder?
DIP Schalter sind auf programmieren gestellt.
Was ich nicht genau kapiere sind die Adressen oder IDs
Charger to controller message ID
Controller to charger message ID
Controller broadcasts to charger message ID
Message ID
0x000C00XX
0x000C01XX
0x000C01FF
Allerdings reagiert es komsicherweise nur auf ein Kommando:
und zwar auf
000C0300#0000
darauf bekomme ich zuerst zweimal meine anfrage zurück.
Eigentlich kannst du deine Anfrage nicht "zurückbekommen", denn CAN funktioniert nicht wie eine übliche serielle Schnitte mit 2 Teilnehmern. CAN funktioniert so, dass irgendwer auf dem Bus irgendeine Message mit einer bestimmten ID auf dem Bus sendet. Und wenn es mindestens 1 Teilnehmer auf dem Bus gibt, der diese ID kennt und die Message brauchen kann, dann legt der das ACK auf den Bus.
Ich nutze einen RasPi mit Can/RS485 HAT von Waveshare und habe alles
soweit konfiguriert, dass ich mit cansend senden und per candump diese
Nachricht auch empfangen kann.
Geschickt ist es immer, wenn man 2 solcher Geräte miteinander verbinden und untereinander kommunizieren kann. Dann weiß man schon mal, dass die eigene Hardware tut.
noch eine Idee?
Ich würde erst mal sicherstellen, dass der CAN-Bus hardwaremäßig gut funktioniert. Also mit dem Oszi die Pegel und Flanken sowie das Timing auf beiden Busleitungen kontrollieren. Und dann noch schauen, was sich überhaupt auf dem Bus tut und ob da irgendwas ausser deiner eigenen Message auf dem Bus unterwegs ist.
EDIT zum Thema Oszi:
wenn du den Bus beidseitig mit 120R terminierst und einen 4R7 Widerstand in die beiden Busleitungen schleifst, dann kannst du mit dem Oszi leicht erkennen, welcher der beiden Teilnehmer grade das dominante Bit auf den Bus legt.
Ich habe den Jumper auch schon deaktiviert. Gleiches Ergebniss.
Das System Can Bus habe ich verstanden.
Ich habe eine ID und sende einen Command. Die Gegenstelle oder der Teilnehmer antwortet nur wenn er das in seinem Code hinterlegt hat.
Ich habe 2 ESP32 die miteinander kommunizieren können.
Nur die Kommunikation mit dem Lader funktioniert leider nicht.
Und wenn es mindestens 1
Teilnehmer auf dem Bus gibt, der diese ID kennt und die Message brauchen
kann, dann legt der das ACK auf den Bus.
Nein, das ACK wird immer dann gesendet, wenn mindestens ein Empfänger die Richtigkeit der Message auf dem Bus incl. CRC bestätigen kann, egal, ob der Identifier bzw. die Message für ihn gedacht ist oder nicht.
Und wenn es mindestens 1
Teilnehmer auf dem Bus gibt, der diese ID kennt und die Message brauchen
kann, dann legt der das ACK auf den Bus.
Nein, das ACK wird immer dann gesendet, wenn mindestens ein Empfänger
die Richtigkeit der Message auf dem Bus incl. CRC bestätigen kann, egal,
ob der Identifier bzw. die Message für ihn gedacht ist oder nicht.
Dann ist meine Message nicht richtig??
Ich sende 0x0080 das ist laut Anleitung der Herstellername zum lesen.
Hi there,
I've struggled for the past few days with similar issue. I was using mcp_can library and after checking that all the registries were setup correctly and all my hardware was fine and and and....checking everything!
I then realised with the help of meanwell support that in CANbus you have to swtich the LSB with MSB!
When you send the command, let's say for IOUT_SET (0x0030), you have to send it with the two bytes in the opposite order, like so:
byte data[] = {0x30, 0x00};
Hope this helps someone as I was banging my head for a long time!
Es war ein Wahnsinns weg um am Schluss doch festzustellen, das am Anfang alles richtig war!!!
Hier die Lösung.
Der ESP32 funktioniert super mit dem MCP2515.
Hierzu nutze ich ESPHome in meinem Homeassistant.
Wie in dem letzten Post schon steht, muss das LowBIT als 1. abgefragt werden.
Das habe ich aber schon in einem Post von einer anderen Seite gelesen.
Ich habe mir mit einem Arduino UNO ein CanHack Board gebastelt.
Darüber konnte ich mittels der Software CanHacker Befehle zum Ladegerät senden und auch visualisieren.
Komischerweise funktionierte das. Nur über ESP32 eben nicht.
Dann hatte ich die Idee mal statt extendet-ID eine normale ID zu senden.
Und siehe da. es funktionierte.
Um das ganze kurz zu machen, habe ich zum Schluss dem MCP2515 getauscht und musste feststellen, das er das Problem war.
Mit einem anderen funktioniert alles perfekt.
Falls jemand Interesse hat, helfe ich gerne, da ich hier echt am verzweifeln war.
Hallo Udo,
ich habe mir ebenfalls ein Meanwell NPB-1700-24 bestellt.
Ich würde dieses ebenfalls gerne mit Home Assistent oder IP-Symcon nutzen bzw. regeln.
Da Canbus für mich komplett neu ist, wollte ich mich schon mal etwas einarbeiten.
Gibt es irgendwo eine Anleitung von Dir wie Du das mit ESP Home gemacht hast?
ich kann dir da gerne helfen.
Anleitung ist in meinem Kopf.
Allerdings nur mit homeassistant.
Es gibt auch noch einiges das du über die CAN Steuerung wissen musst. Das Ladegerät muss eingestellt werden.
Hallo Udo,
Danke für die schnelle Antwort.
Aktueller Stand ist Ladegerät bestellt, Lieferung wird aber leider noch dauern.
Wie geschrieben wollte ich aber schon mal alles vorbereiten und mich in Canbus etwas einarbeiten.
Ich habe mehrere ESP32 und Arduinos da und habe auch schon das ein oder andere mit ESP Home gemacht. Von den MCP2515 habe ich einen 3-Pack hier und einen Waveshare USB to Can habe ich ebenfalls bestellt, dürfte Morgen eintreffen.
Homeassistant ist vollkommen ok für mich, wichtig ist, dass ich mal einen Startpunkt habe. Eine Beispiel ESP Home Yaml wäre z.B. ganz cool dann könnte ich mir die genauer ansehen und versuchen zu verstehen.
Hallo Udo,
Danke, werde es am Wochenende mal testen.
Manual vom Netzteil mit den Canbus Adressen/Befehlen usw. habe ich mir schon heruntergeladen.
Werde mir mal einen Testaufbau mit zwei Canbus ESP32 erstellen
und die ersten versuche starten.
Falls ich irgendwo hänge, melde ich mich wieder.
habe nun die ersten Tests gemacht.
Mit zwei ESP32 und Canbus Transceiver SN65HVD230.
Senden und empfangen klappt schon mal.
Ich habe mir auch Deinen Codeschnipsel oben angesehen und die Bedienungsanleitung vom Netzteil.
In Deinem Beispiel oben ist das Auslesen des Ladestroms drin.
1
time:
2
- platform: homeassistant
3
on_time:
4
seconds: /5
5
then:
6
- canbus.send:
7
canbus_id: my_mcp2515
8
use_extended_id: True
9
data: [0x30, 0x00]
10
can_id: 0x000C0103
11
- lambda: |-
12
ESP_LOGD("CAN Strom abfragen","","");
13
- delay:
14
milliseconds: 100
Könntest Du mir noch den Codeschnipsel senden wie man den Ladestromwert setzt?
Reicht es wenn einfach bei data an die 0x30 der gewünschte Wert angehängt wird?
Hallo Udo,
vielen Dank.
Jetzt verstehe ich wie ich die Werte ans Netzteil senden kann.
Damit müsste ich es hinbekommen.
Ich muss bei mir halt noch den Überschuss, den ich ja AC seitig habe, noch umrechnen für DC Seite und dann möchte ich ebenfalls automatisiert den Akku Ladestrom einstellen.
Wenn das Netzteil endlich da ist und ich das ganze in die Praxis umgesetzt habe, gebe ich noch mal Rückmeldung.
Kurze Zwischeninfo.
Netzteil ist leider noch nicht da.
Aber ich ich habe schon einiges mit Canbus getestet.
Wie ich geschrieben hatte würde ich bevorzugt IP-Symcon (https://www.symcon.de/de/) einsetzen.
Deshalb habe ich esp-idf-can2mqtt ausprobiert
(https://github.com/nopnop2002/esp-idf-can2mqtt).
Damit kann ich Canbus Befehle über das ESP Gateway mit IPS senden und empfangen.
Aktuell versuche ich esp-idf-can2mqtt auf einen Olimex EVB Bord zu packen.
Dann hätte ich ein Ethernet Gateway mit can2mqtt und mqtt2can.
Damit kann ich mein Projekt sicherlich realisieren.
Nochmals vielen Dank für die sehr hilfreiche Unterstützung.
Wenn das Projekt fertig ist, gebe ich noch mal Rückinfo.
Hallo,
ich brauche wohl doch noch weitere Hilfe.
Wie geschrieben, versuche ich can2mqtt auf den Olimex EVB zu flashen.
Ich bin auch soweit gekommen, dass es tatsächlich läuft, aber eben nur per WLAN. Ich würde aber gerne LAN nutzen. Deshalb die Frage hier in die Runde, kennt sich hier jemand gut mit der ESP IDF aus und könnte mich in die richtige Richtung führen damit ich den Olimex LAN Treiber in das can2mqtt Projekt einbinden kann?
https://github.com/OLIMEX/ESP32-EVB/tree/master/SOFTWARE/ESP-IDF%20examples/ESP32-EVB_Ethernet_v5.1.1
Netzteil ist zwischenzeitlich angekommen.
Olimex EVB hat per WLAN und MQTT wie erwartet funktioniert.
Da ich es aber unbedingt mit LAN realisieren wollte,
habe ich mir ein Can to Eth Gateway besorgt.
https://www.waveshare.com/wiki/2-CH-CAN-TO-ETH
Damit kann ich nun den Ladestrom mit meiner Smarthome Software regeln (siehe Bild).
ich habe heute mein NPB-450 erhalten und wollte es auch bedarfsgerecht steuern.
Das Kommando 0x0030 (IOUT_SET) scheint keinen wirklichen Einfluss auf den Ladestrom zu haben. Gesetzt wird es aber wohl richtig, weil ich den gesetzten Wert auch zurücklesen kann.
Über 0x00B0 (CURVE_CC) kann ich den Ladestrom steuern (ergibt auch Sinn, solange sich das Ladegerät in der Konstantstromphase befindet), aber hier wird eine neuer Wert erst übernommen, wenn ich den Lader einmal aus- und wieder einschalte.
Hallo,
Worüber ich ganz zu Beginn gestolpert bin ist, dass Netzteil hat von Haus aus Ladekurve eingestellt. Du musst das aber abschalten und auf Manuelle Ladekurve gehen.
Bit 7 musst auf 0 stellen, erst dann nimmt er Ladestromänderungen per Canbus an.
Die 3 DIP Schalter müssen auf off sein und der Jumper für Remote On/Off sollte dran bleiben.
Wenn das BIT 7 auf 0 gestellt hast nicht vergessen das Netzteil Stromlos zu machen und neu zu starten.
Hallo,
Worüber ich ganz zu Beginn gestolpert bin ist, dass Netzteil hat von
Haus aus Ladekurve eingestellt. Du musst das aber abschalten und auf
Manuelle Ladekurve gehen.
Bit 7 musst auf 0 stellen, erst dann nimmt er Ladestromänderungen per
Canbus an.
Die 3 DIP Schalter müssen auf off sein und der Jumper für Remote On/Off
sollte dran bleiben.
Wenn das BIT 7 auf 0 gestellt hast nicht vergessen das Netzteil Stromlos
zu machen und neu zu starten.
Vielen Dank, darüber bin ich jetzt auch zufällig gestolpert :)
Was auch viel gebracht hat, war das aktuelle Datenblatt online anzuschauen. Dort sind viele Dinge erklärt, die in dem Manual, welches beim Netzteil dabei war gar nicht erwähnt sind (z.B. was sofort umgesetzt wird und was erst beim aus- und einschalten).
Leider kann mein Netzteil das Schreiben ins EEPROM noch nicht abschalten. Kennt jemand eine Quelle, aus der man ein NPB bekommt, welches schon die neueste Firmware hat?
Hat jemand schon versucht den Strom noch kleiner einzustellen, als es eigentlich vorgesehen ist? Der Trucki-Stick, der in vielen Youtube Kanälen angepriesen wird scheint dies zu können. Wenn ich es richtig verstehe, dann wird dazu die Spannung reduziert.
warum möchtest du das Ladegerät nicht kleiner einstellen?
Bei meinem sind es 10A. Das entspricht ca. 200-300W.
Was ist die kleinste Stufe bei deinem?
Ich würde es gerne nahezu von 0A einstellen können. Ich habe aktuell ein 450W 12V Ladegerät. Dieses startet bei 5A. Ich habe nicht das 750W Modell genommen, weil dies bei noch größerem Strom startet (wobei das passender gewesen wäre).
Aktuell kann ich zwischen 5A und 25A einstellen. Das entspricht ca. 75W bis 380W.
Verwendet hier noch jemand ESPHome um das NFB zu steuern? Ich benutzte einen MCP2515 CAN Controller an einem ESP32 mit ESPHome. (Vielen Dank für den Code, das hat den Einstieg sehr erleichtert, Udo!)
Ab und zu lese ich zB bei der Akkuspannung 18V zurück. Hier scheint ab und zu etwas nicht ganz sauber in der Kommunikation zu sein.
You won't be able to set the charging current below the minimum that is stated in the datasheet.
I haven't used ESPHome but my code in c++ works well for setting and reading, have no problems with that. You'd have to either hook up a logical analyser or or look into the controller's response somehow else. I guess you sorted out the termination correctly? Keep in mind that NPBs have an internal termination resistor already.
Wenn du noch Hilfe benötigst, melde dich einfach.
Ich war lange auf der Suche nach der richtigen Verkabelung usw.
Ich nutze das ganze über ESP Home an Homeassistant.
Hier noch ein Tipp.
Falls du ein BMS verwendest, würde ich das Entladen schon bei unter 5% beenden, da das Ladegerät sonst Macken bezüglich der Erkennung des Akkus macht.
Ich schalte das Ladegerät auch nicht aus, sonder nutze die ein/aus Funktion über den CANBus.
Falls du ein BMS verwendest, würde ich das Entladen schon bei unter 5%
beenden, da das Ladegerät sonst Macken bezüglich der Erkennung des Akkus
macht.
Mein BMS hat leider keine Schnittstelle. Ich habe zwei 12V 100Ah Akkus parallel (12V, weil ich dafür schon einiges hatte). Ich würde nun bei 12,0V abschalten, um die Akkus nicht zu weit zu entladen.
Laden würde ich am NPB bei 14,0V einstellen.
Ah ok, guess you want to trickle charge? My application is different, as I use the charger to do emergency charging with a backup gasoline generator. Meaning I want to pump as much as safely possible in the shortest period of time.
Hallo zusammen,
ich hoffe, dass in diesem Thread noch was los ist.
@grisu74 ich versuche es im Moment eigentlich, glaube ich, fast genau wie du.
Ich habe ein NPB-750-24 und versuche dieses anzusteuern mit einem dieser China-Boards mit MCP2515/TJA1050 an einem ESP32(S3). Dass mir der Transceiver allein auch gereicht hätte und der ESP CAN bzw. TWAI anbietet, habe ich erst danach mitbekommen, aber seis drum, jetzt versuche ich das eben über SPI.
Und (noch) ohne Level Shifter, sondern mit 4,7kOhm an MISO. Allerdings gehen mir langsam die Ideen aus. Da du aber geschrieben hast, du hattest auch einige Versuche nötig mit der Verkabelung, versuche ichs mal und hoffe auf den entscheidenden Tipp, um um den Level Shifter/extra umsteigen auf Transceiver + wieder andere Implementierung mit ESP-CAN rumzukommen und einfach das vorhandene MCP2515 Modul zu verwenden.
CANH und CANL sind mit dem MCP verbunden, GND (Signal, Pin 4 am NT) mit dem ESP.
Der MCP am ESP mit CS (GPIO10), MOSI (GPIO11), SCK (GPIO12), MISO (GPIO13), sowie VCC an 5VBUS und natürlich GND.
ESPHome wirft keine Fehler bei der CAN/SPI Initialisierung, außer wenn ich was an der Verkabelung (zum falschen) ändere, also da gehe ich aktuell mal vom richtigen aus und dass sich was mit den Pins in die Quere kommt, 10-13 sollte auch safe sein
Pins 7 und 8 am NT sind gebrückt, die DIPs alle auf off (und waren nie anders). Beim aus- und wieder einstecken des Steckers schaltet das NT auch kurz in den Charging Modus, mangels Akku aber gleich wieder aus - aber den brauchtest du ja auch nicht zum Testen, richtig?
Sender ID 0x000C0103, Receiving ID 0x000C0003, 8MHz Clock und 250 kbps in ESPHome gecheckt (A0 und A1 sind unverbunden, also high laut Manual)
ich habe alle möglichen Nachrichten schon implementiert, aber erstmal würde mir eine einfache Antwort auf 0x0000 (OPERATION) schon reichen, das sollte ja klappen auch ohhne Bit 7 der CURVE_CONFIG auf 0 gesetzt zu haben.
Du hattest geschrieben, du hast den MCP2515 letztlich tauschen müssen, von welchem zu welchem bist du da gegangen, oder hattest du zwei gleiche von denen einfach einer blöd war?
Hallo, ach danke für die schnelle Antwort. Okay, ich habe auch zwei und der zweite macht die selben Faxen, bzw. halt gar nichts. Mir fällt auf, dass die Spannung an CANH und CANL nahezu identisch sind. Das kommt mir merkwürdig vor.
Ich bin jetzt auch bald kurz davor alles einfach fest zu verlöten.. Davor prüfe ich noch die selbe Pinbelegung wie bei dir.
Das GND(Signal) am NT hast du einfach vom ESP genommen oder kommt das bei dir auch von der MCP-Platine?
Hast du den INT-Pin vom MCP belegt/angesteuert?
Hallo, ach danke für die schnelle Antwort. Okay, ich habe auch zwei und
der zweite macht die selben Faxen, bzw. halt gar nichts. Mir fällt auf,
dass die Spannung an CANH und CANL nahezu identisch sind. Das kommt mir
merkwürdig vor.
Ich bin jetzt auch bald kurz davor alles einfach fest zu verlöten..
Davor prüfe ich noch die selbe Pinbelegung wie bei dir.
Das GND(Signal) am NT hast du einfach vom ESP genommen oder kommt das
bei dir auch von der MCP-Platine?
Hast du den INT-Pin vom MCP belegt/angesteuert?
Hallo,
CAN H und L müssen gleiche Spannung haben. GND ist sozusagen in der Mitte.
Das Ladegerät hast du richtig eingestellt?
Die Dipschalter und die Brücke?
Genaueres müsste ich erst noch nachsehen.
Mein ESP läuft noch mit Probeverkabelung. Ich würde die Kabel nochmals prüfen. Ich schicke dir meine Belegung.
Dauert allerdings ein wenig.
Nicht aufgeben.
Hi, Udo hmm ok. Den MCP hast du aber schon auch an +5V oder? Das Board soll ja angeblich 5V benötigen, der MCP scheint sich an und für sich aber auch mit 3,3V zu begnügen. Dann wäre das Logic Level gleich erledigt... oder benötigt das NPB explizit einen 5V Pegel? Da find ich jetzt nichts dazu...
Das Ladegerät würde ich als richtig eingestellt bezeichnen, immer und immer wieder hab ich die Pins geprüft.
die 3 DIPs sind auf links wie im Originalzustand (off).
Pin 7 und 8 sind gebrückt also Remote ON ist short
CANL an 12 und CANH an 11, GND vom ESP an Pin 4... Der Rest ist frei.
Ich dank dir ganz herzlich schonmal im Voraus und keine Eile, aufgegeben wird nicht bis es sich beugt :D Ich bin gespannt auf deine Verkabelung.
Hi, Udo hmm ok. Den MCP hast du aber schon auch an +5V oder? Das Board
soll ja angeblich 5V benötigen, der MCP scheint sich an und für sich
aber auch mit 3,3V zu begnügen. Dann wäre das Logic Level gleich
erledigt... oder benötigt das NPB explizit einen 5V Pegel? Da find ich
jetzt nichts dazu...
Das Ladegerät würde ich als richtig eingestellt bezeichnen, immer und
immer wieder hab ich die Pins geprüft.
die 3 DIPs sind auf links wie im Originalzustand (off).
Pin 7 und 8 sind gebrückt also Remote ON ist short
CANL an 12 und CANH an 11, GND vom ESP an Pin 4... Der Rest ist frei.
Ich dank dir ganz herzlich schonmal im Voraus und keine Eile, aufgegeben
wird nicht bis es sich beugt :D Ich bin gespannt auf deine Verkabelung.
Ich hoffe doch mit dem TJA-Transceiver...
Eine GND-Verbindung braucht man bei CAN normalerweise nicht.
Den MCP hast du aber schon auch an +5V oder? Das Board
soll ja angeblich 5V benötigen, der MCP scheint sich an und für sich
aber auch mit 3,3V zu begnügen.
Der MCP2515 würde auch mit 3,3V funktionieren, aber der TJA-Transceiver braucht 5V. Deshalb betreibt man die China-CAN-Boards mit 5V.
Den MOSI vom ESP kann man bei 3,3V direkt an den MCP2515 klemmen. Der MCP erkennt die 3,3V als High-Pegel.
Den MISO vom MCP zum ESP, also von 5V Ausgang auf 3.3V Eingang spendiert man einen Widerstand in Reihe, 4k/ wie du hast passt auch.
INT schliesst man an wenn man CAN-Botschaften interruptgesteuert empfangen will.
GND hatte ich zuerst auch gar nicht dran, dann damit versucht, jetzt wieder weg, leider immer noch ohne Erfolg
MCP bleibt dann wie er ist auf 5V mit dem 4,7k an MISO
INT ist und bleibt unverbunden..
beide MCP Module machen ähnlich wenig
ich habe sogar den 5V auf 3,3V LDO vom ESP aufgemotzt, um hier einen eventuellen Spannungsabfall/-engpass auszuschließen, wobei der ESP32 mit sonst gar nichts außer einem SPI doch wohl nicht exorbitant Strom ziehen sollte
ein zweites NPB werde ich noch ausprobieren
ich ziehe langsam in Betracht, dass ich wohl vielleicht einfach zwei Mist-MCPs bekommen habe. Aber noch glaub ich nicht ganz dran :D
GND hatte ich zuerst auch gar nicht dran, dann damit versucht, jetzt
wieder weg, leider immer noch ohne Erfolg
MCP bleibt dann wie er ist auf 5V mit dem 4,7k an MISO
INT ist und bleibt unverbunden..
beide MCP Module machen ähnlich wenig
ich habe sogar den 5V auf 3,3V LDO vom ESP aufgemotzt, um hier einen
eventuellen Spannungsabfall/-engpass auszuschließen, wobei der ESP32 mit
sonst gar nichts außer einem SPI doch wohl nicht exorbitant Strom ziehen
sollte
ein zweites NPB werde ich noch ausprobieren
ich ziehe langsam in Betracht, dass ich wohl vielleicht einfach zwei
Mist-MCPs bekommen habe. Aber noch glaub ich nicht ganz dran :D
Ich mach morgen mal ein Bild von meinem Aufbau. Dann kannst du genau vergleichen.
das mit der Masse muss wohl noch geklärt werden, ich habe dann auch nachgelesen dass es eigentlich ein 3-Wire Aufbau sein sollte, aber gut, wenn es bei Udo ohne GND geht.. hm
bei den Nachrichten sehe ich keinen Fehler.
für OPERATION habe ich bspw. folgenden Template-Button
1
button:
2
- platform: template
3
id: get_operation_status
4
name: Get operation status
5
on_press:
6
- canbus.send:
7
canbus_id: can_mcp2515
8
data: [0x00, 0x00]
9
- lambda: |-
10
ESP_LOGD("main", "CAN get OPERATION (0x0000)", "");
ich glaube da kann nicht viel falsch laufen, da ich ja einfach nur 0x0000 sende..
wobei canbus wie folgt definiert ist:
1
spi:
2
id: mcp2515_spi
3
clk_pin: GPIO12
4
mosi_pin: GPIO11
5
miso_pin: GPIO13
6
canbus:
7
- platform: mcp2515
8
id: can_mcp2515
9
spi_id: mcp2515_spi
10
cs_pin: GPIO10
11
can_id: 0x000C01FF
12
use_extended_id: true
13
clock: 8MHZ
14
bit_rate: 250KBPS
15
on_frame:
16
- can_id: 0x000C0003
17
can_id_mask: 0x1fffff00
18
use_extended_id: true
19
then:
20
- lambda: |-
21
std::string b(x.begin(), x.end());
22
ESP_LOGD("main", "Received: %s", &b[0]);
die can id habe ich gerade zwischenzeitlich auch mal in 0x000C01FF geändert statt 03, als Controller to Charger Broadcast wie im Manual angegeben. Andert auch nix. Dann noch die can_id_mask dazu genommen beim on_frame, um die letzten 2 Stellen zu ignorieren. Auch ohne Erfolg.
Wenn ich ein bisschen an den Kabeln rüttel, meldet der ESP sofort einige angebliche Nachrichten, also irgendwas tut es ja...
Mal nochmal zur Sicherheit: Pins 7 und 8 müssen SHORT sein am Netzteil, richtig?
guten Morgen!
den 120er auf dem MCP muss man brücken? ne, das wusste ich noch nicht.. wird getestet.
bin gestern noch mit Flussmittel über ESP und MCP drüber um eventuelle kalte Lötstellen o.ä. zu eliminieren, leider war offenbar bereits alles gut.. ein Wechsel auf ESP8266 stünde heute noch an.
Ich hoffe doch mit dem TJA-Transceiver...
Eine GND-Verbindung braucht man bei CAN normalerweise nicht.
Die braucht man genau dann nicht, wenn alle Steuergeräte die gleiche Masse haben. So ist das im Auto.
Am Labortisch liegt der eine Teilnehmer über den USB auf Schutzleiter-Potential, und der andere über die Masseklemme des Oszis. Das tut es auch, zumindest wenn PC und Oszi an der selben Steckdosenleiste hängen. Falls sich in der Firma IT-Strom und Versorgung des Labortisches erst im Keller treffen, können die beiden Schutzleiter auch mal 10 V auseinander sein. Dann funktioniert es ein paar Tage und plötzlich wird der Controller heiss.
Daher besser die Masse mitführen.
Das Signal bei CAN ist U_CAN = (U_CANH - U_GND) - (U_CANL - U_GND). Mathematisch gesehen kürzt sich U_GND raus. Physikalisch gesehen werden aber beide Spannungen gegen Masse gemessen.
Also, GND wieder an Pin 4, keine Änderung, auch mit dem ESP8266 (GPIOs 12-15) kommt nix an, jetzt würde ich noch einen anderen ESP32 ausprobieren oder gleich einen 74HCT125 Level Shifter dazwischen hängen...
danke an alle und besonders dich Udo für deine Mühe. Achtung, jetzt wird's peinlich. Ich habe falsch verstanden, was du meintest mit den Widerstand brücken... Wenn man den Jumper (J1) setzt, dann geht's auch. Mir war nicht klar, dass der Widerstand sonst vom Bus getrennt ist. Heilige Sch...
Ich hoffe, das wird wenigstens zukünftigen Lesern einige blöde Fehlersucherei ersparen!
Danke nochmal!
Zusätzlich, um auch was sinnvolles beizutragen, würde ich gerne noch teilen, wie ich meine SET_IOUT Funktion umgesetzt habe - nämlich mit einer Template Number als Ziel-Stromvorgabe. Sieht aus wie folgt:
1
number:
2
- platform: template
3
optimistic: yes
4
max_value: 22.5
5
min_value: 4.5
6
step: 0.1
7
id: target_current
8
name: Target charging current
9
set_action:
10
- delay:
11
milliseconds: 100
12
- button.press: set_current
13
14
button:
15
- platform: template
16
id: set_current
17
name: Set charging current
18
on_press:
19
then:
20
if:
21
condition:
22
lambda: |-
23
return (id(target_current).state);
24
then:
25
- lambda: |-
26
uint32_t can_id = 0x00C0103;
27
bool use_extended_id = 1;
28
float x = float(id(target_current).state);
29
uint16_t current = x*100;
30
ESP_LOGD("main", "Target current is %f, must become %d then %02x", x, current, current);
ESP_LOGD("main", "Target current is invalid, skip", "");
43
- platform: template
44
id: bit7_disable
45
name: Switch to PSU mode
46
on_press:
47
- canbus.send:
48
canbus_id: can_mcp2515
49
data: [0xB4, 0x00, 0x04, 0x00]
50
- lambda: |-
51
ESP_LOGD("main", "CAN set CURVE_CONFIG (0x00B4) Bit 7 = 0 (0x0004), please power cycle NPB afterwards", "");
52
- platform: template
53
id: bit7_enable
54
name: Switch to Charger mode
55
on_press:
56
- canbus.send:
57
canbus_id: can_mcp2515
58
data: [0xB4, 0x00, 0x84, 0x00]
59
- lambda: |-
60
ESP_LOGD("main", "CAN set CURVE_CONFIG (0x00B4) Bit 7 = 1 (0x0084), please power cycle NPB afterwards", "");
In meinem Fall (NPB-750-24) kann ich laut Manual zwischen 4,5 und 22,5 A einstellen, entsprechend habe ich die Template Number begrenzt. Bei Änderung wird automatisch der Template Button gedrückt, der dann das Kommando absetzt und den Wert der Number in Hex übersetzt. Vielleicht kanns ja jemand gebrauchen.
Dazu habe ich zwei Template Buttons für den CURVE_CONFIG Bit7 Toggle eingebaut.
Habe noch mehr Spielereien eingebaut... bei Fragen gerne fragen.
Vielen Dank euch hier für das Teilen, dieser Thread hat mir damals auch geholfen.
Den Strom stelle ich bei mir direkt über eine Number ohne extra Button:
number:
platform: template
name: "Charge Current"
unit_of_measurement: "A"
optimistic: true
min_value: 5
max_value: 25
step: 0.01
mode: box
id: iout_set
on_value:
then:
- lambda: |-
int setpoint = id(iout_set).state * 100;
byte a = setpoint;
byte b = setpoint >> 8;
uint32_t can_id = 0x000C0103;
bool use_extended_id = 1;
std::vector< uint8_t > data{ 0x30, 0x00, a, b };
id(my_mcp2515)->send_data(can_id, use_extended_id, data);
PS: Mein Lader kann 5-25A
Wie oft setzt ihr bei euch den Strom um das EEPROM nicht zu schnell zu zerstören?
Die Konfiguration wird wohl bei jedem Setzen im EEPROM abgelegt. Bei neuerer Firmware kann man das auch über CAN abschalten. Mein Lader kann das leider noch nicht. Ich meine im Handbuch steht irgendwo etwas von 4 Millionen Schreibzyklen oder so.
Warum in 1A Schritten? Der Lader kann doch auch 0,1A?
Noch eine Sache: Es gibt einen Trucki-Stick, der wohl auch unter dem minmalen Ladestrom des Laders gehen kann. Ich denke, dass er das über die Spannungsbegrenzung macht. Ich habe damit mal gespielt und bei so auch Ladeströme unter 5A einstellen können. Nutzt das jemand von euch?
das EEPROM hab ich noch im Blick und die Begrenzung. Hast du da einen kurzen Tipp wie der Befehl wäre? Hab in meinem Manual dazu nichts gefunden aber es mal irgendwo gelesen.
Gleiches gilt für die Spannungsbegrenzung. Das wollte ich mir auch noch ansehen, jedoch noch nichts weiter. Mein Akku ist auch noch gar nicht da. Also wenn ich mit SET_VOUT etwas runtergehe nimmt SET_IOUT auch geringere Werte entgegen?
Sind auf jeden Fall zwei Dinge die ich noch umsetzen will.
PS: Code kannst du hier auch einfach in [ code ] Tags setzen für die Formatierung. Danke fürs Teilen!
Wie oft setzt ihr bei euch den Strom um das EEPROM nicht zu schnell zu
zerstören?
Ich habe nicht den ganzen Thread durchgelesen aber ...
Man muss ja nicht immer in die gleiche Speicherstelle schreiben. Es gibt Techniken (Software) die das über den gesamten Speicher verteilt und ihn erst löscht wenn er voll ist. So kann die Lebensdauer vervielfacht werden.
Ich habe nicht den ganzen Thread durchgelesen aber ...
Man muss ja nicht immer in die gleiche Speicherstelle schreiben. Es gibt
Techniken (Software) die das über den gesamten Speicher verteilt und ihn
erst löscht wenn er voll ist. So kann die Lebensdauer vervielfacht
werden.
Machen Sie vermutlich auch, um auf die genannten 4 Million zu kommen.
Wenn man 1x pro Sekunde schreibt sind das nur 4 Millionen Sekunden. Gehen wir mal davon aus, dass man maximal 10h am Tag diese Regelung laufen hat, dann macht das
"Bit 10 EEP_OFF: Disable to write voltage and current parameters to EEPROM
0= Write the voltage and current parameters into EEPROM in real time
(Default)
1= Disable to write the voltage and current parameters into EEPROM in real
time
Please refer to Chapter 6.4.4 for details."
Leider kann meiner das noch nicht. Es taucht in meinem Handbuch auch nicht auf. Ich habe es trotzdem mal probiert, aber leider geht es wirklich nicht.
In 6.4.4. steht dann:
"Description of EEP_OFF:
When the EEP_OFF, the bit 10 of the high byte of SYSTEM_CONFIG is 0 (
default) : These seven commands 0xB0 to B3, 0xB9, 0x20, and 0x30 are
written into EEPROM in real time.
When the EEP_OFF, the bit 10 of the high byte of SYSTEM_CONFIG is 1:
These seven commands: 0xB0 to B3, 0xB9, 0x20, and 0x30 cannot write
into EEPROM."
Die Anzahl der Zyklen habe ich auf die schnelle nicht gefunden
Zum Laden bei kleinerem Strom: Nein, einfach die Spannung reduzieren gibt einem keinen weiteren Einstellbereich beim Strom, aber bei entsprechend kleiner Spannnung fließt einfach weniger Strom und den liefert das Ladegerät bis zu gewissen Grenzen dann auch, auch wenn der unter dem einstellbaren Minimum liegt.
Ja, leider schon. Ich teste heute Abend deinen Code aber noch einmal.
Aktuell habe ich ein 12V System mit 400Ah LFP (4x 100Ah) daran einen NPB 480-12. Ich würde gerne auf den NPB 1700-12 gehen, aber natürlich ungern einen für 400EUR bestellen um dann zu merken, dass der das auch nicht abschalten kann.
Womit macht ihr die Einspeisung? Und welche Akkuspannung nutzt ihr?
Ggf. wäre ein Umbau bei mir ohnehin sinnvoll.
Ah Mist.. okay.. ärgerlich. Ich habe das Netzteil direkt aus China geordert und die Sache war mir gar nicht bewusst, hatte jetzt einfach Glück. Das Herstellungsdatum habe ich ausgelesen, 27.05.2024.
Ich habe geplant auf 8x 100Ah LiFePo zu gehen. Warte aber aktuell noch auf die Lieferung, hängt wohl im Zoll. Entsprechend habe ich ein NPB-750-24 und einen SoyoSource GTN-1000W-24. Abgerundet wird's von einem JK B2A8S20P BMS.
Den WR versuche ich jetzt auch noch anzusprechen über RS485, soll beides der selbe ESP32S3 übernehmen.
Mach das alles aber auch zum ersten Mal, entsprechend kann ich leider gar keine Aussagen treffen, vor allem Mangels Akku noch, alles nach bestem Wissen nach Recherche zusammengetragen :D
Zum Laden bei kleinerem Strom: Nein, einfach die Spannung reduzieren
gibt einem keinen weiteren Einstellbereich beim Strom, aber bei
entsprechend kleiner Spannnung fließt einfach weniger Strom und den
liefert das Ladegerät bis zu gewissen Grenzen dann auch, auch wenn der
unter dem einstellbaren Minimum liegt.
Ja gut, also mit VOUT runtergehen leuchtet mir ein, aber wie(so) sollte deswegen der Ladestrom auch sinken?
Leider kann man IOUT ohne Akku nicht setzen, bzw. READ_IOUT ergibt immer 0, sodass ich da im Moment das effektive Minimum noch nicht herausfinden kann. Bei der Spannung sind es ziemlich genau 21 Volt, die das Netzteil noch zulässt. Allerdings krieg ich damit ja auch keinen 8-Zellen LFP Akku voll..
Irgendwas scheine ich da noch nicht verstanden zu haben, aber eine andere Lösung/Möglichkeit die Ladeleistung zu reduzieren erschließt sich mir auch nicht? Und wirklich weit runter käme man damit ja auch nicht.
Ich hatte bei der o.g. Funktion zum Ladestrom setzen übrigens einen Dreher bei hex0/hex1.. Ups. Hier korrekt, mit dem Analogon zur Spannung/VOUT_SET:
1
- platform: template
2
id: mw_set_voltage
3
name: "${mw_name} set charging voltage"
4
on_press:
5
then:
6
if:
7
condition:
8
lambda: |-
9
return (id(mw_target_voltage).state);
10
then:
11
- lambda: |-
12
uint32_t can_id = id(global_can_sender_id);
13
bool use_extended_id = 1;
14
float x = float(id(mw_target_voltage).state);
15
uint16_t voltage = x*100;
16
ESP_LOGD("${mw_name}", "Target voltage is %f, must become %d then %02x", x, voltage, voltage);
ESP_LOGD("${mw_name}", "Target current is invalid, skip", "");
Würde dann noch eine Funktion schreiben, der man einfach die Ladeleistung vorgibt, die dann je nach dem den Strom setzt und ggf. auch noch mit der Spannung runtergeht. Dafür brauchts dann aber erstmal den Akku hier, wie gesagt.
Hallo Udo,
dann ist dein Netzteil wohl vom 28.11.23 mit der FW Rev. 1.10 und damit leider zu alt für die EEPROM Funktion :(
Trotzdem würde ich einfach mal versuchen, SYSTEM_CONFIG mit 0x0403 zu setzen wie oben geschrieben. NT neustarten und nochmal kucken, was bei der Abfrage von SYSTEM_CONFIG dann raus kommt.
Ja gut, also mit VOUT runtergehen leuchtet mir ein, aber wie(so) sollte
deswegen der Ladestrom auch sinken?
Weil Du eine Spannung zwischen der Zelle und dem Ladegerät brauchst, damit Strom fließen kann.
Die Spannung musst Du dann natürlich auch nachführen, darum benutze ich das bisher nicht. Zudem fängt es bei mir auch schon bei etwa 70W an.
Thanks a million! I also ordered a MeanWell NPB (-1700-48) for my DIY home battery to be steered by CAN-BUS. I'm now gathering all bits and pieces (do not have a actual battery yet). But like the title of this tread, the charger did not listen to commands (it did acknowledge the CAN-BUS messages though). Again just for reference (like Matej L. in a previous contribution): COMMANDS HAVE TO BE SENT WITH SWAPPED LOW AND HIGH BYTES, thus reading from the manual e.g. set system_config (0x00c2), you have to sent 0xc2, 0x00. I know, it is in the manual, but I guess many of us are first time CAN-BUS users.
Next, some fields from the charger (e.g. manufacturer date) where messed up (showing 160119, a number that showed up again in the serial number of the charger: 000076 + 160119) I do not know. Firmware shows: 0f 0b ff ff ff ff So, if I divide (like some previous code sample showed) the first byte, firmware is 1.5 (?) Anybody know the purpose of the second byte that has value 0x0b?
I could write 0x03, 0x04 to 0xc2, 0x00 and the value of 4 (the famous bit 10) was sustained after power up, indicating it has the disabled EEPROM write function. (again, I do not have a battery yet, so it all has to prove itself).
That's all I have to share. Great thread. Happy to help others
(using raspberry pi 3B+ (lan), Waveshare 2-CH-CAN-Hat, NPB-1700-48 as charger and OpenDTU together with Hoymiles HMS-500 as inverters)
And, oh yeah, the search term for the connector on the MeanWell NPB: JST PHDR-14VS
Hello Udo, Greetings from India...I am going nuts over this CAN communication with NPB-1700..
I have used, Arduino UNO board with MCP2515, Waveshare USB- CAN Converter and other peripherals, But i am just unable to get the CAN Data from Charger or communicate with it.
I Have followed your instruction about 120ohm resistance but still no luck.
Can you please share link to your Arduino code code where i can check how you have done he addressing. That will be really helpful..
since we all used espressif controllers and esphome to program it, there's no arduino implementation.
however it should be no problem to adapt. take note of the initialization with 8MHz clock and 250KBPS bit rate, right adresses as well as the swapped low and high bytes as @markjoe stated.
and yes, you're correct, the CAN bus must be terminated by the mentioned resistor. in my case I didn't notice my MCP2515 module needed the jumper on its pcb to be bridged in order to terminate, which caused the communication to not work at all. jumper set and it's all good. what MCP2515 board do you use?
furthermore you have to make sure the power supply itself has the right pin/jumper configuration. usually you should not need any jumpers or extra wires besides of the CAN bus wires.
I'll attach some esphome code where you can see the addressing and so on.