Auf Wunsch von @pfeifferl beschreibe ich hier, wie ich die Geschwindigkeitsanzeige des Displays korrigiert habe.
Über die Schwierigkeiten bei dieser Korrektur hatte ich schon mal
hier berichtet.
Der Sevcon überträgt die aktuelle Motordrehzahl mit Hilfe einer sogenannten
PDO über den CAN-Bus an das Display oder die ECU, wo der Wert in eine Geschwindigkeit umgerechnet wird. Das Mapping dieser PDO ist im Sevcon in einer Tabelle im Register 0x1A04 abgelegt, die zugehörige Id (0x391) im Register 0x1804. Das Tabelle enthält 3 Parameter, neben der "vehicule speed" (0x606.00C) noch die "Id referenc current" (0x4602.2A) sowie den "Maximum battery discharge current" (0x2870.02). Die "vehicule speed" (int32) hat vier Hexbytes, die anderen beiden (int16) jeweils zwei, d.h. die PDO besitzt die maximal mögliche Länge von 8 Hexbytes.
Da es nicht geklappt hat, die "vehicule speed" im Controller zu korrigieren, habe ich sie im Mapping durch die "user speed 1" (0x2722.00) ersetzt. Diese überträgt auch die Motordrehzahl, lässt sich aber über die Register 0x2915.04 und 0x2915.05 skalieren. Im Gegensatz zur "vehicule speed" enthält die "user speed 1" (int16) aber nur zwei statt vier Hexbytes. Die fehlenden zwei Bytes müssen nun durch Einfügen von zwei Nullbytes nach der "user speed 1" ergänzt werden. Ich habe dies durch Hinzufügen eines weiteren int16 Parameters nach "user speed 1"erreicht. Als Parameter habe ich "user Speed 2" (0x2723.00) gewählt, dieser Parameter ist immer 0, solange das Register 0x2915.07 nicht geändert wird und den Wert 0 enthält. Das neue Mapping der PDO 0x391 enthält nun also die 4 Parameter 0x2722.00, 0x2723.00, 0x4602.2A und 0x2870.02 und damit wieder eine Länge von 8 Hexbytes. Da die Tabelle jetzt 4 Parameter enthält, muss auch das Register 0x1A04.00 (Number 0f mapped objects) der Mapping Tabelle von 3 auf 4 geändert werden.
Beim Ändern der Mapping Tabelle ist eine bestimmte Prozedur vorgeschrieben, die am Ende des oben verlinktem PDO-Dokument beschrieben wird. Beim Sevcon muss zusätzlich zu Beginn noch in den preoperational Modus geschaltet werden. Dabei stürzt der Arduino-Sketch jedes mal ab, das Kommando wird zwar noch ausgeführt, aber alle weiteren Eingaben werden mit einer Fehlermeldung quittiert. Als Workaround muss man den Sketch wieder neu starten, in dem man den Arduino über den USB-Stecker neu verbindet.
Die Abfolge der verwendeten Kommandos zum Ändern der PDO hänge ich hier mal an, nach dem ersten Befehl (w 2800 0 1) wird er Sketch abstürzen. Der zweite Befehl (r 5110 0) dient deshalb zu Kontrolle, ob sich der Controller auch im preop Modus befindet. Mit den letzten beiden Befehlen wird in den op-Modus zurückgeschaltet und der Schaltvorgang überprüft.
w 2800 0 1 //set preoperational
r 5110 0 //Modus auslesen, 127 = prep
w 1804 1 2147484419
w 1a04 0 0
w 1a04 1 656539664
w 1a04 2 656605200
w 1a04 3 1174546960
w 1a04 4 678429200
w 1a04 0 4
w 1804 1 913
w 2800 0 0 //set operational
r 5110 0 // 5 = op
Nun muss nur noch die "user Speed 1" skaliert werden. Dies geschieht mit den beiden folgenden Befehlen:
w 2915 4 88
w 2915 5 100
Ich hatte hier einen Faktor 88/100 gewählt, was einer Korrektur der Geschwindigkeit um 12% entspricht. Man kann hier natürlich nach eigenem Gusto auch andere Werte eingeben..