Forum: Mikrocontroller und Digitale Elektronik Fragen zum ATTiny13 --> Tachosignal


von Jens T. (jens_t)


Lesenswert?

Hallo in die Runde,

ich habe es mal vor ein paar Jahren geschafft, mit Bascom + Mega8 mir 
einen SPI-Sniffer zu basteln.
(sogar nur mit dem internen Oszillator ;-)

Da das aber schon so lange her ist und ich fast wieder als DAU da stehe, 
habe ich ein paar Grundsatzfragen....

Ich wollte mit einem ATTiny13 im Prinzip ein Fahrradtacho-Signal in der 
Geschwindigkeit reduzieren. (nicht einfach teilen)

28 Zoll Tacho <--> 20 Zoll Reifen
Verhältnis Takt bzw. Time IN:OUT 10:7

Hier die Eckdaten:
(grobe Werte, können später noch abweichen)

Puls-Pause Verhältnis --> 200:1
(Reedkontakt mit 1x Magnet)


Frequenz
  min  max
Input  0,5  10  Hz
Output  0,35  7  Hz

Zeiten
Puls  100  2000  ms
Pause  0,5  10  ms


Da der ATTiny13 nur einen Timer hat, kann ich Hardware PWM vergessen.

Ich dachte mir, den Timer mit <1ms laufen zu lassen und über einen 
externen Interrupt (steigende Flanke) einen Zähler(IN) zu starten, der 
die Timer-Überläufe mit zählt.
Beim nächsten Interrupt (fallende Flanke) wird der Zähler gestoppt und 
der Wert zur weiteren Verarbeitung zwischengespeichert.
Jetzt mit dem nächsten Interrupt (steigende Flanke) wieder Zähler(IN) 
bei Null starten.

So dachte ich mir die Erfassung vom Eingangssignal.

Ausgangssignal läuft mit einem anderen Zähler(OUT) über den gleichen 
Timer.
Max.Wert für den Zähler(OUT) wäre der wischengespeicherte Wert+43% für 
die Pulslänge.
Pulspause 0,5% der vorher durchlaufenden Pulslänge.
Max.Wert für den Zähler wird bei jeden Puls neu eingelesen.

Jetzt meine Fragen dazu:

Lässt sich das so in Bascom realisieren?

Geht das evtl. anders einfacher bzw. macht das so Sinn?

Kann ich innerhalb des Programmlaufs überhaupt das Interrupt-Register 
für steigende- / fallende Flanke umschalten?


Ich hoffe auf die eine oder andere Antwort oder einen Link, falls es das 
so schon geben sollte....DANKE


Gruß

Jens

: Bearbeitet durch User
von Max D. (max_d)


Lesenswert?

Also bei 10 Hz schläft der AVR ja ein....
Einfach dem Timer laufen lassen und im Interrupt die Flanke lesen und 
evtl. den Ausgang umschalten....

von Joe F. (easylife)


Lesenswert?

und den tacho kann man nicht einfach auf 20" einstellen?

von Mitlesa (Gast)


Lesenswert?

Joe F. schrieb:
> und den tacho kann man nicht einfach auf 20" einstellen?

Das wäre ein doofer Tacho bei dem das nicht geht .....

von Jens Tester (Gast)


Lesenswert?

Max D. schrieb:
> Also bei 10 Hz schläft der AVR ja ein....
> Einfach dem Timer laufen lassen und im Interrupt die Flanke lesen und
> evtl. den Ausgang umschalten....

Wie jetzt, ohne externen Interrupt und den Eingang pollen?

@ Joe F.

ich wollte es erst schreiben....aber JA, Tacho lässt sich NICHT 
umstellen (daher --> im Prinzip).


Gruß

Jens

von Marc (gierig) Benutzerseite


Lesenswert?

Jens T. schrieb:
> Fahrradtacho-Signal in der Geschwindigkeit reduzieren.

