Forum: Mikrocontroller und Digitale Elektronik Hallsensor Signal invertieren


von Egon (egon12345)


Angehängte Dateien:

Lesenswert?

Hallo und guten Abend,

Ich habe einen Hallsensor mit Open collector & 5.1k Widerstand und würde 
das Signal gern für einen uC invertieren.

Kann ich das so wie anliegend machen ?

Dankeschön

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Egon schrieb:
> würde das Signal gern für einen uC invertieren.
Warum?
Oder besser: warum invertierst du das Signal nicht in der Software?

> Kann ich das so wie anliegend machen ?
Im Prinzip ja. Aber: welche maximale Impulsfrequenz musst fu 
verarbeiten?

von Egon (egon12345)


Lesenswert?

> Warum?
> Oder besser: warum invertierst du das Signal nicht in der Software?

Möchte bei jeder Umdrehung auf die steigende Flanke/ 5 V Signal/ 
Interrupt arbeiten (Arduino)

>> Kann ich das so wie anliegend machen ?
> Im Prinzip ja. Aber: welche maximale Impulsfrequenz musst fu
> verarbeiten?

20 Hz maximal, mit kurzem AN Impuls wenn der Magnet vorbei zieht

Danke

von Vanye R. (vanye_rijan)


Lesenswert?

> 20 Hz maximal, mit kurzem AN Impuls wenn der Magnet vorbei zieht

Dann wird das sehr wahrscheinlich funktionieren.

Allerdings stamme ich wohl aus einer neueren Entwicklergeneration
und wuerde eher einen TC7S04 nehmen. :-D

Du wuerdest dann knackigere Flanken haben die vermutlich auch
stabiler sind wenn sich mal die Temperatur deiner Schaltung aendert.

Aber fuer deine einfache Anwendung ist das vermutlich egal.

Vanye

von Joe L. (joelisa)


Lesenswert?

Vanye R. schrieb:
>> 20 Hz maximal, mit kurzem AN Impuls wenn der Magnet vorbei zieht
>
> Dann wird das sehr wahrscheinlich funktionieren.
>
> Allerdings stamme ich wohl aus einer neueren Entwicklergeneration
> und wuerde eher einen TC7S04 nehmen. :-D

Wahrscheinlich? Was rauchst du eigentlich?

Die Eingangsflanke von ~30ns vergessen wir mal getrost - und auch die 
max. 20Hz...

So'n TC7S04 bietet eine output transition time von typ. 5ns - das reißt 
es dann natürlich voll raus. Prosit neue Entwicklergeneration - das habt 
ihr ja wirklich drauf!

von Thomas S. (Firma: Chipwerkstatt) (tom_63)


Lesenswert?

Widerstände mit 5,1K an der Position wären mir zu niedrig. und wenn dann 
auf 4,7, oder 5,6k. Die sind in der E-Reihe.

Hier würde ich mind. 15K nehmen.

Nachtrag:
Ein kleines C mit 100nF spätestens am 2. Transistor gegen Masse.

: Bearbeitet durch User
von Mi N. (msx)


Lesenswert?

Egon schrieb:
> Möchte bei jeder Umdrehung auf die steigende Flanke/ 5 V Signal/
> Interrupt arbeiten (Arduino)

Es gibt absolut keinen Grund, nicht die negative Flanke zu verwenden. 
Nimm die Signale so wie sie kommen.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

warum unterstützt man den TO bei seinem Gedanken der Signalinvertierung? 
Das ist doch Unsinn. Das macht man alles in Software. Ich würde auch 
keinen Interrupt verwenden sondern pollen. Aber egal ob mit oder ohne 
Interrupt, externe Signalinvertierung ist einfach nur Unsinn. Wer darauf 
besteht sollte sich fragen wofür er µC programmiert.

Übrigens, 5.1k gibt es in der E-Reihe. ;-)

von Rolf (rolf22)


Lesenswert?

Egon schrieb:

>> warum invertierst du das Signal nicht in der Software?
>
> Möchte bei jeder Umdrehung auf die steigende Flanke/ 5 V Signal/
> Interrupt arbeiten (Arduino)

Hm. Welcher Arduino ist das denn, bei dem man den Interrupt nicht mit 
einer ode zwei C++-Programmzeilen auf eine frei gewählte der beiden 
Flanken programmieren kann?
(Mag sein, dass solche grundlegenden Möglichkeiten nicht in der 
einfachen Arduino-Doku gezeigt werden, aber im Datenblatt des Prozessors 
steht es ganz sicher.)

