mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PWM mit ADC-Poti steuern


Autor: Emanuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 
:-)

Autor: Emanuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Emanuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Emanuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.