Forum: Mikrocontroller und Digitale Elektronik Arduino PWM-Ausgänge erweitern / 4..20mA Output


von Sebastian E. (sebert)


Angehängte Dateien:

Lesenswert?

Derzeit nutze ich die PWM-Ausgänge meines Arduino, um ein 4..20mA-Signal 
zu erzeugen.

Dazu schalte ich hinter dem PWM-Ausgang ein RC-Glied (um das Signal zu 
glätten, sonst ist der Ripple zu groß). Und dahinter nutze ich dann 
einen LM224 (oder LM358), um in Abhängigkeit der Spannung hinter dem 
RC-Glied (1..5V) einen Ausgangsstrom von 4..20mA zu erzeugen (siehe 
Screenshot -- RC-Glied ist weggelassen). Das funktioniert soweit ganz 
gut und ist für meine Zwecke ausreichend präzise.

Jetzt habe ich damit allerdings zwei Probleme:
1) Ich benötige mehr PWM-Ausgänge, als der Arduino her gibt und ich 
würde gerne die ganze Sache durch etwas weniger Verkabelung "entwirren". 
Ich brauche 32 Ausgänge.
2) Ich würde mir nach Möglichkeit gerne das RC-Glied (Glättung) und den 
LM358 sparen und insgesamt mit wenigen Bauteilen auskommen.

Nebenbedingung: Das ganze sollte eben auch steckbar sein (also kein 
SMD).

Darauf hin habe ich hier eine mögliche Lösung mit einem 16-Kanal 
LED-Driver-Chip (TLC5940) gefunden: 
https://howtomechatronics.com/tutorials/arduino/how-to-extend-arduino-pwm-outputs-tlc5940-tutorial/

Der ist mittlerweile kaum noch zu bekommen, aber auf eBay erhält man ihn 
noch.

Die zugehörige Doku von Texas Instruments ist hier:
http://www.ti.com/lit/ds/symlink/tlc5940.pdf?&ts=1590088182268

Meine eigene Einschätzung:
3) Es sieht so aus, als könnte ich damit zumindest mein Problem 1) lösen 
und die Ports erweitern. Aber nach meinem Verständnis müsste ich das 
ganze hinter dem TLC5940 dann doch erst wieder glätten (oder fällt das 
hier weg, weil der im Vergleich zum Arduino mit nur 480Hz relativ hoch 
getaktet ist?), über einen Spannungsteiler auf 1..5V bringen und dann 
alles doch wieder über einen LM224 in den entsprechenden Strom (4..20mA) 
wandeln, richtig?

Mein Problem 2) hätte ich damit leider nicht gelöst.

*Meine Fragen:*
- Ist 3) so korrekt von mir beschrieben?
- Wie kann ich Problem 2) (am besten alles mit wenigen Bauteilen) lösen?
- Gibt es vielleicht eine alternative recht einfach Möglichkeit, das 
Gesamtproblem zu lösen und bin ich hier mit meinem Ansatz vielleicht auf 
dem Holzweg und mache es mir unnötig kompliziert?

von Jens M. (schuchkleisser)


Lesenswert?

Der TLC5940 hat Konstantstromausgänge, die einerseits mit jeweils einem 
12-bit-Zähler PWMt werden, und gleichzeitig eine analoge 
Stromquellenverstellung  mit 6 bit.

Wenn du mit der 6-bit Stromverstellung hinkommst, kannst du den Chip auf 
20mA pro Pin einstellen, PWM auf 100% und den Strom nur über die Dot 
Correction beeinflussen.
Allerdings musst du natürlich mit den elektrischen Gegebenheiten der 
Ausgänge klarkommen, dann ist Teil2 gelöst.

Wenn es nur mit PWM geht, ist der PCA9685 evtl. besser geeignet, aber 
diesen Steckbrettmist solltest du mal überdenken.
Und du bräuchtest dann wieder die ganzen Filter usw., aber der kann 
schnelleres PWM, da wird das wenigstens kleiner.

: Bearbeitet durch User
von Ach Du grüne Neune (Gast)


Lesenswert?

Hinter dem RC-Glied könntest du einen NPN Transistor in 
Kollektorschaltung schalten. Durch die fehlenden 0,6 Volt bleiben am 
Ausgang dann zwar nur noch 4,4 Volt übrig, aber wenn der 
Emitterwiderstand von 250R auf 220R verkleinert wird, dann sind es 
rechnerisch wieder 20mA.

von Stefan F. (Gast)


Lesenswert?

Sebastian E. schrieb:
> 1) Ich benötige mehr PWM-Ausgänge, als der Arduino her gibt und ich
> würde gerne die ganze Sache durch etwas weniger Verkabelung "entwirren".
> Ich brauche 32 Ausgänge.

Ich plädiere auch für zwei Module mit PCA9685

