MOTOR

 avatar
unknown
c_cpp
6 days ago
6.3 kB
0
Indexable
#include <SPI.h>
#include <SimpleFOC.h>

// Определение пинов для первого SPI (VSPI) M1 (Left)
#define VSPI_MISO 13
#define VSPI_MOSI 11
#define VSPI_SCLK 12
#define VSPI_CS1 10

// Определение пинов для второго SPI (HSPI) M2 (Rigth)
#define HSPI_MISO 17
#define HSPI_MOSI 18
#define HSPI_SCLK 15
#define HSPI_CS2 16

// Объявление объектов SPI
SPIClass* vspi = NULL;
SPIClass* hspi = NULL;

SPIClass SPI_1(SPI);   // Создаем объект для HSPI (SPI_2)
SPIClass SPI_2(HSPI);  // Создаем объект для HSPI (SPI_2)

MagneticSensorSPI sensor1 = MagneticSensorSPI(VSPI_CS1, 14, 0x3FFF);
MagneticSensorSPI sensor2 = MagneticSensorSPI(HSPI_CS2, 14, 0x3FFF);

// Объявление моторов
BLDCMotor motor1 = BLDCMotor(14);
BLDCDriver3PWM driver1(47, 48, 6, 7);

BLDCMotor motor2 = BLDCMotor(14);
BLDCDriver3PWM driver2(4, 5, 1, 2);

Commander command = Commander(Serial);
void doTarget1(char* cmd) { command.scalar(&target1, cmd); }
void doTarget2(char* cmd) { command.scalar(&target2, cmd); }
void doMode(char* cmd)    { command.scalar(&scannerState, cmd); }
void doMotor1(char* cmd)  { command.motor(&motor1, cmd); }
void doMotor2(char* cmd)  { command.motor(&motor2, cmd); }

void initMotors() {
  SimpleFOCDebug::enable(&Serial);

  command.add('T', doTarget1, "target1: ");
  command.add('R', doTarget2, "target2: ");
  command.add('S', doMode, "Mode: ");
  command.add('M', doMotor1, "M1");
  command.add('N', doMotor2, "M2");

  vspi = new SPIClass(SPI);
  hspi = new SPIClass(HSPI);

  vspi->begin(VSPI_SCLK, VSPI_MISO, VSPI_MOSI, VSPI_CS1);
  //vspi->setFrequency(1000000);
  sensor1.init(vspi);

  // Настройка второго SPI
  hspi->begin(HSPI_SCLK, HSPI_MISO, HSPI_MOSI, HSPI_CS2);
  //hspi->setFrequency(1000000);
  sensor2.init(hspi);

  // Инициализация первого мотора
  motor1.linkSensor(&sensor1);
  driver1.voltage_power_supply = 25;
  driver1.init();
  motor1.linkDriver(&driver1);

  motor1.voltage_limit = 10; 

  //motor1.foc_modulation = FOCModulationType::SpaceVectorPWM;
  motor1.controller = MotionControlType::torque;

  //motor1.useMonitoring(Serial);
  //motor1.monitor_variables = _MON_TARGET | _MON_VEL | _MON_VOLT_D; 

  motor1.init();
  motor1.pole_pairs = 14; //14
  motor1.initFOC();


  // Инициализация второго мотора
  motor2.linkSensor(&sensor2);
  driver2.voltage_power_supply = 25;
  driver2.init();
  motor2.linkDriver(&driver2);
  motor2.voltage_limit = 10;

  motor2.PID_velocity.P = 0.5;
  motor2.PID_velocity.I = 50;
  motor2.PID_velocity.D = 0.000;
  //motor2.PID_velocity.output_ramp = 1000;
  motor2.LPF_velocity.Tf = 0.01;
  
  motor2.P_angle.P = 20;

  //motor2.foc_modulation = FOCModulationType::SpaceVectorPWM;
  motor2.controller = MotionControlType::torque;

  motor2.useMonitoring(Serial);
  motor2.monitor_variables = _MON_TARGET | _MON_VEL | _MON_VOLT_D; 

  motor2.init();
  motor2.pole_pairs = 11; //14
  motor2.initFOC();

  /*
  //motor2.useMonitoring(Serial);

  //display variables
  motor2.monitor_variables = _MON_TARGET | _MON_VEL | _MON_ANGLE; 
  // downsampling
  motor2.monitor_downsample = 100; // default 10
  */
}

void motorLoop() {
  motor1.loopFOC();
  motor2.loopFOC();

  motor1.move(motor1Target); //Slave
  motor2.move(motor2Target); //Master

  //command.run();
}

void callCommand() {
  command.run();
  motor1.monitor();
  //motor2.monitor();
}

/*void motorsQP (int P) {
  motor1.PID_current_q = P;
  motor2.PID_current.P = P;
}*/

void motor1Enable(bool state) {
  if(state) motor1.enable();
  else motor1.disable();

  //Serial.println("Dissable Motors");
}

void motorsDissable() {
  motor1.disable();
  motor2.disable();

  Serial.println("Dissable Motors");
}

void motorsEnable() {
  motor1.enable();
  motor2.enable();

  Serial.println("Enable Motors");
}

/*
void motorRewind(bool state) {
  motor1.enable();
  motor2.enable();

  if (state) {
    motor1.controller = MotionControlType::velocity;
    motor1Target = 6;
    motor2.controller = MotionControlType::torque;
    motor2Target = 3;
    Serial.println("Enable Motors / Rewind");
  }

  else {
    motor1.controller = MotionControlType::torque;
    motor1Target = motor1TargetIsh;
    motor2.controller = MotionControlType::velocity;
    motor2Target = motor2TargetIsh;
    Serial.println("Enable Motors / Scan");
  }
}
*/
void motorsTest() {
  motor1.controller = MotionControlType::velocity;
  motor2.controller = MotionControlType::velocity;

  motor1Target = target1;
  motor2Target = target1;
  
  //Serial.println("Test Motors");
}

void motor2SetVL (int VL) {
  if (VL < 10 && VL > -10) motor2.voltage_limit = VL;
  else Serial.println("M2 VL Wrong!");
}

void motor2ControlTorque (bool torque) {
  if (torque) motor2.controller = MotionControlType::torque;
  else motor2.controller = MotionControlType::velocity;
}

void motor2ControlAngle (bool angle) {
  if (angle) {
    motor2.controller = MotionControlType::angle;
    motor2Target = motor2.shaft_angle;
    //Serial.print(motor2Target);
    //Serial.print(" / ");
    //Serial.println(sensor2.getAngle());
  }
  else motor2.controller = MotionControlType::velocity;
}

float motor2GetAngle () {
  return motor2.shaft_angle;
}

void initialTension(float target_torque, float ramp_time) {
  float start_time = millis();  // Текущее время в секундах
  float current_torque = 0;

  while (current_torque < target_torque) {
    float elapsed_time = millis() - start_time;
    current_torque = (elapsed_time / ramp_time) * target_torque;

    if (current_torque > target_torque) {
      current_torque = target_torque;
    }

    // Применяем одинаковый крутящий момент к обоим моторам
    motor1.move(-current_torque*motorDiff);
    motor2.move(current_torque);  // Обратный знак для второго мотора

    motor1.loopFOC();
    motor2.loopFOC();
  }
}
Leave a Comment