- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 22

Thema: double to integer oder exp(x) mit integer

  1. #11
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.02.2006
    Ort
    München
    Alter
    35
    Beiträge
    161
    Anzeige

    Powerstation Test
    Code:
    ~> man exp
    achnee, unter Windows gibts ja keine man-Pages ^^

    Also, dann klär ich mal auf: exp ist die natürliche Logarithmusfunktion

  2. #12
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Fast. exp ist die Exponentialfunktion.

    Ja nach Verwendungszweck kann man ja nen anderen Weg wählen, als den Brummer double exp(double). (double ist eh ne Mogelpackung, intern ist das nur float)
    -- Urbildbereich?
    -- Genauigkeit?
    -- Muss es Basis e sein? Oder tut's auch z.B. 2?
    -- etc?
    Disclaimer: none. Sue me.

  3. #13
    Neuer Benutzer Öfters hier
    Registriert seit
    24.03.2005
    Beiträge
    21
    Nein, es geht nur darum das OCR0-Register fuer eine PWM zu fuellen. Und zwar soll das Tastverhältnis mit 40*exp(-t/tau)+30 abklingen. Das Ergebniss muss also noch auf Werte von 0 ... 255 (OCR0 ist 8bit) scaliert werden. Die Zeit von der oberen Schwelle zur unteren Schelle soll ca. 300ms sein, also in der Zeit ist die PWM auf der unteren Schelle.

    Natürlich kann man eine Tabelle machen, aber wie sieht es dann aus, wenn tau sowie die Schwellen als Paramenter vorgebbar sein sollen?!

  4. #14
    Neuer Benutzer Öfters hier
    Registriert seit
    24.03.2005
    Beiträge
    21
    also das 40*exp(-t/tau)+30 war dann natürlich das Tastverhältnis in Prozent

  5. #15
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Was sind denn t und tau. Integrale Typen oder floats? *würmer-aus-der-Nase-zieh*
    Disclaimer: none. Sue me.

  6. #16
    Neuer Benutzer Öfters hier
    Registriert seit
    24.03.2005
    Beiträge
    21
    entschuldigung ... fuer tau reichen ganze zahlen aus. t werde ich ueber eine Laufvariable gewinnen. Ich weiss noch nicht, da ich dann nicht so viele Zíschenwerte bekomme.

    Wie gesagt. Eine PWM soll mit einem Tastverhältnis von 70% bis 30% innheralb von 0.3 sec exponentiell abklingen.

  7. #17
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    30.12.2005
    Ort
    Tann / ZH
    Alter
    68
    Beiträge
    264
    Zitat Zitat von fambi_mail
    Ja, aber es gibt keine casts fuer float nach integerzahlen, da da dies etwas komplizierter ist, wegen der internen abspeicherung von exponent und mantisse
    @fambi_mail
    Ist doch nicht wahr !! Programmierst Du in Assembler ?

    Wenn es keine direkte von Float zu integer gibt, so gibt
    es immer eine von Float zu einem String und eine
    von einem String zu einem Integer.

    Die Programmiersprache für einen modernen uC (ausser Assembler)
    die das nicht kann, möchte ich mal sehen....

    Meinst Du dass wenn du den Befehl nicht kennst, es diesen Befehl
    automatisch nicht gibt ??
    MfG
    Ruedi

  8. #18
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Mal ganz abgesehen davon, daß
    Code:
    (int) exp ((double) t/tau)
    funktionieren sollte...

    Was du willst in eine geometrische Progression, d.h. zwei aufeinander folgende Werte haben immer den gleichen Quotienten.

    Nehmen wir mal an, du begnügst dich mit einem duty von 16 Bit, also Werten 0...0xffff. Nehmen wir weiterhin an, zwei aufeinanderfolgende Werte haben einen Quotienten von 1.01. Auf 0xffff folgt also 0xfd76. Zwei benachbarte Werte sind also durch 1.01 zu teilen, was hier gleichbedeutend damit ist, sie mit 0x10000/1.01 = 0xfd77 zu multiplizieren. Wir haben also 16-Bit Werte, bei denen wir alle 16 Bits als Nachkommastellen interpretieren. Multiplizieren wir zwei dieser Werte, haben wir 32 Bit Nachkommastellen, und schieben das Ergebnis der Mul daher um 16 nach rechts:
    Code:
    extern uint16_t fixprod16 (const uint16_t, const uint16_t); // Prototyp für *.h
    
    uint16_t fixprod16 (const uint16_t a, const uint16_t b)
    {
       uint32_t ab = (uint32_t) a*b;
       return ab >> 16;
    }
    Der Nachfolger von x ist dann
    Code:
       fixprod16 (x, 0x10000/1.01)
    Das ist auf jeden Fall deutlich effizienter als Geschütze wie exp.

    Als Argumente von fixprod16 gehen natürlich auch Werte, die nicht zur Compilezeit bekannt sind.
    Disclaimer: none. Sue me.

  9. #19
    Neuer Benutzer Öfters hier
    Registriert seit
    24.03.2005
    Beiträge
    21
    Hallo Georg-Johann, ich habe nicht soviel verstanden von dem was du meinst.

    uint16_t x,y;

    for (x=10;x>0;x--){
    y=fixprod16 (x, 0x10000/1.01);
    }

    also so funktioniert es nicht. Was ist denn x und ist fuer 0x10000 eine variable zu verwenden?

  10. #20
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Eher so was:
    Code:
    #include <avr/io.h>
    ...
      uint16_t i; // Laufvariable
      uint16_t duty = ...; // Duty, mit dem angefangen wird
    
      for (i=0; i<100; i++)
      {
         duty = fixprod16 (duty, faktor);     
         OCR1A = duty;
      }
    Dabei gibt faktor an, um welches Verhältnis sich zwei aufeinander folgende dutys unterscheiden:
    64887 --> 1.01
    62415 --> 1.05
    59578 --> 1.1
    46341 --> Wurzel(2)
    43690 --> 1.5
    32768 --> 2
    20860 --> PI
    16384 --> 4

    etc.
    Disclaimer: none. Sue me.

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test