- LiFePO4 Speicher Test         
Seite 18 von 28 ErsteErste ... 81617181920 ... LetzteLetzte
Ergebnis 171 bis 180 von 278

Thema: Sensor für balancierenden 2-Rad Roboter

  1. #171
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.03.2005
    Ort
    Essenrode bei Braunschweig
    Beiträge
    182
    Anzeige

    Praxistest und DIY Projekte
    Hallo recycle,

    Bei meinem UCBalBot habe ich mit dem digitalen PSD Sensor eine Auflösung von etwa 0,5 Grad / Stufe erreicht.
    Der Neigungswinkel 0 liegt bei einem gemessenen Abstand von etwa 14 cm (RAWZERO).
    Eine einfach Linearisierung mit dem Faktor M_ALPHA um diesen Punkt der Kennlinie reicht aus.
    Siehe auch den beiliegenden Programmauszug.
    Der Gyro wird mit einem 10Bit ADC ausgewertet. Aufgrund des Rauschens und sonstiger Störungen
    sind davon aber höchstens 7-8Bit relevant. Deshalb müsste eine Auflösung von 0,5 bis 1 Grad/s / Stufe ausreichend sein.
    (Der CG-16 von Tokin hat eine Empfindlichkeit von etwa 90 Grad/s, das /100 ergibt 0,9 Grad/s)
    Code:
     /********************************************************
    | File:         	SensorGP2D02.c
    | Project:		UCBalBot
    | Authors:      	Ulrich Czarkowski
    |			u.czarkowski@t-online.de
    | Created:      	18.01.04 
    | last changes:		20.03.04 16:24
    |			
    | Description:  	IR remote balance control with const Timing
    |
    | 13.03.04 16:32 	First balancing on the spot for more than 20 sec
    | 			K [5, 6, 2, 2]
    | 21.03.04 20:37	K [6,6,2,2]
    |
    *****************************************************************/
    
    #include "irtv.h"
    #include <stdio.h>
    #include "qsmregs.h"
    
    /* Nokia remote control codes */
    
    #define CODE_0      0x6142
    #define CODE_1      0x61fd
    #define CODE_2      0x6102
    #define CODE_3      0x60fd
    #define CODE_4      0x6082
    #define CODE_5      0x617d
    #define CODE_6      0x6182
    #define CODE_7      0x607d
    #define CODE_8      0x6042
    #define CODE_9      0x61bd
                                   /* key      => function 	*/
    #define CODE_FWD    0x6112     /* "play"   => forward 	*/
    #define CODE_BACK   0x606d     /* "stop"   => backward 	*/
    #define CODE_LEFT   0x60ed     /* "rewind" => left 	*/
    #define CODE_RIGHT  0x61ed     /* "ffwd"   => right	*/
    #define CODE_STOP   0x61dd     /* "+"      => stop	*/
    #define CODE_STOPM  0x6122     /* "-"      => stop moving */
    #define CODE_BALAN  0x619D     /* "TIMER"  => balance	*/
    #define CODE_END    0x61a2     /* "power"  => end	*/
    #define CODE_OK     0x6166     /* "OK"     => tbd	*/
    
    /* Normal speed */
    #define NORMAL_V    0.03
    #define NORMAL_W    0.10
    
    /* angle calculation 	*/
    /* Sensor: GP2D120	*/
    #define MS 31742000	/* M-Strich * 1000 	*/
    #define BS 	 -6	/* B-Strich		*/
    #define KS     4000	/* K-Strich * 1000 	*/
    #define HR   116000	/* Sensor z-distance µm */
    #define BR    92000	/* Sensor x-distance µm */
    #define PI_BR    16	/* Rad/radius: (1/(180/PI/BR)) * 100 = 1605	*/
    
    /* angle calculation 	*/
    /* Sensor: GP2D02	*/
    #define M_ALPHA  50	/* 0.50 * 100 	*/
    #define M_ALPHAM -58	/* 0.50 * 100 	*/
    #define RAWZERO  78	/*   0 deg */
    #define RAWMIN	 29	/* +20 deg */
    #define RAWMAX  103	/* -20 deg */
    
    #define TILTSENSOR  2	/* ad channel 02 */
    #define GYROSENSOR  3	/* ad channel 03 */
    #define TEMPSENSOR  5	/* ad channel 05 */
    
    #define GYRONULL 615	/* Initial Null */
    #define TEMPNULL 631	/* Initial Temp 24°C */
    
    /* Gain of state space controller */
    #define K1	42
    #define K2	170
    #define K3	10
    #define K4	10
    #define	KNORM	1.0/100000.0
    #define FTORQUEMAX	1.9
    #define FTORQUEMIN	-1.9
    
    /* Integrating constant */
    #define KI	10
    #define Ti	21
    
    /* define Timings */
    #define TA	1	/*  1 * 10 ms = 10 ms cycle time */
    #define TVW	1	/*  1 * 10 ms = 10 ms VW-IRQ */
    
    /* define globals */
    int iAdcValue;
    int iGyroNull;
    static int tiltangle = 0;
    static int raw = 0;
    static int tiltraw = 0;
    static int iLastAngle = 0; 
    static int angle = 0;
    static int angle_velocity = 0;
    static int sim_angle = 0;
    static int torque = 0;
    static int k1_theta = 0; 
    static int k2_thetadot = 0;
    static int k3_x = 0;
    static int k3_x_old = 0;
    static int k4_xdot = 0;
    
    static float ftorque = 0;
    static float v = 0;
    static float w = 0;  
      
    /* define Handles */
    PSDHandle psd_handle;
    VWHandle vw_handle;
    TimerHandle timer_handle;
        
    /* num_code: 
    	returns the integer value for a numeric remote key (-1 for other keys) */
    
    int num_code(int code)
    {
        int i;
        const int CodeNum[10] =
            {CODE_0, CODE_1, CODE_2, CODE_3, CODE_4,
             CODE_5, CODE_6, CODE_7, CODE_8, CODE_9};
    
        for (i=0; i<10; i++) {
            if (code == CodeNum[i]) return i;
        }
        return -1;
    }
    
    
    /* num_input: wait for remote key 0..9 */
    
    int num_input(void)
    {
        int num;
        do {
            num = num_code(IRTVGet());
            if (num < 0) AUTone(500, 150);
        } while (num < 0);
        LCDPrintf("%d\n", num);
        return num;
    }
    
    /******************************************
    * iAdcRead(int iChan)	 
    * Disable Interrupt, clear SPIF, double Read 	
    *******************************************/
    
    int iAdcRead(int iChan)			
    {   int iMax;
        int i, dummy;
        iMax = 2;
          
        for (i = 0; i < iMax; i++)
        {
     	/* dummy = OSDisable(); */
     	iAdcValue = OSGetAD(iChan);
     	spsr = 0;			/* clear SPIF */
        	/* dummy = OSEnable(); */
        }
        return iAdcValue;				 
    }
    
    int iGyroInit(void)
    {   int i, iGyroValue = 0;
        for (i = 0; i < 1000; i++)
        {	
        	iGyroValue += iAdcRead(GYROSENSOR);
        }
        return (iGyroValue /1000);
    }
        
    
    /*************************************** 
    * Tilt angle measurement 
    * Sensor: GP2D02
    ***************************************/
    
    static int tiltangle_calc(void)	
    {   
        if (PSDCheck()) raw = PSDGetRaw(psd_handle); /* read value if valid */
        	if (raw > RAWMAX) raw = RAWMAX;		 	
        	else if (raw < RAWMIN) raw = RAWMIN;	
            tiltangle = (RAWZERO - raw)* M_ALPHA; 
        	tiltraw = raw;
        return tiltangle;
    }
    Gruß
    Ulli

    Carpe Diem

  2. #172
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    29.01.2004
    Beiträge
    2.441
    @Manf
    Hier ist gerade ein schönes Bild von der Sharp Messkurve mit dem Maximum (aus dem Datenblatt). Unter 10cm sollte man danach nicht gehen und auch von dem Maximum dort ein bisschen Sicherheitsabstand halten.
    Super. Habe gerade mal bei meinem alten Fahrgestell nachgemessen. Mit 8cm Höhe sitzt der Sensor da mittendrin im Maximum. Kein Wunder, dass ich mit den Messwerten nichts mehr anfangen konnte.
    Ich weiss noch, dass ich mir die Kurve im Datenblatt damals angesehen und extra Sicherheitsabstand vom Maximum gehalten habe.
    Als ich den Sensor dann später mal eine Etage tiefer montiert habe, habe ich da wohl nicht mehr drüber nachgedacht.
    Ich habe aber ehrlich gesagt auch nie versucht herauszufinden, warum die Messwerte plötzlich widersprüchlich waren.

    Jetzt kommt der Sensor erst mal an das neue Fahrgestell und wenn ich ihn da irgendwann nicht mehr brauche, kann ich ihn ja bei dem alten wieder in der richtigen Höhe montieren

  3. #173
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    29.01.2004
    Beiträge
    2.441
    Ich habe den Spannungsregler für die Versorgung der Motoren jetzt eingebaut und nu spielt meine Motorsteuerung völlig verrückt.

    Ich habe mie eine Schleife programmiert, die die Pulsweite für die PWM in 10er Schritten von 0 bis 1023 steigert.
    Die Motoren summen dann langsam los und das Summen wird merklich lauter. Soweit also OK.
    Bei PWM = 480 drehen die Motoren dann ganz langsam los.
    Das ist auch noch ok, ohne Regler ging es bei 380 los, aber da war die Spannung ja auch höher.
    Ab 500 Summen die Motoren dann aber plötzlich wíeder nur und bewegen sich nicht mehr. Bis PWM = 1000 wird das Summen mal lauter mal leiser, es geht aber nicht soweit, dass sich die Motoren drehen.
    Bei 1023 drehen sie dann plötzlich mit voller Kraft los.

    Kann es sein, dass sich der Spannungsregler und die PWM irgendwie überlagern oder beeinflussen?
    Der Regler ist ein LM317 und ausser einem L293D mit den Motoren hängt da nichts dran.

  4. #174
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.03.2005
    Ort
    Essenrode bei Braunschweig
    Beiträge
    182
    Kann es sein, dass sich der Spannungsregler und die PWM irgendwie überlagern oder beeinflussen?
    Der Regler ist ein LM317 und ausser einem L293D mit den Motoren hängt da nichts dran.
    Überbrücke doch mal den LM317. Wenn das gleiche passiert würde ich in der Software suchen.
    Wenn nicht, wären weitere Daten wie Beschaltung, Zwischentaktfrequenz etc. für die Untersuchung erforderlich.

  5. #175
    Super-Moderator Lebende Robotik Legende Avatar von Manf
    Registriert seit
    30.01.2004
    Ort
    München
    Alter
    71
    Beiträge
    13.098
    Zitat Zitat von datasheet LM317
    Ci is required when regulator is located an appreciable distance from power supply filter.
    Co is not needed for stability, however, it does improve transient response.
    Transient response (klingt irgendwie nach Feature nicht nach Schwäche):
    Hast Du noch vom letzten Netzteil einen "kleinen" Elko übrig?
    Man soll ja dann eine Diode vom Ausgang zum Eingang dazuschalten damit beim Abschalten der geladene Elko am Ausgang nicht den Regler belastet.
    Manfred

  6. #176
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    29.01.2004
    Beiträge
    2.441
    @UlliC
    Überbrücke doch mal den LM317. Wenn das gleiche passiert würde ich in der Software suchen.
    Hab die Software schon aus bis aufs wesentliche reduziert, alte Versionen ausprobiert usw.
    Daran kann es eigentlich nicht liegen.
    Reglr überbrücken, Spanung im Oszilloskop annsehen usw. kommt als nächstes dran. Dafür muss ich das Ding erst wieder auseinandernehmen und ein paar Pins zum Mesen usw. drauflöten.

  7. #177
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    29.01.2004
    Beiträge
    2.441
    @Manf
    Hast Du noch vom letzten Netzteil einen "kleinen" Elko übrig?
    Von welchem letzten Netzteil? Traust du mir etwas zu, dass ich Netzteile zerschiesse?

    Ich habe mir ne ganze Menge Elkos in unterschiedlichen Grössen gekauft, auch kleinere.
    Bei meinem Regler könnte ich schon eher vorstellen, dass es zuviele sind

    Habe die beschaltung hier abgekupfert: http://www.kreatives-chaos.com/index...e=festspannung
    2.Schaltbild, Einstellbarer Spannungsregler LM317
    Habe beide Dioden und alle 3 Kondensatoren drauf, allerdings nicht 100% überall dieselben Werte und Typen.
    R1 = 200; R2 = 5k und als Dioden hatte ich nur 1N4004 da.
    Für C1 habe ich einen Kerko 100nF , die beiden Elkos sind 1µF und 10µF.

  8. #178
    Super-Moderator Lebende Robotik Legende Avatar von Manf
    Registriert seit
    30.01.2004
    Ort
    München
    Alter
    71
    Beiträge
    13.098
    Von welchem letzten Netzteil? Traust du mir etwas zu, dass ich Netzteile zerschiesse?
    Bei mir wurden vor kurzem ein PC und ein Radio erneuert beide mit integriertem Netzteil. Speziell die Elkos aus dem alten PC sind für hohe Schaltstöme und hohe Temperaturen.

    Es wurde schon vorgeschlagen den LM317 testweise zu überbrücken. Eine Alternative ist, die Elkos auf der Ausgangsseite etwas größer zu machen. Ich habe es nicht ausprobiert aber ich dachte da schon an ein paar 1000µF.
    Im Betrieb hast Du ja zwei Motoren die synchron die Richtung wechseln. Die Stromspitzen könnten dabei schon ein bisschen größer werden als die 1-2A für die der LM317 gebaut ist. Ich könnte es mal beim 7805 ausprobieren wie die Spannung bei einer solchen Belastung aussieht.

    Oder hat es schon jemand gemessen?
    Manfred

  9. #179
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    29.01.2004
    Beiträge
    2.441
    Bei mir wurden vor kurzem ein PC und ein Radio erneuert beide mit integriertem Netzteil. Speziell die Elkos aus dem alten PC sind für hohe Schaltstöme und hohe Temperaturen.
    Da habe ich leider momentan nichts vorrätig und die grössten Elkos in meiner Sammlung haben 2200µF.
    Warm oder sogar heiss werden der Regler und die verwendeten Elkos momentan nicht.

    Die Stromspitzen könnten dabei schon ein bisschen größer werden als die 1-2A für die der LM317 gebaut ist.
    Was mich halt nur wundert ist, dass die Motoren bis PWM=1010 nur leise vor sich hinbrummen und bei 1023 laufen sie dann plözlich mit voller Kraft, selbst wenn ich sie recht schnell hin- und herschalte.
    Beim ständigen Richtungswechsel bei voller Spannung müssten doch auch Stromspitzen auftreten. Davon wird der Regler nichtmals lauwarm.
    Ich könnte es mal beim 7805 ausprobieren wie die Spannung bei einer solchen Belastung aussieht.
    Ich hatte die Motoren vorher am Motortreiber vom RN-Control, da funktionierte die Motorsteuerung einwandfrei.
    Da hingen sie an einem 7805, auf dem RN-Control ist allerdings ein 1000µF Elko drauf und es sind halt nur 5V.
    Mach dir keine Mühe mit dem Messen. Nachdem du dir die Mühe gemacht hast mir zu erklären wie mein Oszi funktioniert, kann ich das auch selber mal dranhalten. (sobald ich einen Pin zum messen aufs Board gelötet habe)

  10. #180
    Super-Moderator Lebende Robotik Legende Avatar von Manf
    Registriert seit
    30.01.2004
    Ort
    München
    Alter
    71
    Beiträge
    13.098
    Ich meine nicht dass die Schaltung thermisch überlastet wird.
    Ich hatte nur gerade die Schachtel mit den Elkos vor mir und habe überall 105°gelesen.

    Auch die Transient Response des LM317 wird nicht thermisch bedingt sein, sondern durch das Regelverhalten (zu hochohmig oder nicht schnell genug). Das es so deutlich auftreten kann hätte ich vorher auch nicht gedacht, aber nach dem beschriebenen Verhalten müsste es so etwas in der Richtung sein.

    Eine Erklärung wäre eine ohmsche Kopplung in den Sense Eingang:
    So etwas kommt vor, der Bezugspunkt für die Spannungsregelung so gewählt ist, dass ein Spannungsabfall auf der Leitung dem Sense Eingang eine steigende Spannung meldet und der LM317 abregelt.
    Das findet man eher, wenn man den Aufbau betrachtet und kritische Leitungen dick genug ausführt.

    Zu den Werten:
    2200F ist ja schon mal ein ordentlicher Wert mit dem man es versuchen kann.
    Der 7805 hat dem Motor dann wohl 5V geliefert und jetzt ist es etwas mehr mit größeren Anlaufströmen.
    Manfred

Seite 18 von 28 ErsteErste ... 81617181920 ... LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests