Eine Folge von 23 und 24 erzeugen, die im Mittel 23,572 ergibt

OP #5952246
Lesenswert?

Hi, nehmen wir mal an, ich möchte eine PWM implementieren, die 
langfristig im Mittel 23,572% Tastverhältnis hat. Allerdings ist die 
tatsächliche Auflösung des Tastverhältnisses auf 1% beschränkt, ich kann 
die PWM also entweder mit 23% oder mit 24% Tastverhältnis laufen lassen. 
Indem ich jedoch eine bestimmte Folge aus 23 23 24 23 24 23 24 23 23 
23... usw ausgebe kann ich das Tastverhältnis im statistischen Mittel 
langfristig auf beliebige Auflösungen bringen.

Aber wie erzeuge ich eine solche Folge? Klar, ich könnte eine Folge aus 
572*24 und 428*23 aneinanderreihen aber würde mir eher wünschen, dass 
die Folge so "abwechslungsreich" wie nur irgendwie möglich wird.

Vielleicht stehe ich auch gerade auf dem Schlauch aber mir fällt auf 
anhieb kein mathematisches Verfahren ein. Wichtig ist auch, dass ich die 
Folge on the fly berechnen will, also nicht zuerst im RAM präparieren 
müssen möchte.

Hat jemand eine Idee?
OP #5952357
Lesenswert?

Im jetzigen konkreten Anwendungsfall möchte ich das auf eine 
Software-PWM anwenden, kann also die PWM-Werte in jedem Zyklus updaten. 
Aber die Frage hat mich schon seit längerem mal interessiert, mir fallen 
da verschiedene Anwendungsfälle ein.

Theor schrieb:
> Das Problem lässt sich auf die Erzeugung von Zufallszahlen mit einer
> bestimmten Verteilung reduzieren.

Zuerst wollte ich genau hiernach fragen, aber dann kam mir das etwas zu 
abstrakt vor und ich habe es lieber direkt auf den konkreten 
Anwendungsfall bezogen :-D


Danke an alle für die hilfreichen Ansätze! Die werde ich mal verfolgen 
und den ein oder anderen davon zu implementieren versuchen.


Für die, die es interessiert: In meinem jetzigen Fall brauche ich das, 
um eine Pumpe anzusteuern, die unterhalb eines bestimmten 
Tastverhältnisses einfach gar nicht mehr pumpt. Durch geschicktes 
Pendeln zwischen dem minimalen Tastverhältnis 0% und 2% kann ich somit 
dennoch beliebige Durchflussmengen erreichen.
#5952358
Lesenswert?

Paul H. schrieb:
> Hi, nehmen wir mal an, ich möchte eine PWM implementieren, die
> langfristig im Mittel 23,572% Tastverhältnis hat

Also wenn du abwechselnd mit 23% und 24% ansteuerst, dann hast du im 
Mittel (rechnerisch...) 23,5%! Ich kann mir jetzt gar nicht vorstellen, 
dass die restlichen 0,072% da jemandem einen "Faden abbeissen" sollten 
:-)
Gruß Rainer
#5952369
Lesenswert?

Paul H. schrieb:
> Für die, die es interessiert: In meinem jetzigen Fall brauche ich das,
> um eine Pumpe anzusteuern, die unterhalb eines bestimmten
> Tastverhältnisses einfach gar nicht mehr pumpt. Durch geschicktes
> Pendeln zwischen dem minimalen Tastverhältnis 0% und 2% kann ich somit
> dennoch beliebige Durchflussmengen erreichen.

Das ist doch aber mehr oder weniger zufällig. Wenn die Lager um 3 Monate 
gealtert sind oder ein bischen Dreck im Rotor hängt dann läuft sie gar 
nicht mehr an.
Eine bessere und langfristig funktionierende Lösung wäre ein echter 
Regelkreis bei dem die Durchflussmenge oder die Drehzahl der Pumpe 
erfasst würde.
#5952380
Lesenswert?

Undauch wenn ich einen eiteren Minuspunkt einstecken muß...die 
Geschichte, aus Ganzzahlen gebrochene Zahlen zu generieren, ist sicher 
hochinteressant! Aber für deine Pumpe wäre das einzig Richtige, einen 
Regelkreis zu implementieren. Wie gerade schon empfohlen.
Gruß Rainer
#5952552
Lesenswert?

