mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Ton erzeugen mit PWM


Autor: Sebastian R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich möchte mit PWM einen Ton erzeugen. Dazu habe ich amAtmega bei 0c1B 
einen kleinen LS angeschlossen und folgenden Code geschrieben:

#include <stdio.h>
#include <avr/io.h>
#include <util/delay.h>
#include <pwm_init.c>


void long_delay(uint16_t ms)
 {
 for(; ms>0; ms--) _delay_ms(1);
 }

int main(void)
 {
 unsigned char i = 0;
 pwm_init();
 USARTInit();

 while(1)
  {
  for (i=0; i<255; i++)
   {
   OCR1B = i;
   long_delay(10);
   }
  }
 }



weiß vielleicht jeamnd warum das nicht klappt?


Sebastian

Autor: Hickhack0 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
 for(; ms>0; ms--) _delay_ms(1); 
1. ist das erlaubt?
2. nimm doch while
3. Lautsprecher an PWM...
3a bitte mit verstärker sons kanns nix werden,
3b PWM hört sich sicher nicht toll an aber brummen oder pfeifen wirds 
bestimmt.
4. krasses Projekt

Autor: Hickhack0 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
5. nimm doch noch besser
_delay_ms(10);
statt
der ganzen Funktion long_delay()

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <pwm_init.c>

Sowas macht man nicht.

Und nun wird es laut:

WOHER ZUM GEIER SOLL JEMAND WISSEN WAS DU
IN PWM_INIT.C VERBROCHEN HAST?

Etwas leiser:

Lautsprecher direkt am Portpin ist keine gute Idee.
Wenn der nur so 8 Ohm hat ist der Port vieleicht schon tot.

Autor: Sebastian R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke schon mal

Ich hab den LS natürlich über einen Widerstand (1KO) angeschlossen.

Ein kurzer Test mit:

DDRB=255;
while (1)
  {
  PORTB=64;
  long_delay(1);
  PORTB=0;
  long_delay(1);
  }

brachte nun außerdem die Bestätigung, dass der Port an sich einwandfrei 
funktioniert. Allerdings nur als Mückenschreck ist mir der AVR zu 
schade... :)

nun zu pwm_init.c:



void pwm_init (void) {

  DDRB = (1<<PB1) | (1<<PB2);
  PORTB = ~(1<<PB1) & ~(1<<PB2);

    TCCR1A =  (1<<WGM10) | (1<<COM1A1) | (1<<COM1A0) |(1<<COM1B1) | 
(1<<COM1B0);

    TCCR1B = (1<<CS10) | (1<<WGM12);
}

Autor: Sebastian R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, hab herausgeunden, dass mit eingeschaltetem CKDIV8 Fusebit ein Ton 
zu höhren ist, etwa 15KHz würd ich mal sagen (hab kein Oszi). Allerdings 
ändert sich die Frequenz nicht, sondern die Lautstärke. Mit dem 
Messgerät kann man eine schwankende Spannung zwischen 0 und ~5V 
messen....

Autor: bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist ja auch klar das sich der Ton nicht ändert. Wie auch? Die Frequenz 
bleibt ja konstant, lediglich der effektivwert ändert sich und somit 
auch die Lautstärke bzw deine gemessenen 0 bis 5V.

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

auch wenn PWM scheinbar das Schalgwort für alles zu sein scheint...

Um einfach irgendeinen Ton zu erzeugen, den Timer in den CTC-Mode, das 
Cpomapre-Pin auf Toggle, nun noch Vorteiler auf einen sinnvollen Wert 
und den Comparewert setzen. Der bestimmt dann auch die Tonhöhe.

Die Zeit, die sich aus Vorteiler und Comparewert ergibt, ist der Wert 
für die Länge einer Halbwelle.

Bei 1MHz AVR-Takt und z.B. 1kHz Ton muß als die Zeit 1ms für eine 
Schwingung, damit 500µs (2kHz) für den Timer sein.

Vorteiler auf 16 ergibt 62500, also rund 32kHz am Timer.
Compare jetzt auf 32 sollte ca. 1kHz ergeben.
Genaue Berechnung ist im Datenblatt.

Gruß aus Berlin
Michael

Autor: Sebastian R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Michael erstmal. Ich habs nun auf CTC umgestellt. Meine Settings 
sind nun folgende:

    TCCR1A = (1<<COM1B0);  // Toggle OCnA/OCnB/OCnC on compare match.
    TCCR1B = (1<<CS10) | (1<<CS12) |(1<<WGM12); // clk/1024, WGM Mode 4


Die Formel für den CTC mode ist:

           fclk
FOC =     ------
        2*N*(1+OCR)


fclk = 16.000.000, N ist ja bereits auf 1024 gestellt, das heißt, wenn 
ich OCR nun auf 2 stelle, müsste ich etwa 2,6KHz erhalten. Ist das 
richtig?



Gruß
Sebastian

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.