von Rainer W. (rawi)


Lesenswert?

Veit D. schrieb:
> Übrigens, 5.1k gibt es in der E-Reihe. ;-)

Ach - ob die Widerstände 10% größer oder kleiner sind, spielt an der 
Stelle nun wirklich keine Rolle. Es geht darum, einen 3x so großen Wert 
zu nehmen, falls nicht lange Leitungen im Spiel sind und die Umgebung 
unsäglich verseucht ist.

von N. M. (mani)


Lesenswert?

Rolf schrieb:
> Welcher Arduino ist das denn

Selbst der ATiny85 kann beide Level, beide Flanken und Change.

Rolf schrieb:
> bei dem man den Interrupt nicht mit einer ode zwei C++-Programmzeilen
> auf eine frei gewählte der beiden Flanken programmieren kann?

Ist unabhängig von der Programmiersprache, sondern was die Hardware her 
gibt.

Rolf schrieb:
> Mag sein, dass solche grundlegenden Möglichkeiten nicht in der einfachen
> Arduino-Doku gezeigt werden

Doch. Gibt es da auch (siehe Parameter):
https://www.arduino.cc/reference/de/language/functions/external-interrupts/attachinterrupt/

Es liegt also am TO.
Und wie gesagt, allgemein sollte man sich fragen ob polling hier nicht 
besser wäre. Bei den Eingangsfrequenzen sowieso immer möglich und dann 
auch unabhängig von der Hardware.

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Thomas S. schrieb:
> Widerstände mit 5,1K an der Position wären mir zu niedrig
Passt doch. Da fließt nicht mal ein läppisches mA.

> Nachtrag:
> Ein kleines C mit 100nF spätestens am 2. Transistor gegen Masse.
Mal davon abgesehen, dass der 1. Transistor ja noch im TLE sitzt, ist es 
ungeschickt, einen Kondensator zwischen C und E zu schalten. Denn der 
Kondensator lädt sich auf 5V auf und wird dann beim nächsten Puls über 
den Transistor kurzgeschlossen(!!). Das ist hier jetzt zwar nicht viel 
Energie, die der Transistor da jedesmal in Wärme umwandeln muss, aber 
trotzdem wäre mir so eine Beschaltung ein Warnsignal: "Da ist sicher 
noch mehr im Argen!"

Rainer W. schrieb:
> Es geht darum, einen 3x so großen Wert zu nehmen, falls nicht lange
> Leitungen im Spiel sind und die Umgebung unsäglich verseucht ist.
Falls man nicht unbedingt jedes mA sparen muss, dann kann man auch 5k1 
nehmen. Mein EMV-Spezi sagt: alles über 10k ist aus EMV-Sicht nicht 
vorhanden.


Egon schrieb:
> mit kurzem AN Impuls wenn der Magnet vorbei zieht
Oder man könnte auch so argumentieren: wenn der Puls sowieso nur ganz 
kurz ist, dann liegen die beiden Flanken eh' zeitlich (und räumlich) eng 
nebeneinander, so dass es egal ist, welche der beiden Flanken den 
Interrupt triggert.

Aber ich würde ebenfalls einfach den Pinchange-Interrupt des unbekannten 
µC so konfigurieren, dass ich keine Invertierung des Signals brauche.

: Bearbeitet durch Moderator
von Rolf (rolf22)


Lesenswert?

N. M. schrieb:
>> bei dem man den Interrupt nicht mit einer ode zwei C++-Programmzeilen
>> auf eine frei gewählte der beiden Flanken programmieren kann?
>
> Ist unabhängig von der Programmiersprache, sondern was die Hardware her
> gibt.

Da wäre ich ja nie drauf gekommen. Einen Arduino programmiert man (und 
vermutlich auch der OP) aber in der Regel in C++.   ;-)

> Und wie gesagt, allgemein sollte man sich fragen ob polling hier nicht
> besser wäre. Bei den Eingangsfrequenzen sowieso immer möglich und dann
> auch unabhängig von der Hardware.

