Forum: Mikrocontroller und Digitale Elektronik Raspberry PI 400, Genauigkeit PWM-Signal


von Michael (Gast)


Lesenswert?

Hallo Elektronikfreunde,

ich habe mir vor kurzem einen Raspberry Pi 400 gegönnt und leider 
ziemlich große Probleme mit dem PWM-Signal festgestellt.

Mein Ziel ist es ein möglichst genaues PWM-Signal mit 1 kHz und 
Duty-Cycle zwischen 5 % und 95 % hinzubekommen, ich würde 1 % Abweichung 
akzeptieren.

Habt ihr eine Idee, wie ich ohne große Korrekturrechnungen das 
PWM-Signal einstellen kann?

----------------------------------------------------------------------
Ich habe es mit der Standardfunktion probiert sowie mit einem 
time.sleep.
Anbei mal ein paar Code-Schnipsel mit denen ich herumprobiert habe.
Die Abweichungen sind mindestens immer 3 % groß, im Bereich unter 
Duty-Cycle 10 % sogar 5 % Abweichung.

Grüße und ich freue mich auf eure Hilfe.
Michael

--------------------
GPIO-Funktionen
--------------------
1
import RPi.GPIO as GPIO
2
3
pin = 33
4
dc = 10
5
freq = 1000
6
GPIO.setwarnings(False)
7
GPIO.setmode(GPIO.BOARD)
8
GPIO.setup(pin,GPIO.OUT)
9
pi_pwm = GPIO.PWM(pin,freq)
10
pi_pwm.start(dc)
11
input('Press return to stop:')
12
pi_pwm.stop()
13
GPIO.cleanup()


--------------------
Sleep-Funktion
--------------------
1
import RPi.GPIO as GPIO
2
import time
3
4
GPIO.setmode(GPIO.BOARD)
5
GPIO.setup(33, GPIO.OUT)
6
7
i = 0
8
9
dc = 0.9
10
ges = 0.0004*2
11
low = dc * ges
12
high = ges - low
13
14
while(i < 2):
15
16
  GPIO.output(33, 0)
17
  time.sleep(high)
18
  GPIO.output(33, 1)
19
  time.sleep(low)
20
  
21
  i = 1

von WF88 (Gast)


Lesenswert?

Was weicht ab, Frequenz oder Duty?

von Michael (Gast)


Lesenswert?

Hallo,

es weicht beides ab. Die Frequenz schwankt immer so random um 10 Prozent 
selbst um den sich ergebenden Wert.
Bei einer Sollfrequenz von 10 kHz erreiche ich noch 5.4 kHz, bei Soll 
von 1 kHz etwa 840 Hz und bei Soll von 500 Hz sind es immerhin 450 Hz.

Der DutyCycle passt bei 50 % super, drum herum sind die Abweichungen 
zwischen 3 % und an den Grenzen weit über 5 %, kleine Werte wie 2 % kann 
man garnicht stellen.

Ich bin mir bewusst, dass es ein Soft PWM ist, aber kriegt man das nicht 
besser hin?

von Ein Kommentar (Gast)


Lesenswert?

Der Prozessor kann doch Hardware PWM. Weiß nicht, ob inzwischen die 
Treiber beim Raspian mitgeliefert werden. Als es es das letzte mal 
brauchte, gab es zig Varianten, die man selbst aus dem git kompilieren 
musste.

In Software klappt das doch eh nicht. Gibt ja keine Echtzeitprozesse, 
bei denen dir das Linux rechtzeitig und gleichmäßig Rechenzeit zuteilt.

von Frank K. (fchk)


Lesenswert?

Nimm das hier:

https://www.amazon.de/dp/B08YD8PDLS/

Da wird das PWM-Signal in Hardware erzeugt, unabhängig vom Prozessor 
(und ob der hoch oder runter taktet), und das ist dann wirklich stabil.

fchk

von Ein Kommentar (Gast)


Lesenswert?

> Nimm das hier:

Gute Gelegenheit, da starten wir doch gleich mal einen Religionskrieg.

Nimm einen Arduino. Dort arbeitet das sleep() exakt. Nicht so einen 
neumodischen Kram mit Multitaskingbetriebssystem.

von Alfred B. (alfred_b979)


Lesenswert?

Michael schrieb:
> Die Abweichungen sind mindestens immer 3 % groß, im Bereich unter
> Duty-Cycle 10 % sogar 5 % Abweichung.

Ist so natürlich in ziemlich vielen Anwendungen völlig
unbrauchbar - man müßte was drehen oder beifügen*, bzw.
könnte man gleich alles ganz anders machen.

Vielleicht ja einfach nur irgendeine Art von Feedback-
Schleife anlegen, um aus dem (vermutlich) Steller einen
Regler zu machen - wenn das denn ginge. Oder, oder, oder.

Wie am besten, ist bisher noch etwas schwer zu sagen,
bzw. könnte man viele Tipps geben, die funktionierten,
aber aus noch unbekannten Gründen nicht paßten.

Darf man erfahren, worum genau(er) es geht? (Ungefähr?)

