ProChip BADASS eBIKES

Autor Thema: DU45: Korrektur des Tachos und der Abregelgrenze  (Gelesen 3846 mal)

Offline Steueroase

  • Newbie
  • *
  • Join Date: Feb 2014
  • Beiträge: 3
  • Dankeschön: 1 mal
DU45: Korrektur des Tachos und der Abregelgrenze
« am: 26. Februar 2014, 11:49 »
Das Problem:

Angeblich achtet der TüV darauf, dass die DU45 nicht oberhalb von 45km/h unterstützt. Um das sicherzustellen, wird zum Einen der Radumfang etwas grösser eingestellt - zB 2,2 anstatt 2,15m. Doch das reicht wohl noch nicht: zusätzlich wird eine Tachovoreilung eingebaut. Dies wird dadurch realisiert, dass dem Radumfang nochmal 10cm hinzugedichtet werden. Damit sind dann die angezeigte Geschwindigkeit und Wegstrecke falsch. Die Abregelung findet bei 42 km/h statt.
Der Nachweis ist denkbar simpel: Referenztacho am Rad montieren, Reedschalter an den Bosch-Sensor tapen, Radumfang aus der DU45 (2200mm) plus 100mm im Referenztacho einstellen. Tacho und KM-Zähler laufen jetzt synchron.

Was ich davon halte, bedarf keiner weiteren Erklärung. Das Ziel ist also, Tacho und km Anzeige zu korrigieren.


Folgende Lösungsansätze fallen mir dazu ein:

1. Klassisches "Sensortuning", also jeden 2. Impuls vom Sensor verschlucken: die Kiste geht schneller (zu schnell), Tacho ist komplette Grütze. Geht nicht.

2. Verbessertes Sensortuning: n Magnete am Hinterrad anbringen und die Impulse durch n+1 teilen. Etwas besser, jedoch müsste für eine brauchbare Korrektur 16 Magnete ans Rad (17/16 ungefähr gleich 2300/2150). Sieht komisch aus, und verschleisst den Reedkontakt 16 mal schneller.

3. Alternativer Sensor: Irgendeine Vorrichtung mit stationärem Magnet und analogem Hallsensor, der die vorbeiflutschenden (magnetischen) Speichen zählt. Das wären 32 Impulse pro Umdrehung, die man nur entsprechend zu teilen braucht. Die Herausforderung ist hier das Sensordesign (low power, robust, zuverlässig). Einfacher wäre ggf ein photoelektrischer Sensor, der allerdings kaum "low power" sein wird.

4. Bei vorhandenem Nabendynamo könnte man die Impulse vom Dynamo selbst nutzen. Gängige Teile von Shimano habe 28 Pole, also locker ausreichend. Die Stromversorgung des Teilers sowie des vom Teile anzusteuernden Elektromagneten, der seinerseits den originalen Reedkontakt auslöst, kommt auch vom Nabendynamo. Dieser Ansatz scheint mir recht vielverprechend zu sein.

5. DU45 Modifikation: man könnte mal mit der Taktfrequenz des Teils rumexperimentieren. Erhöhte Taktfrequenz bedeutet ja, dass die Software mehr "Zeit" zwischen den Sensorimpulsen sieht, und eine niedrigere Geschwindigkeit ermittelt. Der KM-Zähler geht trotzdem weiterhin falsch, die Uhr ggf. auch.

6. Sensortuning reloaded mit Mikrokontroller: Es bleibt bei einem Speichenmagneten. Die abgenommenen Impulse werden zeitlich verzögert und ggf. Impulse "verschluckt". Diesen Ansatz finde ich sehr interessant, deswegen werde ich ihn detaillierter beschreiben:

