Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

PID konusunda yardım

Başlatan bulut_01, 01 Mayıs 2017, 22:16:24

bulut_01

@taglı hocam verdiğiniz kodu kullanmak istiyorum anlamadıgım noktalar var örnek ben encoder aldıgım bilgiyi rpm cinsine ceviriyorum verdiğiniz kodda bu encoder bilgisini nereye girecegim rpm cinsinden girersem olur mu ayrıca kodda case swich bölümünde mode pwm ve abs bölümleri tam olarak neyi ifade ediyor yardımlarınız olursa pid inş halledecegim.

void takeControlAction(void) {
    float effort, error, pTerm, iTerm, dTerm;

    switch (ctrlMode) {
        case CTRL_IDLE:
            return;
            break;
        case CTRL_PWM:
            setDuty(dutyRef);
            monitor.duty = dutyRef;
            break;
        case CTRL_POS_ABS:
            error = posRef - monitor.posAbs;
            if (fabs(error) < 0.03) {
                spdRef = 0;
            } 
            else {
                posInteg += (DT * error * posPid.ki);
                posInteg = limit(posInteg, -limits.spdMax, limits.spdMax);
                pTerm = error * posPid.kp;
                iTerm = posInteg;
                dTerm = error * posPid.kd / DT;
      spdRef = limit(pTerm + iTerm + dTerm, -limits.spdMax,limits.spdMax);}  // No break here, it's not a bug.
            
            
        case CTRL_SPEED:
            error = spdRef - monitor.speed;
            spdInteg += (DT * error * spdPid.ki);
            spdInteg = limit(spdInteg, -95, 95);
            pTerm = error * spdPid.kp;
            iTerm = spdInteg;
            dTerm = error * spdPid.kd / DT;
            effort = limit(pTerm + iTerm + dTerm, -95, 95);
            setDuty(effort);
            monitor.duty = effort;
            break;
YENİLMEZ..

bulut_01

ayrıca case swich kullanmasak ne olur ?
YENİLMEZ..