Und stünde z.B. Verwendung anderer Komponenten (siehe den
Post davor) überhaupt zur Auswahl bzw. Debatte?

Etc., was Dir halt potentiell Relevantes einfiele.

: Bearbeitet durch User
von PittyJ (Gast)


Lesenswert?

So etwas ist auf einem Raspi mit Linux nicht so einfach zu machen. Wenn 
man Pech hat, schlägt eine SD-Karten Schreibroutine zu, und die Hardware 
ist erst mal beschäftigt.

Es soll Hardware-Chips geben, die die PWM erzeugen und über I2C 
angeschlossen sind. PCA9685 habe ich auf die Schnelle gefunden.

Ich habe die PWM beiseite gelegt, und bin auf I2C DACs umgestiegen. Da 
ist die Spannung wesentlich konstanter, die Glättung entfällt.

von olaf (Gast)


Lesenswert?

> Ich habe die PWM beiseite gelegt, und bin auf I2C DACs umgestiegen. Da
> ist die Spannung wesentlich konstanter, die Glättung entfällt.

Du bekommst mit PWM relativ einfach einen DA-Wandler mit 16Bit 
Genauigkeit wenn du es mit der Aenderung des Ausgabewertes nicht zu 
eilig hast. Da musst du bei einem DAC tiefer in die Tasche greifen, bist 
aber schneller. Hat also beides so seine Berechtigung.

Olaf

von Michael (Gast)


Lesenswert?

Hallo,

ich will eigentlich nur ein altes Roboterlein, was ich mir mal gebaut 
hatte, ansteuern. Ich komme mit PWM-Frequenzen zwischen 500 Hz und 2 kHz 
klar, aber der Duty-Cycle sollte halt passen.

ich werde mir ein externes Modul kaufen.
Der interne Hardware-PWM scheint mir nur 8 Bit Auflösung zu haben.

Wisst ihr zufälligerweise, ob man beim internen Hardware PWM nicht doch 
etwas cheaten kann :D ?
1
import pigpio
2
3
pi = pigpio.pi()
4
5
pi.set_mode(13, pigpio.OUTPUT)
6
pi.set_mode(19, pigpio.OUTPUT)
7
pi.set_PWM_frequency(13, 1000)
8
pi.set_PWM_dutycycle(13, 128)
9
pi.set_PWM_frequency(19, 1000)
10
pi.set_PWM_dutycycle(19, 64)

von Dyson (Gast)


Lesenswert?

olaf schrieb:
>Du bekommst mit PWM relativ einfach einen DA-Wandler mit 16Bit
> Genauigkeit

Auflösung. Genauigkeit ist etwas anderes.

von olaf (Gast)


Lesenswert?

> Auflösung. Genauigkeit ist etwas anderes.

Ich weiss das es etwas anderes ist und habe das Wort bewusst gewaehlt. 
.-)

Olaf

von N. M. (mani)


Angehängte Dateien:

Lesenswert?

Also wenn ich die Hardware PWM meines Raspi 4 verwende sieht das nicht 
all zu schlecht aus:
2 Kanäle mit je 1kHz und 5% bzw. 95% (siehe Anhang).

Dein Problem ist dass du das mit Software und einem Betriebssystem nicht 
hinbekommst weil der Task-Jitter zu groß ist und damit deine 
Ein-/Ausschaltzeitpunkte versaut.

von olaf (Gast)


Lesenswert?

> ich will eigentlich nur ein altes Roboterlein, was ich mir mal gebaut
> hatte, ansteuern.

Dann ist es vermutlich wirklich am einfachsten du besorgst dir einen
I2C DAC mit 10 oder 12Bit und sagen wir mal 4 Ausgaengen.

Ups, wollte dir gerade den MAX5842 empfehlen weil ich den frueher
mal gerne verwendet habe:

https://www.analog.com/media/en/technical-documentation/data-sheets/max5842.pdf

Aber angesichts der Mouser/RS-preise wuerde ich da doch wieder zu 
irgendeiner anderen Loesung raten. :-D

Der hier sieht doch halbwegs bezahlbar aus:

https://www.mouser.de/ProductDetail/Microchip-Technology-Atmel/TC1321EOA?qs=VDoAoI%2FEFTNT2fNRwgb%2F2g%3D%3D


Olaf

von Bauform B. (bauformb)


Lesenswert?

olaf schrieb:
> Aber angesichts der Mouser/RS-preise wuerde ich da doch wieder zu
> irgendeiner anderen Loesung raten. :-D

Zum Beispiel SPI statt I2C. Dazu ein anderer Hersteller und/oder 
Händler. Reichelt hat über 20 Typen von Microchip auf Lager, auch 1 oder 
2 mit I2C.

https://www.reichelt.de/signalwandlung-c8710.html?&nbc=1

von Dyson (Gast)


Lesenswert?

olaf schrieb:
>> Auflösung. Genauigkeit ist etwas anderes.
>
> Ich weiss das es etwas anderes ist und habe das Wort bewusst gewaehlt.
> .-)
> Olaf

Selbstverständlich

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.