]> rtime.felk.cvut.cz Git - fpga/rpi-motor-control.git/blobdiff - pmsm-control/test_sw/main_pmsm.c
Speed regulation with zero error.
[fpga/rpi-motor-control.git] / pmsm-control / test_sw / main_pmsm.c
index 48fcf1ec8d61b11e939748d1b1a4875de12b034e..3d13ff28a484b11ea43c62f6d61b7287d26ff4e5 100644 (file)
 #include "pmsm_state.h"
 #include "cmd_proc.h"
 
-#define MAX_DUTY       170
+
 #define PID_P          0.3
-#define PID_P_S                0.3
+#define PID_P_S                0.9     /*2.3 kmita*/ /*1.4 vhodne jen pro P regulator*/
+#define PID_I_S                0.01
 
 #define PRIOR_KERN     50
 #define PRIOR_HIGH     49
@@ -55,7 +56,8 @@ struct rpi_state rps={
        .pos_reg_ena=0,
        .desired_spd=0,
        .spd_reg_ena=0,
-       .old_pos={0}
+       .old_pos={0},
+       .spd_err_sum=0
 };
 
 /**
@@ -539,7 +541,10 @@ inline void pos_pid(){
  */
 inline void spd_pid(){
        int duty_tmp;
-       duty_tmp = PID_P*(rps.desired_pos - (int32_t)data.pozice);
+       int error;
+       error=rps.desired_spd - rps.speed;
+       rps.spd_err_sum+=error;
+       duty_tmp = PID_P_S*error+PID_I_S*rps.spd_err_sum;
        if (duty_tmp>MAX_DUTY){
                rps.duty=MAX_DUTY;
        }else if (duty_tmp<-MAX_DUTY){
@@ -601,10 +606,14 @@ void * read_data(void* param){
                        }else{ /*index je v poradku*/
                                comIndDist();           /*vypocet vzdalenosti indexu*/
                        }
+
                        /* pocitame sirku plneni podle potreb rizeni*/
-                       if (rps.pos_reg_ena){
+                       if (rps.pos_reg_ena){           /*pozicni rizeni*/
                                pos_pid();
+                       }else if(rps.spd_reg_ena){      /*rizeni na rychlost*/
+                               spd_pid();
                        }
+
                        /* sirka plneni prepoctena na jednotlive pwm */
                        if (rps.index_ok && rps.commutate){
                                /*simple_ind_dist_commutator(rps.duty);*/