Forum: Mikrocontroller und Digitale Elektronik Störgeräusche bei tone mit Arduino


von Fred B. (racerfred)


Lesenswert?

Hallo,

bin ganz neu hier und grüße erst einmal die ganze Gemeinde :-)

Bin auch erst zwei Tage Besitzer meines Arduino Uno, deswegen bitte 
evtl. dumme Fragen zu entschuldigen ;-)

Zum Problem:

Wenn ich mit dem Befehl "tone" eine Rechteckfrequenz ausgebe, dann hört 
sich das auf meinem Piezo bis ca. 5 kHz ganz normal an.
Gehe ich allerdings mit der Frequenz weiter hoch, so ab ca. 10 kHz, dann 
wird neben der ursprünglichen Frequenz ein deutliches gleichmäßiges 
"Knattern" hörbar (im Ultraschallbereich nur noch dieses, mit dem Ohr 
hörbar). Evtl. ist dieses auch bei der niedrigen Frequenz da, nur nicht 
durch den relativ lauten Ton der niedrigen Frequenz zu hören.

Der Testcode mit 10 kHz.



unsigned int frequenz=10000;

void setup() {
  tone(10,frequenz);
}

void loop() {
}



Weiß jemand, wo dieses herkommt bzw. wie man dieses umgehen kann, da ich 
nur die eigntl. Frequenz haben will (im Bereich von 10 bis 30 kHz)?

Gibt es eine andere Möglichkeit, eine Frequenz in diesem Bereich 
auszugeben ?

Bin um jeden Tipp dankbar.

Viele Grüße und einen schönen Feiertag

Fred

: Verschoben durch User
von Beo Bachta (Gast)


Lesenswert?

Das wird nie ein sauberer Ton da das Arduino Framework per
Timer Interrupt eine Millisekunden Zeitbasis erzeugt.

Dein Ton wird also dauernd unterbrochen, was sich in einem
zweiten Ton bemerkbar macht.

Wenn ohne Störung gewünscht dann bei Arduino beschweren
(wird nix helfen) oder selber von Grund auf programmieren
(z.B. void setup() und void loop() weglassen, dann gibt's
auch kein Framework).

von Fred B. (racerfred)


Lesenswert?

Hallo Beo Bachta,

vielen Dank für die Info.

Ich habe mir schon in der Form etwas gedacht. Da wie gesagt, ein 
blutiger Anfänger, sind das so die ersten Erfahrungen.

Das "richtige" Programmieren wäre dann in Maschinensprache (C oder so)?

Liese sich das mit der Software "Bascom" bewerkstelligen?

Kennst Du eine Adresse, bei dem man sich (für einen Anfänger) in diese 
Sprache einarbeiten kann?

Ich weiß, dass das mit Sicherheit sehr umfangreich wird, aber wenn man 
nicht beginnt, kommt man auch nicht ans Ziel ;-)

Gruß Fred

von Michael U. (amiga)


Lesenswert?

Hallo,

Beo Bachta schrieb:
> Wenn ohne Störung gewünscht dann bei Arduino beschweren
> (wird nix helfen) oder selber von Grund auf programmieren
> (z.B. void setup() und void loop() weglassen, dann gibt's
> auch kein Framework).

geht prinzipiell auch innerhalb der Arduino-Geschichte. Freien Timer 
suchen, der CTC kann und den Wunschgemäß programmieren. Tone() hat wohl 
eher das Problem, daß sie es auf allen Pins irgendwie machen wollen.

Gruß aus Berlin
Michael

von Peter D. (peda)


Lesenswert?

Um beliebige Pins zu benutzen erfolgt das Pin toggle in Software. Da der 
AVR keine Interruptlevel kann, gibt es zwangsläufig Jitter durch andere 
Interrupts.
Die Lösung ist, man nimmt einen der Pins, die mit einem Compareregister 
verknüpft sind. Dann geht das Toggle in Hardware, d.h. ohne Interrupt. 
Wie das geht, steht im Kapitel Timer im Datenblatt des jeweiligen AVRs.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.