PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Geschwindigkleit= Strecke/ Zeit



karlauer
04.12.2008, 12:47
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.


#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 8-[

Valen
04.12.2008, 13:51
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.

karlauer
04.12.2008, 22:20
Danke Valen!

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


/************************************************** *****************************
*
* 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;
}



:-k