当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Arduino ArduinoMotorCarrier - PID用法及代码示例


允许将 Motor1 或 Motor2 设置为特定的速度或位置。控制器中有两个 PID 虚拟对象:pid1 和 pid2。 pid1 作用于 M1 和 encoder1。 pid2 作用于 M2 和 encoder2。建议使用这些函数控制电机。

用法

pid1. setGains(int P, int I, int D)

职能

  • setGains(float P, float I, float D):设置 PID 增益。 (MKRMotorCarrier 的int 类型)
  • resetGains():将 PID 增益重置为出厂默认设置。
  • setControlMode(cl_control) :将控制模式设置为 CL_VELOCITYCL_POSITION
  • setSetpoint(cl_mode, int target):在其中一个电机中设置特定的速度或位置。将 cl_mode 定义为 TARGET_POSITIONTARGET_VELOCITY 以及目标中的所需值。

示例

PID 位置控制示例。

#include <ArduinoMotorCarrier.h>
#define INTERRUPT_PIN 6

//Variable to change the motor speed and direction
static int duty = 0;

int target;
float P;
float I;
float D;

void setup()
{
  //Serial port initialization
  Serial.begin(115200);
  while (!Serial);

  //Establishing the communication with the motor shield
  if (controller.begin())
  {
    Serial.print("MKR Motor Shield connected, firmware version ");
    Serial.println(controller.getFWVersion());
  }
  else
  {
    Serial.println("Couldn't connect! Is the red led blinking? You may need to update the firmware with FWUpdater sketch");
    while (1);
  }

  // Reboot the motor controller; brings every value back to default
  Serial.println("reboot");
  controller.reboot();
  delay(500); 

  int dutyInit = 0; 
  M1.setDuty(dutyInit);
  M2.setDuty(dutyInit);
  M3.setDuty(dutyInit);
  M4.setDuty(dutyInit);
  Serial.print("Duty: ");
  Serial.println(dutyInit);

  P = 0.07f;//0.07 //0.2
  I = 0.0f;
  D = 0.007f;

  /************* PID 1 ***********************/

  pid1.setControlMode(CL_POSITION);

  //pid1.resetGains();  
  pid1.setGains(P, I, D); //Proportional(change) Integral(change) Derivative
  Serial.print("P Gain: ");
  Serial.println((float)pid1.getPgain());
  Serial.print("I Gain: ");
  Serial.println((float)pid1.getIgain());
  Serial.print("D Gain: ");
  Serial.println((float)pid1.getDgain(), 7);
  Serial.println("");

  encoder1.resetCounter(0);
  Serial.print("encoder1: ");
  Serial.println(encoder1.getRawCount());
  target = 5000;
  pid1.setSetpoint(TARGET_POSITION, target);
}

void loop() {

  Serial.print("encoder1: ");
  Serial.print(encoder1.getRawCount());
  Serial.print(" target: ");
  Serial.println(target);
  if (encoder1.getRawCount() == target) {
    target += 1000;
    Serial.print("Target reached: Setting new target..");
    pid1.setSetpoint(TARGET_POSITION, target);
    //delay(5000);
  }

  delay(50);
}

相关用法


注:本文由纯净天空筛选整理自arduino.cc大神的英文原创作品 ArduinoMotorCarrier - PID。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。