Paul H. schrieb:
> Aber wie erzeuge ich eine solche Folge? Klar, ich könnte eine Folge aus
> 572*24 und 428*23 aneinanderreihen aber würde mir eher wünschen, dass
> die Folge so "abwechslungsreich" wie nur irgendwie möglich wird.
>
> Vielleicht stehe ich auch gerade auf dem Schlauch aber mir fällt auf
> anhieb kein mathematisches Verfahren ein. Wichtig ist auch, dass ich die
> Folge on the fly berechnen will, also nicht zuerst im RAM präparieren
> müssen möchte.
>
> Hat jemand eine Idee?


35 mal die Folge 24,23,24,23,24,23,24 nacheinander ausgeben
und dann 1 mal die Folge 24,23,24,23,24 hinterher und wieder von vorne 
anfangen.

Da die letzte Folge nur eine 23 und eine 24 kürzer ist, lässt sich m.E. 
die gesamte Sequenz nicht abwechslungsreicher gestalten. Egal wo man 
diese Folge einfügt, der zeitliche Abstand würde immer gleich bleiben. 
Die Sequenz ist insgesamt 250 Werte lang.
(Ich hoffe, ich habe mich nicht vertan, es sollte genau 23,572 
herauskommen)
Gast #5952573
Lesenswert?

Bernd schrieb:
> c-heater schrieb:
>
>>
1
>> cnt+=572;
2
>> if (cnt >= 1000)
3
>> {
4
>>   cnt-=1000;
5
>>   set_pwm(24);
6
>> }
7
>> else
8
>> {
9
>>   set_pwm(23);
10
>> }
11
>>
>
> Was soll denn dieser schwachsinnige Codesnipsel?

Das ist eine Implementierung des Bresenham-Algorithmus für das Intervall 
23..24, welches im Mittel 572/1000 zu 23 addiert.

Wer das nicht erkennt, kann nicht programmieren. C nicht und auch keine 
andere Sprache. Sowas ist eine der absoluten Trivialitäten.
Gast #5952596
Lesenswert?

c-hater schrieb:
> Bernd schrieb:
>> c-heater schrieb:
>>
>> Was soll denn dieser schwachsinnige Codesnipsel?
>
> Das ist eine Implementierung des Bresenham-Algorithmus für das Intervall
> 23..24, welches im Mittel 572/1000 zu 23 addiert.
>
> Wer das nicht erkennt, kann nicht programmieren. C nicht und auch keine
> andere Sprache. Sowas ist eine der absoluten Trivialitäten.

Vielleicht meint Bernd "Warum hast Du nicht gekürzt, Du 
Ressourcenverschwender?" ;)
Gast #5952619
Lesenswert?

c-heater schrieb:
>>Du Ressourcenverschwender?" ;)
>
> Also gut. Für die 8-Bitter:cnt+=143;
> if (cnt >= 250)
> {
>   cnt-=250;
>   set_pwm(24);
> }
> else
> {
>   set_pwm(23);
> }

140 (z.B.) + 143 ist etwas groß, oder? Wie wäre es mit

cnt+=71;
if (cnt >= 125)
{
  cnt-=124;
  set_pwm(24);
}
else
{
  set_pwm(23);
}

Genau genug?
Gast #5952635
Lesenswert?

Single Event Upsets. Äußert sich in zufälligen Fehlern. Treten mit 
bestimmter Wahrscheinlichkeit auf.

Wie genau brauchst Du's denn für eine PWM?

> Natürlich gibt es da einen Fehler, aber du mußt abschätzen, ob das
> reicht!!

Irgendwie hatte ich jetzt gehofft, dass Du das machst ;)
(Firma: tsx89) Persönliche Seite #5952912
Lesenswert?

Paul H. schrieb:
> Für die, die es interessiert:
> um eine Pumpe anzusteuern...
> Durch geschicktes Pendeln zwischen dem minimalen Tastverhältnis 0% und 2%
> kann ich somit dennoch beliebige Durchflussmengen erreichen.

Paul H. schrieb:
> Was gehört das? ?

