PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : mega32 pwm



_maddin
02.02.2008, 16:04
hallo
ich möchte mit einem mega32 melodien über einen piezo oder sowas abspielen (soll eine spielkonsole werden). das hauptprogramm soll natürlich unbehindert davon weiterlaufen. ich hab versucht die frequenz über einen pwm ausgang auszugeben aber ich check einfach nicht wie das funktioniert...
kann mir vllt mal jemand der ahnung davon hat nen beispielprogramm schreiben das an einem beliebigen pwm ausgang ne 440 Hz schwingung ausgibt oder kann mir zumindest jemand nen link schicken wo der ganze PWM kram schön einfach erklärt wird ??
grüße
martin

Hubert.G
03.02.2008, 17:35
www.roboternetz.de/wissen/index.php/Pwm
www.mikrocontroller.net/articles/Pulsweitenmodulation
Ob PWM zum Melodien erzeugen das richtige ist bezweifle ich.

_maddin
03.02.2008, 19:45
die hab ich beide schon gelesen, ich weiß auch, das pwm eigentlich dazu da ist, ohne DA wandler leistungen zu regeln. aber dass kann man doch auch zum erzeugen von melodien verwenden, dem piezo ist das tastverhältnis natürlich (fast) egal, den interessiert eigentlich nur die frequenz.
aber wie ich das ganze praktisch realisiere, sagen mir die beiden artikel auch nicht

McJenso
03.02.2008, 20:15
Hallo,

wenn dem Piezo das Tastverhältnis egal ist und es nur auf die Frequenz ankommt, möchtest du den Timer nicht im PWM sondern im CTC- Mode einsetzen. Über den Prescaler bestimmst du einen Frequenzbereich und über den Wert im Compareregister die Frequenz innerhalb des Bereiches.

Gruß

Jens

Hubert.G
03.02.2008, 20:23
Bei der PWM bleibt die Frequenz gleich, es ändert sich nur das Tastverhältnis.
Du musst einen Timer den Prescaler einstellen das du bei Überlauf die tiefste Frequenz erreichst die du willst. Compare Match und CTC einstellen. Die Werte im CompareMatch Register ergeben dann die Tonhöhe. In der ISR dann ein Port toggeln.

_maddin
03.02.2008, 21:58
mir wird einiges klar^^
ich probiers mal aus, danke schonmal

Ceos
03.02.2008, 22:07
könnte man die steifen rechteckimpulse nicht noch irgendwie mitm bissl elektronik(spule und kondensator) glätten und das ganze ein wenig sinusfürmiger erscheinen zu lassen ?

Hubert.G
04.02.2008, 10:03
Man kann sicher ein Pi-Filter nachschalten, dem Piezo-Pfeiferl wird es aber ziemlich egal sein.

_maddin
04.02.2008, 20:27
ich hab mich jetzt durch irgendwelche datenblätter gekämpft und versteh trotzdem nichts... dieses programm soll nen 440Hz Ton am OC1A pin ausgeben (atmega32) . funzt aber nicht...
int main(void) {

DDRD|=1<<OC1A;
PORTD|=1<<OC1A;

TCCR1A = (1<<COM1A1); // Set OC1A when upcounting, clear when downcounting
TCCR1B = (1<<WGM13); // Phase/Freq-correct PWM, top value = ICR1
TCCR1B|= (1<<CS10);

ICR1H= 0x6a;
ICR1L= 0x88;

OCR1AH = 0x6a;//440Hz
OCR1AL = 0x88;

while(1) tuwas();
}

Hubert.G
05.02.2008, 15:10
Sollte es nicht eher so gehen:
DDRD=0x20;
OCR1A=0xfa;
TCCR1A=(1<<COM1A0);
TCCR1B=(1<<WGM12)|(1<<CS11);
In OCR1A kommt dann der Wert des Tons. Bei 8MHz etwa 2f für 440Hz, habe ich aber nicht genau nachgerechnet.

Eher 2ff.

_maddin
06.02.2008, 12:54
so funktioniert es =), danke

ich würde meine konsole gerne zweistimmig piepsen lassen aber wenn ich das datenblatt vom mega32 richtig verstanden habe, funktioniert der CTC mode NUR mit dem OC1A, ist das richtig ?

Hubert.G
06.02.2008, 13:15
CTC geht pro Timer nur einmal. Du müsstest dann einen zweiten Timer opfern.

_maddin
07.02.2008, 11:39
ok ich hab das ganze jetzt mit dem 16 und dem 8 bit timer völlig unabhängig vom rest des programmes gelöst und zwar mittels "software CTC" , damit ich mehr als nur eine stimme zur verfügung habe.
ich hab jetzt schon die F dur invention von bach rübergeholt und die original tetrismucke (allerdings nur 3-stimmig) ...
das problem ist nur: mein "software CTC" benötigt soviel rechenleistung, dass das eigentliche programm (im moment noch PingPong) furchtbar langsam wird, selbst wenn ich alle delays usw lösche...
also wird wohl nix aus schönem polyphonem sound beim zocken, außer ich hol mir noch nen zweiten Avr für die sundwiedergabe dazu...

danke trotzdem für die hilfe. hat jetzt alles so funktioniert wie ich es wollte, nur nutzen tut es mir trotzdem nix... :D

Ceos
07.02.2008, 14:46
ersetz die delays doch durch ausgefeilte ISRs mit Flags und so bei welchem Timer Event was alles gemacht werden muss ... und dein Hauptprogramm bleibt dann völlig unbeeindruckt ... ich habe z.B. ne proportionalsteuerung für servos mittels oszi ausgang gebastelt, steuerung wird über ISRs behandelt und das hauptprogramm überprüft regelmäßig die stellung der servos und meldet sie an den PC ... ist also bis auf die takte die durch die ISRs flöten gehen von der steuerung unabhängig sowas wie primitives multitasking