Simple FOC. Управление моментом

Написанный ниже пример написан с использованием библиотеки SimpleFoc. Оригинал вы найдете здесь. В качестве torque_controller укажите foc_current.

3KB
MotorTorqueControl_SimpleFOC.ino

Токовое управление FOC является единственным истинным подходом к управлению моментом. Он управляет двумя компонентами вектора тока q и d. Предполагается, что крутящий момент пропорционален компоненте тока q, а компонента тока d управляется так, чтобы оставаться равной 0.

Познакомиться с теорией векторного управления электродвигателем и подробнее почитать о компонентах q и d мы предлагаем в статье на хабре.

При управлении моментом, здесь в качестве управляющего воздействия подается максимальный потребляемый ток, когда двигатель прикладывает максимальный крутящий момент либо потому, что ему не дают двигаться полностью, либо потому, что он не может больше разгоняться с учетом нагрузки, которую он испытывает.

Не забудьте в функции setup() добавить ограничения для тока, напряжения и скорости.

#include <VBCoreG4_arduino_system.h>
#include <SimpleFOC.h>
#define EN_GATE PB3 // PB3 - включает/отключает драйвер

SPIClass SPI_3(PC12, PC11, PC10);

// MagneticSensorSPI(int cs, float _cpr, int _angle_register)
//  cs              - SPI chip select pin 
//  bit_resolution - magnetic sensor resolution
//  angle_register  - (optional) angle read register - default 0x3FFF
MagneticSensorSPI sensor = MagneticSensorSPI(PA15, 14, 0x3FFF);

float sensitivity = 45.0; // mV/A 

// InlineCurrentSensor constructor
//  - mVpA  - mV per Amp ratio
//  - phA   - A phase adc pin
//  - phB   - B phase adc pin
//  - phC   - C phase adc pin (optional)
//                                                          phA  phB  phC
InlineCurrentSense current_sense = InlineCurrentSense(45.0, PC1, PC2, PC3); 

BLDCMotor motor = BLDCMotor(11); //11 -пар полюсов

//  BLDCDriver3PWM( int phA, int phB, int phC)
//  - phA, phB, phC - A,B,C phase pwm pins
BLDCDriver3PWM driver = BLDCDriver3PWM(PA10, PA9, PA8);



Commander command = Commander(Serial);
void doTarget(char* cmd) { command.scalar(&motor.target, cmd);}
//Serial.println(digitalRead(PB5)); }
void setup() {

Serial.begin(115200);
 motor.useMonitoring(Serial);

  pinMode(PB5, INPUT);
  pinMode(EN_GATE, OUTPUT);
  

  pinMode(PB15, OUTPUT);
  pinMode(PB14, OUTPUT);
  pinMode(PB13, OUTPUT);
  digitalWrite(PB15, HIGH);
  digitalWrite(PB14, HIGH);
  digitalWrite(PB13, HIGH);
  
  digitalWrite(EN_GATE, HIGH);
  delay(10);
  // driver config
  driver.voltage_power_supply = 12;
  driver.init();
  driver.enable();

  
  // set torque mode:
  motor.torque_controller = TorqueControlType::foc_current; 
  // set motion control loop to be used
  motor.controller = MotionControlType::torque;


  // initialise magnetic sensor hardware
  sensor.init(&SPI_3);
  // link the motor to the encoder
  motor.linkSensor(&sensor);
  // link the motor to the driver
  motor.linkDriver(&driver);
  current_sense.init();
  current_sense.linkDriver(&driver);
  // link the current sense to the motor
  motor.linkCurrentSense(&current_sense);

  motor.current_limit = 1.94;
  motor.voltage_limit = 15;
  motor.velocity_limit - 5.5; // rad/sec
  // initialize motor
  motor.init();
  // align encoder and start FOC
  motor.initFOC();


 // add target command T
  command.add('T', doTarget, "target current");

  Serial.println(F("Motor ready."));
  _delay(1000);
}

int t;
void loop() {
  // main FOC algorithm function
  motor.loopFOC();

  // Motion control function
  motor.move();

  // user communication
  command.run();
}

Загрузите программу и убедитесь, что все работает. Далее попробуйте поменять torque_controller - вместо foc_current, поставьте voltage.

Управление моментом по напряжению - это наиболее простой тип управления моментом, который позволяет абстрагироваться от BLDC-двигателя и управлять им как двигателем постоянного тока. Он основан на принципе прямой пропорциональности тока напряжению (динамикой тока пренебрегается) и поэтому не нуждается в аппаратных средствах измерения тока. Данный подход к управлению моментом может быть использован на любой плате BLDC-драйвера, независимо от того, есть ли в ней датчик тока или нет. Подробнее ознакомиться с теорией можно на сайте SimpleFoc.

А теперь поставьте torque_controller - dc_current.

Режим управления постоянным током позволяет управлять током BLDC-двигателя, как если бы это был двигатель постоянного тока. Датчик тока используется для получения общей величины тока, потребляемого двигателем, и его направления, при этом предполагается, что вращающий момент пропорционален общему току. Преимущество такого подхода заключается в том, что можно очень точно управлять истинным током, задаваемым BLDC-двигателем, и он немного быстрее и стабильнее выполняется для менее производительных микроконтроллеров.

Last updated