- LiFePO4 Speicher Test         
Ergebnis 1 bis 4 von 4

Thema: Anfängerfehler? Doppelte PWM

  1. #1
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8

    Anfängerfehler? Doppelte PWM

    Anzeige

    Powerstation Test
    Hallo,

    bisher kannte ich PWM berufsbedingt nur bei Motoren mit mehreren KW Leistung. Nachdem ich mich nun ein wenig in die Materie eingelesen habe und die Umsetzung in ein c-Programm auch halbwegs funktioniert sollte ich ja eigentlich zufrieden sein. Aber leider bin ich mit diesen neuen Kenntnissen auch in der Lage zu erkennen, das der asuro die PWM schon serienmässig eingebaut hat ( den Hinweis darauf habe ich im asuro-wiki nicht gefunden). Aber egal, ich wollte ja was lernen, hier noch mein bisheriger Code:
    Code:
    /* asuro fährt endlos drehend in zwei Richtungen mit selbstgebauter
       Pulsweitenmodulation und Sanftanlauf
    
       mic 6.1.2006
    */
    
    #include <asuro.h>
    
    unsigned long step_delay,loop_count;
    unsigned char run_flag, step;
    
    unsigned char pwm_tick_l, pwm_duty_l, pwm_bit_l, pwm_speed_l;
    unsigned char pwm_tick_r, pwm_duty_r, pwm_bit_r, pwm_speed_r;
    unsigned long pwm_rampe_l; pwm_rampe_r;
    
    int pwm(void) {
    
        StatusLED(OFF);
        if ((loop_count > pwm_rampe_l) && (pwm_speed_l != pwm_duty_l)) {
            if (pwm_duty_l < pwm_speed_l) {
                pwm_duty_l++;
            } else {
                pwm_duty_l--;
            }
            pwm_rampe_l=loop_count+500; // Steilheit Rampe
            StatusLED(RED);
        }
        if ((loop_count > pwm_rampe_r) && (pwm_speed_r != pwm_duty_r)) {
            if (pwm_duty_r < pwm_speed_r) {
                pwm_duty_r++;
            } else {
                pwm_duty_r--;
            }
            pwm_rampe_r=loop_count+500;
            StatusLED(RED);
        }
    
        pwm_tick_l++; pwm_tick_r++;
        if (pwm_tick_l >= 255) pwm_tick_l=0;
        if (pwm_tick_r >= 255) pwm_tick_r=0;
    
        if ((pwm_duty_l) && (pwm_tick_l <= pwm_duty_l)) pwm_bit_l=255; else pwm_bit_l=0;
        if ((pwm_duty_r) && (pwm_tick_r <= pwm_duty_r)) pwm_bit_r=255; else pwm_bit_r=0;
    
        MotorSpeed(pwm_bit_l,pwm_bit_l); // verflucht, rechte Seite funzt nicht
        BackLED(pwm_bit_l,pwm_bit_r);
    }
    
    void Motor(unsigned char speed_l, unsigned char speed_r) {
        pwm_speed_l=speed_l;
        //pwm_duty_l=speed_l;  // ohne Sanftanlauf
    
        pwm_speed_r=speed_r;
        //pwm_duty_r=speed_r;
    
        step_delay=loop_count+100000;
    }
    
    int main(void) {
    Init();
    run_flag=1; step=0; loop_count=0;
    pwm_duty_l=0; pwm_speed_l=0; pwm_rampe_l=0; pwm_tick_l=0;
    pwm_duty_r=0; pwm_speed_r=0; pwm_rampe_r=0; pwm_tick_r=0; // oder Tick=128 für Phasenverschiebung l/r
    
    SerWrite("\nHallo\nBatterie: ",17);
    PrintInt(Batterie());
    
    MotorSpeed(0,0);
    MotorDir(BREAK,BREAK);
    
    do {
        loop_count++;
        if (loop_count > step_delay)             
            switch (step) {
            case 0: MotorDir(FWD,RWD); step++; break;
            case 1: Motor(150,150); step++; break;
            case 2: Motor(0,0); step++; break;
            case 3: MotorDir(RWD,FWD); step_delay=loop_count+200; step++; break;
            case 4: Motor(150,150); step++; break;
            case 5: Motor(0,0); step=0; break;
    
            case 6: MotorDir(BREAK,BREAK); step++; break;
            case 7: run_flag=0; break;
            }
    
        pwm();
    }while (run_flag);
    
    StatusLED(RED);
    MotorSpeed(0,0);
    MotorDir(BREAK,BREAK);
    while (1);
    return 0;
    }
    Kann man natürlich noch viel optimieren, aber da es völlig unnötig ist werde ich mich jetzt auf die Weg- und Geschwindigkeitsmessung stürtzen. Übrigens fährt mein asuro beim Testen fast immer im Kreis

    Gruß

    mic
    Angehängte Dateien Angehängte Dateien
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  2. #2
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    37
    Beiträge
    4.063
    dass der asuro im kreis fährt ist einer der größten hindernisse (oder anreize, wie mans sieht) des asuro. das liegt an bauteiltoleranzen (geringe qualität, für kleinen preis) verschiedene kraft der motoren, widerstandstoleranzen, lötstellen, usw.). die kunst, den asuro geradeausfahren zu lassen, ist eine der bekanntesten und beliebtesten... aber eine selbstentwickelte pwm ist was feines, hab ich noch nicht gesehn =)
    sieh es nicht als fehler, sondern als kunst... =)
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    29.12.2006
    Ort
    Bayern
    Alter
    69
    Beiträge
    41
    Alle Achtung!
    An dem Erstellungszeitpunkt Deines Beitrages kann man erkennen, dass Du Dich mit dem Problem auseinander gesetzt hast.....
    Eleganter Ansatz, den Du da hast.
    Ich bin momentan auch dabei ein Programm zu entwickeln, dass der Asuro geradeaus fährt - natürlich ohne der bequemen vorhandenen Routinen wie Go etc. Ich sehe das auch als Herausforderung an.
    Die Programmierung in C macht schon Spaß...
    Der Urlaub ist jetzt leider zu Ende. Mal schauen, ob ich das noch hinbringe.
    Mein Asuro fährt leider noch zick/zack.

    Grüße, Hans

  4. #4
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Ja, dass macht Spass, der asuro ist für die paar Euro auch recht genial, vergleichbar mit dem zx81 damals. *schwärm*

    Tja, mein Urlaub ist auch bald vorbei, aber ich denke, die Basics habe ich geschafft.

    Mein asuro fährt natürlich deswegen im Kreis damit ich ihm nicht immer nachrennen muss. Die meisten Testprograme hier jagen ihn immer quer durchs Zimmer...

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Berechtigungen

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

Solar Speicher und Akkus Tests