Forum: Mikrocontroller und Digitale Elektronik Suche Möglichkeit um Töne mit PWM zu erzeugen


von Thomas Schmidt (Gast)


Lesenswert?

Hallo,

ich arbeite mit einem M16C/28 Prozessor und muss dringend mit
PWM Töne erzeugen. Leider habe ich bisher keine gute Doku dazu
gefunden und stehe im Moment echt auf dem Schlauch. Die Töne müssen
aus Platz und Stromgründen nur durch den Controller erzeugt werden.
Eigentlich sollen die Töne noch polyphon sein, aber ich wäre schon
froh wenn ich überhaupt einen vernünftigen Ton erzeugen könnte.

Nach langem experimentieren habe ich mithilfe zweier Timer schon
etwas hörbares erzeugt, allerdings ist ständig in regelmässigen
Abständen ein knacks zu hören, denn ich auch durch entkopplung durch
einen Kondensator nicht wegbekommen habe.

Hat jemand vielleicht ein Beispiel in C sodass ich die funktionsweise
der Tonerzeugung besser verstehen kann ?

Danke schon mal für eure Hilfe

Thomas

von ka-long (Gast)


Lesenswert?

Hi,

vielleicht hilft Dir das Konzept eines Class-D Verstärkers weiter ?
Ist zwr nicht in der Richtung, in der Du wahrscheinlich suchst, aber
damit läßt sich einiges machen.

Gruß ka-long

von SirSydom (Gast)


Lesenswert?

hab ich vor einiger zeit schonmal gepostet, so mach ich das.. vllt 
hilfts:

music.h
#define TONE_C      654
#define TONE_CIS    693
#define TONE_DES    693
#define TONE_D      734
#define TONE_DIS    778
#define TONE_ES    778
#define TONE_E      824
#define TONE_F      873
#define TONE_FIS    925
#define TONE_GES    925
#define TONE_G      980
#define TONE_GIS    1038
#define TONE_AS    1038
#define TONE_A      1100
#define TONE_AIS    1165
#define TONE_B      1165
#define TONE_H      1235
#define TONE_c      1308
#define TONE_cis    1386
#define TONE_des    1386
#define TONE_d      1468
#define TONE_dis    1556
#define TONE_es    1556
#define TONE_e      1648
#define TONE_f      1746
#define TONE_fis    1850
#define TONE_ges    1850
#define TONE_g      1960
#define TONE_gis    2077
#define TONE_as    2077
#define TONE_a      2200
#define TONE_ais    2331
#define TONE_b      2331
#define TONE_h      2469
#define TONE_c1    2616
#define TONE_cis1    2772
#define TONE_des1    2772
#define TONE_d1    2937
#define TONE_dis1    3111
#define TONE_es1    3111
#define TONE_e1    3296
#define TONE_f1    3492
#define TONE_fis1    3700
#define TONE_ges1    3700
#define TONE_g1    3920
#define TONE_gis1    4153
#define TONE_as1    4153
#define TONE_a1    4400
#define TONE_ais1    4662
#define TONE_b1    4662
#define TONE_h1    4939
#define TONE_c2    5233
#define TONE_cis2    5544
#define TONE_des2    5544
#define TONE_d2    5874
#define TONE_dis2    6223
#define TONE_es2    6223
#define TONE_e2    6593
#define TONE_f2    6985
#define TONE_fis2    7400
#define TONE_ges2    7400
#define TONE_g2    7840
#define TONE_gis2    8306
#define TONE_as2    8306
#define TONE_a2    8800
#define TONE_ais2    9324
#define TONE_b2    9324
#define TONE_h2    9878
#define TONE_c3    10465
#define TONE_cis3    11087
#define TONE_des3    11087
#define TONE_d3    11747
#define TONE_dis3    12445
#define TONE_es3    12445
#define TONE_e3    13185
#define TONE_f3    13969
#define TONE_fis3    14800
#define TONE_ges3    14800
#define TONE_g3    15680
#define TONE_gis3    16612
#define TONE_as3    16612
#define TONE_a3    17600
#define TONE_ais3    18647
#define TONE_b3    18647
#define TONE_h3    19755



music.c
#include <avr/io.h>
#include <avr/interrupt.h>
#include "music.h"

#define PAUSE  10

unsigned int speed  = 1500;
int pause = PAUSE;
unsigned int count  = 0;
unsigned int pos  = 0;
unsigned int melody1[27][2] =  {
            {TONE_g1, 8},
                {TONE_g1, 8},
              {TONE_a1, 4},
              {TONE_g1, 4},
            {TONE_c2, 4},
            {TONE_h1, 2},
            {TONE_g1, 8},
            {TONE_g1, 8},
            {TONE_a1, 4},
            {TONE_g1, 4},
            {TONE_d2, 4},
            {TONE_c2, 2},
            {TONE_g1, 8},
            {TONE_g1, 8},
            {TONE_g2, 4},
            {TONE_e2, 4},
            {TONE_c2, 8},
            {TONE_c2, 8},
            {TONE_h1, 4},
            {TONE_a1, 4},
            {TONE_f2, 8},
            {TONE_f2, 8},
            {TONE_e2, 4},
            {TONE_c2, 4},
            {TONE_d2, 4},
            {TONE_c2, 2}
            };
unsigned int length = 27;



void make_music(int freq, int time)
{
  TCCR0 = 0;
  if(freq < 4910)
  {
    TCCR0 = (1<<COM00) | (1<<CS02) | (1<<WGM01);
    OCR0 = 312500 / freq;
  }
  else
  {
    TCCR0 = (1<<COM00) | (1<<CS00) | (1<<CS01) | (1<<WGM01);
    OCR0 = 1250000 / freq;
  }

  count = (speed / time) / 10;
  OCR2  = 156;
  TIMSK = (1<<OCIE2);
  TCCR2 = 0;
  TCCR2 = (1<<WGM21) | (1<<CS22) | (1<<CS21) | (1<<CS20);

  return;
}

ISR(TIMER2_COMP_vect)
{
  count--;
  if(count == 0)
  {
    TCCR0 = 0;
    pause--;
    count++;
    if(pause == 0)
    {
      TCCR2 = 0;
      start_melody(melody1);
      pause = PAUSE;
    }
  }
}

void start_melody(int melody[16][2])
{
  if(pos >= length-1)
    return;
  make_music(melody[pos][0], melody[pos][1]);
  pos++;
  return;
}

int main (void)
{
  DDRB = 0xFF;
  sei();

  start_melody(melody1);


  while(1);
  return 0;
}

von SirSydom (Gast)


Lesenswert?

ach ich Idiot das war ja ne Suche und kein aktueller Thread..

Ruhe in Frieden.

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.