Ja, die Antwort sieht auf dem Oszilloskop einwandfrei aus.
Danke für Deine Antwort, das wäre aber schade, wenn ein so mächtiger Chip wie der ESP8266 kein PWM Signal als Input auswerten könnte.
Es muss ja nur der Duty_Cycle der am Pin anliegt, erkannt werden.
Ich könnte mir aber vorstellen, dass das Board nicht mit zwei verschiedenen Frequenzen umgehen kann. Die Frage warum WILO, beim Feedback 75Hz verwendet, stelle ich mir auch.
Da steht nur, dass er vier PWMs erzeugen kann, aber nich
Selbst dass ist eigentlich gelogen. Der Chip hat keinerlei PWM Hardware. Deswegen heißt es im Datenblatt: "The functionality of PWM interfaces can be implemented via software programming".
Und "via software programming" ist insofern problematisch, dass die Software unregelmäßig oft und unterschiedlich lange unterbrochen wird, um die WLAN Schnittstelle zu bedienen. Die Ergebnisse werden dementsprechend ungenau. Sieht man bei PWM Dimmern schön daran, dass die Lichter flackern. Mal mehr, mal weniger.
Die Aufgabe des Programmierers ist, Wünsche mit der verfügbaren Hardware und Software in Einklang zu bringen. Einfach irgendwas hin zu schrieben und auf Glück hoffen, ist keine funktionierende Arbeitsmethode.
Von PWM Eingabe steht nirgendwo etwas. Nicht im Datenblatt, nicht der Anleitung von Micropython, nicht in der Anleitung vom großen Python und auch in keinem Diskussionsforum.
Schorsch, wo hast du das her?:
1
pwminput=PWM(Pin(4),75)
2
print(pwminput)
Ich könnte mir aber vorstellen, dass das Board nicht mit zwei
verschiedenen Frequenzen umgehen kann
Beim Arduino Framework gibt es diese Einschränkung tatsächlich. Sie kommt daher, dass dort das PWM Signal in einem Interrupt-Handler per Software erzeugt wird (geht ja nicht anders) und es nur einen Timer gibt, der dazu taugt.
So viel zum Thema "mächtig". Was den Funktionsumfang angeht, ist der Chip alles andere als mächtig. Der kann ja nicht nicht einmal aus dem Ruhezustand aufwachen, ohne neu zu booten. Sorry, aber ich glaube zu vertraust da zu sehr den wohlwollenden Superlativen von Espressifs Marketing.
Erscheint mir nicht wirklich zielführend zu sein.
Ich kann mich aber auch irren, da ich eine Aversion gegen Python habe (und da schimpfen andere über Arduino...)
ich werde jetzt versuchen die 75Hz mit dem AD Pin zu analysieren,
bei 10-bit Auflösung, sollte das ja keinerlei Problem sein,
Wenn du mit bis zu 20% Abweichung vom richtigen Wert leben kannst, dann kann das klappen. Du musst dabei aber das WLAN aus schalten (was einen Neustart erfordert), sonst ist er noch ungenauer.
Ich denke, er will das PWM Signal mit einem Tiefpass in eine analoge
Spannung umwandeln, und diese dann messen.
kommt mir bekannt vor...
Also ein digitales Signal analogisieren um es dann in ein digitales zu wandeln.
Das hat ein Kollege auch mal gemacht, weil ihm Modbus zu kompliziert war.
Man kann natürlich vor der Auswahl der Hardware schon mal auflisten, was man am Ende alles haben will.
Ja, es geht leider nur über den Tiefpass Umweg, da nur das pyboard die elegante Methode "ADC.read.timed()" zur Verfügung stellt und das ADC sample in einen Buffer liest, der dann ausgewertet werden kann.
Ich habe jetzt nur die Möglichkeit mit 25% Ungenauigkeit zu leben, oder für einen DI Pin einen buffer zu implementieren um über das timing die Pulsweite zu analysieren. Aber wer weiss wie ungenau das dann wieder sein wird? NUr gut dass das Board nur 6 Euro gekostet hat. Eventuell steige ich noch auf einen teurere Hardware um...
Ja, es geht leider nur über den Tiefpass Umweg, da nur das pyboard die
elegante Methode "ADC.read.timed()" zur Verfügung stellt und das ADC
sample in einen Buffer liest, der dann ausgewertet werden kann.
Zitat aus der micropython-Doku:
"ADC.read_timed(buf, timer)
1
Read analog values into buf at a rate set by the timer object.
2
3
buf can be bytearray or array.array for example. The ADC values have 12-bit resolution and are stored directly into buf if its element size is 16 bits or greater. If buf has only 8-bit elements (eg a bytearray) then the sample resolution will be reduced to 8 bits.
4
5
*timer* should be a Timer object, and a sample is read each time the timer triggers. The timer must already be initialised and running at the desired sampling frequency.
6
7
To support previous behaviour of this function, timer can also be an integer which specifies the frequency (in Hz) to sample at. In this case Timer(6) will be automatically configured to run at the given frequency."
Woher kommt das Timer-Objekt, wenn der Controller nur den Watchdog als Timer besitzt?
Hat leider nicht funktioniert, meine Abtastrate im python Script ist zu niedrig. Mit einem ATtiny85 und Spannungsteiler funktioniert es nun,
schade dass ich jetzt zwei Boards habe. Eine Lösung mit einem einzigen Board wäre mir lieber gewesen.
NUr gut dass das Board nur 6 Euro gekostet hat. Eventuell
steige ich noch auf einen teurere Hardware um...
Du brauchst kein teureres Board, sondern eins, dass für deine Aufgabe geeignet ist. Ein PWM-Signals erzeugt bzw. wertet man besser mit einem µC aus, der so etwas mit seiner integrierten HW unterstützt.
Ich nehme einen Pin-Interrupt, einen Mikrosekunden Timer, und schon kann ich das ankommende Signal vermessen. Ich mache das auch einem einfachen NXP Arm-M0.
Warum geht so etwas auf einem ESP nicht?
Dazu muss ich mit dem mikrosekunden Timmer beschäftigen, das mache ich jetzt mal, da mir eine Lösung mit nur einem Board wesentlich besser gefallen würde.
Hast Du einen Sourcecode Deiner Lösung?
Ich habe jetzt eine preiswerte Hardware gefunden, mit der ich alles auf einem Board realisieren kann. Ich hatte vorher nur leider keine Ahnung, dass der Pi Pico das alles kann:
Wow, Sebastian, Du bist ja ganz schön fit mit dem Zeug!
Da ich für die Wilo Pumpen eine einfache Lösung suche habe ich mir jetzt aber 10 Stück Pi Pico W bei Kaufland bestellt, da die nur 5,15 Euro kosten und alles von der Stange können was ich brauche:
https://datasheets.raspberrypi.com/picow/pico-w-datasheet.pdf
Ich frage mich, warum ich für meine bisherigen Projekte jemals ein anderes Board benutzt habe.
Das Pico W ist günstiger und wesentlich leistungsfähiger als esp8266.
Ich frage mich, warum ich für meine bisherigen Projekte jemals ein
anderes Board benutzt habe.
du hast eine tolle Tischkreissäge, aber jetzt eine große Platte die du da nicht durchschieben kannst. Da ist eine Handkreissäge mit Schiene auf einmal viel besser. Jetzt möchtest du einen Stamm aufsägen, aber der ist zu dick für beide Sägen. Also muss eine Bandsäge her. Passt nicht für die Kurvenschnitte in der Arbeitsplatte, also noch ne Stichsäge. usw....
Python auf einem Mikrocontroller fühlt sich für mich an wie
Brötchen kaufen mit einer schweren Transportkiste. Man braucht ein Auto, um die schwere Kiste zu transportieren. Und eine Garage, um das Auto zu laden. Und eine Werkstatt, um das Auto zu pflegen.
Unterm Strich ist mir "zu Fuß gehen mit Einkaufstüte" lieber.
Da geht es Dir wie mir. Ich bin auch am liebsten auf steinigen Pfaden unterwegs, wo man nie genau weis, was als nächstes passiert und man viel ausprobieren kann:
https://www.youtube.com/watch?v=_JM-e_cl4Wc&t=544s
Nur beim Programmieren halte ich es wie Walter Röhrl und möchte in meinen von den Maintainern bis aufs letzte optimierten "Opel Ascona 400" einsteigen und in Rekordzeit zum Erfolg kommen :-)
Python auf einem Mikrocontroller fühlt sich für mich an wie
Brötchen kaufen mit einer schweren Transportkiste.
Hab gerade https://github.com/micropython/micropython/pull/5962 gefunden. Die MicroPython machine.Pin change interrupts auf dem ESP8266 können nicht "hard=True" sein, sind also sehr flatterhaft. Damit lässt sich die Austastung eines 75Hz-Rechtecks nicht vernünftig messen, ich habs probiert. Die schwere Transportkiste ist also so grob gezimmert dass die meisten Brötchen auf die Straße fallen :(
Eine PWM lässt sich sehr einfach per Software einlesen, wenn der Eingangsport Interrupts für fallende und steigende Flanken auslösen kann und ein Timer vorhanden ist. Ob das der ESP8266 kann, hab ich nicht nachgeschaut, aber ich nehme es an.
Man konfiguriert den Interrupt des Ports für steigende Flanke
Sobald die steigende Flanke auftritt, startet man einen Timer und konfiguriert den Interrupt um auf fallende Flanke
Sobald die fallende Flanke auftritt, speichert man den Timerwert, startet den Timer neu und konfiguriert den Interrupt auf steigende Flanke
Anschließend wertet man den Timer aus und hat nun die Pulsdauer des positiven Pulses
Sobald die steigende Flanke auftritt, speichert man wieder den Timerwert, startet den Timer neu und konfiguriert den Interrupt auf fallende Flanke
Anschließend wertet man den Timer aus und hat nun die Pulsdauer des negativen Pulses. Aus der Pulsdauer des positiven und negativen Pulses, lässt sich leicht die PWM ausrechnen.
Wenn man den Interrupt mit höchster Priorität laufen lässt, dann bekommt man eine sehr genaue Messung, die nur von der Genauigkeit des Timers abhängt.
Die Flanken der PWM dürfen nicht schneller auftreten, als die ISR dauert.
Falls der Eingang prellt, muss man eine Entprellung vornehmen. Entweder in Hardware oder in Software.
Ob das der ESP8266 kann, hab ich nicht
nachgeschaut, aber ich nehme es an.
Interrupts und Timer sind vorhanden
Wenn man den Interrupt mit höchster Priorität laufen lässt,
dann bekommt man eine sehr genaue Messung
Daramn scheitert es. Das Programm wird zur Bedienung der WLAN Schnittstelle zu unregelmäßigen Zeitpunkten für unregelmäßige Dauer unterbrochen. Das hat leider höhere Prio, als die Pin Changes.
Eine PWM lässt sich sehr einfach per Software einlesen, wenn der
Eingangsport Interrupts für fallende und steigende Flanken auslösen kann
und ein Timer vorhanden ist.
Das wurde doch alles schon hier diskutiert. Aber anscheinend noch nicht von allen :(
Mit dem Pi Pico W, funktioniert die Vermessung bei 40% Drehzahl perfekt!
Connected to 192.168.178.23 MQTT Broker
New message on topic heatp/pump
duty = 32000
High-Flanke: 72
Low-Flanke : 39556
High-Flanke:77
Low-Flanke :39734
und so weitere...
New message on topic heatp/pump
32000
103
39537
106
39695