PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : software pwm für atmega 32



proevofreak
02.02.2009, 21:07
Hallo, bin noch relativer C Anfänger und möchte nun eine Hindernisserkennung mit einer Software PWM realisieren.

Für die Sendediode benötige ich eine Frequenz von 36 khz.

Leider habe ich sehr beschränkte Programmierfähigkeiten auf diesem Gebiet.
Hat jemand von Euch vielleicht so etwas schon mal programmiert und hat den Code noch?
wäre voll nett, wenn mir jemand hier ein Beispielprogramm mit Kommentaren posten könnte.

danke schon mal im voraus

gruß

lorcan
03.02.2009, 10:55
Guck dir mal das Datenblatt zu deinem AVR an, insbesonder bzgl. Timern.
Die Funktion die dich interesiert ist zum einen "Clear OCxA/OCxB on Compare Match" und zum anderen CTC.

Die erste Funktion wechselt den Pegel eines bestimmten Portpins bei erreichen eines sog. "Compare Match", die zweite Funktion setzte den Zähler beim gleichen Ereignis zurück. Um ein Rechteck zu erzeugen musst du jetzt nur mit der doppelten Frequenz des gewünschten Signals am Timer ein "Compare Match" auslösen, also das "Compare Match"-Register auf Taktfrequenz/(2*Signal-Frequenz) setzen, einen Vorteiler für den Timer fällt dann weg.

Für weitere Information kannst du auch nach Infrarotfernbedienungen suchen, die brauchen auch ein Rechtecksignal mit 36-40kHz.

Hoffe du kannst damit was anfangen.

Gruss
Lorcan

oberallgeier
03.02.2009, 12:03
Hi proevofreak,

zu einer präzisen Software-PwM brauchst Du sowieso einen präzsien Timer - dazu wird einer der Hardware-Timer genommen. Möglicherweise ist ein 16-bittiger notwendig, um auf die sauberen 36 kHz zu kommen (kommt halt auf den Quarztakt an). Wenn Du nun so einen Hardwaretimer hast, könntest Du so "nebenher" auch ne PwM davon ableiten. Wie das geht hat lorcan ja schon skizziert.

Andernfalls wartet Dein Controller die meiste Zeit - und tut sonst nix als blos die Softwarepwm mit einer Waitschleife erzeugen.

Software zur Hinderniserkennung mit IR (das meinst Du vermutlich auch), aber für mega168 bzw. mega8, und ausführliche Erläuterungen gibts hier (https://www.roboternetz.de/phpBB2/viewtopic.php?t=38009) oder etwas (noch?) ausführlicher hier. (https://www.roboternetz.de/phpBB2/viewtopic.php?t=11114)

Eine andere Möglichkeit zur Hinderniserkennung per IR ist genauer bzw. reproduzierbarer mit den Sharpsensoren der GP2Dx - Familie möglich. Dann brauchst Du keinen Timer, dann kannst Du den Sensor mit dem ADC auslesen.

wkrug
03.02.2009, 12:11
Die Funktion die dich interesiert ist zum einen "Clear OCxA/OCxB on Compare Match" und zum anderen CTC.
Es gibt auch eine Toggle OCx Funktion. Das mit dem CTC stimmt so.
Die notwendigen Informationen findest Du im Datenblatt für den ATMEGA32A ( doc8155.pdf ) auf Seite 79.

Welche Register dann dazu wie gesetzt werden müssen sollte sich dort klären lassen.
Ich müsste mich jetzt da genauso durchkämpfen, das kannst DU ja aber auch selber machen, umso mehr lernst Du dabei.

Wenn Du die Register richtig befüllst, läuft die komplette Frequenzerzeugung in Hardware und braucht somit keine Rechenzeit mehr vom Controller - toll oder ?

lorcan
03.02.2009, 12:35
@wkrug: Die Toggle-Funktion meinte ich eigentlich auch, macht ja auch mehr Sinn.