DAS hängt vom Design des Gesamtsystems ab. Wir wissen ja gar nicht, was 
das Programm sonst noch alles tun soll.
Nur, weil es möglich ist, ist es nicht automatisch besser.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Rolf schrieb:
> DAS hängt vom Design des Gesamtsystems ab.
Mein Ansatz ist: Interrupts nur dann, wenn sie unbedingt nötig sind.

Einer, der aus irgendwelchen Gründen immer nötig ist, ist ein 
Timer-Interrupt. Und wenn der jede ms kommt, dann dürfte das hier zum 
Abstasten des Hall-Signals vermutlich schnell genug sein.

von Mi N. (msx)


Lesenswert?

Rolf schrieb:
> Wir wissen ja gar nicht, was
> das Programm sonst noch alles tun soll.

Ein Magnet an einem Rad, das sich dreht, kling ganz schwer nach 
Drehzahlmessung. Das würde ich immer per Interrupt machen. Was dann noch 
alles laufen soll, wäre wurscht.
Die ganze Frage scheint mir aber aus Unwissenheit zu kommen.

von Egon (egon12345)


Lesenswert?

> Ein Magnet an einem Rad, das sich dreht, kling ganz schwer nach
> Drehzahlmessung. Das würde ich immer per Interrupt machen. Was dann noch
> alles laufen soll, wäre wurscht.
> Die ganze Frage scheint mir aber aus Unwissenheit zu kommen.


Richtig, eine Drehzahl Messung mit TFT. Für Polling ist keine Zeit, da 
wird ein Interrupt verwendet…

Hab mich breit schlagen lassen und nehmen jetzt die fallende Flanke. 
Danke an alle für den Support 👍

von Vanye R. (vanye_rijan)


Lesenswert?

Ich wuerde ja mal schauen ob die Timer nicht irgendwelche
speziellen Modi haben wo sie pegelhabhaengig automatisch
zaehlen. Dann braucht man vielleicht nur einen Wert aus
einem Register auslesen und ist fertig.

Vanye

von Jens G. (jensig)


Lesenswert?

Egon schrieb:
> Richtig, eine Drehzahl Messung mit TFT. Für Polling ist keine Zeit, da
> wird ein Interrupt verwendet…
>
> Hab mich breit schlagen lassen und nehmen jetzt die fallende Flanke.
> Danke an alle für den Support 👍

Wieso soll es überhaupt wichtig sein, für eine Drehzahlmessung unbedingt 
auf einer bestimmten Flanke zu bestehen?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Egon schrieb:
> Für Polling ist keine Zeit, da wird ein Interrupt verwendet…
Naja, wie gesagt: lies den Eingang im Timer-Tic Interupt ein und mache 
einen XOR Vergleich zum vorherigen Wert. Dann hast du deine Flanke.

> Hab mich breit schlagen lassen
Wir wollen dich zu nichts zwingen, du kannst auch den Inverter einbauen. 
Ist halt für deine Anwendung "Drehzahlmessung" völlig sinnlos. Weil du 
ja völlig ohne Probleme für diese Anwendung die steigende oder die 
fallende Flanke nehmen kannst. Und egal, ob da noch ein Inverter 
eingebaut ist oder nicht, es wird/muss immer die selbe Drehzahl 
herauskommen.

: Bearbeitet durch Moderator
von Rainer W. (rawi)


Lesenswert?

Mi N. schrieb:
> Ein Magnet an einem Rad, das sich dreht, kling ganz schwer nach
> Drehzahlmessung. Das würde ich immer per Interrupt machen.

Heutzutage gibt es Mikrocontroller, die per Timer und Capture-Funktion 
den Zeitpunkt vollständig in Hardware bestimmen können. Der µC muss sich 
das Ergebnis nur aus einem Register abholen, bevor beim nächste Ereignis 
der Wert wieder überschrieben wird.

: Bearbeitet durch User
von Georg M. (g_m)


Lesenswert?

Rainer W. schrieb:
> Heutzutage gibt es Mikrocontroller, die per Timer und Capture-Funktion
> den Zeitpunkt vollständig in Hardware bestimmen können.

Core Independent Peripheral

https://microchipdeveloper.com/xwiki/bin/view/products/mcu-mpu/8bit-pic/cip/

von N. M. (mani)


Lesenswert?

Rolf schrieb:
> Einen Arduino programmiert man (und vermutlich auch der OP) aber in der
> Regel in C++.   ;-)