> 28 Zoll Tacho <--> 20 Zoll Reifen
> Verhältnis Takt bzw. Time IN:OUT 10:7

Jens Tester schrieb:
> aber JA, Tacho lässt sich NICHT
> umstellen (daher --> im Prinzip).

Teile und doch bitte die Marke von diesem Tacho mit
damit hier keiner auf die Idee kommt sich so ein Müll zukaufen.
Seit wann gibt so ein Schrott denn ? Schon die ersten E-Tachos
waren Flexibel zu Justieren.

Oder willst du dich vielleicht doch noch um entscheiden?

Deine Angaben + Tiny13 Wunsch hört sich nämlich eher
nach eBike Turing Chip an....

von Jens Tester (Gast)


Lesenswert?

Marc D. schrieb:

> Deine Angaben + Tiny13 Wunsch hört sich nämlich eher
> nach eBike Turing Chip an....

Fast richtig, Antrieb soll in einem Liegerad verwendet werden und eine 
Anpassung auf 20" ist bei verschiedenen Antrieben nicht so ohne weiteres 
zu machen.

"eBike Tuning" wollte ich (eigentlich) nicht schreiben, ist damit zwar 
möglich aber nicht MEIN Ziel!
(auch wenn, ändert ja nichts an meinem Problem ;-)

Gruß

Jens

von M. K. (sylaina)


Lesenswert?

Jens Tester schrieb:
> Fast richtig, Antrieb soll in einem Liegerad verwendet werden und eine
> Anpassung auf 20" ist bei verschiedenen Antrieben nicht so ohne weiteres
> zu machen.

Was? Ein Tacho, der vom Antrieb abhängt? Was ist das denn für ein 
Schrott? Ein Tacho sollte nur vom Rad abhängig sein, an dem er hängt und 
den Radumfang oder Raddurchmesser sollte man vorgeben können.

von Joe F. (easylife)


Lesenswert?

Jens T. schrieb:
> Ich wollte mit einem ATTiny13 im Prinzip ein Fahrradtacho-Signal in der
> Geschwindigkeit reduzieren.

Jens Tester schrieb:
> @ Joe F.
>
> ich wollte es erst schreiben....aber JA, Tacho lässt sich NICHT
> umstellen (daher --> im Prinzip).

Jens Tester schrieb:
> Fast richtig, Antrieb soll in einem Liegerad verwendet werden und eine
> Anpassung auf 20" ist bei verschiedenen Antrieben nicht so ohne weiteres
> zu machen.
>
> "eBike Tuning" wollte ich (eigentlich) nicht schreiben, ist damit zwar
> möglich aber nicht MEIN Ziel!
> (auch wenn, ändert ja nichts an meinem Problem ;-)

Was denn nun?
Es macht echt keinen Spaß hier heiteres "um was geht es denn eigentlich" 
zu veranstalten.

Einen Fahrradtacho könnte man durch einfaches Weglassen von Pulsen 
"überlisten". Aber es handelt sich ja offenbar nicht um einen 
Fahrradtacho.
Trotzdem gibt es die Chance, dass auch dein Gerät durch einfaches 
Weglassen von Pulsen zufriedenstellend arbeitet.
Dies könnte man komplett ohne Mikrocontroller, durch einen einfachen 
Decade-Counter und einem Transistor realisieren.

Wo liegt denn dein Problem, einfach zu sagen, ich möchte an meinem 
E-Bike Antrieb Marke Soundso Modell Soundso, mit dem ich eh nur auf 
Privatgeländen unterwegs bin, rumbasteln.
Mit diesen Informationen wäre dir leichter zu helfen.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

> Wo liegt denn dein Problem, einfach zu sagen,

Vielliecht ist er Hersteller des Fahrzeuges und braucht nun einen 
Workaround für ein verbocktes Konzept.

von Max D. (max_d)


Lesenswert?