Sehr viele Personen einladen um die Pumpe nochmal heraus zu heben! 
Sodass es ein großes Ereignis wird. Das 
"Große-Pumpen-Wieder-Heraus-Hebe-Festival". Das gehört sich so.

Rainer V. schrieb:
> Das gehört jedenfalls noch einmal "groß" herausgehoben!!!

...The More You Know
#5952975
Lesenswert?

c-heater schrieb:
> Warum 23,571428571428571%, wenn ganz einfach 23,572% möglich sind?

Hier genügen nur 7 Werte, ansonsten 250 ...

Alex D. schrieb:
> 35 mal die Folge 24,23,24,23,24,23,24 nacheinander ausgeben
> und dann 1 mal die Folge 24,23,24,23,24 hinterher und wieder von vorne
> anfangen.
>
> Da die letzte Folge nur eine 23 und eine 24 kürzer ist, lässt sich m.E.
> die gesamte Sequenz nicht abwechslungsreicher gestalten. Egal wo man
> diese Folge einfügt, der zeitliche Abstand würde immer gleich bleiben.
> Die Sequenz ist insgesamt 250 Werte lang.
> (Ich hoffe, ich habe mich nicht vertan, es sollte genau 23,572
> herauskommen)
Gast #5952991
Lesenswert?

>Hier genügen nur 7 Werte, ansonsten 250 ...
Naja. Das hier:
1
cnt+=532;
2
if (cnt >= 1000) 
3
{
4
  cnt-=1000;
5
  set_pwm(24); 
6
}
7
else
8
{
9
  set_pwm(23); 
10
}

steht dem gegenüber:
1
const BYTE lut[7]={ 24,23,24,23,24,23,24};
2
int index;
3
...
4

5
index++;
6
if (index >= 7) 
7
index = 0;
8
set_pwm(lut[index]);
#5952997
Lesenswert?

c-hater schrieb:
> Wer das nicht erkennt, kann nicht programmieren. C nicht und auch keine
> andere Sprache. Sowas ist eine der absoluten Trivialitäten.

Damit kannst du vieleicht super programmieren, aber nicht das 
eigentliche Problem lösen, das da ist:

Paul H. schrieb:
> Für die, die es interessiert: In meinem jetzigen Fall brauche ich das,
> um eine Pumpe anzusteuern, die unterhalb eines bestimmten
> Tastverhältnisses einfach gar nicht mehr pumpt. Durch geschicktes
> Pendeln zwischen dem minimalen Tastverhältnis 0% und 2% kann ich somit
> dennoch beliebige Durchflussmengen erreichen.

Also mal bitte die "Software-Scheuklappen" abnehmen und sich das 
eigentliche Problem ansehen.
Um deine eigene Ausdrucksweise zu bemühen:
"Wer das nicht kann ist kein Ingenieur, sondern maximal ein Geek, der 
mit C rumspielen kann".

SCNR
#5952998
Lesenswert?

Nachdem nun das Problem für 23,572% vollumfassend gelöst ist, können 
wir uns nun dem nächste Schritt zuwenden:

24,87942% ;)

Oder auch:

Die Aufgabe wird doch wohl lauten, ein beliebiges Tastverhältnis mit der 
vorhandenen 1%-Schrittweite darzustellen.

Wobei drei Stellen hinterm Komma eh akademischer Blödsinn sind. Eine 
reicht zur Pumpenansteuerung völlig aus.

Oliver
#5953016
Lesenswert?

Du nimmst einen Algorithmus, der Dir gleichverteilte Zufallszahlen von 0 
bis 1 erzeugt. Die skalierst Du auf den Bereich 0 bis 2*(23.572-23), 
dann haben die den Mittelwert 0.572. Wenn die Zufallszahl > als 0.572 
ist gibs Du eine 24 aus, sonst eine 23. Mit der Methode kann man auch 
andere Tastverhältnisse als 23 und 24 ausgeben, die einen 
vorgeschriebenen Mittelwert haben.

math rulez!
Cheers
Detlef

PS: In anderen Bereichen heißt diese Methode 'dithern', mit Rauschen die 
Auflösung vergrößern.
Gast #5953047
Lesenswert?

