mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PWM Sinus 440 Hz funktioniert nicht


Autor: Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

ich habe hier einen ATmega8 @ 16 Mhz.


Mit diesem möchte ich ein 440 Hz Sinussignal per PWM ausgeben.

Timer 2 ist auf fast PWM geschaltet.

Es wird vorher eine Tabelle mit 20 verschiedenen Sinuswerten berechnet.


Der Timer1 COMPA Interrupt gibt der PWM jeweils den nächsten berechneten 
Sinuswert. Dieser Interrupt wird alle T=1/(440Hz*20 Schritte) ausgelöst.

Somit sollte an OC2 ein 440 Hz Sinussignal anliegen.

Leider habe ich kein Scope hier sondern nur einen Lautsprecher. Der 
Ausgang geht an 2 Transistoren (Endstufe) und von dort aus an den 
Lautsprecher. Es ist nichts zu hören.


Vielleicht kann mit ja jemand von euch helfen. Ich bedanke mich schonmal 
im vorraus.


Hier der Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <math.h>

#define pi 3.1415926

void init(void);

unsigned int anzahlWerte=20;
unsigned char sinusWerte[20];

unsigned int step=0;

ISR(TIMER1_COMPA_vect)
{
    OCR1AL=sinusWerte[step];
  step++;
  if(step==20) step=0;
}



int main(void)
{

  init();
  while(1);
  return 0;
}

void init(void)
{
  int i;
  for(i=0;i<anzahlWerte;i++)
    sinusWerte[i]=(unsigned char)(127.5+127.5*sin(2.0*pi*i/anzahlWerte));
  DDRB=0b00001000;    // PWM Ausgang OC2
  TCCR2=(1<<WGM21)|(1<<WGM20)|(1<<COM21)|(1<<CS20);  // Fast PWM, non invertig mode, no prescaler
  OCR2=128;  // Lautsprecher aus: PWM auf 50%
  
  TCCR1A=(1<<WGM12);  // CTC
  TCCR1B=(1<<CS11);  // CLK/8
  OCR1AL=227;      // Entspricht Sinus mit ca 440 Hz
  sei();
}

Autor: Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einen Fehler habe ich entdeckt.


Im Interrupt muss es natürlich

OCR2=sinusWerte[step];

statt

OCR1AL=sinusWerte[step];

heißen.


Leider funktioniert es trotzdem noch nicht.

Autor: Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, noch ein Fehler; ich hatte den Interrupt nicht aktiviert.


TIMSK=(1<<OCIE1A);


habe ich in der init() Funktion hinzugefügt.

Der Ausgang wird an einer LED getestet und es leuchtet mit ca 1,5 Hz.


Um diesen jetzt auf 440 Hz zu bringen muss TCNT1 beim Aufruf des 
Interrupt resettet werden.


Ich dachte dies würde durch
TCCR1A=(1<<WGM12);  // CTC
 passieren. Leider macht ers nicht. Vielleicht kann mir jemand sagen was 
ich falsch gemacht habe?

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
versuchs mal mit 16BIT (also nicht H/L)

OCR1A=227;      // Entspricht Sinus mit ca 440 Hz

Der Compiler setzt das dann passend um.

gruß hans

Autor: Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo! Danke soweit.

Hab alles umgeändert. Ändert aber nichts daran, dass TCNT1 nicht 
gelöscht wird. Ich bin soweit der 440 Hz Ton ausgeben zu können:

ISR(TIMER1_COMPA_vect)
{
  TCNT1=0;
    OCR2=sinusWerte[step];
  step++;
  if(step==20) step=0;
}


Ich dachte durch das

TCCR1A=(1<<WGM12);  // CTC

wäre TCNT1=0; unnötig. Leider wird TCNT1 nur gelöscht wenn ich es selber 
in den Interrupt reinschreibe. Dann sind auch die 440 Hz zu hören.

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das Bit WGM12 ist in TCCR1B (wenn mein Datenblatt stimmt).

  TCCR1A=0;
  TCCR1B=(1<<CS11)|(1<<WGM12); // CLK/8, CTC

und es läuft (denke ich)

gruß hans

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.