Ruhefrequenz los werden

Hallo alles zusammen,

Ich, ein absoluter Anfänger, nerve wahrscheinlich mit einer sehr leichten Frage aber ich wäre für Hilfe dankbar^^

Folgendes:
Ich habe einen Arduino Nano welcher mir als Frequenzumrichter/-converter dienen soll.
Und zwar soll die Ausgangsfrequenz ca. 85% der Eingangsfrquenz haben.
Dies funktioniert auch aureichend gut.

mein Problem ist folgendes:
Wenn ich keine Eingangsfrequenz habe dann habe ich am Ausgang immernoch eine Frequenz von 30Hz. Wie werde ich diese Los?
Gemessen habe ich diese mit einem Multimeter welches Frequenz messen / zählen kann. (Günstiges VC99)
Danke schonmal im vorraus

int pin = 7;
unsigned long T; //Periodendauer in us
double f; //Frequenz in MHz

void setup()
{Serial.begin(9600);
pinMode(7,INPUT); // Anschluss als Eingang definieren
digitalWrite(7, LOW); // Pull Up Widerstand aktivieren
pinMode(10,OUTPUT); //Anschluss als Ausgang definieren
digitalWrite(10,LOW) ; // Pull DOWN Widerstand akti

void loop()
{T = pulseIn(pin, HIGH) + pulseIn(pin, LOW);
{f=1/(double)T; // f=1/T
if (f1e60.85<70)
{digitalWrite(10,LOW);}
else{ tone(10,f1e60.85);}
}
}

tone musst du mit noTone wieder abschalten. pulseln würde ich mit einem Timeout versehen, sonst kann es blockieren wenn keine Eingangspulse kommen.

digitalWrite(7, LOW); // Pull Up Widerstand aktivieren hier würde ich , HIGH erwarten.

 digitalWrite(10,LOW) ; // Pull DOWN Widerstand akti

geht das beim Nano ?

Stefan

pulseln würde ich mit einem Timeout versehen, sonst kann es blockieren wenn keine Eingangspulse kommen.

pulseIn hat ja einen Default-Timeout von 1 Sekunde, das kann natürlich - je nach Anwendungsfall - "ziemlich blockieren" oder bei recht niedrigen Frequenzen durchaus OK sein.

Wenn du minimal 30 Hz detektieren willst, dann würde ich den Timeout auf minimal ca. 70 ms setzen.

 digitalWrite(10,LOW) ; // Pull DOWN Widerstand akti

geht das beim Nano ?

Nein, geht nicht. Es gibt keinen internen Pulldown-Widerstand, den man aktivieren könnte, bei diesem Board.

Also ich habe jetzt Verschiedene Sachen Ausprobiert.

Timeout:

{T = pulseIn(7, HIGH,100) + pulseIn(7, LOW,100);
und
{T = pulseIn(7, HIGH,1000) + pulseIn(7, LOW,1000);

Ruhefrequenz wird höher bei 100 wars glaube ich 2kHz

noTone:
void loop()
{T = pulseIn(7, HIGH) + pulseIn(7, LOW);
{f=1/(double)T; // f=1/T
if ((f1e60.85)<70)
{digitalWrite(10,LOW);
}
else{ tone(10,f1e60.85);}
noTone(10)

}
}

Frequenzconvertierung Funktioniert nicht mehr Richtig
bei 1kHz Eingang kommen bei Pin 10 nur noch 333Hz raus statt (860Hz wie vorher)

Vllt. verfolge ich auch einen komplett falschen Ansatz…
Ziel ist es bei einem Frequenzband zwischen 10Hz-4kHz eine Zeitnahe Ausgabe von 85% zu bekommen:
sprich
4000Hz->3400Hz
1000Hz-> 850Hz
100Hz-> 85Hz
10Hz-> ~9Hz

und bei allem unter 10Hz Eingang soller der Ausgang (10) ruhig sein kein muks von sich geben ^^.

PS.: Ob dieser dann HIGH oder LOW ist, ist egal.
Und mit dem Pull-Down… Habs auch anders herum getestet . Wenn das beim Nano nicht geht dann fänd ichs super wenn das beim Kompilieren angemotzt werden würde^^

Gruß
David

Bombi: mein Problem ist folgendes: Wenn ich keine Eingangsfrequenz habe dann habe ich am Ausgang immernoch eine Frequenz von 30Hz.

Die minimal mit der tone() Funktion erzeugbare Frequenz mit den Boards Uno, Mega, Leonardo und anderen AVR Boards betrrägt 31 Hz.

Das ist auch dokumentiert: https://www.arduino.cc/en/Reference/Tone Niedrigere Frequenzen mußt Du entweder auf andere Art erzeugen oder mit noTone() die Frequenzerzeugung abschalten.

Bombi:
if ((f1e60.85)<70)

10Hz-> ~9Hz

jurs:
Die minimal mit der tone() Funktion erzeugbare Frequenz mit den Boards Uno, Mega, Leonardo und anderen AVR Boards betrrägt 31 Hz.

Das ist auch dokumentiert: https://www.arduino.cc/en/Reference/Tone
Niedrigere Frequenzen mußt Du entweder auf andere Art erzeugen oder mit noTone() die Frequenzerzeugung abschalten.

Tschuldige für die verwirrung welche ich gestiftet habe.10Hz wären super muss aber nicht .Das mit den 31Hz hatte ich auch davor gelesen. Um dies los zu werden dachte ich es bringt evtl. was wenn ich erst Eingangsfrequenzen ab 70Hz ausgebe.
Die fehlenden 60Hz wäen zu verschmerzen bzw. 31Hz/0,85 =36,47Hz~37Hz-> würden sogar nur der Bereich von 27 hz fehlen was echt gut wäre.

Gruß David

Hallo David,

ich möchte nur versuchen, dich auf Ungereimtheiten aufmerksam zu machen. Durch den Code oder vielmehr die Funktionsweise bin ich noch gar nicht durch gestiegen.

. Wenn das beim Nano nicht geht dann fänd ichs super wenn das beim Kompilieren angemotzt werden

. Bei einem als INPUT definierten Pin kannst Du durch digitalWrite HIGH einen Pullup aktivieren. (oder durch INPUT_PULLUP als Definition). Dann hast Du zwischen Pin und +5V einen Widerstand mit 20K geschaltet. Bei einem OUTPUT ziehst du den Pin mit digitalWrite LOW auf GND. OHNE Widerstand dazwischen. Da das ein legaler Befehl ist, motzt auch der Kompiler nicht. Es ist jedoch Schaltungstechnisch ein großer Unterschied. Auch wenn es evtl. bei DIESEM Projekt keinen Schaden anrichtet.

Hoffe Du bekommst das mit der Grenzfrequenz in den Griff !

Stefan

Für die Aktivierung interner Pullups gibt es den Modus INPUT_PULLUP. Der sollte bei jedem Controller funktionieren, der überhaupt interne Pullups hat, und ggf. eine Fehlermeldung beim Compilieren, wenn der Controller das nicht kann.

Das digitalWrite HIGH funktioniert nur bei ganz speziellen Prozessoren, und mit INPUT_PULLUP gibt es überhaupt keinen Grund für solche Trickprogrammierung.

Bei Verwendung von tone() mußt Du feststellen, ob die kleinstmögliche Frequenz (30Hz?) unterschritten würde, und dann die Ausgabe mit noTone() abschalten, statt eine ungültige Frequenz auszugeben. Gleichzeitig kann man mit einer LED anzeigen, ob der Ausgang aktiv oder abgeschaltet ist.

Ich verstehe dein Codebeispiel nicht.
Ich habs mal geändert, und kommentiert, so wie ich das machen würde, was ich glaube verstanden zu haben, was du willst.

void loop() {
  T = pulseIn(7, HIGH) + pulseIn(7, LOW);   // Eingangssignal messen
  f=1/(double)T;          // f=1/T                 Eingangsfrequenz berechen.
  f = (f*1e6*0.85);              // Ausgangsfrequenz berechnen
  if (f<70){                           // wenn f kleiner 70
     noTone(10);                       // Frequenzausgabe abschalten
  } else{                              //  wenn nicht
     tone(10,f);                        // Frequenz ausgeben
  }
}