mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP PWM Signal in Hz Umwandeln


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Andreas M. (dbilas)
Datum:
Angehängte Dateien:

Bewertung
-3 lesenswert
nicht lesenswert
Ich habe ein Problem. Ich muss ein PWM Signal in ein Signal was 5 bis 
255Hz hat umwandeln.

Ich habe es, zum Testen, so aufgebaut gehabt das ich das PWM Signal über 
einen Optokoppler (PC817) laufen lasse und geschaut habe was für ein 
Wert am Display ausgegeben wird. Der Ausgegebene Wert bleibt bei DC 0-99 
gleich erst ab DC 100 geht er auf 0. Nun habe ich dann noch die 
Möglichkeit gehabt die Hz des PWM Signals zu ändern und habe dann 
festgestellt das der niedrigste Wert, der mir angezeigt werden muss, 5Hz 
hat und der max Wert 255Hz.

Nun wäre es ideal wenn ich mit dem DC des PWM Signals die Hz ändern 
könnte also 0 DC=1HZ und 99DC=255Hz. Ich habe schon etwas im Netz 
gesucht aber irgendwie nicht so richtig das gefunden was ich Suche oder 
aber es nicht verstanden.

Könnt ihr mir da weiter helfen wie ich das Problem lösen kann?

Autor: Stefan S. (chiefeinherjar)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das PWM-Signal durch einen Tiefpass jagen und dann damit einen VCO a la 
4066 steuern. Formeln zur Berechnung gibt's im Internet zur Genüge. Oder 
die Gleichspannung per uC auswerten und dann per Timer einen 
entsprechenden Takt generieren.

Autor: Michael K. (Firma: Knoelke Elektronik) (knoelke)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Voltage controled oszillator
Oder du steckst ein wenig hirnschmalz in den code und hast die freie 
Auswahl mit welcher Frequenz (hz) und welchem puls pausen Verhältnis 
dein signal herumschwabbelt.

Autor: Andreas M. (dbilas)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die schnellen Antworten! Ich habe mal etwas auf der Seite 
https://www.elektronik-kompendium.de/public/schaerer/vco.htm gestöbert 
und bin im Datenblatt vom MC14046BCL fündig geworden. Dort steht wenn 
VCOin = VDD, C1 50nf, R1 5k, R2 offen ist und 5V anliegen 0,5Mhz 
ausgegeben werden. Nun habe ich mal gerechnet. 10,2V/200pF*5k=0,255Mhz. 
0,2V/200pF*5k=0,005Mhz. Ist jetzt auf die Minimumausgabe gerechnet. 
Passt das so? Welcher Tiefpass sollte da genommen werden und den PC817 
muss ich ja dann nicht mehr verbauen? Der MC14046BCL kann ja bis +18V 
ab? Ich gehe dann vom Tiefpass auf VCOin und VDD?

Autor: Stefan S. (chiefeinherjar)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Andreas M. schrieb:
> 0,255Mhz

Andreas M. schrieb:
> 0,005Mhz

Ich dachte du willst 5 Hz bis 255 Hz?
0,255 MHz sind aber 255 kHz - da liegt Faktor 1000 zu deinen 255 Hz 
dazwischen.

Autor: Stefan S. (chiefeinherjar)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas M. schrieb:
> Welcher Tiefpass sollte da genommen werden

DAS hängt von den Anforderungen an deine Regelgeschwindigkeit, 
Phasenrauschen durch Restripple und ähnlichem ab.

Andreas M. schrieb:
> Der MC14046BCL kann ja bis +18V
> ab?

Naja... laut absolute Maximum rating ja. Da ist dann aber kein 
Spielraum mehr für Fehler; ich würde ihm eher eine niedrigere 
Spannungsversorgung bspw. via Festspannungsregler verpassen.

Autor: Joe F. (easylife)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Analog frickelt man sich da wirklich einen ab (untere/obere Frequenz, 
Linearität).
Auch die Temperaturabhängigkeit wird kein Spaß.
Ich nehme mal an, das Vorhaben ist auch irgendwo im KFZ Bereich 
angesiedelt...
Das ist daher eine sehr typische Anwendung für einen Mikrocontroller.
Auch die Reaktionsgeschwindigkeit ist wesentlich besser (1 PWM-Cycle).