Das mag ja zu 90% der Fall sein, aber warum fragst du dann ob es nicht 
eine Zeile gibt die man in Cpp schreiben kann die diese Aufgabe erfüllt?
Ja kann man! Indem man einfach die Hardware dementsprechend einstellt. 
Warum? Weil es nichts mit einer Programmiersprache zu tun hat. Frage 
unnötig.

Rolf schrieb:
> DAS hängt vom Design des Gesamtsystems ab. Wir wissen ja gar nicht, was
> das Programm sonst noch alles tun soll.

Das stimmt. Aber wenn die Main keine 40Hz mehr macht ist meist etwas 
komplett anderes faul. Wahrscheinlich wird viel Interrupt genutzt weil 
sonst überall mit delay gearbeitet wird.

Lothar M. schrieb:
> Mein Ansatz ist: Interrupts nur dann, wenn sie unbedingt nötig sind.

Stimme ich dir voll zu. Und vor Software so viel Peripherie nutzen wie 
möglich. Und damit meine ich nicht den Interrupt Controller, sondern 
Zähler die die Pulse oder die Pulsdauer zählen.

Lothar M. schrieb:
> Einer, der aus irgendwelchen Gründen immer nötig ist, ist ein
> Timer-Interrupt.

So sehe ich das auch. Und 10ms Tick würde hier für Pulse zählen 
ausreichen.
Und wenn es genauer bei langsamen Drehzahlen werden muss, musst du 
sowieso auf Pulsdauer umschalten weil zu wenig Pulse.

von Spess53 .. (hardygroeger)


Lesenswert?

Hi

Das Invertieren kann auch durch Verwendung eines 2,Magneten

Siehe
'Hall-Effect IC Applications Guide' von Allegro™ MicroSystems S.28 
Abb.47

erfolgen.

MfG Spess

von Spess53 .. (hardygroeger)


Lesenswert?


von Rainer W. (rawi)


Lesenswert?


von Spess53 .. (hardygroeger)


Lesenswert?

Hi

>Oder doch die AN27701

Ja. Du hast Recht.

MfG Spess

von Motopick (motopick)


Lesenswert?

Mann koennte viel einfacher auch den Magneten umpolen. :)

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Rolf schrieb:
> Mag sein, dass solche grundlegenden Möglichkeiten nicht in der
> einfachen Arduino-Doku gezeigt werden,
Das muss doch nicht sein....

https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/

von Motopick (motopick)


Lesenswert?

> Wieso soll es überhaupt wichtig sein, für eine Drehzahlmessung unbedingt
> auf einer bestimmten Flanke zu bestehen?

Es ist durchaus denkbar, dass eine Flanke durch das Messprinzip
und/oder den Auswertemechanismus begruendet, einen starken Jitter
aufweist. Dann waere es doppelt plus unschlau die jitternde Flanke
zu benutzen.
Das muss im Fall des TO nicht zutreffen.

von Spess53 .. (hardygroeger)


Lesenswert?

Hi

Was für ein Hallsensor hat der TO denn? Uni- oder Bipolar?

MfG Spess

von Georg M. (g_m)


Angehängte Dateien:

Lesenswert?

Rainer W. schrieb:
> Heutzutage gibt es Mikrocontroller, die per Timer und Capture-Funktion
> den Zeitpunkt vollständig in Hardware bestimmen können. Der µC muss sich
> das Ergebnis nur aus einem Register abholen, bevor beim nächste Ereignis
> der Wert wieder überschrieben wird.

Z.B. AVR TCB.

von Rainer W. (rawi)


Lesenswert?

Georg M. schrieb:
> AVR_TCB_Frequency_Measurement.png

Entgegen der Bezeichnung sieht das eher nach einer Messung der 
Periodendauer aus, die erst vom uC in eine Frequenz umgerechnet werden 
muss.

von Mi N. (msx)


Lesenswert?

N. M. schrieb:
> So sehe ich das auch. Und 10ms Tick würde hier für Pulse zählen
> ausreichen.
> Und wenn es genauer bei langsamen Drehzahlen werden muss, musst du
> sowieso auf Pulsdauer umschalten weil zu wenig Pulse.

