- 12V Akku mit 280 Ah bauen         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 17 von 17

Thema: Fragen zum Setup (omnidirektional gesteuerter Roboter)

  1. #11
    Neuer Benutzer Öfters hier
    Registriert seit
    24.06.2009
    Beiträge
    21
    Anzeige

    Powerstation Test
    bin nun dabei den Motortreiber MD23 zu programmieren, nur wie bekommen ich zugriff auf ihn? angeschlossen ist er am I2C bus.

    in Bascom sind die Befehle einigermaßen verständlich:

    i2c_start
    i2c_sendebyte(slaveid)
    i2c_sendebyte(wert1)
    i2c_sendebyte(wert2)
    i2c_stop

    aber wie mache ich das in C?
    kann mir vielleicht jemand diese Befehle in C übersetzen?
    danke

  2. #12
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.01.2006
    Beiträge
    4.555
    Gute Frage, von C habe ich leider keine Ahnung. Habe das
    früher mal in ASS selber geprogt, im Datenblatt ist das Protokoll
    und das Timing zu finden. War nicht besonders schwer, einfach
    das entsprechende Byte seriell bitweise rausschieben.
    sift Px.y
    tackt Toggle x
    sift px.y
    u.s.w. Natürlich in ner schleife für 8 Bit...
    Die Geschwindigkeit muß matürlich mit nop oder ähnlich
    gebremst werden, zumindenst in Ass. Zu langsam gibt
    es dabei nicht aber zu schnell schon.


    Ich vermute aber das es in C auch ne Lib mit ensprechenden
    Funktionen gibt. In Bascom sind diese Funktionen halt schon
    in der Standart Lib die automatisch von Bascom geladen wird
    enthalten.

  3. #13
    Neuer Benutzer Öfters hier
    Registriert seit
    24.06.2009
    Beiträge
    21
    ja ich denke auch dass es so eine "I2C Master/Slave Lib" doch geben sollte, wäre schön die zu haben

    weiß denn jemand wo ich die bekommen kann?

  4. #14
    Neuer Benutzer Öfters hier
    Registriert seit
    24.06.2009
    Beiträge
    21
    habe gerade so etwas in der art gefunden: eine I2C Master Library von Peter Fleury:

    http://homepage.hispeed.ch/peterfleu...ware.html#libs

    hier die datei i2cmaster.zip

    hab gerade meine motoren ansteuern können, wunderbar =)

    ich werde jetzt die platform fertigen lassen und die motoren drauf schrauben, dann gibts ein bild (dauert aber wahrschienlich ein paar wochen)

  5. #15
    Neuer Benutzer Öfters hier
    Registriert seit
    24.06.2009
    Beiträge
    21
    so nach einer langen pause bin ich wieder am projekt, die fertigung mancher teile dauert ewig, die grundplatte steht und ich bin nun damit beschäftigt mir die software zu erarbeiten.

    Hardware immer noch die selbe:
    PC --> RS232 --> RN-Control --> 2 x Motortreiber MD23 --> 3 x EMG Motoren

    ich arbeite mit AVR studio 4 und habe zur zeit folgendes problem:

    ich möchte zum test die Werte der Drehgeber der EMG motoren über die RS232 schnittstelle ins Hyperterminal senden, im MD23 Testprogramm md23drehzahl.bas funktioniert das auch schon.
    ich möchte aber nun mit AVR studio in C programmieren und bei einem tastendruck die motoren beschleunigen, drehgeberpositionen lesen und an hyperterminal senden.

    im Bascom beispiel sieht der teil so aus:

    Code:
    Case 4 Zaehler = Md23_impulse(1) 
    Umdrehungen = Zaehler / 360 
    Print "Impulse: " ; Zaehler ; " Umdrehungen: " ; Umdrehungen
    
    .
    .
    .
    
    Function Md23_impulse(byval Motor As Byte) As Long
    Local W1 As Byte
    Local W2 As Byte
    Local W3 As Byte
    Local W4 As Byte
    Local Impulse As Long
    Local I2cread As Byte
    
    
      I2cread = Md23_slaveid + 1
    
      If Motor = 1 Then
        I2cstart
        I2cwbyte Md23_slaveid
        I2cwbyte 2                                              'Leseregister festlegen
        I2cstop
      Else
        I2cstart
        I2cwbyte Md23_slaveid
        I2cwbyte 6                                              'Leseregister festlegen
        I2cstop
      End If
    
       I2cstart
       I2cwbyte I2cread
       I2crbyte W1 , Ack
       I2crbyte W2 , Ack
       I2crbyte W3 , Ack
       I2crbyte W4 , Nack
       I2cstop
    
       Impulse = 0
       Impulse = Impulse Or W1
       Shift Impulse , Left , 8
       Impulse = Impulse Or W2
       Shift Impulse , Left , 8
       Impulse = Impulse Or W3
       Shift Impulse , Left , 8
       Impulse = Impulse Or W4
    
    
       Md23_impulse = Impulse
    End Function
    kann mir jemand sagen wie ich in C bytes aus einem register lese und über RS232 senden kann?
    das senden von Text über RS232 mit USART funktioniert, allerdings weiß ich nicht wie ich das register des motortreibers zugreifen auslesen kann und an hyperterminal übermittel.

    benutze ich die funktion USART_Transmit(); oder besser sendUSART(); wie im C-Demoprogramm?

    ich habe es so probiert, bekomme allerdings nur immer die gleichen festen werte:

    Code:
    	unsigned char position;
    	char buf [4];
    
    	sendUSART("\r\n Drehgeberwerte: ");
    	i2c_init();
    	i2c_start(0xB0);			//Adresse des Motortreiber 1
    	i2c_write(0xB2);			//Adresse Byte 1 Drehgeber 1 Position (aus MD23 Datenblatt)
    	i2c_rep_start(0xB0+I2C_READ);
    	position = i2c_readNak();
    	sprintf(buf, "%03d", position);
    	sendUSART(buf);
    	i2c_stop();

    über hilfe wäre ich sehr dankbar

  6. #16
    Neuer Benutzer Öfters hier
    Registriert seit
    24.06.2009
    Beiträge
    21
    wie kann ich außerdem den Titel des Threads ändern?

    thx

  7. #17
    Neuer Benutzer Öfters hier
    Registriert seit
    24.06.2009
    Beiträge
    21
    okay ich habe das problem mit dem auslesen des drehgebers gelöst, aber brauche noch hilfe beim feinschliff:

    habe jetzt diesen, zugegeben umständlichen, code zum motor beschleunigen, drehgeberbytes auslesen und abbremsen geschrieben:

    Code:
    char buffa [4];
    char buffb [4];
    char buffc [4];
    char buffd [4];
    int dataa;
    int datab;
    int datac;
    int datad;
    
    /*### Drehgebertest ### */ 
    void vor(void)
    {
    
    	i2c_init();			
    	i2c_start(0xB0);	//Slave Adresse des Motortreiber 1
    	i2c_write(0x00);	//Motor 1
    	i2c_write(0xFF);	//vorwärts
    	i2c_stop();
    
    	waitms(200);
    
    
    	i2c_start(0xB0);	//Slave Adresse des Motortreiber 1
    	i2c_write(0x02);	//Byte 2 Drehgeber 1 Position (aus MD23 Data Sheet)
    	i2c_stop();
    
    	i2c_start(0xB1);	//Slave Adresse Motortreiber 1 + 1 Bit für Leserichtung
    	dataa = i2c_read(1);	//Lesen
    	datab = i2c_read(1);
    	datac = i2c_read(1);
    	datad = i2c_read(0);
    
    	i2c_stop();
    
    
    	sprintf(buffa, "%01d", dataa);	//in char umwandeln
    	sprintf(buffb, "%01d", datab);
    	sprintf(buffc, "%01d", datac);
    	sprintf(buffd, "%01d", datad);
    	
    	sendUSART("\r\n Impulse: ");	//senden
    	sendUSART(buffa);
    	sendUSART(buffb);
    	sendUSART(buffc);
    	sendUSART(buffd);
    	
    	sendUSART("\r\n Umdrehungen: ");
    	
    // hier brauche ich noch eine Umwandlung von den Impulsen zu den Umdrehungen...
    
    
    
    	waitms(200);
    
    	i2c_start(0xB0);	//Motortreiber 1
    	i2c_write(0x00);	//Motor 1
    	i2c_write(0x80);	//anhalten
    	i2c_stop();
    
    }
    und es wird mir folgendes am hyperterminal ausgegeben:

    Bild hier  

    leider bekomme ich manchmal eine 8 stellige zahl, manchmal auch nur eine 6 oder 7 stellige

    außerdem: wie kann ich aus den 4 werten die dann zu den impulsen zusammengesetzt werden ein int machen den ich dann durch 360 teilen kann um so die umdrehungen anzuzeigen?

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

Solar Speicher und Akkus Tests