Hallo,
ich habe ein paar kurze und einfach Fragen, werde aus dem Datenblatt
aber nicht zu absoluter Sicherheit schlau (ATMega 644P):
Ich möchte den TOP-Wert einer PWM gerne mit einem Poti steuern. Ein
ADC-Eingang, bzw. der Wandler, läuft daher im Free Running Mode. Nun
habe ich insgesamt zwei Potis an zwei Eingängen, welche ich per Taster
wechsle (immer im Free Running Modus).
Ich möchte dabei zwei verschiedene Dinge programmieren:
1. Poti: Wenn dieser Poti "an" ist, soll in einer Schleife über eine
Berechnung der Wert am Poti proportional den TOP-Wert ändern. Ist das
möglich oder interruptet der ADC ständig meine PWM (also auch, wenn ich
nicht dran drehe)? Was wäre dann eine andere Möglichkeit?
2. Poti: Dieser soll nur dann den TOP-Wert der PWM ändern, wenn ich auch
daran drehe - sobald er stillsteht, ist der TOP-Wert wieder mein zuerst
initialisierter Wert. Damit möchte ich die die An-Zeit der PWM (absolut
gesehen) nach vorne bzw. hinten verschieben. Ich möchte das über einen
regelmäßig erneuerten Buffer machen, der den Wert des ADC einliest und
im Programm wird dann verglichen, ob die aktuelle Rückgabe vom
AD-Wandler größer als ein bestimmter Wert ist - wenn ja, wird
proportional der TOP-Wert (also die Dauer eines gesamtem Impulses)
verlängert / verkürzt, bis der Poti wieder stillsteht.
Ist die zweite Möglichkeit eine gute Idee oder gibt es hier elegantere
Möglichkeiten? Funktioniert das einigermaßen für folgende Größenordnung:
Impuls gesamt: ~100 ms, An-Zeit (LED): ~10 ms.
Oder dauern die Vergleiche oder mögliche Interrupts vom ADC zu lange?
Danke und Grüße!
Emanuel
Emanuel schrieb:> Ich möchte den TOP-Wert einer PWM gerne mit einem Poti steuern.
OK
> Ein> ADC-Eingang, bzw. der Wandler, läuft daher im Free Running Mode. Nun> habe ich insgesamt zwei Potis an zwei Eingängen, welche ich per Taster> wechsle (immer im Free Running Modus).
Brauchst du doch gar nicht.
Im AVR-GCC-Tutorial gibt es schöne ADC Funktionen, die jeweils eine
Wandlung machen und den gemessenen Wert zurückliefern. Dieser Funktion
übergibt man den Kanal an dem man messen will und sie liefert den
richtigen Wert.
Und ... keine Angst. Das geht schneller als du an deinen Potis drehen
kannst.
Vorneweg:
Ein 'Poti' ist immer 'an'.
Ist es an einen Endanschlag gedreht, dann wird eben der Wert 0
geliefert.
> 1. Poti: Wenn dieser Poti "an" ist, soll in einer Schleife über eine> Berechnung der Wert am Poti proportional den TOP-Wert ändern.
ok.
> Ist das> möglich
natürlich ist das möglich. Wenn du dir eine Formel dazu ausdenken
kannst, dann ist das auch möglich
> oder interruptet der ADC ständig meine PWM (also auch, wenn ich> nicht dran drehe)?
Warum soll denn die PWM interrupted werden.
Bis jetzt ist noch nichts erwähnt, was eine Hardware-PEM verhindern
würde. Das heißt: Die Hardware erzeugt die PWM ganz von alleine. Tagein
- tagaus
> 2. Poti: Dieser soll nur dann den TOP-Wert der PWM ändern, wenn ich auch> daran drehe - sobald er stillsteht, ist der TOP-Wert wieder mein zuerst> initialisierter Wert.
ok
> Damit möchte ich die die An-Zeit der PWM (absolut> gesehen) nach vorne bzw. hinten verschieben.
Also sowas wie ein Offset.
> Ich möchte das über einen> regelmäßig erneuerten Buffer machen, der den Wert des ADC einliest und> im Programm wird dann verglichen, ob die aktuelle Rückgabe vom> AD-Wandler größer als ein bestimmter Wert ist - wenn ja, wird> proportional der TOP-Wert (also die Dauer eines gesamtem Impulses)> verlängert / verkürzt, bis der Poti wieder stillsteht.
Zähl einfach die beiden ADC Werte gewichtet zusammen, berechne daraus
deinen TOP Wert und du hast was du erreichen willst.
Mit dem einen Poti eine Grobeinstellung und mit dem anderen Poti eine
Feinjustierung.
> Oder dauern die Vergleiche oder mögliche Interrupts vom ADC zu lange?
Alles was länger als 1ms dauert, ist für einen µC eine halbe Ewigkeit
:-)
Hi,
Danke für diese ausführliche Antwort!
Ich dachte nur, dass der ADC jedesmal, wenn er einen Wert in sein
Register geschrieben hat, ein Interrupt macht mit "hier ist der Wert,
mach mal Pause". Dem ist wohl nicht so.
Im Endeffekt will ich ja mit dem 2. Poti folgendes: Wenn gedreht wird
(von einer Mittelstellung aus nach links oder rechts) soll der der PWM
Impuls früher (nach links drehen) oder später (nach rechts drehen)
losgehen - solange, bis ich nicht mehr am Poti drehe, dann soll ja die
PWM "normal" weiterlaufen. Ich wollte das mit dem Trick machen, dass das
entsprechende Drehen am Poti den Impuls in seiner eigenen Größenordnung
(100ms)verlängert bzw. verkürzt und ich so durch verlängern des Impulses
und dem anschließenden "normal weitermachen" die An-Zeit der LED einfach
um z.B. 30ms früher erscheint als davor (in absoluten Zeitintervallen
gemessen).
Ist das eine kluge Möglichkeit oder gibt es eine andere - ich dachte
z.B. auch daran, den Counter der PWM einfach für 30ms zu unterbrechen
bzw. die Impulse 30ms (jeweils natürlich in Counter-Zähleinheiten) VOR
dem erreichen des BOTTOM wieder bei Null starten zu lassen.
Geht das oder ist die erst genannte Möglichkeit dafür schon ganz OK?
Grüße
Hi
>Ich dachte nur, dass der ADC jedesmal, wenn er einen Wert in sein>Register geschrieben hat, ein Interrupt macht mit "hier ist der Wert,>mach mal Pause". Dem ist wohl nicht so.
Doch, es gibt einen ADC Complete Interrupt. Der wird ausgelöst, wenn der
ADC mit einer Messung fertig ist.
MfG Spess
Spess53 schrieb:> Hi>>>Ich dachte nur, dass der ADC jedesmal, wenn er einen Wert in sein>>Register geschrieben hat, ein Interrupt macht mit "hier ist der Wert,>>mach mal Pause". Dem ist wohl nicht so.>> Doch, es gibt einen ADC Complete Interrupt. Der wird ausgelöst, wenn der> ADC mit einer Messung fertig ist.>
Man muss ihm aber extra anfordern. Von alleine kommt der nicht
> (von einer Mittelstellung aus nach links oder rechts) soll der der> PWM Impuls früher (nach links drehen) oder später (nach rechts> drehen) losgehen - solange, bis ich nicht mehr am Poti drehe,> dann soll ja die PWM "normal" weiterlaufen.
Ich glaube ehrlich gesagt nicht, dass du das willst.
Oder willst du ständig am Poti drehen?
Du willst doch sicherlich dein Poti aus der Mittelstellung heruasdrehen
und so die Grund-PWM verändern. Und wenn dir die Veränderung passt, dann
soll die 'verstimmte' PWM bestehen bleiben. Solange bis du sie wieder
aufhebst indem du das Poti in Mittelstellung zurückdrehst.
Ein Poti welches nur dann wirkt, wenn man es dreht, ist relativ sinnlos,
weil man damit nichts gezielt einstellen kann.
Hi,
doch ;) d
Karl heinz Buchegger schrieb:> Ein Poti welches nur dann wirkt, wenn man es dreht, ist relativ sinnlos,> weil man damit nichts gezielt einstellen kann.
Doch, denn ich will ja genau das:
Nehmen wir an, ohne Vorkenntnisse über eine PWM, die LED blinkt alle
paar Millisekunden für einen kurzen Zeitraum. Mit dem rechtsdrehen des
Potis will ich, dass der Zeitpunkt, indem die LED blinkt, nach hinten
verschoben wird. Wenn ich aufhöre zu drehen, blinkt die LED wieder
regelmäßig. Drehe ich das Poti nun wieder nach links, verlagert sich das
Blinken in der Zeit nach vorne - wenn ich aufhöre, blinkt es wieder
regelmäßig.
Also meine Idee: Poti drehen -> Wertunterschied des ADC messen lassen ->
im Programm gewichtet den TOP-Wert ändern (sodass sich der An-Impuls der
LED verschiebt) -> nicht mehr am Poti drehen -> Das Programm erkennt
keinen Wertunterschied -> die PWM läuft mit der ursprünglichen Frequenz
weiter.
Habe ich einen Denkfehler oder funktioniert das?
edit:
Das 1. Poti habe ich zum Verstellen der gesamten Frequenz - da stimmt
es, dass es nur Sinn macht, wenn das Poti einmal gedreht wird und
dadurch die Gesamtfrequenz verändert.
Mit dem 2. Poti will ich wirklich nur den Startpunkt der PWM nach hinten
oder vorne verlegen, also nur wenn ich dran drehe, ändert sich was in
der PWM. Danach läuft sie normal weiter, ich will ja die Frequenz an
sich beibehalten bzw. mit dem anderen Poti einstellen.