Also mit 10 Hz und einem 1:200 Verhältnis hat man etwa 0,5 ms schmale 
pulse. Tastet man das mit 5 kHz ab ist man auf der sicheren Seite. Also 
timer so einstellen, dass er mit 5 kHz feuert. Dann über einen gewissen 
Zeitraum Flanken zählen und im nächsten Zeitsegment die reduzierte 
Frequenz abgeben.

von Jens Tester (Gast)


Lesenswert?

@Joe F.

ich hätte auch schreiben können:

Ich habe einen Bosch Classic Pedelec Antrieb aus einem 28" Rad in einem 
20" Liegerad eingebaut.
Antrieb funktioniert und unterstützt lt. Tacho bis 25km/h.
Lt. GPS-Tacho fahre ich aber nur 18km/h.
Was kann ich jetzt machen ???

>Mit diesen Informationen wäre dir leichter zu helfen.

Da ich einen aus meiner Sicht passenden Lösungsansatz habe, hatte ich 
die dafür relevanten Eckdaten genannt !!!

Gruß

Jens

von Max D. (max_d)


Lesenswert?

Dadurch, dass man immer weniger sendet als empfängt könnte man sogar das 
ganze noch weiter eindampfen:
Solange kein Puls kam sendet man auch nichts.
Wenn man jetzt zwei Pulse hatte so bestimmt man die Zeit dazwischen (in 
Timerticks zählen, spart umrechnung) und gibt dann den ersten Puls auf 
den Ausgang und nach 0,7 * Zeit (evtl. mit fixedpoint-arithmetik 
optimieren) den nächsten. Dann gibt es zwei Möglichkeiten; Es gab in der 
Zwischenzeit noch einen Puls -> gut, man stellt die Zeit als neue Pause 
ein oder es gab keinen -> man wartet bis einer kommt (und noch etwas 
länger, man will ja längere Pausen).
Wenn der "Empfänger" dumm ist, dann kann die aktive Zeit in einem Puls 
immer gleichlang lassen und nur die Pausen anpassen, ansonsten muss man 
halt noch die Pausen mit strecken...

von Jens T. (jens_t)


Lesenswert?

Max D. schrieb:
> ....gibt dann den ersten Puls auf den Ausgang und nach 0,7 * Zeit.....den 
>nächsten.
Du meinst vermutlich 1,43 * Zeit ?

Ob das so leichter zu programmieren wäre?


>Wenn der "Empfänger" dumm ist, dann kann die aktive Zeit in einem Puls
>immer gleichlang lassen und nur die Pausen anpassen,....

So etwas ähnliches hatte ich mir auch schon überlegt, aber wenn ich 
schon die Pulslänge richtig hin bekomme, sollte eine angepasste 
Pausenzeit auch noch mit drin sein ;-)

Gruß

Jens

von Joe F. (easylife)


Lesenswert?

Max D. schrieb:
> Solange kein Puls kam sendet man auch nichts.

Und spätestens hier wird's untrivial. Ab wann 'steht' das fahrrad, und 
rollt nicht mehr sehr langsam?

von Karl H. (kbuchegg)


Lesenswert?

Jens T. schrieb:

> So etwas ähnliches hatte ich mir auch schon überlegt, aber wenn ich
> schon die Pulslänge richtig hin bekomme, sollte eine angepasste
> Pausenzeit auch noch mit drin sein ;-)

Hast du es denn schon ausprobiert?

Ich würde fast darauf wetten, dass die Empfänger sich um die Pulszeit 
einen feuchten Kehrricht scheren. Die zählen einfach Pulse pro 
Zeiteinheit bzw. sie messen die Zeit zwischen 2 Pulsen, wobei da sehr 
wahrscheinlich noch eine Mittelwertbildung drinnen sein wird, die 
Ausreisser (falls aus irgendeinem Grund mal ein Puls fehlen sollte) 
nicht gleich ins Desaster führen. Aber mehr würde ich da als 
Arbeitshypothese nicht erwarten.

