- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 3 von 3

Thema: Geschwindigkleit= Strecke/ Zeit

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    07.02.2005
    Beiträge
    5

    Geschwindigkleit= Strecke/ Zeit

    Anzeige

    Praxistest und DIY Projekte
    Hallo!

    Bin grad am einarbeiten in die Ausro Thematik und hätte da mal folgende Fragen:

    Was passiert hier? Es geht um die Geschwindigkeit. Ich verstehe nicht ganz wie man mithilfe der Taktfrequenz und der Odometrie auf die Geschwindigkeit kommt?
    Wie kommt man auf die Konstante 256, 27000 usw.

    Code:
    #include "asuro.h"
    #include <stdlib.h>
    volatile unsigned char count36kHz;
    volatile unsigned long timebase;
    unsigned int takte;
    int w, x, e, y, kp, ki, esum[2];
    unsigned char speedLeft,speedRight;
    unsigned long zeit[2];
    
    
    void ReglerL (void)
    {
       takte = (timebase*256)+count36kHz - zeit[0];
       zeit[0]=(timebase*256)+count36kHz;
       x = 27000/takte;
       e = w - x;
       esum[0] = esum[0] + e;
       if (esum[0] < -130) {esum[0] = -130;}
       if (esum[0] > 130) {esum[0] = 130;}
       y = kp*e + ki*esum[0];
       if (y < 0) {y = 0;}
       if (y > 255) {y = 255;}
       speedLeft = y;
       MotorSpeed(speedLeft,speedRight);
    }
    Was ich hier erkenne ist der Regelfehler e wird aus der Führungsgröße w minus Regelgröße x bestimmt. Wenn x eine Geschwindigkeit sein soll bräcute ich auch noch einen "Weg" um mit der Zeit auf die Geschwindigkeit zu kommen...wieso steht dann hier aber 27000

    Ps: Ich hoffe es fühlt sich keiner beleidigt dass ich mir den Code hier zum Verständnis ausgeborgt habe

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    Ich verstehe diese code auch nicht ganz. W ist definiert aber wird niemahls einer werte gegeben. Na ja, nicht im ReglerL function jedenfalls. Ob es die gemessene weg ist oder zb. 'omega' (radwinkel drehung pro sekunde) kan man nicht feststellen. Genau so mit x, keine ahnung was es ist (genauer was 27000 ist). Woher hast du dieser code? Ein gutes beispiel warum mann /*comments*/ benutzen soll.

    256 ist einfach. Count36kHz ist ein byte/char zähler die jeder takt hoch gezählt wird (fur zeit messung). Wenn count36kHz uber 255 geht wird timebase 1 höher gezälht (irgendwo in asuro.c oder etwas). Das ist ähnlich wie stunden, minuten und sekunden, aber nur mit 256 und nicht 60.

    p.s. Hmm, 27.000 * 36.000= CPUtakt_8MHz * 121,5. Und 121,5 ist ungefehr die rad umfang/periferie.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    07.02.2005
    Beiträge
    5

    selbst ist der mann

    Danke Valen!

    Ich hab jetzt mal als Versuch einen Code auf meine eigene Art gemacht als mich mit irgendwelchen Konstanten herumzuschlagen...
    Danke trotzdem!

    Code:
    /*******************************************************************************
    *
    * Description: Eigen versuch geschw
    *
    *****************************************************************************/
    
    
    
    #include<asuro.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    
    
    
    
    
    
    int main(void) {
    unsigned int data[2];//Speicher bereitstellen
    unsigned char taste;
    unsigned int dataO[2],dataM[2],dataMi[2],dataMa[2];
    unsigned long time;
    float tli[1000],v[2];
    char text[16]="      ";
    int k,l,i,tz;
    tz=0;
    i=0;
    k=0;
    l=0;
    tli[0]=0;
    Init();
    
    dataM[0]=0;
    dataMi[0]=1000;
    dataMa[0]=0;
    time=0;
    
    
    while(1){ // Endlosschleife, ASURO soll beliebig
    // lang einer Linie nachfahren
    MotorDir(FWD,FWD);
    time=Gettime();
    
    OdometrieData(dataO);
    if (dataO[0]>dataMa[0])
    {dataMa[0]=dataO[0];}
    if (dataO[0]<dataMi[0])
    {dataMi[0]=dataO[0];}
    dataM[0]=(dataMi[0]+dataMa[0])/2;
    
    
    
    
    
    
    
    StatusLED(RED);
    if (dataO[0]<(dataM[0]-dataM[0]*0.2))
    {k++;}
    if (dataO[0]>(dataM[0]+dataM[0]*0.2))
    {l++;}
    
    if (k>1 && l>1)
    {StatusLED(GREEN);
    tz++;
    tli[tz]=time;
    v[0]=2510/(tli[tz]-tli[(tz-1)]);
    i++;
    k=0;
    l=0;}
    
    SerWrite("\n\rAsuro Ergebniss = ",20);
    PrintInt(v[0]);
    
    
    MotorSpeed(100,0);
    
    
    }
    
    return 0;
    }


Berechtigungen

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

LiFePO4 Speicher Test