Mam pytanie dlaczego zmienna Ki oraz Kp (s->Ki oraz s->Kp) wchodzaca w sklad struktury s_pid przyjmuje losowe warosci wewnatrz funkcji RegulatorNextStep; Przedstawiam ponizej zawartosc plikow zrodlowych
Dodam tylko ze problem rozwiazalem ale nie moge sobie wytlumaczyc tak dziwnego zachowania kompilatora. Rozwiazanie problemu polegalo na przeniesieniu tworzenia struktury (struct s_pid pid;) z wnetrza funkcji main() na zewnatrz jej (globalna).
******** plik main.c ********#include "pid.h" ... main(1); { ... struct s_pid pid; // jezeli przeniose to strukture na zewnatrz funkcji main // to program wykonuje sie prawidlowo ... InitReg(&pid,40,1,0); ... while(1); { ... err=RegulatorNextStep(&pid,i_set,current); ... }// end while }// end main
*************************** plik pid.h *************************** #ifndef _PID_H_ #define _PID_H_struct s_pid { signed int Kp; signed int Ki; signed int Kd; signed long sigma; signed int delta; };
void InitReg(struct s_pid *s, signed int Kp, signed int Ki, signed int Kd); signed int RegulatorNextStep(struct s_pid *s,signed int set,signed int mes); void RegulatorReset(struct s_pid *s);
#endif
***************************** plik pid.c ************************** #include "pid_flt.h" ... signed int RegulatorNextStep(struct s_pid *s,signed int set_value,signed int measure_value) { ...p_term=(s->Kp) * error; i_term= (s->Ki * s->sigma)/8; ... lcd(s->Kp); // !!!!!! dla czego mam losowe wartosci??? lcd(s->Ki); ... return (signed int)out; }
void InitReg(struct s_pid *s, signed int Kp, signed int Ki, signed int Kd) { s->Kp=Kp; s->Ki=Ki; s->Kd=Kd; s->sigma=0; s->delta=0; }
******************************************************************************__________ Informacja programu ESET NOD32 Antivirus, wersja bazy sygnatur wirusow 5103 (20100510) __________
Wiadomosc zostala sprawdzona przez program ESET NOD32 Antivirus.