i have some questions about programing an PID Controller in Multiwii. So far so good, I have an Multiwii 2.4 on Arduino pro mini connected to an SRF08 Sensor. It works, measures pretty well, but my PID Controller for Altitude Controll is the Problem.
for now ist generates from the Sonar Error P, I, and D but witch int you can´t do multiplikation as i want to do...or maybe I cant do it because of my programing skills

Here the existing Code: Imu.cpp
Code: Select all
unsigned long lastTime;
int16_t lastSonarAlt;
int16_t lastSonarError;
int16_t kp=20; //x*100 wegen Kommazahl
int16_t ki=1; //x*1000 wegen Kommazahl
int16_t kd=126; //x*100 wegen Kommazahl
int16_t SampleTime=100;
void SonarPID(){
unsigned long now = millis();
int16_t timeChange = (now-lastTime);
if(timeChange>=SampleTime)
{
int16_t error = SonarSetpoint - sonarAlt;
ITermSonar+=(ki*timeChange*error/1000000);
constrain(ITermSonar,-10,+10);
int16_t dInput = (error - lastSonarError);
//SonarPidOutput = kp*error + ITermSonar -kd*dInput/timeChange/1000;
SonarPidOutput = kp*error/100 + ITermSonar +kd*dInput/timeChange/100000;
constrain(SonarPidOutput,-100,+100);
lastSonarError=error;
lastSonarAlt = sonarAlt;
lastTime = now;
}
}
in Multiwii.cpp
Code: Select all
#if SONAR
if(f.SONAR_MODE) {
SonarSetpoint= 150;
SonarPID();
rcCommand[THROTTLE]+= SonarPidOutput;
constrain(rcCommand[THROTTLE],1150,1850);
}
if(!f.SONAR_MODE) {
SonarPidOutput=0;
ITermSonar=0;
}
#endif