Kim GiJeong / Mbed 2 deprecated HydraulicControlBoard_LIGHT_GJ

Dependencies:   mbed FastPWM

Files at this revision

API Documentation at this revision

Comitter:
Lightvalve
Date:
Mon Sep 09 06:29:56 2019 +0000
Parent:
18:b8adf1582ea3
Child:
20:806196fda269
Commit message:
190909

Changed in this revision

CAN/function_CAN.cpp Show annotated file Show diff for this revision Revisions of this file
CAN/function_CAN.h Show annotated file Show diff for this revision Revisions of this file
function_utilities/function_utilities.cpp Show annotated file Show diff for this revision Revisions of this file
function_utilities/function_utilities.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
setting.h Show annotated file Show diff for this revision Revisions of this file
--- a/CAN/function_CAN.cpp	Wed Sep 04 11:02:57 2019 +0000
+++ b/CAN/function_CAN.cpp	Mon Sep 09 06:29:56 2019 +0000
@@ -1154,7 +1154,7 @@
     int32_t valve_pos_vs_flowrate;
     valve_pos_vs_flowrate = (int32_t) (JOINT_VEL[canindex]);
 
-    int16_t VALVE_POS_VALVE_ID = ID_index_array[canindex] * 50 + DDV_CENTER;
+    int16_t VALVE_POS_VALVE_ID = ID_index_array[canindex] * 10 + DDV_CENTER;
     
     temp_msg.id = CID_TX_INFO;
     temp_msg.len = 7;
--- a/CAN/function_CAN.h	Wed Sep 04 11:02:57 2019 +0000
+++ b/CAN/function_CAN.h	Mon Sep 09 06:29:56 2019 +0000
@@ -224,6 +224,7 @@
 void CAN_RX_HANDLER();
 void CAN_ID_INIT(void);
 
-extern int ID_index_array[100];
+extern int ID_index_array[50];
 
 #endif
+
--- a/function_utilities/function_utilities.cpp	Wed Sep 04 11:02:57 2019 +0000
+++ b/function_utilities/function_utilities.cpp	Mon Sep 09 06:29:56 2019 +0000
@@ -9,6 +9,21 @@
 //FlashWriter writer(6);//2부터 7까지 되는듯 아마 sector
 
 
+//int CID_RX_CMD = 100;
+//int CID_RX_REF_POSITION = 200;
+//int CID_RX_REF_TORQUE = 300;
+//int CID_RX_REF_PRES_DIFF = 400;
+//int CID_RX_REF_VOUT = 500;
+//int CID_RX_REF_VALVE_POSITION = 600;
+//int CID_RX_REF_CURRENT = 700;
+//
+//int CID_TX_INFO = 1100;
+//int CID_TX_POSITION = 1200;
+//int CID_TX_TORQUE = 1300;
+//int CID_TX_PRES = 1400;
+//int CID_TX_VOUT = 1500;
+//int CID_TX_VALVE_POSITION = 1600;
+
 /*******************************************************************************
  * VARIABLE
  ******************************************************************************/
@@ -206,13 +221,12 @@
 int VALVE_POS_TMP = 0;
 int JOINT_VEL_TMP = 0;
 int DDV_POS_AVG = 0;
-int VALVE_POS_AVG[100] = {0};
+int VALVE_POS_AVG[50] = {0};
 int VALVE_POS_AVG_OLD = 0;
 int data_num = 0;
 int ID_index = 0;
 int DZ_index = 1;
-int ID_index_array[100] = {0};
-int FR_index_array[100] = {0};
+int ID_index_array[50] = {0};
 int first_check = 0;
 double init_time = 0.0;
 int VEL_POINT = 0;
@@ -226,7 +240,8 @@
 int one_period_end = 0;
 double Ref_Vel_Test = 0.0;
 long TMR2_FOR_SLOW_LOGGING = 0;
-int velcount = 0;
+//int velcount = 0;
+int Ref_Valve_Pos_FF_CAN = 0;
 char max_check = 0;
 char min_check = 0; 
 
@@ -284,6 +299,8 @@
 double CUR_CURRENT = 0.0;
 double u_CUR[3] = {0.0,0.0,0.0};
 
+//int Ref_Valve_Pos_FF_CAN = 0;
+
 /*******************************************************************************
  * General math functions
  ******************************************************************************/
@@ -324,12 +341,6 @@
 /*******************************************************************************
  * ROM functions
  ******************************************************************************/
-void ROM_INIT_DATA(void)
-{
-    //ROM_RESET_DATA();
-    ROM_CALL_DATA();
-}
-
 void ROM_RESET_DATA(void) {
     FlashWriter writer(6);//2부터 7까지 되는듯 아마 sector
     if (!writer.ready()) writer.open();
@@ -395,8 +406,8 @@
     }
     for(int i=0; i<100; i++)
     {
-        writer.write(RID_VALVE_POS_VS_FLOWRATE_0 + i, (int) (JOINT_VEL[ID_index] & 0xFFFF));
-        writer.write(RID_VALVE_POS_VS_FLOWRATE_0_1 + i, (int) ((JOINT_VEL[ID_index] >> 16) & 0xFFFF));
+        writer.write(RID_VALVE_POS_VS_FLOWRATE_0 + i, (int) (JOINT_VEL[i] & 0xFFFF));
+        writer.write(RID_VALVE_POS_VS_FLOWRATE_0_1 + i, (int) ((JOINT_VEL[i] >> 16) & 0xFFFF));
     }
     writer.write(RID_VALVE_MAX_POS, (int) VALVE_MAX_POS);
     writer.write(RID_VALVE_MIN_POS, (int) VALVE_MIN_POS);
@@ -550,3 +561,4 @@
 
 }
 
+
--- a/function_utilities/function_utilities.h	Wed Sep 04 11:02:57 2019 +0000
+++ b/function_utilities/function_utilities.h	Mon Sep 09 06:29:56 2019 +0000
@@ -26,7 +26,6 @@
 
 void     ROM_RESET_DATA(void);
 void     ROM_CALL_DATA(void);
-void     ROM_INIT_DATA(void);
 
 void     ENC_UPDATE(void);
 void     ENC_SET_ZERO(void);
--- a/main.cpp	Wed Sep 04 11:02:57 2019 +0000
+++ b/main.cpp	Mon Sep 09 06:29:56 2019 +0000
@@ -70,6 +70,22 @@
 int timer_while = 0;
 int while_index = 0;
 
+
+extern int CID_RX_CMD;
+extern int CID_RX_REF_POSITION;
+extern int CID_RX_REF_TORQUE;
+extern int CID_RX_REF_PRES_DIFF;
+extern int CID_RX_REF_VOUT;
+extern int CID_RX_REF_VALVE_POSITION;
+extern int CID_RX_REF_CURRENT;
+
+extern int CID_TX_INFO;
+extern int CID_TX_POSITION;
+extern int CID_TX_TORQUE;
+extern int CID_TX_PRES;
+extern int CID_TX_VOUT;
+extern int CID_TX_VALVE_POSITION;
+
 // =============================================================================
 // =============================================================================
 // =============================================================================
@@ -129,8 +145,8 @@
     /*********************************
     ***     Initialization
     *********************************/
-    LED = 1;
-    pc.baud(9600);
+    //LED = 1;
+    //pc.baud(9600);
     
     // i2c init
     i2c.frequency(400 * 1000);          // 0.4 mHz
@@ -147,8 +163,7 @@
     make_delay();
     
     //rom
-    
-    ROM_INIT_DATA();
+    ROM_CALL_DATA();
     make_delay();
 
     // ADC init
@@ -169,19 +184,18 @@
     can.attach(&CAN_RX_HANDLER);
     CAN_ID_INIT();
     make_delay();
