Verstärkendes Impulssignal (0,1 .. 0,5 V) zum Arduino-Digitaleingang

Wie das so schwierig sein kann (für mich :-). Das eingehende Sensorsignal liegt nahe bei 0 Volt und gibt ~ 0,5-V-Impulse, die vom Arduino-Digitaleingang (Interrupts) gelesen werden müssen.

Was ich bisher probiert habe:

  • 0,5Volt ist knapp unter Optokoppler zum Funktionieren, das wäre einfach gewesen.
  • Lesen Sie dieses kleine Signal direkt zum Analogeingang. OK, aber das Timing ist nicht genau genug. Sie möchten also auf jeden Fall den digitalen Interrupt von Arduino verwenden.

Wenn der Sensor einen 0,5-V-Impuls -> 5 V an den HIGH-Zustand des Arduino-Digitaleingangs sendet. Wenn das Sensorsignal unter 0,2 V geht -> Arduino-Digitaleingang in den LOW-Zustand.

OK, Operationsverstärker vielleicht, aber wie? Habe versucht zu simulieren, ohne richtige Sachen um passende Opamps zu bekommen.

  • Ich habe eine einzige DC-Versorgung von +5 Volt, um Dinge anzutreiben.
  • Ich möchte die Komponentenmenge klein und klein halten.
Warum nicht den analogen Komparator mit entsprechender Referenz verwenden?
Ein analoger Komparator ist nett, aber wenn Ihr Eingang etwas verrauscht ist, könnte ein Schmidt-Trigger so eingestellt werden, dass er nur unter 0,2 V und über 0,3 V triggert. EEVblog Nr. 941 - Schmitt-Trigger-Tutorial

Antworten (4)

Die meisten ATMega-ICs verfügen bereits über ein eingebautes analoges Komparatormodul (AC), sodass externe Schaltungen kaum erforderlich sind, es sei denn, Sie möchten die Hysterese steuern.

Bei einem Arduino Uno sind die AC-Pins PD6 und PD7 (digitaler Pin 6 und digitaler Pin 7 in "Arduino" sprechen). An PD6 (AIN0) würden Sie eine DC-Referenzspannung anschließen, an der Sie Ihren Schwellenwert haben möchten (in Ihrem Fall ~ 0,3 V), und an PD7 (AIN1) schließen Sie Ihr Eingangsimpulssignal an.

Wenn Sie in der Lage sein möchten, mehr als ein Signal (wenn auch nur eines gleichzeitig) zu messen, können Sie anstelle von PD7 einen der analogen Eingangspins (A0 bis A5) verwenden. Der ADC-Multiplexer-Ausgang innerhalb der MCU kann zum analogen Komparator durchgeleitet werden. Beachten Sie jedoch, dass der ADC nicht gleichzeitig mit dem analogen Komparator verwendet werden kann, wenn der Multiplexer als Eingangsquelle verwendet wird.


Für den ATMega32U4 auf einem Pololu Micro gemäß Ihrem Kommentar sind die Dinge ein bisschen anders. Diese haben zwar noch einen analogen Komparator, aber keinen AIN1-Pin. Stattdessen müssen Sie den ADC-Mux als Quelle für Ihr Signal verwenden, sodass Sie das Impulssignal in einen der Pins A0 bis A5 auf der Mikroplatine einspeisen können.

Für die DC-Referenz ist AIN0 auf PE6, was dem digitalen Pin 7 entspricht.


Für Ihr Referenz-DC-Signal können Sie einfach ein Paar Widerstände als Spannungsteiler und möglicherweise auch einen kleinen (~ 100 nF) Entkopplungskondensator verwenden, um Rauschen zu glätten.

Um zu lesen, ob das Signal High oder Low ist, können Sie dann entweder das ACOBit des ACSRRegisters überprüfen oder eine Interrupt-Service-Routine für den ANALOG_COMP_vectInterrupt-Vektor einrichten.

Wenn Sie daran interessiert sind, Ihr Signal zeitlich zu steuern, kann das ACOBit auch intern direkt an das Eingangserfassungsregister von Timer 1 geleitet werden, sodass Sie Übergänge des Signals mit einem Zeitstempel versehen können.

