电机转矩PID控制
PID torque control of motor
我正在尝试控制电机扭矩。这是我试图通过实现对电机电流的PID控制来实现的,因此对PWM。更高的PWM意味着更高的转矩。我是新的arduino-uno,因此需要帮助与编码。我写了一个相同的代码,但有点不确定它的正确性。我仍然不确定要使用的"积分"变量的值。非常感谢任何帮助提前感谢
#include "RunningAverage.h"
int m1 = 13;
int m2 = 12;
int me = 9;
int t = millis()+5000;
RunningAverage myRA(80);
int stat=0;
int pwmn=100;
int counter=0;
int kP;
int kI=0;
int kD=0;
int SetPt;
int Last;
int Actual;
int Error;
int Integral;
float P;
float I;
float D;
int Drive;
int ScaleFactor;
void motorRight(){
digitalWrite(m1,HIGH);
digitalWrite(m2, LOW);
}
void motorLeft(){
digitalWrite(m2,HIGH);
digitalWrite(m1, LOW);
}
void motorOff(){
digitalWrite(m2, LOW);
digitalWrite(m1, LOW);
}
void motorBrake(){
digitalWrite(m2, HIGH);
digitalWrite(m1, HIGH);
delay(10);
motorOff();
}
void setup() {
// put your setup code here, to run once:
pinMode(m1,OUTPUT);
pinMode(m2,OUTPUT);
pinMode(me,OUTPUT);
analogWrite(me,pwmn);
Serial.begin(115200);
motorRight();
}
void loop() {
// put your main code here, to run repeatedly:
myRA.addValue(analogRead(A1));
Serial.print(myRA.getAverage());
Serial.println(",500,600");
Actual = myRA.getAverage();
Error = SetPt - Actual;
P = Error*kP; // calc proportional term
I = Integral*kI; // integral term
D = (Last-Actual)*kD; // derivative term
Drive = P + I + D; // Total drive = P+I+D
Drive = Drive*ScaleFactor; // scale Drive to be in the range 0-255
//Serial.println(pwmn);
if(counter>10){
if(pwmn<250){
pwmn++;
}
counter=0;
}
counter++;
if (abs(Drive)>255) {
Drive=255;
}
analogWrite (me,Drive); // send PWM command to motor board
Last = Actual; // save current value for next time
// analogWrite(me,pwmn);
delay(50);
}'
你是对的,积分计算错误。积分(Integral)的意思是加起来。你想要的是
I = I + kI*Error;
你还应该限制积分项(I)的最大值和最小值,以避免"上弦"错误。当伺服系统不能达到目标时,就会发生这种情况,因为I项是误差的总和,它可能会失去控制。
相关文章:
- 控制允许动态运行c++的并发操作数
- 从控制台中删除最后打印的元素
- 是否可以使用if constexpr删除控制流语句
- 无法在windows控制台中为C++程序提供必要的输入
- 使用 VID、PID、+SN 查找 USB 端口号
- 控制到达非空函数clang(-Wreturn-type)的末尾
- 查找 GCD:并非所有控制路径都返回值
- 对于四轴飞行器,PID中I控制器的理想值应该是多少
- 通过 API 控制 DJI 相机
- 禁止在控制台上记录谷神星
- 是否可以使用一个类来控制 C++ 中另一个类的对象?(阿杜伊诺)
- 如何删除列出的"QGraphicsPathItem"对象以控制进程内存使用情况?
- 我在 C++ 代码中遇到错误警告:控制到达非空函数 [-Wreturn 类型] 的末尾
- C++ Python 模块在 Blender 中崩溃,但在 Python 控制台中不会崩溃
- wx通用目录控制错误"wxTheFileIconsTable was nullptr"
- main() 中的 std::cout 在调试期间不会在调试控制台中打印任何内容
- Cython通过浮点数的最快方式,用于高频控制回路
- 用户控制从 c++ 到 java 脚本的 Webassembly 访问调用
- 电机转矩PID控制
- windows ce:我可以在内核模式下为PID控制回路执行所有的计算