-
+    can.filter(msg.id, 0xFFFFF000, CANStandard);
+    
     // spi _ enc
     spi_enc_set_init();
     make_delay();
 
     //DAC init
     dac_1 = PRES_A_VREF / 3.3;
-    //dac_1 = 0.0;
     dac_2 = PRES_B_VREF / 3.3;
-    //dac_2 = 0.0;
     make_delay();
 
-    for (int i=0; i<100; i++) {
+    for (int i=0; i<50; i++) {
         if(i%2==0)
             ID_index_array[i] = - i * 0.5;
         else
@@ -192,15 +206,15 @@
     ***     Program is operating!
     *************************************/
     while(1) {
-        if(timer_while==1){
+        if(timer_while==1000){
             //i2c
             read_field(i2c_slave_addr1);
             if(DIR_VALVE_ENC < 0) value = 1023 - value;
             
-            if(LED==1) {
-                LED=0;
-            } else
-                LED = 1;
+//            if(LED==1) {
+//                LED=0;
+//            } else
+//                LED = 1;
             timer_while = 0;
             
         }
@@ -216,9 +230,9 @@
     for(i=0; i<VALVE_POS_NUM; i++) {
         if(REF_JOINT_VEL >= min(JOINT_VEL[i],JOINT_VEL[i+1]) && REF_JOINT_VEL <=  max(JOINT_VEL[i],JOINT_VEL[i+1])) {
             if(i==0) {
-                Ref_Valve_Pos_FF = ((int) 50.0/(JOINT_VEL[i+1] - JOINT_VEL[i]) * (REF_JOINT_VEL - JOINT_VEL[i])) + DDV_CENTER;
+                Ref_Valve_Pos_FF = ((int) 10.0/(JOINT_VEL[i+1] - JOINT_VEL[i]) * (REF_JOINT_VEL - JOINT_VEL[i])) + DDV_CENTER;
             } else {
-                Ref_Valve_Pos_FF = ((int) 50.0*(ID_index_array[i+1] - ID_index_array[i-1])/(JOINT_VEL[i+1] - JOINT_VEL[i-1]) * (REF_JOINT_VEL - JOINT_VEL[i-1])) + DDV_CENTER + 50*ID_index_array[i-1];
+                Ref_Valve_Pos_FF = ((int) 10.0*(ID_index_array[i+1] - ID_index_array[i-1])/(JOINT_VEL[i+1] - JOINT_VEL[i-1]) * (REF_JOINT_VEL - JOINT_VEL[i-1])) + DDV_CENTER + 10*ID_index_array[i-1];
             }
             break;
         }
@@ -228,6 +242,7 @@
     } else if(REF_JOINT_VEL < min(JOINT_VEL[VALVE_POS_NUM-1], JOINT_VEL[VALVE_POS_NUM-2])) {
         Ref_Valve_Pos_FF = VALVE_MIN_POS;
     }
+    Ref_Valve_Pos_FF_CAN = Ref_Valve_Pos_FF;
     return Ref_Valve_Pos_FF;
 }
 
@@ -261,6 +276,9 @@
             break;
         }
     }
+
+    //VALVE_PWM_RAW_FF = 0.0;
+
     V_out = VALVE_PWM_RAW_FF + VALVE_PWM_RAW_FB;
 }
 
@@ -308,201 +326,74 @@
                             TIMER INTERRUPT
 *******************************************************************************/
 
-unsigned long CNT_TMR4 = 0;
+//unsigned long CNT_TMR4 = 0;
 double FREQ_TMR4 = (double)FREQ_10k;
 double DT_TMR4 = (double)DT_10k;
 extern "C" void TIM4_IRQHandler(void)
 {
-    if ( TIM4->SR & TIM_SR_UIF ) {
-        /*******************************************************
-        ***     Sensor Read & Data Handling
-        ********************************************************/
+    if (TIM4->SR & TIM_SR_UIF ) {
+        
+    /*******************************************************
+    ***     Sensor Read & Data Handling
+    ********************************************************/
 
- 
-        //Using LoadCell
+
+    //Using LoadCell
 //            ADC1->CR2  |= 0x40000000;                        // adc _ 12bit
 //            //while((ADC1->SR & 0b10));
 //            double alpha_update_torque = 1.0/(1.0+(FREQ_TMR4/2.0)/(2.0*3.14*1000.0));
 //            double torque_new = ((double)ADC1->DR - PRES_A_NULL)  / TORQUE_SENSOR_PULSE_PER_TORQUE + 1.0;
 //            torq.sen = torq.sen*(1.0-alpha_update_torque)+torque_new*(alpha_update_torque);
 
-        //Pressure sensor A
-        ADC1->CR2  |= 0x40000000;                        // adc _ 12bit
-        //while((ADC1->SR & 0b10));
-        double alpha_update_pres_A = 1.0/(1.0+(FREQ_TMR4/2.0)/(2.0*3.14*1000.0));
-        double pres_A_new = ((double)ADC1->DR - PRES_A_NULL)  / PRES_SENSOR_A_PULSE_PER_BAR;
-        pres_A.sen = pres_A.sen*(1.0-alpha_update_pres_A)+pres_A_new*(alpha_update_pres_A);
+
 
-        //Pressure sensor 1B
-        //ADC2->CR2  |= 0x40000000;                        // adc _ 12bit
-        //while((ADC2->SR & 0b10));
-        double alpha_update_pres_B = 1.0/(1.0+(FREQ_TMR4/2.0)/(2.0*3.14*1000.0));
-        double pres_B_new = ((double)ADC2->DR - PRES_B_NULL)  / PRES_SENSOR_B_PULSE_PER_BAR;
-        pres_B.sen = pres_B.sen*(1.0-alpha_update_pres_B)+pres_B_new*(alpha_update_pres_B);
-        torq.sen = pres_A.sen * (double) PISTON_AREA_A - pres_B.sen * (double) PISTON_AREA_B;
+    //Pressure sensor A
+    ADC1->CR2  |= 0x40000000;                        // adc _ 12bit
+    //while((ADC1->SR & 0b10));
+    double alpha_update_pres_A = 1.0/(1.0+(FREQ_TMR4/2.0)/(2.0*3.14*1000.0));
+    double pres_A_new = ((double)ADC1->DR - PRES_A_NULL)  / PRES_SENSOR_A_PULSE_PER_BAR;
+    pres_A.sen = pres_A.sen*(1.0-alpha_update_pres_A)+pres_A_new*(alpha_update_pres_A);
+
+    //Pressure sensor 1B
+    //ADC2->CR2  |= 0x40000000;                        // adc _ 12bit
+    //while((ADC2->SR & 0b10));
+    double alpha_update_pres_B = 1.0/(1.0+(FREQ_TMR4/2.0)/(2.0*3.14*1000.0));
+    double pres_B_new = ((double)ADC2->DR - PRES_B_NULL)  / PRES_SENSOR_B_PULSE_PER_BAR;
+    pres_B.sen = pres_B.sen*(1.0-alpha_update_pres_B)+pres_B_new*(alpha_update_pres_B);
+    torq.sen = pres_A.sen * (double) PISTON_AREA_A - pres_B.sen * (double) PISTON_AREA_B;
 
 
 
-        //Current
-        //ADC3->CR2  |= 0x40000000;                        // adc _ 12bit
+    //Current
+    //ADC3->CR2  |= 0x40000000;                        // adc _ 12bit
 //          a1=ADC2->DR;
-        int raw_cur = ADC3->DR;
-        //while((ADC3->SR & 0b10));
-        double alpha_update_cur = 1.0/(1.0+(FREQ_TMR4/2.0)/(2.0*3.14*1000.0)); // f_cutoff : 500Hz
-        double cur_new = ((double)ADC3->DR-2048.0)*20.0/4096.0; // unit : mA
-        cur.sen=cur.sen*(1.0-alpha_update_cur)+cur_new*(alpha_update_cur);
-        cur.sen = raw_cur;
+    int raw_cur = ADC3->DR;
+    //while((ADC3->SR & 0b10));
+    double alpha_update_cur = 1.0/(1.0+(FREQ_TMR4/2.0)/(2.0*3.14*1000.0)); // f_cutoff : 500Hz
+    double cur_new = ((double)ADC3->DR-2048.0)*20.0/4096.0; // unit : mA
+    cur.sen=cur.sen*(1.0-alpha_update_cur)+cur_new*(alpha_update_cur);
+    cur.sen = raw_cur;
 
-        
-
-        /*******************************************************
-        ***     Timer Counting & etc.
-        ********************************************************/
-        CNT_TMR4++;
-    }
+    /*******************************************************
+    ***     Timer Counting & etc.
+    ********************************************************/
+    //CNT_TMR4++;
+    }    
     TIM4->SR = 0x0;  // reset the status register
 }