> 2) Ich würde mir nach Möglichkeit gerne das RC-Glied (Glättung) und den
> LM358 sparen und insgesamt mit wenigen Bauteilen auskommen.

Das R/C Glied brauchst du nicht, wenn du D/A Wandler verwendest. Aber 32 
Stück davon könnte teuer werden.

Anstelle des LM358 kann man Konstantstromquellen auch mit einfachen 
Transistoren aufbauen. Siehe 
https://de.wikipedia.org/wiki/Konstantstromquelle#Mit_Bipolartransistor

von Konzeptverkäufer (Gast)


Lesenswert?

> - Gibt es vielleicht eine alternative recht einfach Möglichkeit, das
> Gesamtproblem zu lösen und bin ich hier mit meinem Ansatz vielleicht auf
> dem Holzweg und mache es mir unnötig kompliziert?

Deine gezeigte OpAmSchaltung ist eine Spannungsgesteuerte Stromquelle.
Deine bisherigen PWM-Ausgänge mit nachgeschalteten RC-glieder SIND in 
der Tat Spannungsquellen (um o.g. Stromquellen zu steuern).

Suche doch entsprechend "programmierbare Spannungsquellen" aka 
DA-Wandlerbausteine, wovon Du in benötigter Anzahl anschliessen kannst.

DA-Wandler mit z.B. I2C Anschluss gibt es viele auch in Mehrkanaliger 
Ausführung.
I2C ist ein Bussystem welches 1 Master (der Arduino) und mehrere dem 
Master hörigen Slaves (hier die DACs) hat; die Slave-DACs verdrahtest Du 
mit unterschiedlichen Adressen sodass mehrere gleiche DACs individuell 
gesteuert werden. Eben soviele bis Du die benötigten 32 hast und jeder 
bekommt seinen OpAmp um 4..20mA auszugeben.

Bei LED-PWM-Treibern ist es nämlich i.d.R. so dass nicht der Strom durch 
die LED geglättet wird, weil sich unsere Augen um die Glättung kümmern 
in dem sie dem tatsächlichen  Lichtflackern oberhalb ca. 50..60 Hz nicht 
mehr nachkommen.
Das dürfte also der falsche Ansatz sein, ganz ohne dass ich den 
genannten Ti-Chip überhaupt anschaue. Normal erhältlich ist er eh nicht, 
schreibst Du.

von Sebastian E. (sebert)


Lesenswert?

Konzeptverkäufer schrieb:

> Suche doch entsprechend "programmierbare Spannungsquellen" aka
> DA-Wandlerbausteine, wovon Du in benötigter Anzahl anschliessen kannst.
>

Hier mal eine Liste bei TI mit den DA-Wandlern, die in Frage kämen:
http://www.ti.com/de-de/data-converters/dac-circuit/products.html?pqs=paqs&familyid=392#p1021=1;16&p116=Unbuffered%20Current;Buffered%20Current&p84=8;12&p158=I2C;SPI;Serial%20LVDS

Das Problem ist: Die haben maximal 2 Kanäle und kosten nach ersten 
Recherchen eher mal über 10 Euro. Außerdem haben alle SPI als Interface, 
keiner davon I2C. Kenne mich mit SPI nicht so genau aus, aber ich denke, 
damit würde ich dann keine Ports am Arduino sparen. Eher das Gegenteil 
wäre der Fall.

Stefan ⛄ F. schrieb:
> Ich plädiere auch für zwei Module mit PCA9685

OK, warum genau? Wegen der besseren Bauteilverfügbarkeit? Gibt es leider 
nicht als DIL-Variante, korrekt?