D.h. unter Umständen reicht es völlig aus, wenn du per Polling die Pulse 
erkennst, und dann einfach für 10 erkannte Pulse nur 7 weitergibst. Du 
lässt einfach zb jeden 3., 6. und 10. Puls unter den Tisch fallen.
Sowas ist schnell programmiert und ausgetestet. Wenn es nicht 
funktioniert, dann kann man immer noch etwas aufwändigeres machen. Aber 
erst mal den simplen Ansatz.

: Bearbeitet durch User
von Joe F. (easylife)


Lesenswert?

ich würde ja einfach 7 magnete an das rad montieren (ca. alle 51.4 grad) 
und dieses signal mit einem decade counter durch 10 teilen ;-)
dahinter monoflop - wenn nötig.

: Bearbeitet durch User
von Max D. (max_d)


Lesenswert?

Joe F. schrieb:
> Und spätestens hier wird's untrivial. Ab wann 'steht' das fahrrad, und
> rollt nicht mehr sehr langsam?

Das ist egal. Hier geht es nur um "das erste mal" nachdem der Strom dran 
kam.
Das Ausrollen übernimmt der Teil mit dem "auf den nächsten Puls 
warten"...

von Jens T. (jens_t)


Lesenswert?

@Joe F.

>Ab wann 'steht' das fahrrad, und rollt nicht mehr sehr langsam?

Unter 4km/h --> über 2s Pulslänge würde ich einfach kein Signal mehr aus 
geben.


@Karl Heinz

>Hast du es denn schon ausprobiert?

Nee, leider noch nicht....aber gute Idee, zum testen einfach jeden 3ten 
Puls unterdrücken und schauen, was passiert.

Das sollte ich die nächsten 1-2Wochen :-( hin bekommen.....

Gruß

Jens

von Joe F. (easylife)


Lesenswert?

Jens T. schrieb:
> zum testen einfach jeden 3ten
> Puls unterdrücken und schauen, was passiert.

Ja, und wenn das funktioniert, dann in Alternativen denken.
3 von 10 Pulsen unterdrücken geht ebenfalls sehr einfach mit einem 
Decade Counter + 3 Dioden + Transistor (falls dir die 7 Magnete nicht 
gefallen, die das Ausgangssignal sehr gleichmäßig machen würden...).

: Bearbeitet durch User
von Jens Tester (Gast)


Lesenswert?

Hallo,

ich hab heute vor der Arbeit mal kurz mit einem Magneten "per Hand" 
testen können:

links - l
rechts - r
pause - #

l-r-l-r-l-r-l-r-l-r- --> 15-16km/h
l-r-l-#-r-l-r-#-l-r-l-#-r-l-r- --> 10-13km/h

Werte zwischen 10-13km/h waren mehrmals für ca. 1-2s zu sehen und 
sprangen sonst zwischen 6 - 58km/h.

--> größere Schwankungen in der Pausenlänge werden anscheinend toleriert 
:-)

Daraus ergibt sich noch eine Möglichkeit:

Pulslänge aus der Wechselspannung von Nabendynamo ableiten

1. Zeit einer Halbwelle ermitteln und daraus Pulslänge errechnen
2. Puls ausgeben
3. nach Pulsende auf neue Halbwelle warten und mit 1. weiter

Vorteil:
(für mich) leichter zu programmieren
kein Reedkontakt/Magnet mehr nötig

Nachteil:
die Pulspause schwankt mit +- 1/2 der Periodendauer vom Dynamo 
(vermutlich Egal)
weiteres Kabel zum Dynamo
Schaltungsaufwand für ein passendes Signal zum AVR
evtl. Masse-/ Potentialprobleme


Gruß

Jens

von Sven (Gast)


Lesenswert?

Hallo
nur so mal als Idee wie verhält sich der Regler wenn du z.B. abwechselnd 
jeden 4. und 3. Impuls einfach auslässt?


Sven

von Jens Tester (Gast)


Lesenswert?

@Sven,