+
+
 int j =0;
-unsigned long CNT_TMR3 = 0;
+//unsigned long CNT_TMR3 = 0;
 double FREQ_TMR3 = (double)FREQ_5k;
 double DT_TMR3 = (double)DT_5k;
 extern "C" void TIM3_IRQHandler(void)
-{
-    if ( TIM3->SR & TIM_SR_UIF ) {
-        
+{ 
+    if (TIM3->SR & TIM_SR_UIF ) {
         ENC_UPDATE();
 
-        /*
-        // Reference Loop
-        switch (REFERENCE_MODE) {
-            case MODE_REF_NO_ACT: {
-                break;
-            }
-            case MODE_REF_DIRECT: {
-                if (FLAG_REFERENCE_VALVE_PWM) {
-                    Vout.ref = (double) Vout.ref;
-                }
-                if (FLAG_REFERENCE_VALVE_POSITION) {
-                    valve_pos.ref = (double) valve_pos.ref;
-                }
-                if (FLAG_REFERENCE_JOINT_POSITION) {
-                    pos.ref = (double) pos.ref;
-                    vel.ref = (double) vel.ref;
-                }
-                if (FLAG_REFERENCE_JOINT_TORQUE) {
-                    torq.ref = (double) torq.ref;
-                }
-                if (FLAG_REFERENCE_CURRENT) {
-                    cur.ref = ((double)cur.ref);
-                }
-                break;
-            }
-            
-            case MODE_REF_COS_INC: {
-                if (FLAG_REFERENCE_VALVE_PWM) {
-                    Vout.ref = ((double) Vout.ref - (double) INIT_Vout.ref)*(0.5 - 0.5 * cos(3.14159 * (double) TMR3_COUNT_REFERENCE / (double) REF_MOVE_TIME_5k)) + (double) INIT_Vout.ref;
-                }
-                if (FLAG_REFERENCE_VALVE_POSITION) {
-                    valve_pos.ref = ((double) valve_pos.ref - (double) INIT_Valve_Pos.ref)*(0.5 - 0.5 * cos(3.14159 * (double) TMR3_COUNT_REFERENCE / (double) REF_MOVE_TIME_5k)) + (double) INIT_Valve_Pos.ref;
-                }
-                if (FLAG_REFERENCE_JOINT_POSITION) {
-                    pos.ref = ((double) pos.ref - (double) INIT_Pos.ref)*(0.5 - 0.5 * cos(3.14159 * (double) TMR3_COUNT_REFERENCE / (double) REF_MOVE_TIME_5k)) + (double) INIT_Pos.ref;
-                    vel.ref = 0.0;
-                }
-                if (FLAG_REFERENCE_JOINT_TORQUE) {
-                    torq.ref = ((double) torq.ref - (double) INIT_torq.ref)*(0.5 - 0.5 * cos(3.14159 * (double) TMR3_COUNT_REFERENCE / (double) REF_MOVE_TIME_5k)) + (double) INIT_torq.ref;
-                }
-                TMR3_COUNT_REFERENCE++;
-                if (TMR3_COUNT_REFERENCE >= REF_MOVE_TIME_5k) {
-                    //REFERENCE_MODE = MODE_REF_DIRECT;
-                    TMR3_COUNT_REFERENCE = REF_MOVE_TIME_5k;
-                    //TMR3_COUNT_REFERENCE = 0;
-                }
-                break;
-            }
-
+        // CONTROL LOOP ------------------------------------------------------------
 
-            case MODE_REF_LINE_INC: {
-                if (FLAG_REFERENCE_VALVE_PWM) {
-                    Vout.ref = ((double) Vout.ref - (double) INIT_Vout.ref)*((double) TMR3_COUNT_REFERENCE / (double) REF_MOVE_TIME_5k) + (double) INIT_Vout.ref;
-                }
-                if (FLAG_REFERENCE_VALVE_POSITION) {
-                    valve_pos.ref = ((double) valve_pos.ref - (double) INIT_valve_pos.ref)*((double) TMR3_COUNT_REFERENCE / (double) REF_MOVE_TIME_5k) + (double) INIT_valve_pos.ref;
-                }
-                if (FLAG_REFERENCE_JOINT_POSITION) {
-                    pos.ref = ((double) pos.ref - (double) INIT_REF_POS)*((double) TMR3_COUNT_REFERENCE / (double) REF_MOVE_TIME_5k) + (double) INIT_REF_POS;
-                    vel.ref = ((double) pos.ref - (double) INIT_REF_POS) / (double) REF_MOVE_TIME_5k * (double) TMR_FREQ_5k;    //   pulse/sec
-                }
-                if (FLAG_REFERENCE_JOINT_TORQUE) {
-                    torq.ref = ((double) torq.ref - (double) INIT_torq.ref)*((double) TMR3_COUNT_REFERENCE / (double) REF_MOVE_TIME_5k) + (double) INIT_torq.ref;
-                }
-                TMR3_COUNT_REFERENCE++;
-                if (TMR3_COUNT_REFERENCE >= REF_MOVE_TIME_5k) {
-                    //REFERENCE_MODE = MODE_REF_DIRECT;
-                    TMR3_COUNT_REFERENCE = REF_MOVE_TIME_5k;
-                    //TMR3_COUNT_REFERENCE = 0;
-                }
-                break;
-            }
-
-            case MODE_REF_SIN_WAVE: {
-                if (FLAG_REFERENCE_VALVE_PWM) {
-                    Vout.ref = REF_MAG * sin(2 * 3.14159 * (double) TMR3_COUNT_REFERENCE / (double) TMR3_COUNT_REFERENCE) + (double) Vout.ref;
-                }
-                if (FLAG_REFERENCE_VALVE_POSITION) {
-                    valve_pos.ref = REF_MAG * sin(2 * 3.14159 * (double) TMR3_COUNT_REFERENCE / (double) TMR3_COUNT_REFERENCE) + (double) valve_pos.ref;
-                }
-                if (FLAG_REFERENCE_JOINT_POSITION) {
-                    Ref_Joint_Pos = REF_MAG * sin(2 * 3.14159 * (double) TMR3_COUNT_REFERENCE / (double) TMR3_COUNT_REFERENCE) + (double) pos.ref;
-                }
-                if (FLAG_REFERENCE_JOINT_TORQUE) {
-                    Ref_Joint_Torq = REF_MAG * sin(2 * 3.14159 * (double) TMR3_COUNT_REFERENCE / (double) TMR3_COUNT_REFERENCE) + (double) torq.ref;
-                }
-                TMR3_COUNT_REFERENCE++;
-                if (TMR3_COUNT_REFERENCE >= TMR3_COUNT_REFERENCE * REF_NUM) {
-                    REFERENCE_MODE = MODE_REF_DIRECT;
-                    TMR3_COUNT_REFERENCE = 0;
-                }
-                break;
-            }
-
-            case MODE_REF_SQUARE_WAVE: {
-                if (FLAG_REFERENCE_VALVE_PWM) {
-                    Vout.ref = REF_MAG * sin(2 * 3.14159 * (double) TMR3_COUNT_REFERENCE / (double) TMR3_COUNT_REFERENCE) + (double) Vout.ref;
-                    if (Vout.ref >= Vout.ref) Vout.ref = REF_MAG + Vout.ref;
-                    else Vout.ref = -REF_MAG + Vout.ref;
-                }
-                if (FLAG_REFERENCE_VALVE_POSITION) {
-                    valve_pos.ref = REF_MAG * sin(2 * 3.14159 * (double) TMR3_COUNT_REFERENCE / (double) TMR3_COUNT_REFERENCE) + (double) valve_pos.ref;
-                    if (valve_pos.ref >= valve_pos.ref) valve_pos.ref = REF_MAG + valve_pos.ref;
-                    else valve_pos.ref = -REF_MAG + valve_pos.ref;
-                }
-                if (FLAG_REFERENCE_JOINT_POSITION) {
-                    Ref_Joint_Pos = REF_MAG * sin(2 * 3.14159 * (double) TMR3_COUNT_REFERENCE / (double) TMR3_COUNT_REFERENCE) + (double) pos.ref;
-                    if (Ref_Joint_Pos >= pos.ref) valve_pos.ref = REF_MAG + pos.ref;
-                    else Ref_Joint_Pos = -REF_MAG + pos.ref;
-                }
-                if (FLAG_REFERENCE_JOINT_TORQUE) {
-                    Ref_Joint_Torq = REF_MAG * sin(2 * 3.14159 * (double) TMR3_COUNT_REFERENCE / (double) TMR3_COUNT_REFERENCE) + (double) torq.ref;
-                    if (Ref_Joint_Torq >= torq.ref) valve_pos.ref = REF_MAG + torq.ref;
-                    else Ref_Joint_Torq = -REF_MAG + torq.ref;
-                }
-                TMR3_COUNT_REFERENCE++;
-                if (TMR3_COUNT_REFERENCE >= TMR3_COUNT_REFERENCE * REF_NUM) {
-                    REFERENCE_MODE = MODE_REF_DIRECT;
-                    TMR3_COUNT_REFERENCE = 0;
-                }
-                break;
-            }
-            
-            default:
-                break;
-        }
-        
-        */
-
-        // CONTROL LOOP ------------------------------------------------------------
-        
         switch (CONTROL_MODE) {
             case MODE_NO_ACT: {
                 V_out = 0;
@@ -551,7 +442,7 @@
                 //            if (torq.err_sum<-1000) torq.err_sum = -1000;
                 //            VALVE_PWM_RAW_TORQ = (double) P_GAIN_JOINT_TORQUE * torq.err + (double) I_GAIN_JOINT_TORQUE * torq.err_sum + (double) D_GAIN_JOINT_TORQUE * torq.err_diff;
                 //            VALVE_PWM_RAW_TORQ = VALVE_PWM_RAW_TORQ * 0.01;
-                
+
                 PWM_RAW_FORCE_FB = 0.0;
 
                 V_out = PWM_RAW_POS_FF + PWM_RAW_POS_FB + PWM_RAW_FORCE_FB;
@@ -561,9 +452,9 @@
 
             case MODE_JOINT_POSITION_TORQUE_CONTROL_VALVE_POSITION: {
                 double VALVE_POS_RAW_POS_FB = 0.0; // Valve Position by Position Feedback
-                double VALVE_POS_RAW_POS_FF = 0.0; // Valve Position by Position Feedforward
+                //double VALVE_POS_RAW_POS_FF = 0.0; // Valve Position by Position Feedforward
                 double VALVE_POS_RAW_FORCE_FB = 0.0; // Valve Position by Force Feedback
-                int DDV_JOINT_CAN = 0;
+                //int DDV_JOINT_CAN = 0;
                 // feedback input for position control
                 pos.err = pos.ref - (double) pos.sen;
                 pos.err_diff = pos.err - pos.err_old;
@@ -594,9 +485,8 @@
                 //            VALVE_PWM_RAW_TORQ = VALVE_PWM_RAW_TORQ * 0.01;
                 VALVE_POS_RAW_FORCE_FB = 0.0;
 
-                valve_pos.ref = VALVE_POS_RAW_POS_FB + DDV_JOINT_POS_FF(vel.ref) + VALVE_POS_RAW_FORCE_FB;
-                //valve_pos.ref = DDV_JOINT_POS_FF(Ref_Joint_Vel);
-
+                //valve_pos.ref = VALVE_POS_RAW_POS_FB + DDV_JOINT_POS_FF(vel.ref) + VALVE_POS_RAW_FORCE_FB;
+                valve_pos.ref = VALVE_POS_RAW_POS_FB + DDV_CENTER;
                 VALVE_POS_CONTROL(valve_pos.ref);
                 break;
             }
@@ -686,7 +576,7 @@
 
                 valve_pos.ref = VALVE_PWM_RAW_POS + VALVE_PWM_RAW_TORQ;
                 VALVE_POS_CONTROL(valve_pos.ref);
-                
+
                 break;
             }
 
@@ -695,66 +585,66 @@
                 break;
             }
 
-           
-            case MODE_TEST_CURRENT_CONTROL:
-            {
+
+            case MODE_TEST_CURRENT_CONTROL: {
                 if (TMR3_COUNT_IREF == TMR_FREQ_5k) {
                     TMR3_COUNT_IREF = 0;
-                } TMR3_COUNT_IREF++;
-            
-                // Set Current Reference 
+                }
+                TMR3_COUNT_IREF++;
+
+                // Set Current Reference
                 double TMR3_CNT_MAX = (double)TMR_FREQ_5k/2.0;
                 double I_REF_MID = 0.0;
                 if (TMR3_COUNT_IREF < TMR3_CNT_MAX) {
                     I_REF = I_REF_MID + 1.0;
                 } else {
                     I_REF = I_REF_MID - 1.0;
-                }    
+                }
 //              double T = 1.0; // wave period
 //              I_REF = (5. * sin(2. * 3.1415 * (double) TMR3_COUNT_IREF / (double)TMR_FREQ_5k/ T));
 //              I_REF = (2.0 * sin(2. * 2. * 3.14 * (double) TMR3_COUNT_IREF / 5000.)+(2.0 * sin(2. * 1. * 3.14 * (double)TMR3_COUNT_IREF/ 5000.))+(2.0 * sin(2. * 5. * 3.14 * (double)TMR3_COUNT_IREF/ 5000.))+(2.0 * sin(2. * 10. * 3.14 * (double)TMR3_COUNT_IREF/ 5000.)));
-            
+
                 if (TMR3_COUNT_IREF % (int) (TMR_FREQ_5k / CAN_FREQ) == 0) {
-                    CAN_TX_PRES((int16_t)(I_REF*1000.0), (int16_t) (CUR_CURRENT*1000.0)); // to check the datas  
+                    CAN_TX_PRES((int16_t)(I_REF*1000.0), (int16_t) (CUR_CURRENT*1000.0)); // to check the datas
                 }
                 break;
             }
-                    
-            case MODE_TEST_PWM_CONTROL:
-            {
+
+            case MODE_TEST_PWM_CONTROL: {
                 if (TMR3_COUNT_IREF == TMR_FREQ_5k) {
                     TMR3_COUNT_IREF = 0;
-                } TMR3_COUNT_IREF++;
-                
+                }
+                TMR3_COUNT_IREF++;
+
                 // Set PWM reference
                 double TMR3_CNT_MAX = (double)TMR_FREQ_5k/2.0;
-                double I_REF_MID = 0.0;
+                //double I_REF_MID = 0.0;
                 if (TMR3_COUNT_IREF < TMR3_CNT_MAX) {
                     CUR_PWM = 1000;
                 } else {
                     CUR_PWM = -1000;
-                }    
-         
+                }
+
                 if (TMR3_COUNT_IREF % (int) (TMR_FREQ_5k / CAN_FREQ) == 0) {
                     CAN_TX_PRES((int16_t)(u_CUR[0]*1000.0), (int16_t) (CUR_CURRENT*1000.0)); // to check the datas
                 }
                 break;
             }
-            
-            
+
+
             case MODE_CURRENT_CONTROL: {
 
                 cur.ref = cur.ref; // Unit : mA
                 CurrentControl();
                 break;
             }
-            
+
             case MODE_JOINT_POSITION_TORQUE_CONTROL_CURRENT: {
                 double I_REF_POS_FB = 0.0; // I_REF by Position Feedback
                 double I_REF_POS_FF = 0.0; // I_REF by Position Feedforward
                 double I_REF_FORCE_FB = 0.0; // I_REF by Force Feedback
                 double I_REF_FORCE_FF = 0.0; // I_REF by Force Feedforward
-    
+
                 // feedback input for position control
                 pos.err = pos.ref - pos.sen;
                 double alpha_update_vel = 1.0/(1.0+(double)FREQ_TMR4/(2.0*3.1415*50.0)); // f_cutoff : 50Hz
@@ -762,7 +652,7 @@
                 pos.err_diff = (1.0-alpha_update_vel)*pos.err_diff + alpha_update_vel*err_diff;
                 pos.err_old = pos.err;
                 I_REF_POS_FB = 0.001*((double)P_GAIN_JOINT_POSITION * pos.err + (double)D_GAIN_JOINT_POSITION * pos.err_diff * 0.1);
-    
+
                 // feedforward input for position control
                 double Vel_Act_Ref = vel.ref; // [pulse/s] >> [deg/s]
                 double K_ff = 1.3;
@@ -770,51 +660,51 @@
                 if(Vel_Act_Ref > 0) K_v = 1.0/100.0; // open, tuning. (deg/s >> mA)
                 if(Vel_Act_Ref < 0) K_v = 1.0/100.0; // close, tuning. (deg/s >> mA)
                 I_REF_POS_FF = K_ff*K_v*Vel_Act_Ref;
-                
+
                 // feedback input for position control
                 I_REF_FORCE_FB = 0.0;
-                
+
                 // feedforward input for position control
                 I_REF_FORCE_FF = 0.0;
-    
+
                 cur.ref = I_REF_POS_FF + I_REF_POS_FB + I_REF_FORCE_FB + I_REF_FORCE_FF;
-                
+
                 CurrentControl();
-                
+
                 break;
             }
-            
+
             case MODE_JOINT_POSITION_PRES_CONTROL_CURRENT: {
-                double T_REF = 0.0; // Torque Reference
+                //double T_REF = 0.0; // Torque Reference
                 double I_REF_FORCE_FB = 0.; // I_REF by Force Feedback
                 double I_REF_VC = 0.; // I_REF for velocity compensation
-                
+
                 // feedback input for position control
-                double Joint_Pos_Err = 34.0-(double) pos.sen/(double)ENC_PULSE_PER_POSITION; // [pulse/s] >> [deg/s] 
-                double Joint_Vel_Err = 0.0-(double) vel.sen/(double)ENC_PULSE_PER_POSITION; // [pulse/s] >> [deg/s] 
-                double K_spring = 0.7;
-                double D_damper = 0.02;
+                //double Joint_Pos_Err = 34.0-(double) pos.sen/(double)ENC_PULSE_PER_POSITION; // [pulse/s] >> [deg/s]
+                //double Joint_Vel_Err = 0.0-(double) vel.sen/(double)ENC_PULSE_PER_POSITION; // [pulse/s] >> [deg/s]
+                //double K_spring = 0.7;
+                //double D_damper = 0.02;
 //              T_REF = K_spring * pos.err + D_damper * Joint_Vel_Err; // unit : Nm
-            
+
                 // torque feedback
                 torq.err = torq.ref - torq.sen;
                 //            torq.err_diff = torq.err - torq.err_old;
                 //            torq.err_old = torq.err;
                 torq.err_sum = torq.err_sum + torq.err/(double)TMR_FREQ_5k;
-                I_REF_FORCE_FB = 0.001*((double)P_GAIN_JOINT_TORQUE * torq.err + (double)I_GAIN_JOINT_TORQUE * torq.err_sum); 
-                
+                I_REF_FORCE_FB = 0.001*((double)P_GAIN_JOINT_TORQUE * torq.err + (double)I_GAIN_JOINT_TORQUE * torq.err_sum);
+
                 // velocity compensation for torque control
-                double Joint_Vel_Act = vel.sen/(double)ENC_PULSE_PER_POSITION; // [pulse/s] >> [deg/s] 
+                double Joint_Vel_Act = vel.sen/(double)ENC_PULSE_PER_POSITION; // [pulse/s] >> [deg/s]
                 double K_vc = 1.5; // Velocity comp. gain
-                double K_v = 0.0; // Valve gain 
+                double K_v = 0.0; // Valve gain
                 if(Joint_Vel_Act > 0) K_v = 1.0/100.0; // open, tuning
                 if(Joint_Vel_Act < 0) K_v = 1.0/100.0; // close, tuning
                 I_REF_VC = K_vc*K_v*Joint_Vel_Act;
-                
+
                 cur.ref = I_REF_VC + I_REF_FORCE_FB;
-    //            cur.ref = I_REF_FORCE_FB;
-    
-                double I_MAX = 10.00; // Maximum Current : 10mV 
+                //            cur.ref = I_REF_FORCE_FB;
+
+                double I_MAX = 10.00; // Maximum Current : 10mV
                 double Ka = 1.0/I_GAIN_JOINT_TORQUE;
                 if(cur.ref > I_MAX) {
                     double I_rem = cur.ref-I_MAX;
@@ -823,20 +713,20 @@
                     torq.err_sum = torq.err_sum - I_rem/(double)TMR_FREQ_5k;
                 } else if(cur.ref < -I_MAX) {
                     double I_rem = cur.ref-(-I_MAX);
-                    I_rem = Ka*I_rem; 
+                    I_rem = Ka*I_rem;
                     cur.ref = -I_MAX;
                     torq.err_sum = torq.err_sum - I_rem/(double)TMR_FREQ_5k;
                 }
-                
+
                 CurrentControl();
-                
-                
+
+
                 /*
                 double I_REF_POS_FB = 0.0; // I_REF by Position Feedback
                 double I_REF_POS_FF = 0.0; // I_REF by Position Feedforward
                 double I_REF_FORCE_FB = 0.0; // I_REF by Force Feedback
                 double I_REF_FORCE_FF = 0.0; // I_REF by Force Feedforward
-    
+
                 // feedback input for position control
                 pos.err = pos.ref - pos.sen;
                 double alpha_update_vel = 1.0/(1.0+(double)FREQ_TMR4/(2.0*3.1415*50.0)); // f_cutoff : 50Hz
@@ -844,7 +734,7 @@
                 pos.err_diff = (1.0-alpha_update_vel)*pos.err_diff + alpha_update_vel*err_diff;
                 pos.err_old = pos.err;
                 I_REF_POS_FB = 0.001*((double)P_GAIN_JOINT_POSITION * pos.err + (double)D_GAIN_JOINT_POSITION * pos.err_diff * 0.1);
-    
+
                 // feedforward input for position control
                 double Vel_Act_Ref = vel.ref; // [pulse/s] >> [deg/s]
                 double K_ff = 1.3;
@@ -852,18 +742,18 @@
                 if(Vel_Act_Ref > 0) K_v = 1.0/100.0; // open, tuning. (deg/s >> mA)
                 if(Vel_Act_Ref < 0) K_v = 1.0/100.0; // close, tuning. (deg/s >> mA)
                 I_REF_POS_FF = K_ff*K_v*Vel_Act_Ref;
-                
+
                 // feedback input for position control
                 I_REF_FORCE_FB = 0.0;
-                
+
                 // feedforward input for position control
                 I_REF_FORCE_FF = 0.0;
-    
+
                 cur.ref = I_REF_POS_FF + I_REF_POS_FB + I_REF_FORCE_FB + I_REF_FORCE_FF;
-                
+
                 CurrentControl();
                 */
-               
+
                 break;
             }
 
@@ -871,18 +761,18 @@
                 // DAC Voltage reference set
                 if (TMR3_COUNT_TORQUE_NULL < TMR_FREQ_5k * 2) {
                     CUR_TORQUE_sum += torq.sen;
-                    
+
                     if (TMR3_COUNT_TORQUE_NULL % 10 == 0) {
                         CUR_TORQUE_mean = CUR_TORQUE_sum / 10.0;
                         CUR_TORQUE_sum = 0;
 
                         TORQUE_VREF += 0.0001 * (TORQUE_NULL - CUR_TORQUE_mean);
-                        
+
                         if (TORQUE_VREF > 3.3) TORQUE_VREF = 3.3;
                         if (TORQUE_VREF < 0) TORQUE_VREF = 0;
-                        
+
                         ROM_RESET_DATA();
-                        
+
                         //spi_eeprom_write(RID_TORQUE_SENSOR_VREF, (int16_t) (TORQUE_VREF * 1000.0));
                         dac_1 = TORQUE_VREF / 3.3;
                     }
@@ -891,18 +781,18 @@
                     TMR3_COUNT_TORQUE_NULL = 0;
                     CUR_TORQUE_sum = 0;
                     CUR_TORQUE_mean = 0;
-                    
+
                     ROM_RESET_DATA();
-                    
+
                     //spi_eeprom_write(RID_TORQUE_SENSOR_VREF, (int16_t) (TORQUE_VREF * 1000.0));
-                    
+
                     //pc.printf("%f\n", TORQUE_VREF);
                     dac_1 = TORQUE_VREF / 3.3;
 
                 }
                 TMR3_COUNT_TORQUE_NULL++;
                 break;
-            }     
+            }
 
             case MODE_VALVE_NULLING_AND_DEADZONE_SETTING: {
                 if (TMR3_COUNT_DEADZONE == 0) {
@@ -967,9 +857,9 @@
                             VALVE_DEADZONE_MINUS = VALVE_CENTER;
                         }
                         V_out = 0;
-                        
+
                         ROM_RESET_DATA();
-                        
+
                         //spi_eeprom_write(RID_VALVE_DEADZONE_PLUS, VALVE_DEADZONE_PLUS);
                         //spi_eeprom_write(RID_VALVE_DEADZONE_MINUS, VALVE_DEADZONE_MINUS);
 
@@ -982,8 +872,8 @@
             }
 
             case MODE_FIND_HOME: {
-                
-                
+
+
                 ////////////////////////////////////////////FIND_HOME_PWM/////////////////////////////////////////////////////
                 if (FLAG_FIND_HOME == true) {
                     cnt_findhome = 0;
@@ -1032,7 +922,7 @@
                     cnt_findhome = 0;
                     cnt_vel_findhome = 0;
                 }
-                
+
                 /*
                 ////////////////////////////////////////////FIND_HOME_CURRENT/////////////////////////////////////////////////////
                 if (FLAG_FIND_HOME == true) {
@@ -1042,7 +932,7 @@
                     Ref_Joint_Pos = pos.sen;
                     FLAG_FIND_HOME = false;
                 }
-                
+
                 int cnt_check_enc = (TMR_FREQ_5k/500);
                 if(cnt_findhome%cnt_check_enc == 0){
                     FINDHOME_POSITION = pos.sen;
@@ -1050,19 +940,19 @@
                     FINDHOME_POSITION_OLD = FINDHOME_POSITION;
                 } cnt_findhome++;
                 if(cnt_findhome == 10000) cnt_findhome = 0;
-                
+
                 if (abs(FINDHOME_VELOCITY) <= 1) {
                     cnt_vel_findhome = cnt_vel_findhome + 1;
                 } else {
                     cnt_vel_findhome = 0;
                 }
-                
+
                 if (cnt_vel_findhome < 3*TMR_FREQ_5k) { // wait for 3sec
                     REFERENCE_MODE = MODE_REF_NO_ACT;
                     if (HOMEPOS_OFFSET > 0) Ref_Joint_Pos = Ref_Joint_Pos + 1.0;
                     else Ref_Joint_Pos = Ref_Joint_Pos - 1.0;
                     pos.err = Ref_Joint_Pos - pos.sen;
-                    I_REF = 0.001*((double)pos.err);    
+                    I_REF = 0.001*((double)pos.err);
                     if(I_REF>5.0) I_REF = 5.0;
                     if(I_REF<-5.0) I_REF = -5.0;
                     cur.ref = I_REF;
@@ -1076,7 +966,7 @@
                     Ref_Joint_Vel = 0.0;
                     REFERENCE_MODE = MODE_REF_COS_INC;
                     CONTROL_MODE = MODE_JOINT_POSITION_TORQUE_CONTROL_VALVE_POSITION;
-                    
+
                     FINDHOME_POSITION = 0;
                     FINDHOME_POSITION_OLD = 0;
                     FINDHOME_VELOCITY = 0;
@@ -1084,7 +974,7 @@
                     cnt_vel_findhome = 0;
                 }
                 */
-                
+
                 break;
             }
 
