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.
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.