PWM-Output invertieren

OP #1615726
Hallo zusammen

Ich bin gerade daran die Schaltung des Ultraschallartikels nachzubauen 
(übrigens ein sehr guter Beitrag). Meine Frage ist nun eine 
allgemeinere: Wie kann ich ein PWM-Signal invertieren? Ich glaube nicht 
das es geht, aber falls es mit einem Atmega16 geht wäre das natürlich 
perfekt.

MfG
Florian
Florian K. schrieb:
> (übrigens ein sehr guter Beitrag). Meine Frage ist nun eine
> allgemeinere: Wie kann ich ein PWM-Signal invertieren? Ich glaube nicht
> das es geht, aber falls es mit einem Atmega16 geht wäre das natürlich
> perfekt.

Wie wird die PWM erzeugt?

Die Hardware-PWM kann man so konfigurieren, dass sich die Polarität 
umdreht. -> Datenblatt und die Konfigurationsregister durchsehen.
Eine Software-PWM hast du ja sowieso selber in der Hand.
Also Hardware - PWM

    TCCR1A = (1<<COM1A1) | (1<<COM1A0) | (1<<WGM11);
    TCCR1B = (1<<WGM12) | (1<<WGM13) | (1<<CS10);


Jetzt schnappst du dir das Datenblatt deines Prozessors (find ich 
witzig, dass im Artikel zwar die Timer Initialisierung angegeben ist, 
aber nicht für welchen Prozessor) und schlüsselst erst einmal auf, was 
denn da eingestellt wird.

Am Beispiel eines Mega16

WGM11, WGM12 und WGM13 zusammen schalten den Timer in den Modus 14, Fast 
PWM

CS10  schaltet den Vorteiler auf 1

Damit hast du erst mal die Grundkonfiguration. Die Bedeutung der 
restlichen Bits hängt auch ein wenig vom Modus ab, daher hab ich den 
Modus als erstes dekodiert.

Aber was ist mit den Bits COM1A1 und COM1A0?

Im Datenblatt findet sich bei der Beschreibung der Bits eine Tabelle, 
die für den Fast-PWM Modus gilt
1
COM1A1/COM1B1 COM1A0/COM1B0 Description
2

3
    0             0         Normal port operation, OC1A/OC1B disconnected.
4

5
    0             1         WGM13:0 = 15: Toggle OC1A on Compare Match,
6
                            OC1B disconnected (normal port operation).
7
                            For all other WGM13:0 settings, normal port
8
                            operation, OCnA/OCnB disconnected.
9

10
    1             0         Clear OC1A/OC1B on compare match, set
11
                            OC1A/OC1B at BOTTOM,
12
                            (non-inverting mode)
13

14
    1             1         Set OC1A/OC1B on compare match, clear
15
                            OC1A/OC1B at BOTTOM,
16
                            (inverting mode)

Bei dir ist COM1A1 und COM1A0 jeweils auf 1 gesetzt. Laut Tabelle ist 
das die letzte Tabellenzeile (der 'inverting mode'). Du willst aber das 
genaue Gegenteil (in der Tabelle steht auch sinnigerweise immer dabei, 
was die Einstellung mit den Pins macht), den 'non-inverting mode'.

ALso wirst du die Konfiguration wie umändern?

Du solltest jetzt NICHT hergehen und meine Ergüsse einfach ohne 
nachzudenken übernehmen. Schau in dein Datenblatt, such dir die 
Beschriebung vom Timer1 und geh dort in den Abschnitt "Register 
Description". Das ist die Zusammenfassung, welches Bit in welchem 
Register was bewirkt. Dort sind auch die Tabellen, die dir Modi 
aufschlüsseln, wenn mehrere Bits gemeinsam eine Einstellung bewirken.
Das Datenblatt ist dein Freund. Du MUSST lernen damit umzugehen. 
Ansonsten wirst du deinen µC nie voll ausschöpfen können.
Florian K. schrieb:
> PS: Ich brauche nicht 4.5V zu 0V sondern 4.5V zu -4.5V