@@ -1135,9 +1025,9 @@
                         }
                     }
                     if (fl_temp_cnt2 == 100) {
-                        
+
                         ROM_RESET_DATA();
-                        
+
                         //spi_eeprom_write(RID_VALVE_GAIN_PLUS_1 + flag_flowrate, (int16_t) (VALVE_GAIN_LPM_PER_V[flag_flowrate] * 100.0));
                         cur_vel_sum = 0;
                         fl_temp_cnt = 0;
@@ -1180,7 +1070,7 @@
                         if (PRES_A_VREF < 0) PRES_A_VREF = 0;
                         if (PRES_B_VREF > 3.3) PRES_B_VREF = 3.3;
                         if (PRES_B_VREF < 0) PRES_B_VREF = 0;
-                        
+
                         dac_1 = PRES_A_VREF / 3.3;
                         dac_2 = PRES_B_VREF / 3.3;
                     }
@@ -1193,7 +1083,7 @@
                     CUR_PRES_B_mean = 0;
 
                     ROM_RESET_DATA();
-                
+
                     dac_1 = PRES_A_VREF / 3.3;
                     dac_2 = PRES_B_VREF / 3.3;
                     //pc.printf("nulling end");
@@ -1225,7 +1115,7 @@
                     CUR_PRES_B_sum = 0;
                     CUR_PRES_A_mean = 0;
                     CUR_PRES_B_mean = 0;