Grundsätzliches: Die Schaltung nimmt Impulse entgegen und gibt diese nach Bearbeitung an die DU45 weiter.
Wir kennen den echten Radumfang (2150mm) und den von der DU angenommenen Umfang (2300mm). Gegeben sei ein Zählerregister (A). Bei jedem eingehenden Impuls wird das Register A um 2,15 erhöht. Immer wenn A grösser als 2,3 wird, wird ein Impuls an die DU weitergegeben und A um 2,3 erniedrigt. Dadurch "verschwinden" die überzähligen Impulse, und der KM-Zähler der DU arbeitet jetzt genau. Die angezeigte Geschwindigkeit hingegen oszilliert zwischen dem zu hohen Wert, und eine zu tiefen Wert, die Abregelung setzt also nach wie vor zu früh ein.
Die verbleibenden Impulse müssen also zeitlich so verschoben werden, dass der Tacho auch die korrekten Werte anzeigt.
Wir nehmen also die Geschwindigkeit, also die Ableitung des Weges nach der Zeit, hinzu. Im vorliegenden diskreten System haben wir also: v = 2,15/dT, wobei dT die zwischen zwei konsekutiven Impulsen vergangene Zeit in s ist. Im Mikrokontroller sollte sich das recht einfach mit einem Timer realisieren lassen. Wir speichern diesen ermittelten Wert in m/s in Register V.
Die Überlegung ist folgende: das Register A enthält stets die tatsächlich zurückgelegte Wegstrecke (in m), die noch an die DU übermittelt werden muss. Man kann also den Zeitpunkt ermitteln, zu dem der Impuls an die DU rausgehen muss. Wir brauchen dazu auch noch ein Register B, welches die von der DU ermittelte Wegstrecke zählt. Dieses wird bei jedem Impuls um 2,3 erhöht.
Beispiel: konstant 10,8 km/h entsprechend 3 m/s. Die Eingangsimpulse kommen mit 1,4Hz, also alle 717ms (Umfang 2,15). Startwert für A sei 0. Impuls n setzt A auf 2,15, B auf 2,3. Anhand von Impuls n-1 wurde eine dT von 717ms gemessen, in V steht also 3m/s. Die Frage ist also, wann werden 2,3 m zurückgelegt sein. Antwort: t = d/v. Da wir diese Berechnung zum Zeitpunkt des Impulses n ausführen, wird also nur an der Verzögerung interessiert sind, haben wir (B-A)/V = (2,3-2,15)/3 = 0.05s. Diese Verzögerung lässt sich mit einem zweiten Timer, der als One-shot programmiert ist, realisieren.
Jetzt kommt der nächste Impuls bei Wegstrecke 4,3 m. Zuerst berechnen wir A=A+2,15 und B=B+2,3. Die Geschwindigkeit sei weiterhin bei V = 3m/s. Dieser Impuls muss also um (B-A)/V = (4,6-4,3)/3 = 0.1s verzögert werden. Und so weiter.
Beim 15. Impuls gibt es aber einen Überlauf: B-A ist grösser/gleich dem tatsächlichem Radumfang. Dann wird kein abgehender Impuls erzeugt, B wird um A verringert, und A wird auf den tatsächlichen Radumfang gesetzt (also Status Quo von Puls Nummer 1)

Hier der Algorithmus in Lua (240 Impulse werden simuliert):

-- Konfiguration:
local Ureal, Ubosch = 2150, 2300 -- in mm

-- Arbeitsvariablen (können Integer sein)
local A=0         -- Tatsächliche Strecke in mm
local B=0         -- von der DU vermutete Strecke in mm
local V=0         -- "Velocity" in mm/s

for i = 1,240 do
   local delay   
   A = A + Ureal         -- Wegstreckenzähler
   B = B + Ubosch
   V = 3000            -- bestimme Geschwindigkeit

   local dU = B-A         -- DU fehlerbedingte Streckendifferenz
   if dU < Ureal then       -- kleiner als Radumfang?
      delay = (dU)/V      -- one shot timer delay
   else
      delay = "--"      -- kein Impuls nötig
      B = B - A         -- Streckenzähler reset
      A = Ureal
   end

   print(i, A, B, delay)

end

Das könnte so ähnlich auf einem PIC umgesetzt werden. Natürlich muss noch die Geschwindigkeitsberechnung mit rein, und auch der Fall des Anhaltens betrachtet werden -- also was passiert, wenn die Geschwindigkeit zu niedrig ist. Beispielsweise könnte man unterhalb 3..4 km/h einfach die Impulse durchreichen.

Mit dieser Korrekturmethode sollte die DU45 endlich richtige Werte anzeigen. Wer macht mit?

.
 

Offline elsi

  • Administrator
  • Sr. Member
  • *****
  • Join Date: Jun 2011
  • Beiträge: 262
  • Dankeschön: 2 mal
Re: DU45: Korrektur des Tachos und der Abregelgrenze
« Antwort #1 am: 26. Februar 2014, 17:47 »
Hallo Steueroase,

Ich würde es mit zweit Timern machen.

Timer 1 misst die Zeit die eine Radumdrehung dauert.
Der Wert wird um 1/16 dekrementiert und in ein Register geschrieben.
Aus diesem Register bedient sich Timer 2.
Wenn Timer 2 abgelaufen ist wird ein Ausgangsimpuls erzeugt und der Registerwert erneut in den Timer geschoben.

Würde das so gehen?

Stay tuned

Elsi


Conway Q-EMR 500 (Badass Box typ3.2)
 

Offline Steueroase

  • Newbie
  • *
  • Join Date: Feb 2014
  • Beiträge: 3
  • Dankeschön: 1 mal
Re: DU45: Korrektur des Tachos und der Abregelgrenze
« Antwort #2 am: 27. Februar 2014, 10:10 »
Hallo elsi,

Der Ansatz mit 2 Timern ist schon richtig. Allerdings muss die Verzögerung für jeden Impuls einzeln berechnet werden. Ich habe den Algorithmus mal etwas für einfache 8 bit Mikrokontroller optimiert. Das heisst, die Anzahl der Operationen in der Hauptschleife reduziert, Divisionen wegoptimiert bzw. durch bitshift (vulgo Bytes weglassen), beliebige Taktraten für die beiden Timer (müssen nur gleich sein)

