Ausgang mit boolschen Ausdruck

Gast #4490462
Moin,

ich nutze den Atxmega128A4U. Ich benutze einen Hardwaretimer um eine PWM 
zu erzeugen. Ich möchte jetzt, dass immer wenn die PWM auf LOW ist, ein 
anderer Ausgang freigegeben wird. Zum Testen einfach invertiert zur PWM 
schalten.

Als Test prüfe ich derzeit, ob die PWM den Schwellwert überschritten 
hat. In dem Fall wird der Ausgang auf HIGH gesetzt, andernfalls auf LOW.

Damit sollte ich eigentlich per Software eine (invertierte) Kopie der 
PWM bekommen. In der Theorie.

In der Praxis sieht diese Software PWM sehr schlecht und unregelmäßig 
aus.

Ich überprüfe die PWM mit folgendem Code:
1
if(!(TCD0_CTRLB & TC_WGMODE_SS_gc)) return true;
2
else if(TCD0_CNT < TCD0_CCA) return true;
3
else return false;

Ich könnte ein Hardware UND Gatter auf die Leiterkarte machen. Ich denke 
das muss aber auch in Software gehen.

Die Ausgänge vom Atxmega kann ich intern meines Wissens nach nicht 
verunden.

Ich habe zur Zeit bei 2Mhz eine Zykluszeit von wenigen mS (weil ich eine 
I²C Operation nicht als Interrupt laufen lasse). Das heißt bei 1kHz PWM 
ist diese bereits schneller als meine Zykluszeit und kann nicht sauber 
erfasst werden.

Auch wenn ich einen Timer Compare benutze - das Ergebnis muss ja 
verarbeitet werden.

Kann mir jemand mit Ideen helfen? Die einzige Idee, die ich habe, ist 
das ganze mit einer höheren CPU Takt zu probieren.

Nils
Gast
> Die einzige Idee, die ich habe, ist
> das ganze mit einer höheren CPU Takt zu probieren.

Das würde dein Problem nur veringern aber nicht lösen.

Ich denke, du kommst nicht umhin, das PWM Signal durch Hardware erzeugen 
zu lassen.
Nils schrieb:
> Zum Testen einfach invertiert zur PWM
> schalten.

Kannst Du da nicht sagen:
Ausgang 2 NOT PWM-Ausgang

Nils schrieb:
> Die Ausgänge vom Atxmega kann ich intern meines Wissens nach nicht
> verunden.

Wenn noch ein Pin als Eingang frei wäre, könnte man den PWM-Ausgang mit 
diesem Eingang verbinden und dort sagen:
IF Eingang = 0 Then
   Tralala
End IF

------------------------------------------------------------------------ 
-
Wie das in C aussehen müßte, weiß ich nicht -das beherrsche ich nicht.

mfG Paul
Gast
Paul B. schrieb:
> Nils schrieb:
>> Zum Testen einfach invertiert zur PWM
>> schalten.
>
> Kannst Du da nicht sagen:
> Ausgang 2 NOT PWM-Ausgang
>
> Nils schrieb:
>> Die Ausgänge vom Atxmega kann ich intern meines Wissens nach nicht
>> verunden.
>
> Wenn noch ein Pin als Eingang frei wäre, könnte man den PWM-Ausgang mit
> diesem Eingang verbinden und dort sagen:
> IF Eingang = 0 Then
>    Tralala
> End IF
>
> ------------------------------------------------------------------------
> -
> Wie das in C aussehen müßte, weiß ich nicht -das beherrsche ich nicht.
>
> mfG Paul

Ändert nichts daran, dass die PWM schneller ist als die Zykluslaufzeit. 
Das geht auch ohne zusätzlichen Eingang.

Klaus schrieb:
> Ich empfehle Dir, gemäß der Netiquette, zu schreiben, für welches
> Problem das die Lösung sein soll.

Zwei Heizungen sollen angesteuert werden. Die eine über PWM + PID, die 
zweite über Zweipunktregler. Es dürfen aber aufgrund der 
Leistungsbegrenzung niemals beide Heizungen gleichzeitig laufen. Die vom 
Zweipunktregler muss nicht sonderlich genau sein, deswegen die Lösung, 
dass diese heizen darf (Freigabe), wenn die PWM auf LOW ist.
Ich kenn mich zwar mit dem XMega überhaupt nicht aus, aber die haben 
doch sehr flexible Timer?
Also passende PWM-Art auswählen,
-Interrupt bei OV, beliebigen Pin zurücksetzen
-Interrupt bei PWM-Wert (dafür evtl 2. compare-Register benutzen und auf 
gleichen Wert wie das eigentliche PWM-Register setzen), beliebigen Pin 
wieder setzen.

Vielleicht geht auch was mit dem pinchange-int? Keine Ahnung, ob man den 
den PWM-Ausgang dafür direkt nehmen kann. Falls nicht, Brücke zu einem 
Eingang basteln.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.