per Hand getestet scheint es zu funktionieren :-)
(siehe weiter oben)

Guter Hinweis, so einfach "krumme" Teilungsverhältnisse erzeugen zu 
können.

Wenn ich mein altes SDK500 Board zum laufen bekommen sollte, kommt das 
mit auf meine ToDo-Liste.


Gruß

Jens

von Jens T. (jens_t)


Angehängte Dateien:

Lesenswert?

Hallo,

als Dateianhang hier mein erster Versuch, ein Eingangssignal halbwegs 
unverändert einzulesen und wieder auszugeben.

Auf einem STK500-Board getestet, hat das blinken einer LED am Ausgang 
nicht wirklich viel mit den Schaltvorgängen an einen Taster zu tun. 
(ohne Entprellung) :-((

Heute ist schon etwas spät, ich schreibe morgen, wie ich mir das mit dem 
Programmablauf gedacht hatte.

Gruß

Jens

von Jens Tester (Gast)


Lesenswert?

Hallo,

ich habe noch mal über den Code nachgedacht...ich werde den Code noch 
mal anpassen und nur auf steigende Flanke auswerten.

Dann dürfte es vermutlich auch keine Probleme mit prellendem Taster 
geben.

Ich melde mich dann nochmal.

Gruß

Jens

von DJShadowman (Gast)


Lesenswert?

Hab dasselbe gaubt um vom Ford Tachogeber auf Opel Senator digitaltacho 
zu kommen, auch mitm 2313.

Den Int/Timer für das Messen der Periodendauer verwendet, und in der 
Hauptschleife den Ausgang mit "waitms x" gesetzt, wobei X nen Wert ist 
der aus Periodendauer mal Faktor besteht.

Ca 10 Bascomzeilen, läuft 1A.

von Ingo L. (corrtexx)


Lesenswert?

DJShadowman schrieb:
> waitms x" gesetzt, wobei X nen Wert ist
> der aus Periodendauer mal Faktor besteht.
Vergleiche mal die Codegröße von:
1
 _delay_ms(20);
zu
1
 volatile uint8_t Delaytime = 20;
2
 _delay_ms(Delaytime);

von Jens T. (jens_t)


Angehängte Dateien:

Lesenswert?

Hallo,


DJShadowman schrieb:
> ....in der Hauptschleife den Ausgang mit "waitms x" gesetzt....

Ist hier für mich nicht brauchbar da "wait" die Interrupts blockiert!!!



Nach Umstellung auf steigende Flanke funktioniert es jetzt wie erwartet.

--> geänderter Code im Anhang

Ein paar Änderungen sind noch nötig, bis ich das im Pedelec testen kann.

Soweit der aktuelle Stand.....

Ich melde mich, wenn es wieder was neues gibt.

Gruß

Jens

: Bearbeitet durch User
von Jens T. (jens_t)


Lesenswert?

Hallo,

ich musste den Code noch etwas anpassen und das Prellen vom Reedkontakt 
abfangen.

Jetzt funktioniert es wie vorgesehen, Danke an die eine oder andere 
Anregung.

Falls es jemand interessiert, die Zeit der Pulspause (Low-Signal) 
braucht nicht variabel sein, ich habe sie auf ca. 10ms fest eingestellt.


Gruß

Jens

von DJShadowman (Gast)


Lesenswert?

Jens T. schrieb:
> Hallo,
>
> DJShadowman schrieb:
>> ....in der Hauptschleife den Ausgang mit "waitms x" gesetzt....
>
> Ist hier für mich nicht brauchbar da "wait" die Interrupts blockiert!!!
>

Ne wieso, wait ist auch nur ne reihe nops im generierten Code, der 
Intterupt läuft wunderbat weiter. Egal ob über Timer oder extern.

Habs ja selbst 1a am laufen bei ner Schaltung um nen Tacho für nen 6 
Zylinder an nem 4 Zylinder Motor zu betreiben.

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.