Oh, oh, oh, was geht denn hier ab?
Es geht nicht darum nur die Impulse zu zählen, sondern auch deren 
genauen Zeitpunkt. Für hinreichend genaue Messungen ist dies unbedingt 
per Interrupt zu erledigen.
Arduino klingt für mich nach ATmega328, der für seinen Timer1 die 
Capture-Eingänge ICP und alle AINx bietet. Da sollte sich ein freier Pin 
finden lassen. Die Auflösung beträgt damit 62,5 ns.
Alternativ kann jeder PCINTx genutzt werden. Selbst, wenn dessen ISR 
durch andere ISRs blockiert sein sollte, kann ein beliebiger Timer (auch 
0 oder 2) zur Zeiterfassung genutzt werden. 10 µs Jitter wären dabei 
schon viel und würden einem 100 kHz polling entsprechen, was der µC 
schon garnicht mehr schaffen würde, falls er noch irgendetwas anderes 
tun sollte.

Und natürlich wird bei dieser niedrigen Frequenz immer die Pulsweitee 
gemessen und auf Drehzahl umgerechnet. Oder will hier jemand mit 10 s 
Torzeit arbeiten?

Hier ein Beispiel für ICP-Messung mit einem ATmega88: 
Beitrag "einfache Drehzahlmessung mit ATmega88"
oder mit PCINT: Beitrag "4-Kanal Drehzahlmessung mit ATmega88"

Motopick schrieb:
> Mann koennte viel einfacher auch den Magneten umpolen. :)

Das gäbe dann aber eine negative Drehzahl, die man invertieren müßte ;-)

: Bearbeitet durch User
von Norbert (der_norbert)


Lesenswert?

Veit D. schrieb:
> warum unterstützt man den TO bei seinem Gedanken der Signalinvertierung?
> Das ist doch Unsinn.

Absolute Zustimmung.

Zumal es µC gibt, bei denen man in HW-Konfiguration per Bit im Register 
festlegen kann dass das (eingehende oder auch ausgehende) Signal 
invertiert werden soll.

von Georg M. (g_m)


Angehängte Dateien:

Lesenswert?

Rainer W. schrieb:
> Entgegen der Bezeichnung sieht das eher nach einer Messung der
> Periodendauer aus, die erst vom uC in eine Frequenz umgerechnet werden
> muss.

Ja, richtig, so werden niedrige Frequenzen gemessen.

Bei höheren Frequenzen kann man schon die Impulse (Perioden) zählen.

von Rainer W. (rawi)


Lesenswert?

Mi N. schrieb:
> Für hinreichend genaue Messungen ist dies unbedingt
> per Interrupt zu erledigen.

Unsinn, Hardware ist schneller. Dafür hat ein µC die integriert.

Georg M. schrieb:
> Ja, richtig, so werden niedrige Frequenzen gemessen.

Es wird die Periodendauer gemessen .PUNKT.
Dass daraus die Frequenz abgeleitet werden kann und dies bei niedrigen 
Frequenzen die einzig wirklich taugliche Methode ist, steht auf einem 
anderen Blatt.

: Bearbeitet durch User
von Mi N. (msx)


Lesenswert?

Rainer W. schrieb:
> Unsinn, Hardware ist schneller. Dafür hat ein µC die integriert.

Was hast Du an ICP von Timer1 nicht verstanden?

von Michi S. (mista_s)


Lesenswert?

Mi N. schrieb:
> Motopick schrieb:
>> Mann koennte viel einfacher auch den Magneten umpolen. :)
>
> Das gäbe dann aber eine negative Drehzahl,
> die man invertieren müßte ;-)

Das aber dann bitte in HW, z.B. mit einer Logikschaltung, die man 
zwischen den µC-GPIOs und 7-Segment-Treiber schalten kann. ;)

von Rainer W. (rawi)


Lesenswert?

Mi N. schrieb:
> Rainer W. schrieb:
>> Unsinn, Hardware ist schneller. Dafür hat ein µC die integriert.
>
> Was hast Du an ICP von Timer1 nicht verstanden?

Das IST Hardware und kein Interrupt

von Mi N. (msx)


Lesenswert?

Rainer W. schrieb:
> Das IST Hardware und kein Interrupt

Na siehste, geht doch.

von Rainer W. (rawi)


Lesenswert?

Mi N. schrieb:
> Für hinreichend genaue Messungen ist dies unbedingt
> per Interrupt zu erledigen.

Mi N. schrieb:
> Rainer W. schrieb:
>> Das IST Hardware und kein Interrupt
>
> Na siehste, geht doch.

Schön, dass dir das jetzt auch klar geworden ist.

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.