-                    
+
                     ROM_RESET_DATA();
 
                     //spi_eeprom_write(RID_PRES_SENSOR_A_PULSE_PER_BAR, (int16_t) (PRES_SENSOR_A_PULSE_PER_BAR * 100.0));
@@ -1273,9 +1163,9 @@
                     VALVE_POS_AVG_OLD = VALVE_POS_AVG[0];
                     for(i=0; i<25; i++) {
                         VALVE_POS_VS_PWM[i] = (int16_t) (VALVE_POS_AVG[i]);
-                        
+
                         //ROM_RESET_DATA();
-                        
+
                         //spi_eeprom_write(RID_VALVE_POS_VS_PWM_0 + i, (int16_t) (VALVE_POS_AVG[i]));
                         if(VALVE_POS_AVG[i] > VALVE_POS_AVG_OLD) {
                             VALVE_MAX_POS = VALVE_POS_AVG[i];
@@ -1285,9 +1175,9 @@
                             VALVE_POS_AVG_OLD = VALVE_MIN_POS;
                         }
                     }
-                    
+
                     ROM_RESET_DATA();
-                    
+
                     //spi_eeprom_write(RID_VALVE_MAX_POS, (int16_t) (VALVE_MAX_POS));
                     //spi_eeprom_write(RID_VALVE_MIN_POS, (int16_t) (VALVE_MIN_POS));
                     CAN_TX_PRES((int16_t) (VALVE_MAX_POS), (int16_t) (VALVE_MIN_POS));