Eine Moeglichkeit waere, das Signal durch einen MAX232 oder MAX202 zu 
schicken. Der macht aus 0V/+5V dann +10V/-10V, also invertiert und 
verschiebt gleichzeitig die Spannung. All das ohne zusaetzliche negative 
Stromversorgung. Aus +/-10V dann +/-4.5V zu machen ueberlasse ich Dir 
als Uebung :-)   (Stichwort Spannungsteiler). MAX232 gibt's bei jedem 
Elektronikshop um wenige Cents.

Wolfgang
Gast
Hallo,

> wo kann ich diese zwei abgreifen (im Moment hole ich
> es bei ICP1 weiss aber nicht mehr wieso)?

Das kann nicht sein; der Pin "ICP1" ist ein Eingang, und Du benutzt 
Hardware-PWM. Der Pin "OC1A" ist hier der Richtige. Und wenn Du den 
Timer für die 'invertierte PWM' richtig programmiert hast, sollte dieses 
Signal am Pin "OC1B" erscheinen.
Und an diese 2 Pins wird dann der Sender angeschlossen.
Florian K. schrieb:
> Das wäre eine gute Idee allerdings habe ich bloss eine 4.5V
> Stromversorgung (Batterie). Es wäre mir neu das das gehen würde.

Doch, genau dafuer ist der MAX232 gedacht - Konvertierung von TTL/CMOS 
(0/5V) auf RS-232-Pegel (-/+10V). Der hat eine integrierte Ladungspumpe 
(charge pump) und einen Inverter, die aus 5V (oder auch 4.5V) 10V und 
-10V machen. Ist also ideal fuer Deine Situation mit +4.5V single 
supply. An externen Komponenten brauchst Du bloss 4 Kondensatoren (1 uF 
fuer MAX232, oder 0.1uF fuer MAX232A oder MAX202).

Es gibt auch aehnliche Chips (z.B. MAX3323) die den Trick sogar mit 
3.3v-Versorgung schaffen.

Wolfgang
Florian K. schrieb:
> Spezi schrieb:
>
>> Das kann nicht sein; der Pin "ICP1" ist ein Eingang, und Du benutzt
>> Hardware-PWM.
>
> Ja hast recht ich hab auf der falschen Seite des Mikrocontrollers
> gesucht. Ich benutze im Moment den OC2-Pin


Auch das kann nicht sein, da du den Timer 1 benutzt. OC2 ist aber vom 
Timer 2

Ausserdem willst du eigentlich 2 Signale die gegenphasig laufen. D.h. du 
solltest eigentlich vom Timer 1 die OC1A und OC1B benutzen. Den OC1A 
konfigurierst du dir auf normale Operation, den OC1B auf invertierte 
Operation. Dann hast du dein gegenphasiges Signal auf den beiden Pins.

Aber wie wäre es, wenn du zunächst mal den Sender einfach nur zum laufen 
bringst? Deine Fragerei lässt nämlich darauf schliessen, dass du zu 
optimieren anfängst noch ehe du die Sache überhaupt verstanden hast.
Florian K. schrieb:
> Die Idee mit dem MAX232 tönt in dem Fall sehr interessant. Ist eine
> solche Spannung für Ultraschallsender zu empfehlen? und kann der MAX232
> mit dem Takt des PWM von 40khz mithalten?

Ob Dein Sender die Spannung vertraegt musst Du selber anhand des 
Datenblattes herausfinden. Die Frequenz ist fuer den MAX232 jedenfalls 
kein Problem - der kann standardmaessig zumindest 115 kHz (= maximale 
Standard-Datenrate fuer RS-232). Eine Sache noch, nachdem dieser Chip 
als RS-232-Treibe gedacht ist - die Last sollte nicht zu niederohmig 
sein (Spec ist typischerweise ~5 kOhm).

Wolfgang
OP
@Karl Heinz Buchegger

Ich kann bereits senden und empfangen. Allerdings kann ich es bisher 
noch nicht auswerten mit einem Mikrocontroller. Ich versuche die 
Auswertung via AC zu realisieren. Das Empfangen kann ich bisher bloss 
mit einem Messgerät feststellen, der Unterschied zwischen 
nicht-empfangen und empfangen ist mir aber ein bisschen zu klein.

Danke vielmals für eure Hilfe.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 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.