Hallo,
ich würde gern mit einem atmega32 eine Art spezielles PWM Signal
generieren.
Ich brauche ein PWM Signal, Frequenz (1kHz bis 10kHz) und Tastverhältnis
(0-95%)einstellbar. So weit kein Problem, lässt sich mit dem einem der
Counter Atmega32 leicht erledigen. Das Problem ist jetzt, dass ich
immer, wenn das Signal länger als 200 µs low ist, einen 1 µs langen Puls
extra brauche. Die Zeiten sollten eingehalten werden, auch wenn der µC
noch was anders erledigt (Display, ein paar Tasten zum Einstellen,
RS-232, …).
Das Bildchen zeigt mal ein paar mögliche Signalformen.
Wie könnte ich da vorgehen? Mit den drei Timern müsst sich da doch was
machen lassen, aber ich komm nicht wirklich auf einen grünen Zweig.
Das Signal soll übrigens zur Leistungsstellung eines Laser benutzt
werden und der Laser hätte eben gern min. alle 200 ms einen 1ms Puls,
damit das Plasma Ionisiert bleibt. Die langen Pulse des eigentlichen PWM
Signals bestimme dabei die abgegebenen Laserpulse, die kurzen 1µs Pulse
alle 200µs halten das Gas ionisiert, aber unter der Laserschwelle,
weshalb keine Leistung emittiert wird. Jetzt könnte man diese Signal
Notfalls ja einfach extern erzeuge und die beiden Signale
Oder-Vernküpfen, aber mir missfällt, dass das dann die Abgabeleistung
beeinflusst, wenn die 1 µs Pulse in der Nähe (<200 µs) der eigentlichen
Pulse auftreten.
Grüße
Flo
Hi.
Hier ein Vorschlag, der gehen könnte, habs aber nicht überprüft:
Also den einen Counter ganz normal einstellen, dass er deine PWM macht.
Zusätzlich den Output-Compare-Int für diesen Timer setzen. Der müsste
dann einen Interrupt machen, sobald dein PWM-Signal von high auf Low
geht.
Dieser Interrupt startet dann einen zweiten Timer, der nach 200 us einen
Overflow und somit einen Interrupt macht. Diesen Timer benutzt du dann
um deinen 1 us Puls zu machen.
Zusätzlich benutzzt du noch den OVF-Int vom ersten timer um den 2.
auszuschalten, damit er keinen imouls mehr macht, wenn dein PWM-Signal
high ist.
Das ganze lässt du dann an 2 pins nach draußen gehen, die du veroderst.
Evtl. gehts auch mit einem Pin, dann ist der Aufwand in den
Interrupt-Routinen aber höher.
Das ganze hängt davon ab, ob es geht, dass der Timer im PWM-Modus einen
Compare-Interrupt machen kann. da bin ich mir nicht sicher. Vielleicht
kann da jemand anderes was dazu sagen.
Bernhard
Hallo Bernhard,
danke für Deinen Vorschlag. In diese Richtung hab ich auch schon kurz
gedacht, ich würde das aber lieber ganz in Hardware machen, also ohne,
dass der Interrupt irgendwelche Zähler konfigurieren muss. Ich mach mir
Sorgen, den Interrupt mal zu verpassen. Das würde mir angeblich das arme
Plasma im Laser übernehmen.
Es wäre ganz einfach, wenn man die Zähler im ATMega durch ein externes
Signal löschen könnte, das geht aber leider nicht.
Drum tendiere ich inzwischen dazu auf dem µC nur das eigentliche PWM
Signal zu mache und die Extrapulse mit zwei externen Zählern.
Das PWM Signal resetet den ersten Zähler, der zählt runter, das dauert
200µs, dann erzeugt er einen kurzen Puls, der setzt ein RS-Flipflop, und
resetted einen zweiten Zähler, der zählt 1µs runter und löscht das
Flip-Flop wieder. Das Ausganssignaldes Flip-Flops oderer ich mit dem PWM
Signal. Vielleicht brauchst auch ein JK-Flipflop statt RS, muss ich mir
noch überlegen.
Als Zähler fallen mir im Moment nur der 74HC161 ein, der hat aber leider
nur 4bit, so dass ich min. 3 kaskadieren müssten. Ein programmierbarer
16 bit Zähler mit Reset wäre schön. Kennt zufällig jemand einen. Mit dem
altbekannten 8254 könnte man sicher was machen, aber der hat mich schon
vor über 15 Jahren in meinem ersten 80386er so gestresst...
Grüße
Flo
Eine eigene Frage?
Dieser Thread ist über 17 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.