Serieel lezen en schrijven. uitleg nodig

Hallo,

Ik heb een nano ESP32-s3 die ik gebruik om een MKS_SERVO42D closed loop stepper driver aan te sturen. De driver heeft gelukkig een behoorlijke handleiding en het is mij gelukt om een aantal voorbeeld codes met wat aanpassingen succesvol uit te voeren. De voorbeelden zijn voor AVR bordjes dus niet alles werkt op de nano ESP32.

Ik wil een sketch maken waarin ik zo veel mogelijk functies van de driver verzamel. Die functie kan bijvoorbeeld zijn om naar een relatieve positie te gaan met een bepaalde snelheid, acceleratie etc etc. Na het aanroepen van de functie antwoord de driver of het is gelukt of niet etc.

Maar ik snap de handleiding niet goed wanneer het gaat om versturen van de bytes. Het ontvangen van de bytes denk ik wel onder controle te hebben omdat die reeks korter is en daarom makkelijker te identificeren wat wat is. Ik denk dat het misschien mis gaat bij mijn vertaling van de HEX bytes naar decimaal?

hieronder een stukje uit de code


void positionMode1Run(uint8_t slaveAddr, uint8_t dir, uint16_t speed, uint8_t acc, uint32_t pulses);

positionMode1Run(1, runDir, 300, 30, 320000);  //Slave address=1, speed=100RPM, acceleration=200, pulse number=32000 (10 circles)

void positionMode1Run(uint8_t slaveAddr, uint8_t dir, uint16_t speed, uint8_t acc, uint32_t pulses) {
  int i;
  uint16_t checkSum = 0;

  txBuffer[0] = 0xFA;                                //frame header (Hiermee start de reeks bytes)
  txBuffer[1] = slaveAddr;                           //slave address
  txBuffer[2] = 0xFD;                                //function code
  txBuffer[3] = (dir << 7) | ((speed >> 8) & 0x0F);  //High 4 bits for direction and speed 
  txBuffer[4] = speed & 0x00FF;                      //8 bits lower
  txBuffer[5] = acc;                                 //acceleration
  txBuffer[6] = (pulses >> 24) & 0xFF;               //Pulse bit31 - bit24
  txBuffer[7] = (pulses >> 16) & 0xFF;               //Pulse bit23 - bit16
  txBuffer[8] = (pulses >> 8) & 0xFF;                //Pulse bit15 - bit8
  txBuffer[9] = (pulses >> 0) & 0xFF;                //Pulse bit7 - bit0
  txBuffer[10] = getCheckSum(txBuffer, 10);          //Calculate checksum

  Serial1.write(txBuffer, 11);
}

hieronder verschijnt hopelijk het plaatje waarin ik met groen, oranje en blauw aangeef wat ik niet snap. Wat rode lijnen wat aangeeft welk HEX bij welke Byte hoort.

-BYTE 4 en BYTE 5 bestaat dus uit "01 40 02 00 00" waarna FA 00 het aantal pulsen geeft?
-dir = direction maar wat is Rev?
-in groen staan b7 tm b0. Dit zijn vast de bitjes in de byte maar snap hier niet de relatie tot "01 40 02 00 00"

Hieronder hopelijk de complete handleiding.

MKS SERVO42&57D_RS485 User Manual V1.0.4.pdf (1.9 MB)

Ik ken dit ding niet, maar omdat het over een stappenmotor gaat, zou Rev kunnen verwijzen naar revolutions, oftewel het aantal omwentelingen van de as.
Dus je geeft op welke richting, hoe vaak de as moet draaien, en hoe snel dat dan moet.
Het is wel vreemd dat je de snelheid met 12 bytes kunt aangeven, maar die revolutions maar met 3 bytes, dus maximaal 8 omwentelingen.
Valt me wel op dat onder b6-b4 -- staat, en bij de andere bits staat er nogmaals wat er ook boven staat.
Het zou me niets verbazen als die bits niet gebruikt worden.

De CRC is een checksum, via Google kun je uitvinden hoe dat werkt en waarom, is veel info over te vinden.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.