Oh ja. Jetzt reden wir. Aber ich habe jetzt zufällig 32U4 Micro Arduino (Pololu). Ich hoffe, es unterscheidet sich nicht zu sehr vom "Standard" -Arduino Uno, wenn direkt auf Register zugegriffen wird. Dieses Mikro-Arduino hat zwei analoge Eingänge (in meinem Fall frei zu verwenden). Auf jeden Fall probiere ich das zuerst aus, bevor ich mit Halbleitern herumalbere.
@jengstronotarealsurname Für dieses Board sollten Sie D7 für die DC-Referenzspannung und einen der analogen Pins A0 bis A5 für das Impulseingangssignal verwenden. Sie können den ADC jedoch nicht gleichzeitig mit dem analogen Komparator für dieses Gerät verwenden.

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

Abbildung 1. Dieser analoge Komparator mit einer 0,25-V-Referenz gibt einen hohen Ausgang aus, wenn der Eingang die Referenz überschreitet.

Dinge zu sehen:

  • Sie möchten einen Komparator, der mit einer 5-V-Versorgung betrieben wird.
  • Stellen Sie sicher, dass die Eingänge sehr nahe an 0 V arbeiten.
  • Viele haben Open-Collector-Ausgänge und erfordern einen Pull-up. Möglicherweise können Sie anstelle von R3 den internen Pullup des Mikros verwenden.
  • Ich habe keinen Entkopplungskondensator an der 5-V-Versorgung gezeigt. Du brauchst eine.
Ich bin mir ziemlich sicher, dass das "Arduino" oder genauer gesagt die Atmega-MCU-Serie einen Komparator eingebaut hat. Sie brauchen also nicht einmal einen externen.
@Mike Anscheinend haben wir zur gleichen Zeit dasselbe gedacht :).

Hier ist eine einfache Schaltung, die mit nur wenigen billigen Komponenten erreichen kann, was Sie wollen. Der Eingang Ihres Sensors wird mit dem Emitteranschluss des NPN-Transistors verbunden. Der Ausgang am Kollektor wird mit dem digitalen Eingang der MCU-Platine verbunden. Die 5 V zur Stromversorgung der Schaltung können auch von der MCU-Platine kommen.

Geben Sie hier die Bildbeschreibung ein

Das sieht so interessant aus, müssen Sie es mit einigen Elektroniksimulationen ausprobieren. Signal nach oben zum Emitter "schieben" und das Problem mit Basis-Emitter unter 0,7 V irgendwie überwinden :-) Beeinflusst diese Schaltung irgendwie die Eingangsquelle? Eingangssignal ist „gestohlen/parallel“ von der ursprünglichen Sensoranwendung.
Diese Schaltung erfordert, dass das Sensorquellensignal den NPN-Emitterstrom senkt, wenn der Sensorausgang niedrig ist. Wie ausgelegt, ist dieser Strom ziemlich niedrig.
Wenn das zu viel Strom ist, müssen Sie auf den Comp zurückgreifen
Schaltung vom Typ Ator.

Fast da ... aber nicht. Ich habe diese Bibliothek gefunden, also muss ich nicht anfangen, diese Register zu maskieren (faul, ja, in der Tat)

#include "analogComp.h"
// Pololu ASTAR a32u4
void setup() {
  // put your setup code here, to run once:
  analogComparator.setOn(AIN0, A1); // AIN0 is on D7. As a reference voltage
  analogComparator.enableInterrupt(speedSensorInterrupt);
  Serial.begin(9600);
}

void loop() 
{
   delay (1000);
   Serial.println(".");
}

void speedSensorInterrupt()
{
   Serial.println("Comparator Interrupt between A1<->D7!");
}

D7 ist also richtig (AIN0), zumindest wirkt es. Aufgrund dieses Interrupts wird ausgelöst, wenn dieser Eingang ~ 0,8 V überschreitet. Der Spannungspegel von A1 (Signaleingang) hat jedoch keine Wirkung, wenn der Interrupt ausgelöst wird. Hm, was könnte das Problem sein?

Verschoben in ein korrekteres Forum, Arduino (sw) Seite. arduino.stackexchange.com/questions/53399/…