Hier noch mal eine etwas genauere Messung.
Diese mal mit Messprogramm, damit man auch den eigenen Asuro mal vermessen kann.
Druckbare Version
Hier noch mal eine etwas genauere Messung.
Diese mal mit Messprogramm, damit man auch den eigenen Asuro mal vermessen kann.
Wie hast Du die Werte aufgenommen?Zitat:
Zitat von waste
Motor mit Getriebe und Rad?
Mit Oszilloskop?
Anfangssteigung der Spannung oder Zeitkonstante oder curve fitting?
Ich bin eigentlich nicht neugierig, ich will halt nur alles wissen.
Manfred
Ich hab jetzt einige Messungen zur Odometrie gemacht und bin zu dem Schluss gekommen, dass man nur die gleichen Übergänge von hell auf dunkel oder umgekehrt nehmen darf. Die Dauer von hell ist unterschiedlich zu der von dunkel und auch noch abhängig vom Umgebungslicht. Das erschwert die Sache noch zusätzlich, da die Abtastrate jetzt 0.6sec ist. Eine kontinuierliche Geschwindigkeitsregelung wird da schwierig wenn nicht unmöglich sein. Ich werde jetzt einen anderen Weg mit schrittweiser Fortbewegung verfolgen.
Zusätzlich habe ich bei den Messungen eine im Takt der Reflexscheibe schwankende Geschwindigkeit festgestellt. Eine genauere Untersuchung zeigte, dass die Reflexscheibe nicht zentrisch ist, dadurch ergibt sich die schwankende Geschwindigkeit bei der Odometrie. Siehe auch das Bild der Geschwindigkeitsmessung. Deutlich zu sehen: eine Schwingung dauert 8 Messungen und das entspricht einem Umlauf der Reflexscheibe.
Das muss ich auch noch erst verbessern.
Waste
Vielen Dank für die weitere Messung.Zitat:
Zitat von stochri
Ein Frage zu den Angaben: früher hieß es Teppich und glatter Boden. Low friction ist glatter Boden?
Wie ist es zu erklären, dass bei der höheren Geschwindigkeit bei gleichem PWM Wert der Sprung beim Anfahren vorhanden ist?, Haftreibung auf glattem Boden? Kollektor-Stellung des Motors.
"low friction" fährt langsamer?
Manfred
@Manfred
Bezüglich Messung des Trägheitsmoment vom Motor
Die Spannung habe ich mit dem Oszi gemessen. Bei konstantem Strom ergibt das eine stetig steigende Spannung. Die Steigung der Spannung ist ein Mass für die Winkelbeschleunigung.Zitat:
Wie hast Du die Werte aufgenommen?
Motor mit Getriebe und Rad?
Mit Oszilloskop?
Ich habe sowohl den Motor alleine als auch mit Getriebe und Rad gemessen. Da ergeben sich nur sehr geringe Unterschied, das Hauptträgheitsmoment hat der Motor allein.
Waste
@Waste
sehr schöne Messung. Stammen die Messwerte vom Atmega selbst, oder hast du extern gemessen ?
Das halte ich auch für den richtigen Weg. Ich glaube nicht, dass es notwendig ist, bei jedem Encoder-Tic regeln. Die Bewegung des Asuro kann mit Sicherheit ohne zu regeln über eine Sekunde stabil gehalten werden.Zitat:
Geschwindigkeitsregelung wird da schwierig wenn nicht unmöglich sein. Ich werde jetzt einen anderen Weg mit schrittweiser Fortbewegung verfolgen.
stochri
@Manf
Ja so ist es halt: was nützt eine Messung genaue Beschreibung des Messvorgangs ?
ramp down = Lererlaufgeschwindigkeit bei Schrittweiser Verkleinerung des PWM-WertesZitat:
Ein Frage zu den Angaben: früher hieß es Teppich und glatter Boden. Low friction ist glatter Boden?
ramp up = Lererlaufgeschwindigkeit bei Schrittweiser Erhöhung des PWM-Wertes
Low Frichtion = Geschwindigkeit auf glattem Boden bei Schrittweiser Erhöhung der Geschwindigkeit
Leerlaufmessung: ohne Bodenberührung der Räder .
In dem Diagramm kann man sehr schön den Punkt der Überwindung der Haftreibung des ASURO-Getriebes und Motor erkennen. Wird die Motorgeschwindikeit von scnell nach langsam verändert ist die minimal erreichbare Geschwindigkeit wie zu erwarten niedriger.
stochri
Ja, danke, das war es, Leerlaufgeschwindigkeit bei der blauen Kurve, jetzt ist es mir klar. Das andere ist dann mit low friction.
Manfred
@stochri
Die Messwerte wurden vom Atmega während der Fahrt aufgenommen und gespeichert. Danach auf Anfrage(Tastendruck) ausgelesen. Dann vom Hyperterminal nach Excel kopiert und das Diagramm erstellt.Zitat:
Stammen die Messwerte vom Atmega selbst, oder hast du extern gemessen ?
Waste
So, ich hab jetzt den Asuro dazu gebracht, sich mit der Geschwindigkeit von 1cm/sec zu bewegen. Eine Fahrt kann man es aber nicht wirklich nennen, es ist mehr ein Gehoppel. Aber er bewegt sich exakt mit 1cm/sec, sowohl auf Teppich als auch auf glattem Untergrund. Das Testprogramm ist angehängt.
Das Prinzip ist, dass er sich alle 0.3sec um 3mm fort bewegt. Die 3mm entsprechen einem Encoder-Tick. Damit er die Haftreibung auch bei schwerem Gelände überwindet, ist eine PWM von 120 eingestellt. Dadurch bewegt er sich ruckartig. Mit dem PWM-Wert kann man noch variieren, aber zu klein darf er nicht werden, sonst läuft er nicht an und zu gross auch nicht, sonst macht er gleich 2 Ticks auf einmal.
Mit dem Testprogramm kann man per Tastendruck die Geschwindigkeit von 0.2cm/sec bis 5cm/sec verändern. Siehe dazu den Sourcecode.
Waste
Code:/*******************************************************************************
*
* Description: Schleichfahrt
*
*****************************************************************************/
#include "asuro.h"
#include <stdlib.h>
int main(void)
{
unsigned char flagl, flagr, links, rechts, weiter, sw;
unsigned int data[2], dt;
unsigned long zeit;
Init();
MotorDir(BREAK,BREAK);
MotorSpeed(120,120);
OdometrieData(data);
OdometrieData(data);
if (data[0] > 600) flagl = TRUE; // Flag setzen
else flagl = FALSE;
if (data[1] > 600) flagr = TRUE; // Flag setzen
else flagr = FALSE;
dt=300;
zeit=Gettime();
zeit += dt;
while(1){
if (Gettime() > zeit){
links = FWD; rechts = FWD;
MotorDir(FWD,FWD);
weiter = 1;
while(weiter){ // fahre einen Schritt
OdometrieData(data); // messe Odometrie
if ((data[0] < 550) && (flagl == TRUE)) {flagl = FALSE; links = BREAK;}
if ((data[0] > 650) && (flagl == FALSE)) {flagl = TRUE; links = BREAK;}
if ((data[1] < 550) && (flagr == TRUE)) {flagr = FALSE; rechts = BREAK;}
if ((data[1] > 650) && (flagr == FALSE)) {flagr = TRUE; rechts = BREAK;}
MotorDir(links,rechts);
if ((links == BREAK) && (rechts == BREAK)) weiter = 0;
}
zeit += dt;
}
sw = PollSwitch();
if (sw & 0x01)
dt = 60; //5cm/sec
if (sw & 0x02)
dt = 100; //3cm/sec
if (sw & 0x04)
dt = 150; //2cm/sec
if (sw & 0x08)
dt = 300; //1cm/sec
if (sw & 0x10)
dt = 600; //0.5cm/sec
if (sw & 0x20)
dt = 1500; //0.2cm/sec
}
while(1);
return 0;
}