- LiFePO4 Speicher Test         
Seite 3 von 5 ErsteErste 12345 LetzteLetzte
Ergebnis 21 bis 30 von 46

Thema: "Vereinfachung" von radbruchs Servoansteuerung mög

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

    Praxistest und DIY Projekte
    Hallo

    Blinkt die FrontLED? Wird dein Mega32 auch mit 8MHz getacktet? Funktioniert Sleep()? Funktioniert das:
    Code:
    void servo(unsigned char winkel){
    unsigned int count=0;
    do{
       count++;
       //Servo(ON,ON,ON);
       if (ON || ON || ON) {
          DDRB |= (1 << PB5) | (1 << PB6) | (1 << PB7);
          PORTB |= (1 << PB5) | (1 << PB6) | (1 << PB7);
       }
       FrontLED(ON);
       Sleep(winkel);
       //Servo (OFF,OFF,OFF);
       if (!OFF) PORTB &= ~(1 << PB7);
       if (!OFF) PORTB &= ~(1 << PB6);
       if (!OFF) PORTB &= ~(1 << PA5);
       FrontLED(OFF);
       Sleep(255); Sleep(255); Sleep(255);
    }while (count<servo_stellzeit);
    }
    Wenn nicht, funktioniert es ohne ifs?

    Ähm, ich seh grad, du hast auch LEDs eingebaut. Liegen die Signalleitungen der Servos direkt am Pin des Kontrollers oder nach dem Vorwiderstand parallel zur LED ?
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  2. #22
    Erfahrener Benutzer Roboter Genie Avatar von pinsel120866
    Registriert seit
    18.12.2007
    Ort
    Hohenems
    Alter
    58
    Beiträge
    847
    Hi radbruch,

    die FrontLED blinkt, ich vermute dass der Atmega mit 16MHz getaktet wird, wo kann ich das nachsehen? Dein Code läuft auch nicht, die LEDs habe ich in Serie zwischen Widerstand und Servostecker.

    Sieht aus, als ob ich hier einiges verbockt habe,oder?

  3. #23
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Die LEDs sollten vom Kontrollerpin über den Vorwiderstand gegen GND geschaltet sein (so wie z.b. die FrontLED). Ebenfalls direkt vom Kontrollerpin (sicherheitshalber auch mit Vorwiderstand) sollten die Servosteuerleitungen abgehen.

    Wenn deine aktuelle Schaltung vom Kontrollerpin über den Vorwiderstand und über die LED zum Servosteueranschluß geht kannst du für einen schnellen Test die LED überbrücken.

    Da die Sleep()-Befehle für den 8MHz-asuro gedacht sind musst du für 16MHz die Werte verdoppeln bzw. die Befehle zweimal ausführen.
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  4. #24
    Erfahrener Benutzer Roboter Genie Avatar von pinsel120866
    Registriert seit
    18.12.2007
    Ort
    Hohenems
    Alter
    58
    Beiträge
    847
    Ich habe nun die LEDs nach deinen Tipps parallel geschalten und den Kontrollerpin via Vorwiderstand an den Servoesteueranschluß angeschlossen. Danach folgendes Programm geflasht:

    Code:
    #include "asuro.h" 
    
    unsigned char i, servo_stellzeit; 
    
    void servo(unsigned char winkel){ 
    unsigned int count=0; 
    do{ 
       count++; 
       //Servo(ON,ON,ON); 
       if (ON || ON || ON) { 
          DDRB |= (1 << PB5) | (1 << PB6) | (1 << PB7); 
          PORTB |= (1 << PB5) | (1 << PB6) | (1 << PB7); 
       } 
       FrontLED(ON); 
       Sleep(winkel); 
       Sleep(winkel);
       //Servo (OFF,OFF,OFF); 
       if (!OFF) PORTB &= ~(1 << PB7); 
       if (!OFF) PORTB &= ~(1 << PB6); 
       if (!OFF) PORTB &= ~(1 << PA5); 
       FrontLED(OFF); 
       Sleep(510); Sleep(510); Sleep(510); 
    }while (count<servo_stellzeit); 
    } 
    
    
    int main(void) { 
    
    Init(); 
    BackLED(OFF,OFF); 
    do{ 
    servo_stellzeit=35; 
    servo(51); 
    servo(90); 
    servo(51); 
    servo(15); 
    servo_stellzeit=2; 
    for (i=15; i<88; i+=2) servo(i); 
    for (i=90; i>17; i-=2) servo(i); 
    }while (1); 
    return 0; 
    }
    Wenn ich nun einschalte, machen die Servos eine kleine Dehung (ca. 2Grad) gegen den Uhrzeigersinn, das war's. Beim nächsten Einschalten wieder, und das so lange bis die Servos auf Anschlag sind.

    Aber das Programm macht doch etwas anderes, FrontLED leuchtet auch nicht...

    An den Servosteuerpins messe ich 1,6 Volt. Batteriespannung: 5 Volt

  5. #25
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Sleep(510); Sleep(510); Sleep(510);

    Das müßte massige Fehler ergeben, Sleep() erwartet doch ein Byte als Parameter.

    Halte doch mal fliegend eine Steuerleitung an die FrontLED. Und entferne testweise die IFs bzw. ändere nach if(1).... Wo und wie sind denn ON und OFF definiert?

    Nanu: if (!OFF) PORTB &= ~(1 << PA5);
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  6. #26
    Erfahrener Benutzer Roboter Genie Avatar von pinsel120866
    Registriert seit
    18.12.2007
    Ort
    Hohenems
    Alter
    58
    Beiträge
    847
    Ich habe nun die Servosteuerleitung nur des Mittleren Servos direkt an den PIN gehängt, also LED und Widerstand überbrückt.

    Program:
    Code:
    #include "asuro.h" 
    
    unsigned char i, servo_stellzeit; 
    
    void servo(unsigned char winkel){ 
    unsigned int count=0; 
    do{ 
       count++; 
       if (ON || ON || ON) { 
          DDRB |= (1 << PB6); 
          PORTB |= (1 << PB6); 
       } 
       FrontLED(ON); 
       Sleep(winkel);
       Sleep(winkel);
    
       if (!OFF) PORTB &= ~(1 << PB6); 
    
       FrontLED(OFF); 
       Sleep(255); Sleep(255); Sleep(255); 
       Sleep(255); Sleep(255); Sleep(255); 
    }while (count<servo_stellzeit); 
    } 
    
    
    int main(void) { 
    
    Init(); 
    BackLED(OFF,OFF); 
    do{ 
    servo_stellzeit=35; 
    servo(51); 
    servo(90); 
    servo(51); 
    servo(15); 
    servo_stellzeit=2; 
    for (i=15; i<88; i+=2) servo(i); 
    for (i=90; i>17; i-=2) servo(i); 
    }while (1); 
    return 0; 
    }
    Servo macht das gleiche, FrontLED blinkt schnell, flackert also. An der Steuerleitung messe ich nun 5V.

  7. #27
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Vorsichtshalber noch so versuchen:
    Code:
    void servo(unsigned char winkel){
    unsigned int count=0;
    do{
       count++;
    
    	DDRB |= (1 << PB6);
       PORTB |= (1 << PB6);
    
    	FrontLED(ON);
       Sleep(winkel);
       Sleep(winkel);
    
    	PORTB &= ~(1 << PB6);
    
    	FrontLED(OFF);
       Sleep(255); Sleep(255); Sleep(255);
       Sleep(255); Sleep(255); Sleep(255);
    }while (count<servo_stellzeit);
    }
    Hast du eigentlich die Timerprescaler in asuro.c für deine 16MHz angepasst? Die orginalen Sleepwerte passen zu einer 36kHz-ISR wie sie der asuro in den erweiterten Libs verwendet.
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  8. #28
    Erfahrener Benutzer Roboter Genie Avatar von pinsel120866
    Registriert seit
    18.12.2007
    Ort
    Hohenems
    Alter
    58
    Beiträge
    847
    Ich habe es jetzt probiert, keine Änderung. Was die Lib angeht, habe ich meine IR-Entfernungsmessungs-Lib für den Atmega32 verwendet. Wo muss ich ggf. in der asuro.c anpassen?

    Ich möchte mich an dieser Stelle für deine Geduld bedanken. Dieser Aufbau soll die Grundlagen für meinen Mehrbeiner sein, wenn er hoffentlich irgenwann einmal läuft.

  9. #29
    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

    Also irgendwie stecken wir fest.

    Wichtig ist zuerst mal er richtige Anschluß: Servo auf Vcc und GND, Servo-GND muss mit Kontroller-GND verbunden sein. Servo-Signal geht direkt auf den Kontrollerpin.

    Die Sleep-Zeiten müssen halbwegs stimmen. Mit der orginalen asuro-Lib erzeugt man so einen 1Hz-Blinktakt (pro Sekunde muss die FrontLED einmal blinken, also ca. 60 mal pro Minute):

    Code:
    int i;
    while(1)
    {
    FrontLED(ON);
    for(i=0; i<500; i++) Sleep(36);
    FrontLED(OFF);
    for(i=0; i<500; i++) Sleep(36);
    }
    Wenn das passt ist 36 der Wert für 1ms, 18 wäre dann für 0,5ms und 72 für 2ms usw... wenn es nicht passt musst du die 36 solange ändern bis halbwegs der Sekundentakt hinkommt.

    Ich möchte mich an dieser Stelle für deine Geduld bedanken.
    Kein Problem, allerdings gehen mir so langsam die Ideen aus. Vermutlich übersehen wir irgendwas elementares, wir sollten das Ganze mal "überschlafen"... Ich versuche es morgen mal mit meinem RP6, der hat ja auch einen Mega32.

    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!

  10. #30
    Erfahrener Benutzer Roboter Genie Avatar von pinsel120866
    Registriert seit
    18.12.2007
    Ort
    Hohenems
    Alter
    58
    Beiträge
    847
    Das passt, die FrontLED blinkt genau im Sekundentakt kleiner Teilerfolg, morgen sehen wir weiter - du hast Recht.

Seite 3 von 5 ErsteErste 12345 LetzteLetzte

Berechtigungen

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

12V Akku bauen