Det är så att jag har byggt en PID regulator som verkar vara lite knas...ibland.
Jag har gjort så att en funktion skickar tillbaka på vilket bittvärde den ger ut till en PWM-pinne på min ATmega. Men av någon konstig anledning så fungerar det inte. PWM-pinnen är kopplad till en pump som roterar, beroende på vilken spänning den får.
0 är så klar 0 volt.
255 är så klart 5 volt.
Det är variablen Bit_int som endast blir 4:a hela tiden.
Här är min kod.
Då har jag några frågor.
1. Är detta smart sätt att skriva en kod? Klarar en ATmega av dessa låga tal?
Kod: Markera allt
double e = pow(10, -PHar) - pow(10, -PHbor);
2.
Kod: Markera allt
double PH_voltage = K*(e + D + I);
Detta K, förstärkningen, måste vara ENORM. Då talar jag typ 1*10^9. Är detta rimligt?
Vad tror ni?
Jobbar jag med allt för stora och för små tal?
Kod: Markera allt
static int U_pump(float PHar)
{
// The wrong values
double e = pow(10, -PHar) - pow(10, -PHbor); // logaritmisk PH.
// Derivate
double D = Td*(e-e_before);
// Integral - This can increase and decrease
static double I;
I += (1/Ti)*e;
// The roof of the integral
if (I >= MAX)
{
I = MAX;
}
if (PHar >= PHbor)
{
I = 0; // reset integral.
}
double PH_voltage = K*(e + D + I); // PID-regulator
e_before = average_before(e); // Här gör jag ett medelvärde av felet e_before.
int Bit_int;
if (PH_voltage >= 1) // om PH_voltage är över 1.
{
Bit_int = 255; // The pump will run at max.
}
else if (PH_voltage <= 0) // om PH_voltage är under 0.
{
Bit_int = 0; // The pump will stop.
}
else
{
Bit_int = 255*PH_voltage;
}
analogWrite(9, Bit_int);
return Bit_int; // Return a integer value between 0 and 255 for logging.
}