Forum: Mikrocontroller und Digitale Elektronik CAN-BUS Speedsignal -> Analog Rechtecksignal


von Hermy (Gast)


Lesenswert?

Hallo an alle,
ich hoffe, Ihr könnt mir weiterhelfen.

Ich bin grad dabei eine Routine zu schreiben, welche das Speedsignal aus 
dem CAN-BUS raus filtert und in Rechtecksignale für ne Navi umwandelt.

Das funktioniert auch soweit in den Grundzügen, allerdings viel zu 
ungenau.

Mein größtes Problem ist, das die Impulse "nachziehen", also wenn das 
Auto hält gibt das Modul noch ein paar Impulse raus und man kann sehen, 
wie das Navi langsam weiter läuft, obwohl das Auto steht, nach ca. 1Sek. 
springt das Navi an die reale Stelle zurück.


hier mal die Routine für die Impulswandlung:
1
void speedimpuls(unsigned int hi, unsigned int low)
2
{
3
  double impuls;
4
  double i;
5
6
  impuls = hi + low;
7
  if (impuls == 0) return;
8
9
  impuls = (hi * 256) + low;
10
  impuls = impuls / 80;
11
12
  for (i=820; i>=impuls; i--);
13
14
  PORTB |= (1<<SPEEDIMP);
15
  for (i=0; i<200; i++);
16
  PORTB &= ~(1<<SPEEDIMP);
17
18
}
hi = Hoher Bytewert
low = kleiner Bytewert

Hoffe, mir kann einer weiterhelfen oder ein Beispielcode, link oder 
ähnliches geben, womit ich weiter komme.

Gruß
Hermy

von opacer (Gast)


Lesenswert?

Wäre es nicht einfacher direkt an den Radsensor zu gehen bzw. an den 
Impuls der ins ABS geht?

von Hermy (Gast)


Lesenswert?

Von der Idee her schon, aber dann müsste extra ein Kabel vom Motorraum 
ins innere gelegt werden.
Ausserdem ist es viel eleganter und interessanter den Speedpuls über den 
Innenraum-Can rauszufiltern :)

von opacer (Gast)


Lesenswert?

Dann geb doch wenn du die Geschwindigkeit im µC hast, das ganze über PWM 
aus .. Was erwartet das Navi denn für einen Impuls?

Gibt das Modul denn wirklich noch 1 sekunde daten aus oder denkst du das 
weil das Navi weiterläuft?

von Hermy (Gast)


Lesenswert?

das muss ein rechtecksignal sein, wo die frequenz mit steigender 
geschwindigkeit ebenfalls steigt

von Martin (Gast)


Lesenswert?


von crazy horse (Gast)


Lesenswert?

Tja, wäre schon interessant, welches Auto, welcher Can-Bus.
Neben dem Geschwindigkeitssignal gibts auch Wegstreckenimpulse.
Falls es passt:
ID 0x351
Byte0 vorwärts/Rückwärts
Byte1/2 Geschwindigkeit
Byte3/4 Wegstreckenimpulse

von Hermy (Gast)


Lesenswert?

Hi Martin,

sieht super aus, dein Projekt.
Leider finde ich keinen Link zur Software.

Kannst mir den Link schicken? Damit werde ich sicher schon sehr viel 
weiter kommen.
Auto isn AlfaRomeo aber da isses ja egal ob für Audi oder Alfa, müssen 
ja nur die entsprechende ID und die abzufragenden Bytes angepasst 
werden.

MfG
Hermy

von Martin (Gast)


Lesenswert?

Du weißt aber nicht unbedingt, wie du die geschwindigkeit in die Impulse 
umrechnest.

Sourcecode findest du jetzt auf meiner Seite. Ich glaube gut kommentiert 
hatte ich ihn damals nicht. Wenn du Fragen hast kannst du gerne Fragen.

von Gast (Gast)


Lesenswert?

Was ist denn das für ein Navigationsgerät? So ein TomTom, Navigon oder 
Garmin PNA?

Gruß.

von Hermy (Gast)


Lesenswert?

Hi Martin,

vielen Dank für den Source, nun muss ich mich erstma durch asm durch 
wühlen, da ich vorher nur über c gecodet hab. Ich finde der code is 
recht gut kommentiert.
Die Umrechnung der Geschwindigkeit in Impulse muss nicht 100% stimmen, 
sie muss nur gleichmäßig mit der geschwindigkeit steigen und fallen. Die 
Navi kallibriert sich selbst anhand der Impulse und des 
Positionswechsels übers GPS-Signal.
@Gast: Die Navi ist eine Pioneer HD3BT.

von Hermy (Gast)


Lesenswert?

Hi Martin,

irgendwie blicke ich nicht so ganz durch...

ist das der komplette Source?
Ich finde keine ID's oder Stellen, die er abfragt, nach der Art, "Wenn 
die ID mit dem Byte, dann mach was..."
Hab auch nichts mit "out" gefunden, also da spielt sich irgendwie alles 
in den Registern ab.

Oder es hängt mit meiner (noch) Unwissenheit von asm zusammen ;)

Kannst mir ein paar Tips geben?

Gruß
Hermy

von Hermy (Gast)


Lesenswert?

Achso, ich arbeite mit nem AtMega162 + SJA1000.

Hardwarestruktur is ähnlich der vom CANDIP Modul.

von Martin (Gast)


Lesenswert?

Unter dem Label "MsjObj0_ini:" wird die ID der Message festgelegt. Immer 
wenn eine Msg mit dieser ID empfangen wird, wird ein Interrupt ausgelöst 
(ISR "CANService:") . In der ISR werden die Daten der Msg zu erst 
geprüft, und dann weiter verarbeitet.

Wenn du magst, kannst du auch in meinem Forum ( 
http://stronix.kilu.de/forum/ ) Fragen. Im Augenblich ist da noch nicht 
viel los, aber vielleicht wirds ja noch was ;-) .

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.