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
|
Anzeige
|
Hallsensor Signal invertierenHallo 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
Warum? Oder besser: warum invertierst du das Signal nicht in der Software?
Im Prinzip ja. Aber: welche maximale Impulsfrequenz musst fu verarbeiten?
Möchte bei jeder Umdrehung auf die steigende Flanke/ 5 V Signal/ Interrupt arbeiten (Arduino)
20 Hz maximal, mit kurzem AN Impuls wenn der Magnet vorbei zieht Danke
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
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! 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.
Es gibt absolut keinen Grund, nicht die negative Flanke zu verwenden. Nimm die Signale so wie sie kommen. 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. ;-)
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.)
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.
Selbst der ATiny85 kann beide Level, beide Flanken und Change.
Ist unabhängig von der Programmiersprache, sondern was die Hardware her gibt.
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.
Passt doch. Da fließt nicht mal ein läppisches mA.
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!"
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.
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.
Da wäre ich ja nie drauf gekommen. Einen Arduino programmiert man (und vermutlich auch der OP) aber in der Regel in C++. ;-)
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.
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.
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 👍 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
Wieso soll es überhaupt wichtig sein, für eine Drehzahlmessung unbedingt auf einer bestimmten Flanke zu bestehen?
Naja, wie gesagt: lies den Eingang im Timer-Tic Interupt ein und mache einen XOR Vergleich zum vorherigen Wert. Dann hast du deine Flanke.
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.
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.
Core Independent Peripheral https://microchipdeveloper.com/xwiki/bin/view/products/mcu-mpu/8bit-pic/cip/
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.
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.
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.
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. 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 Hi Link dazu: MfG Spess Oder doch die AN27701: https://www.allegromicro.com/-/media/files/application-notes/an27701-hall-effect-ic-application-guide.pdf Hi
Ja. Du hast Recht. MfG Spess Mann koennte viel einfacher auch den Magneten umpolen. :)
Das muss doch nicht sein.... https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/
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. Hi Was für ein Hallsensor hat der TO denn? Uni- oder Bipolar? MfG Spess
Z.B. AVR TCB.
Entgegen der Bezeichnung sieht das eher nach einer Messung der Periodendauer aus, die erst vom uC in eine Frequenz umgerechnet werden muss.
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"
Das gäbe dann aber eine negative Drehzahl, die man invertieren müßte ;-)
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.
Ja, richtig, so werden niedrige Frequenzen gemessen. Bei höheren Frequenzen kann man schon die Impulse (Perioden) zählen.
Unsinn, Hardware ist schneller. Dafür hat ein µC die integriert.
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.
Was hast Du an ICP von Timer1 nicht verstanden?
Das aber dann bitte in HW, z.B. mit einer Logikschaltung, die man zwischen den µC-GPIOs und 7-Segment-Treiber schalten kann. ;)
Das IST Hardware und kein Interrupt
Schön, dass dir das jetzt auch klar geworden ist. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|