Да, это не то, что раньше - в машинных кодахАлексс писал(а):а сейчас для микропроцессора можно писать программы на, язык не поворачивается, бейсике... тьфу, мерзость

Да, это не то, что раньше - в машинных кодахАлексс писал(а):а сейчас для микропроцессора можно писать программы на, язык не поворачивается, бейсике... тьфу, мерзость

Надо было просто C3 выкинуть.Алексс писал(а):плюс датчик фазы на транзисторе работал не стабильно (с транзисторами дружу плохо, может я ему мяса недокладывал - не знаю) и в последствии был заменен на оптотранзистор.

без него было тоже плохо - проблема не в пропуске периодов а наоборот - "лишние" появлялись. как следствие, дуня думала что оборотов мало и добавляла. что опять усугубляло и тп.UAVpilot писал(а):C3 выкинуть.

Алексс, день добрый!Алексс писал(а):Пару дней занимался интеллектуальным ананизмом трудом, результат которого вам и представлю. Возможно кому-то пригодится.



ошибся, 470 Ом.Алексс писал(а):470к??



Код: Выделить всё
bool PIDv2::Compute(unsigned int now)
{
if(!inAuto)
return false;
if((now - lastTime)>= SampleTime)
{
lastTime = now;
/*Compute all the working error variables*/
double input = *myInput;
double p_error = *mySetpoint - input;
/* if output is in limit, don't let integrator wind up */
if(!isClipping)
i_error += ki * p_error;
if(i_error != 0.0)
{
if(i_error > i_limit)
i_error = i_limit;
else if(i_error < -i_limit)
i_error = -i_limit;
}
else
{
if(i_error > outMax)
i_error= outMax;
else if(i_error < outMin)
i_error= outMin;
}
double d_error = (p_error - lastError);
lastError = p_error;
/*Compute PID Output*/
double output = kp * p_error + i_error + kd * d_error;
if(output > outMax)
{
isClipping = true;
output = outMax;
}
else if(output < outMin)
{
isClipping = true;
output = outMin;
}
else
isClipping = false;
*myOutput = output;
return true;
}
else
return false;
}