In Kurzfassung für 8bit Arithmetik: Eine Radumdrehung sei in 2^8 Teile geteilt. Pro Umdrehung fehlen der DU45 also 17,8 Teile, (gerundet 18/256 vom Radumfang). Dieser Fehlbetrag wird in "D" aufsummiert. Wenn bei dieser Addition ein Überlauf auftritt, wird nix gemacht (Impuls verschluckt). Ansonsten wird der zweite Timer gestartet. Der Verzögerungswert ist der Wert aus T1 multipliziert mit dem Fehlbetrag D, wovon das Lowbyte fallengelassen wird.

Mit 8 bit Arithmetik ist der Gesamtfehler mit bis zu rund 1% recht hoch. Mit 16bit reicht die Präzision, um den Radumfang millimetergenau zu korrigieren.


Code:
-- Konfiguration:
local Ureal, Ubosch = 2150, 2300 -- in mm
local intmax=2^16         -- 8 oder 16 bit Arithmetik

-- Vorbereitung:
local dU = int((Ubosch-Ureal)/Ureal * intmax + 0.5) -- Wegstrecken differenz in 1/intmax
local V=3               -- "Velocity" in m/s [Demo....]

-- Arbeitsvariablen
local D=0               -- akkumulierte Streckendifferenz
local T1=0               -- Timer 1; ticks seit letztem Impuls
local T2=0               -- Timer 2: Erzeuge Ausgangsimpuls nach Ablauf

-- Die Hauptschleife
for i = 1,50 do
   T1 = Ureal/V         -- Timer 1 auslesen (ticks)

   D = D + dU         -- Wegstreckenzähler [modulo intmax]
   if D < intmax then       -- kleiner als Radumfang? [nur wenn kein Überlauf!]
      T2 = T1*D/intmax   -- Impuls nach <delay> ticks (Timer 2)
      n = n+1
   else
      D = D % intmax   -- Streckenzähler reset [nicht nötig bei int rollover]
      T2 = "--"         -- kein Impuls nötig!
   end

   print(i, T2, D, i/n)

end


.
 

Offline elsi

  • Administrator
  • Sr. Member
  • *****
  • Join Date: Jun 2011
  • Beiträge: 262
  • Dankeschön: 2 mal
Re: DU45: Korrektur des Tachos und der Abregelgrenze
« Antwort #3 am: 28. Februar 2014, 14:45 »
Also, in der Embedded Welt würde das dann etwa so aussehen:
Controller @4,8MHz d.h. 18750 Timeroverflow/sec.
T_VMIN 40000 entspricht dann ca 3 km/h:
Main loop brauchts keine, Timer und Pin Interrupt reicht völlig:

Timer interrupt:

  if(t_real<T_VMIN)
     t_real++;   
   else
     t_fake=0;


   if(t_fake) {
     if(!(t_fake--)) {
   pulse();
        t_fake = t_buffer;
   }


Pin interrupt:

  t_buffer = t_real-((t_real>>4)+(t_real>>5));      // (1/16)+(1/32) 9,375 %
  t_real=0;

Stay tuned

Elsi
Conway Q-EMR 500 (Badass Box typ3.2)
 

Offline as19

  • Full Member
  • ***
  • Join Date: Feb 2012
  • Beiträge: 115
  • Dankeschön: 1 mal
Re: DU45: Korrektur des Tachos und der Abregelgrenze
« Antwort #4 am: 28. Februar 2014, 18:12 »
hi
was erwartet ihr von firmen die werbung betreiben, dass sie die wahrheit sagen???
mfg as19
 

Offline Steueroase

  • Newbie
  • *
  • Join Date: Feb 2014
  • Beiträge: 3
  • Dankeschön: 1 mal
DU45: Korrektur des Tachos und der Abregelgrenze -- die wahre Lösung
« Antwort #5 am: 01. August 2015, 00:51 »
So, hier nun die einzig wahre Lösung zu dem eingangs beschriebenen DU45 Problem: man braucht die Drive Unit nur mit zB einem M-Ped SE Vmax Remover umzuprogrammieren, d.h. den Radumfang um den Faktor 1.05 zu verkleinern.

Hintergrund: Die Classic DU's sind alle identisch, egal, ob 25 oder 45er Modell. Es ist die gleiche Software drin, und diese enthält 2 Sätze Regelkurven. Im 25er Modus erfolgt zB die Kadenzabregelung spürbar früher (Begrenzung auf "250" Watt!), und im 45er Modus gibt es diese unsägliche Tachovoreilung. Wer seine DU25 mit dem M-Ped SE freischaltet, sollte also auch gleich den Radumfang korrigieren :-)

Wie dem auch sei, die Lösung ist zwar nicht preiswert, aber auch nicht billig. Ich bin absolut zufrieden damit.

.
 
Folgende Mitglieder bedankten sich: Administrator

 

UA-12726453-11 Sponsoren: Open eBike SHOP | ProChip | BADASS eBIKES