This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Global Var

HI!!

I declared 3 global var, i call it inside diferent task and every execution this var should be updates but not to do it.
I have a 8051 under evaluation board.
Maybe can be a problem of my small micro?
What do u think about this?

Thanks

Parents
  • Thanks Per!!!

    real is my data type, now is int but i created this for future changes.

    The implementation is important Yeah!!! but i think that it is OK:

    error = SP - PV;
    
                    P = pid->Kp*error;
                    if (pid->Ti){
                            I = pid->iState*(pid->Kp*(pid->Ts/pid->Ti)+ pid->Kwindup);
                            pid->iState = pid->iState + error;
                    }else I=0;
                    if (pid->Td){
                            D = (pid->Kp*(pid->Td/pid->Ts)*(PV - pid->dState));
                            pid->dState = PV;
                    }else D=0;
                    v = P + I + D;
    

    this is a piece of code.
    For example the pid->iState it is not updated!!!

    I dont know where is the problem.

Reply
  • Thanks Per!!!

    real is my data type, now is int but i created this for future changes.

    The implementation is important Yeah!!! but i think that it is OK:

    error = SP - PV;
    
                    P = pid->Kp*error;
                    if (pid->Ti){
                            I = pid->iState*(pid->Kp*(pid->Ts/pid->Ti)+ pid->Kwindup);
                            pid->iState = pid->iState + error;
                    }else I=0;
                    if (pid->Td){
                            D = (pid->Kp*(pid->Td/pid->Ts)*(PV - pid->dState));
                            pid->dState = PV;
                    }else D=0;
                    v = P + I + D;
    

    this is a piece of code.
    For example the pid->iState it is not updated!!!

    I dont know where is the problem.

Children
  • Have you made sure that your function thinks pid->Ti is non-zero, so it has a reason to update pid->iState?

  • In this funtion, i return pid->iState, first this var returned 10 and after returned 4 and should return 14.

  • are you actually writing into the piece of memory pointed by iA? show that please...

  • This is my PID task, it should update the iA, but not to do it!!

    void PIDa (void) _task_ A _priority_ 1 {
    
    
            Ua = UpdatePID (&iA, SPa, PVa, 1, 4);
    
            os_send_signal(WRITE);
    
            os_delete_task(A);
    
    }
    

  • This is my PID task, it should update the iA, but not to do it!!

    Without seeing the code of updatePID, it is impossible for anyone to tell what the function does and what not.

    As long as you keep information scarce, all you're going to get is speculation.

  • OK, well!! I explain the code:

    -I have a global var type struct.
    -I have 2 task: WRITE task: here create PID task PID task: here call to the funtion that update the those struct.

    This is the piece of code:

    PID.H
    
    typedef int real;
    
    typedef struct {
    
    real dState;            /* Ultima posicion             */
    real iState;            /* Estado del integrador       */
    real uMax,uMin;     /* Saturacion del actuador     */
    real Kp;                    /* Ganancia proporcional       */
    real Ti,Td;                     /* Cte, tiempo integral y derivativo        */
    real Ts,Tt;                     /* Periodo muestreo, Cte. tiempo tracking   */
    real Kwindup;           /* Cte. antireset windup                    */
    
    } SPid;
    
    real UpdatePID (SPid *pid, real SP, real PV, unsigned int AUTO,real Uman) reentrant{
             into PID.c
             ....
             pid->iState += error;
             return pid->iState;
    }
    
    MAIN.C
    
    //global var
    SPid iA
    
    void Write (void) _task_ WRITE _priority_ 1{
               .....
               os_create_task(A);
               os_wait(K_SIG, WAIT_FOREVER,0);
               os_clear_signal(WRITE);
    }
    
    void PIDa (void) _task_ A _priority_ 1 {
               ...
               Ua = UpdatePID (&iA, SPa, PVa, 1, 4);
               os_send_signal(WRITE);
               os_delete_task(B);
    }
    
    the iA var never update