سلام دوستان
من برنامه ای نوشتم که باهاش دور و جهت موتور DC به روش PID کنترل کنم
مشکل اینجاست که در یک طرف موتور خوب کار میکنه ولی یک جهت سرعت موتور آروم آروم زیاد میشه کسی می دونه مشکل کجاست؟
#include <PID_v1.h>
#include <Wire.h>
#include <MPU6050.h>
MPU6050 mpu;
double Setpoint, Input, Output;
double consKp=50, consKd=1.4, consKi=60;
PID myPID(&Input, &Output, &Setpoint, consKp, consKi, consKd, DIRECT);
void setup()
{
Serial.begin(115200);
Setpoint = 0;
Input= map(Input,-180,180,-150,150);
myPID.SetMode(AUTOMATIC);
myPID.SetSampleTime(10);
myPID.SetOutputLimits(-150, 150);
while(!mpu.begin(MPU6050_SCALE_1000DPS, MPU6050_RANGE_2G))
{
Serial.println("Could not find a valid MPU6050 sensor, check wiring!");
delay(500);
}
}
void loop()
{
Vector normAccel = mpu.readNormalizeAccel();
int roll = (atan2(normAccel.YAxis, normAccel.ZAxis)*180.0)/M_PI;
Input=roll;
myPID.Compute();
Serial.print(" Roll = ");
Serial.print(roll);
Serial.println();
Serial.print(" out:");
Serial.print(Output);
Serial.println();
if(Output>0)
{
analogWrite(2, Output);
digitalWrite(3,LOW);
}
else
{
int out=Output*(-1);
analogWrite(3,out);
digitalWrite(2,LOW);
}
delay(100);
}
من برنامه ای نوشتم که باهاش دور و جهت موتور DC به روش PID کنترل کنم
مشکل اینجاست که در یک طرف موتور خوب کار میکنه ولی یک جهت سرعت موتور آروم آروم زیاد میشه کسی می دونه مشکل کجاست؟
#include <PID_v1.h>
#include <Wire.h>
#include <MPU6050.h>
MPU6050 mpu;
double Setpoint, Input, Output;
double consKp=50, consKd=1.4, consKi=60;
PID myPID(&Input, &Output, &Setpoint, consKp, consKi, consKd, DIRECT);
void setup()
{
Serial.begin(115200);
Setpoint = 0;
Input= map(Input,-180,180,-150,150);
myPID.SetMode(AUTOMATIC);
myPID.SetSampleTime(10);
myPID.SetOutputLimits(-150, 150);
while(!mpu.begin(MPU6050_SCALE_1000DPS, MPU6050_RANGE_2G))
{
Serial.println("Could not find a valid MPU6050 sensor, check wiring!");
delay(500);
}
}
void loop()
{
Vector normAccel = mpu.readNormalizeAccel();
int roll = (atan2(normAccel.YAxis, normAccel.ZAxis)*180.0)/M_PI;
Input=roll;
myPID.Compute();
Serial.print(" Roll = ");
Serial.print(roll);
Serial.println();
Serial.print(" out:");
Serial.print(Output);
Serial.println();
if(Output>0)
{
analogWrite(2, Output);
digitalWrite(3,LOW);
}
else
{
int out=Output*(-1);
analogWrite(3,out);
digitalWrite(2,LOW);
}
delay(100);
}