@@ -1374,7 +1264,7 @@
                         //CAN_TX_PRES((int16_t) (DZ_case), (int16_t) (DZ_NUM));
 
                     }
-                }else {
+                } else {
                     if((DZ_case == -1 && DZ_NUM == 1) | (DZ_case == 1 && DZ_NUM == 1)) {
                         if(VALVE_DZ_timer < (int) (1.0 * (double) TMR_FREQ_5k)) {
                             V_out = (double) P_GAIN_JOINT_POSITION * 0.01 * (0.5 * (double) pos_plus_end + 0.5 * (double) pos_minus_end - (double) pos.sen);
@@ -1468,9 +1358,11 @@
                                 SECOND_DZ = valve_pos.ref;
                                 DDV_CENTER = (int) (0.5 * (double) (FIRST_DZ) + 0.5 * (double) (SECOND_DZ));
                                 first_check = 0;
-                                
+                                VALVE_DEADZONE_MINUS = FIRST_DZ;
+                                VALVE_DEADZONE_PLUS = SECOND_DZ;
+
                                 ROM_RESET_DATA();
-                                
+
                                 //spi_eeprom_write(RID_VALVE_DEADZONE_PLUS, FIRST_DZ);
                                 //spi_eeprom_write(RID_VALVE_DEADZONE_MINUS, SECOND_DZ);
                                 //spi_eeprom_write(RID_DDV_CENTER, DDV_CENTER);
@@ -1566,14 +1458,10 @@
                                 DDV_CENTER = (int) (0.5 * (double) (FIRST_DZ) + 0.5 * (double) (SECOND_DZ));
                                 first_check = 0;
                                 VALVE_DEADZONE_MINUS = FIRST_DZ;
-                                
-                                ROM_RESET_DATA();
-                                
                                 //spi_eeprom_write(RID_VALVE_DEADZONE_PLUS, FIRST_DZ);
                                 VALVE_DEADZONE_PLUS = SECOND_DZ;
-                                
                                 ROM_RESET_DATA();
-                                
+
                                 //spi_eeprom_write(RID_VALVE_DEADZONE_MINUS, SECOND_DZ);
                                 //spi_eeprom_write(RID_DDV_CENTER, DDV_CENTER);
                                 CAN_TX_PRES((int16_t) FIRST_DZ, (int16_t) SECOND_DZ);
@@ -1616,15 +1504,15 @@
                         V_out = (double) P_GAIN_JOINT_POSITION * 0.01* (0.5 * (double) pos_plus_end + 0.5 * (double) pos_minus_end - (double) pos.sen);
                     } else if(VALVE_FR_timer == (int) (1.0 * (double) TMR_FREQ_5k)) {
                         data_num = 0;
-                        valve_pos.ref = 50*(ID_index_array[ID_index]) + DDV_CENTER;
+                        valve_pos.ref = 10*(ID_index_array[ID_index]) + DDV_CENTER;
 
                         VALVE_POS_CONTROL(valve_pos.ref);
                         START_POS = pos.sen;
                     } else if(VALVE_FR_timer < (int) (5.0 * (double) TMR_FREQ_5k)) {
-                        valve_pos.ref = 50*(ID_index_array[ID_index]) + DDV_CENTER;
+                        valve_pos.ref = 10*(ID_index_array[ID_index]) + DDV_CENTER;
                         VALVE_POS_CONTROL(valve_pos.ref);
                         data_num = data_num + 1;
-                        if(abs(0.5 * (double) pos_plus_end + 0.5 * (double) pos_minus_end - (double) pos.sen) > 20000) {
+                        if(abs(0.5 * (double) pos_plus_end + 0.5 * (double) pos_minus_end - (double) pos.sen) > 20000.0) {
                             FINAL_POS = pos.sen;
                             one_period_end = 1;
                         }
@@ -1640,23 +1528,23 @@
                             min_check = 1;
                         }
                         JOINT_VEL[ID_index] = (FINAL_POS - START_POS) / data_num * TMR_FREQ_5k;   //  pulse/sec
-                        
-                        ROM_RESET_DATA();
-                        
+
+                        //ROM_RESET_DATA();
+
                         //spi_eeprom_write(RID_VALVE_POS_VS_FLOWRATE_0 + ID_index, (int16_t) (JOINT_VEL[ID_index] & 0xFFFF));
                         //spi_eeprom_write(RID_VALVE_POS_VS_FLOWRATE_0_1 + ID_index, (int16_t) ((JOINT_VEL[ID_index] >> 16) & 0xFFFF));
                         VALVE_FR_timer = 0;
                         one_period_end = 0;
                         ID_index= ID_index +1;
                         //                    CAN_TX_PRES((int16_t) (valve_pos.ref), (int16_t) (ID_index));
+                        V_out = 0.0;
                     }
 
                     if(max_check == 1 && min_check == 1) {
-                        
-                        ROM_RESET_DATA();
-                        
+
                         //spi_eeprom_write(RID_VALVE_POS_NUM, (int16_t) (ID_index));
                         VALVE_POS_NUM = ID_index;
+                        ROM_RESET_DATA();
                         ID_index = 0;
                         first_check = 0;
                         VALVE_FR_timer = 0;
@@ -1704,14 +1592,13 @@
 
         //CAN ----------------------------------------------------------------------
         //if (TMR3_COUNT_CAN_TX % (int) (TMR_FREQ_5k / CAN_FREQ) == 0) {
-        if (TMR3_COUNT_CAN_TX % 10 == 0) {
+        if (TMR3_COUNT_CAN_TX % 1000 == 0) {
 
             if (flag_data_request[0] == HIGH) {
                 //position+velocity
                 CAN_TX_POSITION((int32_t) pos.sen, (int32_t) vel.sen);
                 //CAN_TX_POSITION((int32_t) valve_pos.ref, (int32_t) 0);
                 //CAN_TX_POSITION((int32_t) VALVE_PWM_RAW_FF, (int32_t) VALVE_POS_VS_PWM[10]);
-                
                 //pc.printf("can good");
                 //                                    CAN_TX_POSITION((long) CUR_PRES_A_BAR, (long) CUR_PRES_B_BAR);
             }
@@ -1721,6 +1608,7 @@
                 //CAN_TX_TORQUE((int16_t) (CUR_TORQUE_NM * 100.));
                 //CAN_TX_TORQUE((int16_t) (CUR_TORQUE_NM));
                 CAN_TX_TORQUE((int16_t) (cur.sen));
+                //CAN_TX_TORQUE((int16_t) (Ref_Valve_Pos_FF_CAN));
                 //            CAN_TX_TORQUE((int16_t) DZ_temp_cnt);
             }
 
@@ -1737,7 +1625,7 @@
             if (flag_data_request[3] == HIGH) {
                 //PWM
                 CAN_TX_PWM((int16_t) CUR_PWM);
-                //            CAN_TX_PWM((int16_t) (CONTROL_MODE));
+                //CAN_TX_PWM((int16_t) (Ref_Valve_Pos_FF_CAN));
                 //            CAN_TX_PWM((int16_t) cnt_vel_findhome);
                 //            CAN_TX_PWM((int16_t) (VALVE_VOLTAGE * 1000.));
                 //                        CAN_TX_PWM((int16_t) (VALVE_VOLTAGE_VALVE_DZ * 1000.));
@@ -1762,9 +1650,9 @@
 
         }
         TMR3_COUNT_CAN_TX++;
-        
-        
-        
+
+
+
 
         /*******************************************************
         ***     Valve Control
@@ -1787,8 +1675,8 @@
         // Saturation of output voltage to 5.0V
 //        if(PWM_out > 0.41667) PWM_out=0.41667; //5.0/12.0 = 0.41667
 //        else if (PWM_out < -0.41667) PWM_out=-0.41667;
-        
-         // Saturation of output voltage to 12.0V
+
+        // Saturation of output voltage to 12.0V
         if(PWM_out > 1.0) PWM_out=1.0;
         else if (PWM_out < -1.0) PWM_out=-1.0;
 
@@ -1819,7 +1707,7 @@
 //            can.write(msg);
 //        }
 
-        if((CNT_TMR3%5000)==0) {
+        //if((CNT_TMR3%5000)==0) {
 //            if(LED==1) {
 //                LED=0;
 //            } else
@@ -1828,73 +1716,18 @@
 //            pc.printf("A %f\n", (double) pres_A.sen);
 //            CAN_TX_POSITION((int32_t) VALVE_PWM_RAW_FF, (int32_t) VALVE_POS_VS_PWM[j]);
 //            j++;
-        }
+        //}
 
         /*******************************************************
         ***     Timer Counting & etc.
         ********************************************************/
-        CNT_TMR3++;
+        //CNT_TMR3++;
+    
     }
-    
     TIM3->SR = 0x0;  // reset the status register
     
 }
 
-/*
-void ValveControl(unsigned int ControlMode)
-{
-    switch (ControlMode) {
-        case MODE_NO_ACT: // 0
-            V_out = 0.0;
-            break;
-        case MODE_VALVE_OPEN_LOOP: // 1
-            V_out = Vout.ref;
-            break;
-        case MODE_VALVE_POSITION_CONTROL: // 2
-            CurrentControl();
-            break;
-        case MODE_JOINT_POSITION_TORQUE_CONTROL_PWM: // 3
-            V_out = 0.0;
-            break;
-        case MODE_JOINT_POSITION_TORQUE_CONTROL_VALVE_POSITION: // 4
-            double I_REF_POS_FB = 0.0; // I_REF by Position Feedback
-            double I_REF_POS_FF = 0.0; // I_REF by Position Feedforward
-
-            // feedback input for position control
-            pos.err = pos.ref - pos.sen;
-            double alpha_update_vel = 1.0/(1.0+(double)FREQ_TMR4/(2.0*3.1415*50.0)); // f_cutoff : 50Hz
-            double err_diff = (pos.err - pos.err_old)*(double)FREQ_5k;
-            pos.err_diff = (1.0-alpha_update_vel)*pos.err_diff + alpha_update_vel*err_diff;
-            pos.err_old = pos.err;
-            I_REF_POS_FB = 0.001*((double)P_GAIN_JOINT_POSITION * pos.err + (double)D_GAIN_JOINT_POSITION * pos.err_diff * 0.1);
-
-            // feedforward input for position control
-            double Vel_Act_Ref = vel.ref; // [pulse/s] >> [deg/s]
-            double K_ff = 1.3;
-            double K_v = 0.0;
-            if(Vel_Act_Ref > 0) K_v = 1.0/100.0; // open, tuning. (deg/s >> mA)
-            if(Vel_Act_Ref < 0) K_v = 1.0/100.0; // close, tuning. (deg/s >> mA)
-            I_REF_POS_FF = K_ff*K_v*Vel_Act_Ref;
-
-            cur.ref = I_REF_POS_FF + I_REF_POS_FB;
-            break;
-        case MODE_TEST_CURRENT_CONTROL: // 9
-            V_out = 0.0;
-            break;
-        case MODE_TEST_PWM_CONTROL: // 10
-            V_out = 0.0;
-            break;
-        case MODE_FIND_HOME: // 22
-            V_out = 0.0;
-            break;
-        default:
-            V_out = 0.0;
-            break;
-
-    }
-}
-*/
-
 void CurrentControl()
 {
     cur.err = cur.ref - cur.sen;
--- a/setting.h	Wed Sep 04 11:02:57 2019 +0000
+++ b/setting.h	Mon Sep 09 06:29:56 2019 +0000
@@ -6,8 +6,8 @@
 #define PIN_W       PB_6
 //#define PWM_ARR 0x465         // loop 80k, pwm 40k 
 //#define PWM_ARR     0x8CA       // loop 40k, pwm 20k
-#define PWM_ARR     0x1194      // loop 20k, pwm 10k
-//#define PWM_ARR     0x2328    // loop 10k, pwm 5k
+//#define PWM_ARR     0x1194      // loop 20k, pwm 10k
+#define PWM_ARR     0x2328    // loop 10k, pwm 5k
 #define TMR3_COUNT  0x4650      // loop 5k
 
 #define FREQ_5k     5000.0
@@ -19,6 +19,23 @@
 #define DT_20k      0.00005
 #define DT_40k      0.000025
 
+//extern int CID_RX_CMD;
+//extern int CID_RX_REF_POSITION;
+//extern int CID_RX_REF_TORQUE;
+//extern int CID_RX_REF_PRES_DIFF;
+//extern int CID_RX_REF_VOUT;
+//extern int CID_RX_REF_VALVE_POSITION;
+//extern int CID_RX_REF_CURRENT;
+//
+//extern int CID_TX_INFO;
+//extern int CID_TX_POSITION;
+//extern int CID_TX_TORQUE;
+//extern int CID_TX_PRES;
+//extern int CID_TX_VOUT;
+//extern int CID_TX_VALVE_POSITION;
+
+
+
 extern DigitalOut check;
 extern DigitalOut check_2;
 extern AnalogOut dac_1;
@@ -286,13 +303,12 @@
 extern int VALVE_POS_TMP;
 extern int JOINT_VEL_TMP;
 extern int DDV_POS_AVG ;
-extern int VALVE_POS_AVG[100];
+extern int VALVE_POS_AVG[50];
 extern int VALVE_POS_AVG_OLD;
 extern int data_num;
 extern int ID_index;
 extern int DZ_index;
-extern int ID_index_array[100];
-extern int FR_index_array[100];
+extern int ID_index_array[50];
 extern int first_check;
 extern double init_time;
 extern int VEL_POINT;
@@ -306,7 +322,8 @@
 extern int one_period_end;
 extern double Ref_Vel_Test;
 extern long TMR2_FOR_SLOW_LOGGING;
-extern int velcount;
+//extern int velcount;
+extern int Ref_Valve_Pos_FF_CAN;
 extern char max_check;
 extern char min_check; 
 
@@ -363,3 +380,5 @@
 extern int TMR3_COUNT_IREF;
 extern double CUR_CURRENT;
 extern double u_CUR[3];
+
+//extern int Ref_Valve_Pos_FF_CAN;
\ No newline at end of file