: Bearbeitet durch User
Autor: Andreas M. (dbilas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan S. schrieb:
> Andreas M. schrieb:
>> 0,255Mhz
>
> Andreas M. schrieb:
>> 0,005Mhz
>
> Ich dachte du willst 5 Hz bis 255 Hz?
> 0,255 MHz sind aber 255 kHz - da liegt Faktor 1000 zu deinen 255 Hz
> dazwischen.

Oha da hab ich einmal 1000 vergessen.

10,2/400pF*0,010k=0,000255Mhz 255Hz
0,2/400pF*0,010k=0,000005Mhz 5Hz

Stefan S. schrieb:
> Andreas M. schrieb:
>> Welcher Tiefpass sollte da genommen werden
>
> DAS hängt von den Anforderungen an deine Regelgeschwindigkeit,
> Phasenrauschen durch Restripple und ähnlichem ab.
>
> Andreas M. schrieb:
>> Der MC14046BCL kann ja bis +18V
>> ab?
>
> Naja... laut absolute Maximum rating ja. Da ist dann aber kein
> Spielraum mehr für Fehler; ich würde ihm eher eine niedrigere
> Spannungsversorgung bspw. via Festspannungsregler verpassen.

Als Maximalwert liegen 14,4V an. Das sollte eigentlich klappen. Von 
welchen Regelgeschwindigkeiten kann man denn ausgehen? Der Wert sollte 
sich schon innerhalb von 1s verändern.

Joe F. schrieb:
> Analog frickelt man sich da wirklich einen ab (untere/obere
> Frequenz,
> Linearität).
> Auch die Temperaturabhängigkeit wird kein Spaß.
> Ich nehme mal an, das Vorhaben ist auch irgendwo im KFZ Bereich
> angesiedelt...
> Das ist daher eine sehr typische Anwendung für einen Mikrocontroller.

Ja ist im KFZ Bereich. Arduino Nano und Duemilanove sind auch vorhanden. 
So wie ich das gelesen habe ist das mit den Frequenzen dort aber nicht 
so einfach zu lösen.

Ich habe ja noch eine weitere PC817 Schaltung um ein weiteres Signal 
auszuwerten. Ziel soll es dann sein beide Sachen auf einer Platine zu 
vereinen.

Autor: Joe F. (easylife)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas M. schrieb:
> Arduino Nano und Duemilanove sind auch vorhanden.
> So wie ich das gelesen habe ist das mit den Frequenzen dort aber nicht
> so einfach zu lösen.

Ausgangsseitig (5-255 Hz) kein Problem.
Welche Frequenz hat denn die eingangsseitige PWM?

Autor: Andreas M. (dbilas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Joe F. schrieb:
> Andreas M. schrieb:
>> Arduino Nano und Duemilanove sind auch vorhanden.
>> So wie ich das gelesen habe ist das mit den Frequenzen dort aber nicht
>> so einfach zu lösen.
>
> Ausgangsseitig (5-255 Hz) kein Problem.
> Welche Frequenz hat denn die eingangsseitige PWM?

Die kann ich einstellen 0-255Hz 12V.

Autor: Joe F. (easylife)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
0 macht ja wenig Sinn.
D.h du kannst die PWM z.B. auf 250 Hz einstellen (damit das System 
schnell reagiert), und das Puls-Pausenverhältnis variiert dann zwischen 
0% und 100%.
Daraus möchtest du dann bei 0% ein Ausgangssignal mit 5 Hz machen, und 
bei 100% soll 255 Hz rauskommen?
Puls-Pausen-Verhältnis des Ausgangs wäre dann immer 50%.
Soweit korrekt?

: Bearbeitet durch User
Autor: Andreas M. (dbilas)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Ja das ist so korrekt. Ich konnte das Puls-Pausen-Verhältnis (DC?) des 
Ausgangs von 0-99% verändern was bei dem Angezeigten Wert keine Änderung 
ergab. Das sollte dann mit 50% passen.

Autor: Dergute W. (derguteweka)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

Ohje, das wird schon wieder so eine Spezialsalami.
Naja, wurscht - hier mein Vorschlag: Mit dem PWM Signal wird ein 
hoeherfrequentes, konstantes Taktsignal (ein paar MHz) ge"gated" (also 
UND verknuepft). Das resultierende Signal kommt in einen Frequenzteiler, 
der durch so einen Faktor teilt, dass die Ausgangsfrequenz dann halt 255 
Hz hat, wenn das PWM Signal immer high ist.

Gruss
WK

Autor: Joe F. (easylife)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also.
Vom Prinzip her denke ich, dass das ganz locker mit einem Arduino zu 
machen wäre.
Du würdest die PWM auf 51 Hz einstellen, und mit dem Arduino dieses 
Signal mit 5100 Hz abtasten (100-fache Überabtastung, für die 5100 Hz 
einen Timer-Interrupt verwenden).
Dieses abgetastete Signal fütterst du in einen (Software-)Tiefpass mit 
einer Grenzfrequenz von sagen wir mal 20 Hz.
Den Ausgangs-Wert des Tiefpasses (0..5100) skalierst du dann auf 
1020..20 (dafür gibts ja diese schöne "map()" funktion...) und benutzt 
diesen Wert dann, um die Ausgangs-PWM zu steuern.
Die Ausgangs-PWM kannst du im gleichen Timer-Interrupt erzeugen, der 
auch den Eingang abtastet, denn 5100 Hz / 1020 = 5 (Hz) und 5100 / 20 = 
255 (Hz).

: Bearbeitet durch User
Autor: m.n. (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Andreas M. schrieb:
> Nun wäre es ideal wenn ich mit dem DC des PWM Signals die Hz ändern
> könnte also 0 DC=1HZ und 99DC=255Hz. Ich habe schon etwas im Netz
> gesucht aber irgendwie nicht so richtig das gefunden was ich Suche oder
> aber es nicht verstanden.

Das PWM-Signal zu einer Gleichspannung filtern und anschließend die 
Ausgangsfrequenz mit einem Spannungs/Frequenz-Wandler erzeugen: 
http://mino-elektronik.de/Generator/takte_impulse.htm#bsp6

Autor: Andreas M. (dbilas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
m.n. schrieb:
> Andreas M. schrieb:
>> Nun wäre es ideal wenn ich mit dem DC des PWM Signals die Hz ändern
>> könnte also 0 DC=1HZ und 99DC=255Hz. Ich habe schon etwas im Netz
>> gesucht aber irgendwie nicht so richtig das gefunden was ich Suche oder
>> aber es nicht verstanden.
>
> Das PWM-Signal zu einer Gleichspannung filtern und anschließend die
> Ausgangsfrequenz mit einem Spannungs/Frequenz-Wandler erzeugen:
> http://mino-elektronik.de/Generator/takte_impulse.htm#bsp6

Das sieht schon sehr gut aus. Ich brauche ja keine 5khz bei 5V. Würde es 
auch funktionieren wenn man anstatt
#define F_MAX 5.0e3   // 5 kHz bei ADC-Eingang = Vcc

das sagt?

#define F_MAX 255   // 255Hz bei ADC-Eingang = Vcc

Gleichspannung filtern dann wieder mit einem Tiefpass? Welcher wäre da 
dann schnell genug?

Autor: m.n. (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Andreas M. schrieb:
> Das sieht schon sehr gut aus. Ich brauche ja keine 5khz bei 5V. Würde es
> auch funktionieren wenn man anstatt
> #define F_MAX 5.0e3   // 5 kHz bei ADC-Eingang = Vcc
>
> das sagt?
>
> #define F_MAX 255   // 255Hz bei ADC-Eingang = Vcc

Ja.

> Gleichspannung filtern dann wieder mit einem Tiefpass? Welcher wäre da
> dann schnell genug?

Das hängt von Deinen Anforderungen ab, ob ein Filter 2. oder 3. Ordnung 
reicht. Natürlich kann der µC die Pulsweite auch selber messen, wie es 
zuvor schon erwähnt wurde.
Mit einem pin-change-interrupt bekommt man jeden Flankenwechsel und muß 
dazu den Timer lesen, um die Pulsweiten für '0' und '1'-Pegel des 
Signals zu messen. Dazu habe ich nichts Fertiges, bei den tiefen 
Frequenzen ist die Auswertung aber auch nicht sonderlich schwierig.

Autor: Joe F. (easylife)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Habe gerade keinen Arduino hier, aber das hier könnte funktionieren.
PWM muss auf 51 Hz eingestellt sein, input_pin und output_pin musst du 
dir noch entsprechend anpassen.
Die Frequenz ändert sich in 101 Stufen, ich hoffe das reicht aus.
#include "TimerOne.h"  

int input_pin  = 13;
int output_pin = 14;

uint8_t sample_cnt = 0;
uint8_t sample_sum = 0;
uint8_t pwm_step   = 0;

uint16_t freq_out_cnt = 0;
 
uint16_t duration_table[101] = {
  16320, 10880, 8160, 6528, 5440, 4663, 4080, 3627, 3264, 2967, 
  2720, 2511, 2331, 2176, 2040, 1920, 1813, 1718, 1632, 1554, 
  1484, 1419, 1360, 1306, 1255, 1209, 1166, 1126, 1088, 1053, 
  1020, 989, 960, 933, 907, 882, 859, 837, 816, 796, 777, 759, 
  742, 725, 710, 694, 680, 666, 653, 640, 628, 616, 604, 593, 
  583, 573, 563, 553, 544, 535, 526, 518, 510, 502, 495, 487, 
  480, 473, 466, 460, 453, 447, 441, 435, 429, 424, 418, 413, 
  408, 403, 398, 393, 389, 384, 380, 375, 371, 367, 363, 359, 
  355, 351, 347, 344, 340, 336, 333, 330, 326, 323, 320 
};

 
void timer_int()
{
  // sample PWM input
  if (digitalRead(input_pin))
    sample_sum++;
  
  sample_cnt++;
  if (sample_cnt >= 100)
  {
    pwm_step   = sample_sum;
    sample_sum = 0;
    sample_cnt = 0;
  }

  // output 
  freq_out_cnt += 16;
  if (freq_out_cnt >= duration_table[pwm_step])
  {
    digitalWrite(output_pin, 1);
    freq_out_cnt -= duration_table[pwm_step];
  } 
  else if (freq_out_cnt > duration_table[pwm_step]/2)
  {
    digitalWrite(output_pin, 0);
  }
}
 
void setup() 
{
  pinMode(output_pin, OUTPUT);
  pinMode(input_pin,  INPUT);
  Timer1.initialize(196); // 5102 Hz
  Timer1.attachInterrupt(timer_int);
}

void loop() 
{
}

: Bearbeitet durch User
Autor: B-Nutzer (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Stefan S. schrieb:
> Ich dachte du willst 5 Hz bis 255 Hz?
> 0,255 MHz sind aber 255 kHz - da liegt Faktor 1000 zu deinen 255 Hz
> dazwischen.

Es ist erschreckend zu sehen, dass der TE nicht einmal in der Lage ist, 
die Aufgabe vollständig zu beschreiben. Es fehlt entweder die Angabe 
über die Eingangsfreuqenz der PWM oder die der Ausgangsfrequenz, je 
nachdem wie man es liest.

Autor: Andreas M. (dbilas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Joe F. schrieb:
> Habe gerade keinen Arduino hier, aber das hier könnte
> funktionieren.
> PWM muss auf 51 Hz eingestellt sein, input_pin und output_pin musst du
> dir noch entsprechend anpassen.
> Die Frequenz ändert sich in 101 Stufen, ich hoffe das reicht aus.
>

Danke! Das werde ich mal testen.

Autor: Joe F. (easylife)
Datum:
Angehängte Dateien:

Bewertung
1 lesenswert
nicht lesenswert
Habe mir mal nen Arduino Uno besorgt und etwas rumgebastelt.

Anbei der Code für 2 Kanäle.
Auf Pin 3 sollte ein 5100 Hz Rechteck zu sehen sein, wenn die Frequenz 
nicht 5100 Hz ist, muss
Timer1.initialize(98); // 5102 Hz
entsprechend angepasst werden.

Beschaltung:
PWM Inputs: Pin 8 und 9 (Eingangsfrequenz sollte so um die 51 Hz liegen)
Freq Outputs: Pin 12 und 13 (5..255 Hz)
Debug Output: Pin 11 (5100 Hz)

Wenn man das "EMULATE_PWM_SOURCE" define aktiviert, ist auf Pin 3 eine 
PWM, die durch loop() erzeugt wird. Die kann man zum Testen hernehmen.
Duty-cycle wird durch "PWM_EMULATION_ON_TIME" eingestellt.

Viel Spaß damit.

Autor: Äxl (geloescht) (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
WAS WILLST DU BAUEN?!?

Autor: Äxl (geloescht) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gaspedalstellung vs Motordrehzahl?
Die Frequenz ist Motordrehzahlbahängig, die Pulsweite abhängig von der 
Gaspedalstellung, wie dein Oberes Linkes MAPFilezu zeigen scheint.
Möchtest Du "Injektor5" anzapfen und prozentual ausgeben, um irgendwie 
die Motorleistung in Prozent darzustellen?

Autor: Andreas M. (dbilas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Joe F. schrieb:
> Habe mir mal nen Arduino Uno besorgt und etwas rumgebastelt.
>
> Anbei der Code für 2 Kanäle.
> Auf Pin 3 sollte ein 5100 Hz Rechteck zu sehen sein, wenn die Frequenz
> nicht 5100 Hz ist, mussTimer1.initialize(98); // 5102 Hz
> entsprechend angepasst werden.
>
> Beschaltung:
> PWM Inputs: Pin 8 und 9 (Eingangsfrequenz sollte so um die 51 Hz liegen)
> Freq Outputs: Pin 12 und 13 (5..255 Hz)
> Debug Output: Pin 11 (5100 Hz)
>
> Wenn man das "EMULATE_PWM_SOURCE" define aktiviert, ist auf Pin 3 eine
> PWM, die durch loop() erzeugt wird. Die kann man zum Testen hernehmen.
> Duty-cycle wird durch "PWM_EMULATION_ON_TIME" eingestellt.
>
> Viel Spaß damit.

Noch eine Verständnisfrage. Da ich ein +12V PWM Signal habe der Arduino 
aber nur +5V erkennen kann sollte ich das PWM Signal über einen 
Spannungsteiler auf max. +5V bringen?

Das ausgegebene Frequenzsignal sollte dann wieder über den Optocoppler 
laufen oder direkt an das Display angeschlossen werden?

Äxl (geloescht) schrieb:
> Gaspedalstellung vs Motordrehzahl?
> Die Frequenz ist Motordrehzahlbahängig, die Pulsweite abhängig von der
> Gaspedalstellung, wie dein Oberes Linkes MAPFilezu zeigen scheint.
> Möchtest Du "Injektor5" anzapfen und prozentual ausgeben, um irgendwie
> die Motorleistung in Prozent darzustellen?

Ja so in etwa.

Autor: Joe F. (easylife)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Andreas M. schrieb:
> Da ich ein +12V PWM Signal habe der Arduino
> aber nur +5V erkennen kann sollte ich das PWM Signal über einen
> Spannungsteiler auf max. +5V bringen?
>
> Das ausgegebene Frequenzsignal sollte dann wieder über den Optocoppler
> laufen

Bei diesen relativ niedrigen Frequenzen und generell im KFZ Bereich ist 
eine galvanische Trennung durch Optokoppler eine sehr gute Idee.
Ich würde das sowohl Eingangs- als auch Ausgangsseitig machen.
Jeweils eine anti-parallele Diode an dein Eingangs-Optokopplern schützt 
diese auch vor negativen Transienten.

: Bearbeitet durch User
Beitrag #5523278 wurde vom Autor gelöscht.
Autor: Andreas M. (dbilas)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde es jetzt mit dem Optokoppler so testen. Wie sollte ich da noch 
eine anti-parallele Diode verwenden?

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas M. schrieb:
> Wie sollte ich da noch eine anti-parallele Diode verwenden?
Da, wo die LED des Optokopplers angeschlossen ist.

Beitrag #5524319 wurde vom Autor gelöscht.
Autor: Joe F. (easylife)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
s.o.
Der 3.3K Pulldown am Eingang des Arduinos ist evtl. ein bisschen zu 
niederohmig.
Da kann man auch 10K...33K nehmen.

: Bearbeitet durch User
Autor: Andreas M. (dbilas)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin nun mal dazu gekommen es zu testen. Mit der gezeigten Schaltung, 
oben, funktionierte es nicht. Das Display zeigte mir schon ohne Arduino 
entweder den vollen Wert oder 0 an. Ich habe es jetzt so angeschlossen 
wie ich es auch getestet hatte doch leider wurde nichts angezeigt. Ich 
habe dann mal mit Pin3 getestet

> Wenn man das "EMULATE_PWM_SOURCE" define aktiviert, ist auf Pin 3 eine
> PWM, die durch loop() erzeugt wird. Die kann man zum Testen hernehmen.
> Duty-cycle wird durch "PWM_EMULATION_ON_TIME" eingestellt.

Da zeigt mir mein Display dann schön den Wert an den ich einstelle. Also 
funktioniert die Ausgangsseite schon einmal.

Nun habe ich mal das PWM Signal mit meinem Multimeter gemessen. Wenn ich 
das PWM Signal gegen Masse messe habe ich bei DC1 0,17V und bei DC99 0V. 
Dann habe ich das PWM Signal gegen +12V gemessen da habe ich bei DC1 
10,70V und bei DC99 12,10V gemessen.

Ich glaube mein Steuergerät gibt nicht wirklich ein PWM Signal raus 
sondern nur ein getaktetes Massesignal.

Joe F. schrieb:
> s.o.
> Der 3.3K Pulldown am Eingang des Arduinos ist evtl. ein bisschen zu
> niederohmig.
> Da kann man auch 10K...33K nehmen.

Kann es an dem Pulldown liegen das der Arduino nichts erkennt? Ich habe 
das gerade erst gelesen das ich 10k oder 33K nehmen soll. Getestet habe 
ich es mit 3.3K

Autor: Joe F. (easylife)
Datum:
Angehängte Dateien:

Bewertung
1 lesenswert
nicht lesenswert
Andreas M. schrieb:
> Ich glaube mein Steuergerät gibt nicht wirklich ein PWM Signal raus
> sondern nur ein getaktetes Massesignal.

Das nennt sich dann "Open-Collector" Ausgang.

Versuchs mal so wie im Anhang.

Und: was für einen Optokoppler hast du verwendet?

: Bearbeitet durch User
Autor: Andreas M. (dbilas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Joe F. schrieb:

> Und: was für einen Optokoppler hast du verwendet?


Sharp PC817

: Bearbeitet durch User
Autor: Andreas M. (dbilas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe es jetzt mit 10k, 20k und 30k versucht. Leider gibt der Arduino 
keinen Wert aus. Es scheint als würde er das Signal nicht erkennen. Zum 
testen an Pin3 angeschlossen da wird mir ein Wert angezeigt.

Autor: Joe F. (easylife)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist es jetzt so angeschlossen wie hier?
Beitrag "Re: PWM Signal in Hz Umwandeln"

Was misst dein Multimeter jetzt zwischen

a) KFZ_OUTPUT und KFZ_GND und
b) zwischen ARDUINO_INPUT und ARDUINO_GND

bei verschiedenen PWM Stufen?

Hast du die PWM Frequenz auf ca. 50 Hz eingestellt?

Ist die zusätzliche Schutzdiode am Optokoppler evtl. falsch herum 
eingebaut?

: Bearbeitet durch User
Autor: Andreas M. (dbilas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist es jetzt so angeschlossen wie hier?
Beitrag "Re: PWM Signal in Hz Umwandeln"

Ja.

a) KFZ_OUTPUT und KFZ_GND   0,20V und 11,90V bei 1%DC und 99%DC
b) zwischen ARDUINO_INPUT und ARDUINO_GND   0.0V und 4,90V je nach DC 
mit 10K Widerstand

Signal steht auf 50HZ

Schutzdiode ist so wie eingezeichnet drin.

Arduino Output zu GND 0,80V egal welche DC

Arduino Pin3 Test Pin zu GND 1,20V

: Bearbeitet durch User
Autor: Joe F. (easylife)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas M. schrieb:
> a) KFZ_OUTPUT und KFZ_GND   0,20V und 11,90V bei 1%DC und 99%DC
> b) zwischen ARDUINO_INPUT und ARDUINO_GND   0.0V und 4,90V je nach DC
> mit 10K Widerstand

Das ist schon mal ein sehr gutes Zeichen.
Dann funktioniert der Optokoppler schon mal richtig.

Andreas M. schrieb:
> Arduino Pin3 Test Pin zu GND 1,20V

Wieso Pin 3?

Die Pinbelegung bei mir war
8 und 9 -> PWM inputs
12 und 13 -> freq outputs
11 - test PWM output

An welchen Pin hast du den Optokoppler denn angeschlossen?
Oder hast du an der Pinbelegung etwas geändert.

Autor: Andreas M. (dbilas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast oben geschrieben

> Wenn man das "EMULATE_PWM_SOURCE" define aktiviert, ist auf Pin 3 eine
> PWM, die durch loop() erzeugt wird. Die kann man zum Testen hernehmen.
> Duty-cycle wird durch "PWM_EMULATION_ON_TIME" eingestellt.

Das ist jetzt aktiviert und ich habe am Pin 3 1,20V gemessen und das 
Display zeigt mir dann auch einen Wert an.

>Die Pinbelegung bei mir war
>8 und 9 -> PWM inputs
>12 und 13 -> freq outputs
>11 - test PWM output

>An welchen Pin hast du den Optokoppler denn angeschlossen?
>Oder hast du an der Pinbelegung etwas geändert.

Ich habe nur EMULATE_PWM_SOURCE aktiviert der Rest ist so wie du es 
geschrieben hast.

Die LED des Arduino blinkt eigentlich permanent wenn ich den Input an 
Pin9 stecke hört sie auf mit blinken. Wenn ich den Input an Pin8 stecke 
blinkt sie weiter permanent. Output habe ich an Pin12.

Autor: Joe F. (easylife)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
wg. Pin 3, ja, war zu doof meinen eigenen Code zu lesen.

Ich glaube im Code ist noch ein Fehler:

ersetze mal in setup()
  for (ch=0; ch<2; ch++)
  {
    pinMode(output_pin,  OUTPUT);
    pinMode(input_pin,   INPUT);
  }

durch
  for (ch=0; ch<2; ch++)
  {
    pinMode(output_pin[ch],  OUTPUT);
    pinMode(input_pin[ch],   INPUT);
  }

Autor: Andreas M. (dbilas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Joe F. schrieb:
> wg. Pin 3, ja, war zu doof meinen eigenen Code zu lesen.
>
> Ich glaube im Code ist noch ein Fehler:
>
> ersetze mal in setup()
>   for (ch=0; ch<2; ch++)
>   {
>     pinMode(output_pin,  OUTPUT);
>     pinMode(input_pin,   INPUT);
>   }
>
> durch
>   for (ch=0; ch<2; ch++)
>   {
>     pinMode(output_pin[ch],  OUTPUT);
>     pinMode(input_pin[ch],   INPUT);
>   }

Genau das war es! Nun funktioniert es. Super!

Kann man es noch so einstellen das wenn kein PWM Signal anliegt auch 
kein Wert ausgegeben wird? Jetzt ist es so wenn PWM 0 ist mir das 
Display noch einen Wert anzeigt. Anscheinend muss der kleinste Wert 
nicht 1Hz sein sondern 0Hz.

Autor: Joe F. (easylife)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas M. schrieb:
> Kann man es noch so einstellen das wenn kein PWM Signal anliegt auch
> kein Wert ausgegeben wird?

Klar kann man das machen.

> Jetzt ist es so wenn PWM 0 ist mir das
> Display noch einen Wert anzeigt. Anscheinend muss der kleinste Wert
> nicht 1Hz sein sondern 0Hz.

Ursprünglich war die niedrigste Frequenz mal 5 Hz (so ist es auch 
implementiert).
Wie soll es nun sein?

a)
PWM 0%..99% -> Ausgang 0..255 Hz

oder

b)
PWM 0% -> Ausgang 0 Hz
PWM 1%..99% -> Ausgang 1..255 Hz

Autor: Andreas M. (dbilas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>a)
>PWM 0%..99% -> Ausgang 0..255 Hz

So wäre es ideal.

Autor: Joe F. (easylife)
Datum:
Angehängte Dateien:

Bewertung
1 lesenswert
nicht lesenswert
Bittesehr.

Autor: Andreas M. (dbilas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für deine Hilfe!

Autor: Andreas M. (dbilas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich bin jetzt dazu gekommen es ausgiebiger zu Testen und mir ist 
aufgefallen das ich nach ca. 10min Laufzeit den Input Dc erhöhen muss um 
den gleiche Output angezeigt zu bekommen. Als Beispiel: In den ersten 
10min ist Input Dc5 immer der Wert 10, nach 10min muss ich den Input 
eigentlich permanent erhöhen um die 10 angezeigt zu bekommen. Wenn ich 
den Arduino neu starte kann ich dann wieder ca. 10 mit DC5 den Wert 10 
anzeigen lassen und muss dann wieder den Dc erhöhen. Könntest du da noch 
einmal drüber schauen?

Autor: Analogmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da steckt irgendwo ein HP drin, nehme ich an.

Autor: Joe F. (easylife)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Software kann eigentlich nicht "driften".
Was passiert denn, wenn du statt deiner externen PWM-Quelle die vom 
Arduino selbst erzeugte PWM als Input nimmst (#define 
EMULATE_PWM_SOURCE)?
Driftet es dann auch?
Wird irgendwas in deiner Schaltung aussergewöhnlich warm?
Was für Vorwiderstände hast du für die Optokoppler genommen?

Autor: Andreas M. (dbilas)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
(#define EMULATE_PWM_SOURCE)?

Damit habe ich es noch nicht getestet, werde ich am We dann mal machen.
Widerstände sind so wie auf dem Bild. 1k am Input, 10k Arduino Input zu 
Gnd und 220 bei Arduino Output.

Autor: Andreas M. (dbilas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe es heute mit (#define EMULATE_PWM_SOURCE) getestet und es 
dauert ca.20 min bis dann 0 oder kein Wert mehr angezeigt wird. Nach 
einem Neustart des Arduino dauert es dann wieder ca. 20min. Die Bauteile 
haben alle eine normale Temperatur.

Autor: Joe F. (easylife)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist ja höchst seltsam.
Hast du ein Oszilloskop, mit dem du die PWMs mal vor und hinter dem 
Ausgangs-Optokoppler (Arduino -> KFZ) messen könntest?
Du könntest mal statt 220 Ohm auch einen etwas größeren Widerstand 
ausprobieren (z.B. 470, 680 Ohm).
Evtl. wird die LED im Optokoppler mit der Zeit warm.

: Bearbeitet durch User
Autor: Andreas M. (dbilas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe jetzt mal den 680 Ohm getestet. Als mir dann wieder 0 angezeigt 
wurde hat der Reset des Arduino dann aber keine Änderung mehr gebracht. 
Es blieb dann bei der Anzeige 0. Ein Oszilloskop habe ich, aber noch nie 
wirklich genutzt. Das werde ich am Mittwoch dann mal machen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.