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:
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.
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 ACO
Bit des ACSR
Registers überprüfen oder eine Interrupt-Service-Routine für den ANALOG_COMP_vect
Interrupt-Vektor einrichten.
Wenn Sie daran interessiert sind, Ihr Signal zeitlich zu steuern, kann das ACO
Bit auch intern direkt an das Eingangserfassungsregister von Timer 1 geleitet werden, sodass Sie Übergänge des Signals mit einem Zeitstempel versehen können.
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:
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.
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?
Ignacio Vazquez-Abrams
Langen