von Stefan F. (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Ich plädiere auch für zwei Module mit PCA9685

Sebastian E. schrieb:
> OK, warum genau? Wegen der besseren Bauteilverfügbarkeit?

Weil du mit dem Weg über PWM bereits klar gekommen bist und diese Module 
wie gewünscht steck-Anschlüsse haben. Und ja, auch weil sie gut 
verfügbar sind.

> Gibt es leider nicht als DIL-Variante, korrekt?

Laut Datenblatt: Nein. Aber es gibt entsprechende Adapterplatinen.

Damit musst du dich abfinden, in DIL gibt es nur noch wenige Mikrochips.

von Harald (Gast)


Lesenswert?

Mal eine Zwischenfrage: Hat das alles mit dem 4-20mA Signal zu tun, dass 
u.a. in industriellen Steuerungen verwendet wird? Weil dort wäre es ja 
so, dass das Signal von der positiven Seite getrieben wird.

von Konzeptverkäufer (Gast)


Lesenswert?

Sebastian E. schrieb:
> Derzeit nutze ich die PWM-Ausgänge meines Arduino, um ein 4..20mA-Signal
> zu erzeugen.

Nutzt Du bisher nur die A[1..5] PWM-Analogausgänge?

Es gibt da noch Softwarbibliotheken "libs" für sog. Soft-PWM um an 
anderen D[1..x] Ausgänge ebenfalls PWM hinzubekommen.

Damit kommst Du an einem Arduino UNO sicher nicht auf tot. 32 PWMs, aber 
auf mehr als 5.
Vielleicht reichen Dir alle Pins eines Arduino MEGA? Oder Arduino DUE?

Oder vielleicht programmierst Du 2..3 zusätzliche Arduinos so dass sie 
Befehle via Serieller Schnittstelle von einem weiteren, Übergeordneten 
Arduino erwarten.
Auch auf solchem Wege lassen sich bis 32 oder mehr 4..20mA Ausgänge 
realisieren.

SPI
Man kann mehrere SPI Peripheriechips an die selben Daten/Taktleitungen 
verdrahten, jeder Peripheriechip bekommt dann eine individuelle Enable 
Leitung worüber er signalisiert bekommt dass er angesprochen ist.
Ggfs. hilft ein Decoderbaustein z.B. "1-aus-8" um mit nur 3 uC-Pins 8 
Peripheriechips zu adressieren (anstatt 8 uC-Pins direkt).
Einen Tod muss gestorben werden.

von Sebastian E. (sebert)


Lesenswert?

Konzeptverkäufer schrieb:
> SPI
> Man kann mehrere SPI Peripheriechips an die selben Daten/Taktleitungen
> verdrahten, jeder Peripheriechip bekommt dann eine individuelle Enable
> Leitung worüber er signalisiert bekommt dass er angesprochen ist.
> Ggfs. hilft ein Decoderbaustein z.B. "1-aus-8" um mit nur 3 uC-Pins 8
> Peripheriechips zu adressieren (anstatt 8 uC-Pins direkt).
> Einen Tod muss gestorben werden.

Soweit ich das sehe, kann man die seriell hintereinander schalten:
https://de.wikipedia.org/wiki/Serial_Peripheral_Interface

Dann brauche ich unabhängig von der Anzahl der Wandler insgesamt nur 4 
Leitungen.

Konzeptverkäufer schrieb:
> Es gibt da noch Softwarbibliotheken "libs" für sog. Soft-PWM um an
> anderen D[1..x] Ausgänge ebenfalls PWM hinzubekommen.

Daran hatte ich auch gedacht. Habe allerdings etwas Angst, dass da ein 
paar Tücken dahinter versteckt sind.

von Konzeptverkäufer (Gast)


Lesenswert?

> Soweit ich das sehe, kann man die seriell hintereinander schalten:
> https://de.wikipedia.org/wiki/Serial_Peripheral_Interface
>
> Dann brauche ich unabhängig von der Anzahl der Wandler insgesamt nur 4
> Leitungen.

Ja. Dann aber viel Erfolg beim ausklamüsern der Bitmuster welche dann 
rauszutakten sind.

Die Variante "Sternverkabelung" mit pro Chip je 1x *SS Leitung ist 
deutlich übersichtlicher auszuprogrammieren.
Bei 3 Peripheriechips wie im Wikibild sind 3 uC-GPIOs angemessen; bei 
mehr z.B. muss abgewogen werden obs 8 uC-GPIOs oder 3 uC-GPIOs + 
"1-aus-8"Decoder sein sollen.


> Konzeptverkäufer schrieb:
>> Es gibt da noch Softwarbibliotheken "libs" für sog. Soft-PWM um an
>> anderen D[1..x] Ausgänge ebenfalls PWM hinzubekommen.
>
> Daran hatte ich auch gedacht. Habe allerdings etwas Angst, dass da ein
> paar Tücken dahinter versteckt sind.

Du denkst schon richtig. +1
Das hängt von den Umständen resp. Anforderungen ab. Weil Du (noch?) 
Nichts dazu geschrieben hast, habe ich der Vereinfachung wegen dies 
nicht gleich angesprochen.

Geht es um die Übertragung von sich nur langsam ändernden Werte (z.B. 
Umgebungstemperaturen oder nur Anzeigewerte auf Drehspulinstrumente) 
dann dürfte Soft-PWM schon passen.
Bei sich schnell ändernden Werte (z.B. Positionierdaten o.ä.) eher 
nicht.

Auch was dein 'duino sonst so zu rechnen hat, resp. wie clever Du es zu 
implementieren schaffst hat hier Einfluss. Möglicherweise ist eben ein 
schnellerer DUE oder ein STM32'duino vonnöten.

Ev. musst Du sogar kategorisieren: was muss auf echten PWM-Ausgänge 
on-chip raus und was darf auf Soft-PWMs oder langsamer Peripherie 
raus.

Soweit lautete der Fokus Deiner Anfrage "wie MEHR PWMs" (besser: "wie 
MEHR Analogausgänge"), nicht "wie PWMs/A-outs mit *BESTIMMTEN 
Eigenschaften* " abgesehen von 4..20mA.

Probier doch erstmal aus!

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.