Forum: Mikrocontroller und Digitale Elektronik Piezo Piep mit (analogWrite,128)


von oldeurope O. (Gast)


Lesenswert?

Habe auf dieser Webseite gelesen, dass die PWM-Pins
zwei unterschiedliche Frequenzen haben.
https://www.hackerspace-ffm.de/wiki/index.php?title=ArduinoVariablePWMFrequenz
Ist bei Arduino festgelegt welcher PWM Pin 490Hz bzw 980Hz hat?

Momentan habe ich den Piep an Pin11 und der hat 490Hz.
Natürlich wären mir 980Hz lieber, weil besser hörbar.

LG
old.
1
betaetigt =(!(hoch || runter) & (boola || boolb)); 
2
if((betaetigt || initpiep) == HIGH){analogWrite(piep,128);}                                                // Piep
3
  else{analogWrite(piep,0);}

von Helmut H. (helmuth)


Lesenswert?


von oldeurope O. (Gast)


Lesenswert?

Danke für die Info. Zufällig habe ich die beiden Motoren an 5 und 6.
Dann bleibt der Piep halt auf 490Hz.

LG
old.

von oldeurope O. (Gast)


Lesenswert?

"Die PWM-Ausgaben auf Pins 5 und 6 werden höhere Zyklen als erwartet 
haben. Dies passiert, weil die Funktionen millis() und delay() den 
gleichen internen Timer nutzen, um diese PWM-Ausgaben zu generieren. In 
kleinen Zyklen (z.B. 0 bis 10) ist der Effekt am stärksten und kann dazu 
führen, dass der Wert 0 die Spannung auf Pin 5 und 6 nicht komplett 
wegnimmt, d.h. dass z.B. bei Wert 0 die LED trotzdem leuchtet."

Mit "Zyklen" ist was gemeint?

Bisher ist es noch nicht vorgekommen, das die Motoren bei "0"
noch irgendwie bestromt werden.

LG
old.

von Wolfgang (Gast)


Lesenswert?

Aus der W. schrieb:
> Natürlich wären mir 980Hz lieber, weil besser hörbar.

Was hindert dich daran, die PWM-Frequenz zu erhöhen. delay() und 
millis() hängen am Timer0. Falls dein Arduino mehr Timer hat, steht es 
dir frei, einen davon zu verwenden, ohne o.g. Funktionen zu 
beeinflussen. Vielleicht müsstest du dich von der Idee verabschieden, 
dies über die in Arduino bereit gestellte Funktion analogwrite() zu 
erreichen und selber eine geeignete Funktion schreiben, so wie es der 
von dir verlinkte Artikel beschreibt. Was dein µC an Hardware zur 
Verfügung hat, verrät dir dessen Datenblatt.

von oldeurope O. (Gast)


Lesenswert?

Wolfgang schrieb:
> Was hindert dich daran, die PWM-Frequenz zu erhöhen.

Bin ich zu dumm für. Ich hatte versucht über micros()
mit einem Software-Multivibrator 1KHz in der void loop
zu erzeugen. Klappte auch gut, bis die loop zu umfangreich
wurde. Deshalb habe ich dafür analogWrite(piep,128)
verwendet. Funktioniert so und piept halt mit 490Hz,
hört man noch laut genug.

LG
old.

von Helmut H. (helmuth)


Lesenswert?

Man könnte auch tone verwenden, hier kann der Pin und die Frequenz frei 
gewählt werden:
https://www.arduino.cc/reference/de/language/functions/advanced-io/tone/

Das belegt Timer 2, d.h. PWM auf Pins 3 und 11 kann nicht verwendet 
werden.

von oldeurope O. (Gast)


Lesenswert?

1
betaetigt =(!(hoch || runter) & (boola || boolb)); 
2
if((betaetigt || initpiep) == HIGH){tone(piep,1000);}                                                // Piep
3
  else{noTone(piep);}

Vielen Dank !!!
Von der Funktion wusste ich gar nichts.

Helmut H. schrieb:
> Das belegt Timer 2, d.h. PWM auf Pins 3 und 11 kann nicht verwendet
> werden.

Wenn es piept ist die PWM=0. Daher scheint das zu funktionieren.

Ich habe mal testweise einen Dauerton programmiert.
(Der wird dann genau so verwurschtelt wie mein micros()-Piep
in der loop).
Die PWM-Funktion auf 5 und 6 bleibt erhalten.

Der Ardino fährt Tischbeine hoch und runter. Der Piep
kommt nur wenn er nicht fährt. Also kein Problem.

Jetzt könnte ich den Funktionen auch noch unterschiedliche
Tonhöhen zuordnen. Bin Entzückt.

LG
old.

von oldeurope O. (Gast)


Lesenswert?

Helmut H. schrieb:
> https://www.arduino.cc/reference/de/language/functions/advanced-io/tone/
>
> Das belegt Timer 2, d.h. PWM auf Pins 3 und 11 kann nicht verwendet
> werden.

Ich sehe gerade, ich verwende die Pins 5,6 und 9 für PWM.

Deshalb klappt das bei mir.
Das sich der Piep nicht gut anhört, liegt daran,
dass nur Nadelimpulse raus kommen.

>> Generiert einen Ton mit der angegebenen Frequenz
>> (und 50% duty cycle) auf einem Pin.

Kann ich nicht bestätigen. Weder auf Pin 11 noch auf Pin7.
Deklaration als OUTPUT spielt keine Rolle.

Ich gehe erstmal wieder auf analogWrite(piep,128).

LG
old.

von oldeurope O. (Gast)


Lesenswert?

Aha !
1
betaetigt =(!(hoch || runter) & (boola || boolb)); 
2
if(betaetigt == HIGH){tone(piep,1000);}                                                                    // Piep
3
  else if(initpiep == HIGH){tone(piep,440);}
4
  else if(ueberlastmf == HIGH){tone(piep,2000);}  
5
  else{noTone(piep);}

Jetzt weiß ich auch wofür man else if braucht.

Alles bestens,

LG
old.

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.