Hallo, gibt es die möglichkeit mit dem Arduino frequenzen von 1-80Hz zu messen ?
Und wie stelle ich das an, das ich an meinem ADC über 1 sek messe und er mir innerhalb dieser dann den Maximalwert ermittelt ?
Hallo, gibt es die möglichkeit mit dem Arduino frequenzen von 1-80Hz zu messen ?
Und wie stelle ich das an, das ich an meinem ADC über 1 sek messe und er mir innerhalb dieser dann den Maximalwert ermittelt ?
Punkt 1: Klar geht das, Trigger auf Interrupt und die Zeit per millis() messen.
Punkt 2: Du misst in der 1 Sekunde n-mal den ADC-Wert und merkst Dir den jedesmal in einer Variablen. In einer zweiten Variablen schreibst Du den Wert bei der ersten Messung rein und aktualisiert den nur noch, wenn der neue ADC-Wert größer als der aktuell gespeicherte ist.
Grüße
Klaus
qwe900:
Hallo, gibt es die möglichkeit mit dem Arduino frequenzen von 1-80Hz zu messen ?
Ist das ein digitales Signal? (0V / 5V) Dann ja.
Oder eine Sinus-Wechselspannung? Das geht auch, ist aber schwieriger.
qwe900:
Und wie stelle ich das an, das ich an meinem ADC über 1 sek messe und er mir innerhalb dieser dann den Maximalwert ermittelt ?
int sekMax = 0;
int ADpin = A0;
unsigned long Messung_Stopp = 0;
void setup(){
Serial.begin(9600);
Messung_Stopp = millis() +1000;
}
void loop(){
if (millis()< Messung_Stopp){
int AD_akt = analogRead(ADpin);
if (AD_akt > sekMax) sekMax = AD_akt;
} else {
Serial.print("maximaler AD-Wert der letzten Sekunde: ");
Serial.println(sekMax);
sekMax = 0;
Messung_Stopp = millis()+1000;
}
}
Du errechnest dir einen Wert Messung_Stopp der 1 sekunde in der Zukunft liegt.
Dann prüfst du in der loop() ob die Zeit schon erreicht ist, wenn nicht ließt du den AD, vergleichst ob der aktuelle Wert größer ist als die bisherigen, falls ja, wird der aktuelle Wert als neues Max gespeichert.
Nach Erreichen der Zeit, wird das Ergebnis ausgegeben und die Zeit Messung_Stopp neu gesetzt.
Digitalisieren (Zenerdiode) und Interrupt wäre mein Vorschlag.
Code mit digitalem Signal und Interrupt zur Periodendauermessung:
volatile unsigned long periode = 0;
unsigned long lastTime=0;
void setup()
{
attachInterrupt(0,time,FALLING); //Hier die INT-No anpassen (INT0=PIN2 Mega2560)
//Der Interrupt wird durch Impuls-Flanke ausgelöst
}
void time()
{
unsigned long now = micros();
periode = now - lastTime;
lastTime = now;
}
Es handelt sich um einen Sinusförmigen Frequenzverlauf.
Danke gunther das sieht mir sehr plausiebel aus. Ich werde das bei Zeit mal testen.
Ich werde einen ähnlichen verlauf haben wie im Bild, darin möchte einmal die frequenz messen,(muss nicht genau sein) und den max wert innerhalb einer sekunde, bzw umstellen können 1,5,10,15,20sek. Frequenzen werden zwischen 1-80Hz liegen wie schon gesagt. Sensor ist hier ein Geophone welches +-10V ausgibt. Dieses habe ich schon runtergeregelt auf ca +-5v und am adafruit ads1015 4chanel adc, angeschlossen. Ich habe aber den adafruit ads auf differenziermodus heißt ich benutze 2 kanäle, einen für Positive, einen für Negative Halbwelle.
Erstmal danke.
Zum Aufbereiten des Signals kannst Du im einfachsten Fall einen fertigen Schmitt-Trigger nehmen, ansonsten bissel mehr basteln und einen Komparator mit einstellbarer Schwelle und Hystere bauen.
Oder einen Vorverstärker mit ausreichend Verstärkung, der dann halt total überfahren wird und damit auch ein hübsches Rechteck produziert. Vermutlich noch einfacher wenn ich so drüber nachdenke, aber das hängt auch von der Spannungsquelle ab - keine Ahnung was ein Geophone ist.
Aufbereitung mit Zenerdiode wird übrigens nicht gehen, zumindest nicht bei dem Signalverlauf.