Forum: Mikrocontroller und Digitale Elektronik PWM-Output invertieren


von Florian K. (flok)


Lesenswert?

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

von Florian K. (flok)


Lesenswert?

PS: Ich brauche nicht 4.5V zu 0V sondern 4.5V zu -4.5V

von Karl H. (kbuchegg)


Lesenswert?

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.

von Florian K. (flok)


Lesenswert?

Ich ging ganz nach diesem Artikel 
(http://www.mikrocontroller.net/articles/Entfernungsmessung_mit_Ultraschall) 
vor. Den Code für die PWM habe ich auch von dort. Wie ginge das mit dem 
Software invertieren? Kommt dann wirklich -4.5V und +4.5V heraus?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Florian K. (flok)


Lesenswert?

Wenn ich Com1a1 auf 1 und und com1a0 auf 0 setzte, kommen die zwei 
Signale (invertiert und nichtinvertiert) an den Ports OC1A und OC1B 
heraus?

Danke vielmals für deine ausführliche Antwort

MfG Florian

von Wolfgang M. (womai)


Lesenswert?

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

von Florian K. (flok)


Lesenswert?

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.

von Florian K. (flok)


Lesenswert?

@Karl heinz Buchegger

Was kommt dann als Output und wo? ist das Signal dann -4.5V / +4.5V oder 
nur 4.5V / 0? und wo kann ich diese zwei abgreifen (im Moment hole ich 
es bei ICP1 weiss aber nicht mehr wieso)?

von Spezi (Gast)


Lesenswert?

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.

von Wolfgang M. (womai)


Lesenswert?

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

von Florian K. (flok)


Lesenswert?

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?

von Florian K. (flok)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Wolfgang M. (womai)


Lesenswert?

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

von Florian K. (flok)


Lesenswert?

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

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
Noch kein Account? Hier anmelden.