-         

Ergebnis 1 bis 2 von 2

Thema: MD25 encoder register problem

  1. #1

    MD25 encoder register problem

    Anzeige

    hi,

    ich habe ein emg30 motor und dazu md25 platine welche über I2C mit dem Atmel NGW100 board verbunden ist.

    Wenn ich die 4 Encoder register lese (z.b. alle 100ms) kriege beispielsweise alle 20 werte einen falschen zähler wert geliefert, der nächste ist dann wieder ok.

    Ich sende mit setspeed z.b. 128 (also motor stop), lese dann die encoder register, der zu lesende wert müsste ja insgesamt 0 sein, jedoch auf die einzelnen register gesehen steht in einem der wert 0xff.

    Beispiel für was ich meine:

    reg1 : 0 reg2: 0 reg3:0 reg4:0
    reg1 : 0 reg2: 0 reg3:255 reg4:0
    reg1 : 0 reg2: 0 reg3:0 reg4:0
    reg1 : 0 reg2: 0 reg3:0 reg4:0
    ...
    reg1 : 255 reg2: 0 reg3:0 reg4:0
    reg1 : 0 reg2: 0 reg3:0 reg4:0



    Code:
    long MD25_getTicks(int address,int motor){
    //	printf("MD25_getTicks\n");
    	long speed=0;
    
    	if (ioctl(device_file,I2C_SLAVE,address) < 0) {
    		printf("I2C_SLAVE Error!\n");
    		return -1;
    	}
    
    	if(motor==0)buf[0]=MD25_ENC_1A;
    	else buf[0]=MD25_ENC_2A;
    	if(read(device_file,buf,1)!=1){
    		printf("I2C Read Error!\n");
    		return -1;
    	}
    	speed=buf[0]<<24;
    //	printf("0x%x ",buf[0]);
    	if(motor==0)buf[0]=MD25_ENC_1B;
    	else buf[0]=MD25_ENC_2B;
    	if(read(device_file,buf,1)!=1){
    		printf("I2C Read Error!\n");
    		return -1;
    	}
    	speed+=buf[0]<<16;
    //	printf("0x%x ",buf[0]);
    	if(motor==0)buf[0]=MD25_ENC_1C;
    	else buf[0]=MD25_ENC_2C;
    	if(read(device_file,buf,1)!=1){
    		printf("I2C Read Error!\n");
    		return -1;
    	}
    	speed+=buf[0]<<8;
    //	printf("0x%x ",buf[0]);
    	if(motor==0)buf[0]=MD25_ENC_1D;
    	else buf[0]=MD25_ENC_2D;
    	if(read(device_file,buf,1)!=1){
    		printf("I2C Read Error!\n");
    		return -1;
    	}
    	speed+=buf[0];
    
    	return speed;
    }

    kann jemand bitte helfen, oder hat erfahrung damit.

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    31.05.2009
    Beiträge
    251
    Das Problem habe ich mit dem MD23 in ähnlicher Form auch.

    Bei mir "hüpft" der Wert (sporadisch) in relativ großen Sprüngen.

    Nachdem der 3. Umbau des I2C-Busses (da hängen noch mehrere Teilnehmer dran) nichts gebracht hat, habe ich folgende (Not)-Lösung angewendet:

    - do
    - GelesenWert von MD23 holen
    - Delta = abs (GelesenWert - AltWert)
    - wiederholen bis Delta < Toleranz

    - AltWert = GelesenWert

    "Toleranz" ist abhängig von der Geschwindigkeit des Antriebes und der Zykluszeit des Auslesens. Bei meiner Maschine auf 1000 gesetzt !

    Ich hoffe, das hilft Dir erstmal weiter. \/

Berechtigungen

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