>Die Aufgabe wird doch wohl lauten, ein beliebiges Tastverhältnis mit der
>vorhandenen 1%-Schrittweite darzustellen.
1
cnt+=NACHKOMMASTELLEN;
2
if (cnt >= 1000) 
3
{
4
  cnt-=1000;
5
  set_pwm(VORKOMMA+1); 
6
}
7
else
8
{
9
  set_pwm(VORKOMMA); 
10
}
#5953094
Lesenswert?

Detlef _. schrieb:
> Wenn die Zufallszahl > als 0.572
> ist gibs Du eine 24 aus, sonst eine 23. Mit der Methode kann man auch
> andere Tastverhältnisse als 23 und 24 ausgeben, die einen
> vorgeschriebenen Mittelwert haben.
>
> math rulez!

Ok, dann erweitern wir die Aufgabenstellung praxisgerecht so, daß der 
gewünschte Mitelwert des PWM-Taktverhältnis nicht nur statistisch, 
sondern tatsächlich erreicht werden muß. Und zwar nicht erst zum Ende 
des Jahrhunderts, sondern z.B. mit der minimal möglichen Anzahl an 
Taktschritten.

Oliver
#5953155
Lesenswert?

'statistisch' ist praxisgerecht und ein Wert wird tatsächlich errreicht. 
Wie der Aufgabensteller schon sagte kann man von 1000 Werten 572 mal die 
24 ausgeben. Wann man 24 und wann man 23 ausgeben kann wurde hier auch 
schon dargelegt. Das kann man deterministisch machen. Das wollte der 
Aufgabensteller aber nicht tun, sondern er wollte da eine stochastische 
Konstante reinbringen. Das kann man so machen wie ich das geschildert 
habe. Man kann die Varianz der Verteilung auch modifizieren, dann wirds 
weniger zufällig. Damit kannst Du bestimmen, zu Ende ' welchen 
Jahrhunderts ' Du noch wie weit vom tatsächlichen Wert weg bist.

Oh ja, die Stochastik ist ein weites Feld, so viel zu lernen und zu 
entdecken.

math rulez.
Cheers
Detlef
Gast #5953200
Lesenswert?

Detlef _. schrieb:
> math rulez!
> Cheers
> Detlef
>
> PS: In anderen Bereichen heißt diese Methode 'dithern', mit Rauschen die
> Auflösung vergrößern.

Tatsächlich gefällt mir Random Dithering bei Bildern oft besser als 
Floyd Steinberg. Aber hier ist das sicherlich eine der schlechtesten 
korrekten Lösungen.
#5953259
Lesenswert?

Detlef _. schrieb:
> Du nimmst einen Algorithmus, der Dir gleichverteilte Zufallszahlen von 0
> bis 1 erzeugt. Die skalierst Du auf den Bereich 0 bis 2*(23.572-23),
> dann haben die den Mittelwert 0.572. Wenn die Zufallszahl > als 0.572
> ist gibs Du eine 24 aus, sonst eine 23. Mit der Methode kann man auch
> andere Tastverhältnisse als 23 und 24 ausgeben, die einen
> vorgeschriebenen Mittelwert haben.
>
> math rulez!

Dann hätte die Folge aber einen Mittelwert von 23,5.
Man müsste einfach R[0,1] mit 0.572 vergleichen.
Oder auch rand() mit RAND_MAX*0.572
#5953278
Lesenswert?

Heiko L. schrieb:
> Detlef _. schrieb:
>> Du nimmst einen Algorithmus, der Dir gleichverteilte Zufallszahlen von 0
>> bis 1 erzeugt. Die skalierst Du auf den Bereich 0 bis 2*(23.572-23),
>> dann haben die den Mittelwert 0.572. Wenn die Zufallszahl > als 0.572
>> ist gibs Du eine 24 aus, sonst eine 23. Mit der Methode kann man auch
>> andere Tastverhältnisse als 23 und 24 ausgeben, die einen
>> vorgeschriebenen Mittelwert haben.
>>
>> math rulez!
>

> Dann hätte die Folge aber einen Mittelwert von 23,5.

stimmt. Fehler. Zu warm.

> Man müsste einfach R[0,1] mit 0.572 vergleichen.

Ja, so geht.


math rulez.
Cheers
Detlef

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren