Ich möcht ein Ultraschallmodul an mein 8051er anschliesen, das funktioniert per PWM-Signal, also Rechteck-Signal nur wie erzeug ich sowas am besten? selber ausrechnen und dann über nen ganz normalen Pin ausgeben? oder gibts da nen Trick?
Wir sprechen von der softwaremäßigen Erzeugung einer PWM, richtig? Dann nimmst Du einen Timer, lässt den schön schnell laufen und überlegst Dir währenddessen, wie viele Stufen Deine PWM haben soll. Dann noch zwei Variablen - ein PWM-Zähler, ein PWM-Wert: Wenn der PWM-Zähler > PWM-Wert ist, dann Port auf high sonst low. Und wenn der Zähler das Maximum erreicht wieder auf null stellen. Nun zum Trick: Du hast einen PWM-Summierer und einen PWM-Wert. Auf den Summierer addierst Du immer den PWM-Wert und wenn es einen Überlauf gibt, setzt Du Dein Pin auf aktiv, ansonsten auf inaktiv. Wenn ich mich recht erinnere, kann man beim 8051 das Carry auf einen Port/Bit umkopieren, womit das Ganze sehr kompakt wird. Achtung: Das Signal ist damit keine PWM mehr, repräsentiert aber weiterhin einen digitalisierten Analogwert. Wie ist da nur der Fachbegriff?
also wenn ich das richtig vertanden hab, gibt es da kein speziellen Trick bei 8051ern, sowas wie den UART bei serieller Übertragung man macht das einfach mit nem Timer und nem ganz normalen I/O-Pin
Was willst Du denn nun ? Ne PWM oder ein Rechtecksignal ? Rechteck geht mit T2. PWM geht mit PCA (5 * 8Bit). Je nach Frequenz geht natürlich auch ein Timerinterrupt mit T0 oder T1. Da der 8051 ja Prioritäten hat, gibts kein Jitter durch andere Interrupts, wenn man dem Timer die höchste Priorität gibt. Peter
ich dachte PWM ist ein Rechtecksignal, aber wenn nicht brauch ich ein
PWM-Signal
>>PWM geht mit PCA (5 * 8Bit)
was ist PCA?
Eine PWM ist am Ausgang des MC wirklich rechteckig, dient aber dazu ein Analogausgang zu realisieren. Hinter dem RC-Tiefpaß wird dann aus dem Rechteck eine Spannung entsprechend dem Tastverhältnis. Bei einer PWM läßt sich also das Tastverhältnis einstellen, nicht aber die Frequenz. Der Rechteckausgang des T2 liefert dagegen immer ein Tastverhältnis 1:1, dafür läßt sich aber die Frequenz einstellen. Die Frage ist also, kommt es Dir auf das Tastverhältnis (PWM) oder die Frequenz (Rechteckausgang) an. Ein "Programmierbares Counter Array" haben die meisten 8051 mit Bootloader, z.B. Atmel AT89C51RD2, Philips P89C51RD2. Peter
das versteh ich nicht, wenn ich PWM über einen normalen Pin mache, wer hält mich dann davon ab die Frequenz ein zu stellen wie ich will? hat vielleicht jemand ein Beispielcode für ein einfaches PWM-Signal?
Wie fein soll deine PWM sein? Bei welcher Frequenz? Am einfachsten nimmst du Timer 0/1 im Mode 1 oder 2. Dann suchst du dir die Puls-/Pausenverhältnisse aus, die du brauchst. Timer laden und wenn er abgelaufen ist, ladest den mit dem nächsten Wert nach. Und das schön abwechselnd, beim ersten die Pulsbreite und beim nächsten Mal die Pausenbreite. Gruß Elektrikser
"das versteh ich nicht, wenn ich PWM über einen normalen Pin mache, wer hält mich dann davon ab die Frequenz ein zu stellen wie ich will?" Dich will niemand abhalten, sondern ich wollte Dir nur die Begriffe erklären. PWM heißt Pulsweitenmodulation, d.h. die Pulsweite wird verändert, aber die Frequenz bleibt konstant. Wenn Du die Frequenz ändern willst, dann sage doch FM und nicht PWM. Und wenn Du eine Hardware-PWM verwendest, dann kannst Du eben nicht die Frequenz ändern, die ist durch die Auflösung der PWM (8 Bit) fest vorgegeben. In Software kannst Du es halten wie ein Dachdecker, wobei es natürlich sinnvoll ist, die richtigen Begriffe zu verwenden. Peter
achso, ich dachte du meintest, es ist nicht möglich eine PWM mit wechselnder Frequenz zu machen, weil der Mikrocontroller das nicht unterstützt ich möchte ein SRF04 (ein Ultraschall-Distanzsensor) ansteuern im Datenblatt (http://info.hobbyengineering.com/specs/devantech-srf04-tech.pdf) steht, man muss 10uS auf high schalten, um das Ganze zu starten, 10uS ist die kleinste Einheit die ich brauche, also stell ich den Timer so ein, dass immer nach 10uS ein Überlauf kommt bei einem 11059 Mhz Quarz hätte ich dann 11059000 / 12 ~ 921583 Machine Cycles pro Sekunde das heist der Timer wird in einer Sekunde 921583 mal erhöht werden dann kann man auch ausrechnen, wie oft das in 10 uS wäre 921583 / 100000 = 9,21583 aber ist das nicht irgendwie zu ungenau? wenn ich jetzt 100 uS lang auf high stellen will würde ich 10 mal auf einen Überlauf warten, von einem Timer der immer von 247 los zählt(also 9x bis zum Überlauf) dann hätte ich aber bei 100uS schon eine relativ große Abweichung
also kurz gesagt: wie schaffe ich es genau genug zu erkennen, wann ein Zeitraum von nur 10 uS rum ist?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.