Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Revision 63:a3c7f31742c9, committed 2020-05-15
- Comitter:
- Lightvalve
- Date:
- Fri May 15 03:25:15 2020 +0000
- Parent:
- 62:851cf7b7aa7a
- Child:
- 64:dc5b5c258579
- Commit message:
- 200515
Changed in this revision
--- a/CAN/function_CAN.cpp Tue May 12 06:23:22 2020 +0000
+++ b/CAN/function_CAN.cpp Fri May 15 03:25:15 2020 +0000
@@ -378,7 +378,7 @@
case CRX_SET_PISTON_AREA: {
PISTON_AREA_A = (int16_t) (msg.data[1] | msg.data[2] << 8);
PISTON_AREA_B = (int16_t) (msg.data[3] | msg.data[4] << 8);
- PISTON_AREA_alpha = (double)PISTON_AREA_B/(double)PISTON_AREA_A;
+ PISTON_AREA_alpha = (double)PISTON_AREA_A/(double)PISTON_AREA_B;
alpha3 = PISTON_AREA_alpha * PISTON_AREA_alpha*PISTON_AREA_alpha;
ROM_RESET_DATA();
@@ -720,7 +720,7 @@
vel.ref = (double)temp_vel * 256.0f;
}
- torq.ref = (double)temp_torq * 0.1f;
+ torq.ref = (double)temp_torq * 0.1f /(float)(TORQUE_SENSOR_PULSE_PER_TORQUE);
} else if(address==CID_RX_REF_VALVE_POS) {
int16_t temp_ref_valve_pos = (int16_t) (msg.data[0] | msg.data[1] << 8);
--- a/function_utilities/function_utilities.cpp Tue May 12 06:23:22 2020 +0000
+++ b/function_utilities/function_utilities.cpp Fri May 15 03:25:15 2020 +0000
@@ -458,7 +458,7 @@
OPERATING_MODE = flashReadInt(Rom_Sector, RID_OPERATING_MODE);
SENSING_MODE = flashReadInt(Rom_Sector, RID_SENSING_MODE);
CURRENT_CONTROL_MODE = flashReadInt(Rom_Sector, RID_CURRENT_CONTROL_MODE);
- CURRENT_CONTROL_MODE = 0;
+ CURRENT_CONTROL_MODE = 1;
FLAG_VALVE_DEADZONE = flashReadInt(Rom_Sector, RID_FLAG_VALVE_DEADZONE);
CAN_FREQ = flashReadInt(Rom_Sector, RID_CAN_FREQ);
CAN_FREQ = 500;
@@ -487,7 +487,7 @@
CHAMBER_VOLUME_B = flashReadInt(Rom_Sector, RID_CHAMBER_VOLUME_B);
PISTON_AREA_A = flashReadInt(Rom_Sector, RID_PISTON_AREA_A);
PISTON_AREA_B = flashReadInt(Rom_Sector, RID_PISTON_AREA_B);
- PISTON_AREA_alpha = (float)PISTON_AREA_B/(float)PISTON_AREA_A;
+ PISTON_AREA_alpha = (float)PISTON_AREA_A/(float)PISTON_AREA_B;
alpha3 = PISTON_AREA_alpha * PISTON_AREA_alpha*PISTON_AREA_alpha;
PRES_SUPPLY = flashReadInt(Rom_Sector, RID_PRES_SUPPLY);
PRES_RETURN = flashReadInt(Rom_Sector, RID_PRES_RETURN);
--- a/main.cpp Tue May 12 06:23:22 2020 +0000
+++ b/main.cpp Fri May 15 03:25:15 2020 +0000
@@ -76,6 +76,8 @@
extern int CID_TX_VOUT;
extern int CID_TX_VALVE_POSITION;
+float I_REF_fil_DZ = 0.0f;
+
// =============================================================================
// =============================================================================
// =============================================================================
@@ -1300,7 +1302,8 @@
case MODE_JOINT_CONTROL: {
double torq_ref = 0.0f;
pos.err = (pos.ref - pos.sen)/(float)(ENC_PULSE_PER_POSITION); //[mm]
- vel.err = (0.0f - vel.sen)/(float)(ENC_PULSE_PER_POSITION); //[mm/s]
+ vel.err = (vel.ref - vel.sen)/(float)(ENC_PULSE_PER_POSITION); //[mm/s]
+// vel.err = (0.0f - vel.sen)/(float)(ENC_PULSE_PER_POSITION); //[mm/s]
pos.err_sum += pos.err/(float) TMR_FREQ_5k; //[mm]
//K & D Low Pass Filter
@@ -1311,7 +1314,7 @@
torq_ref = torq.ref + K_LPF * pos.err - D_LPF * vel.sen / ENC_PULSE_PER_POSITION; //[N]
// torque feedback
- torq.err = (torq_ref)/(float)(TORQUE_SENSOR_PULSE_PER_TORQUE) - torq.sen; //[N]
+ torq.err = torq_ref - torq.sen; //[N]
torq.err_sum += torq.err/(float) TMR_FREQ_5k; //[N]
if (((OPERATING_MODE&0b110)>>1) == 0 || ((OPERATING_MODE&0b110)>>1) == 1) {
@@ -1423,14 +1426,9 @@
////////////////////////////////////////////////////////////////////////////
//////////////////////////// CURRENT CONTROL //////////////////////////////
////////////////////////////////////////////////////////////////////////////
+
if (CURRENT_CONTROL_MODE) {
- double alpha_update_Iref = 1.0f / (1.0f + 5000.0f / (2.0f * 3.14f * 300.0f)); // f_cutoff : 500Hz
- I_REF_fil = (1.0f - alpha_update_Iref) * I_REF_fil + alpha_update_Iref*I_REF;
-
- I_ERR = I_REF_fil - cur.sen;
- I_ERR_INT = I_ERR_INT + (I_ERR) * 0.0002f;
-
-
+
// Moog Valve Current Control Gain
double R_model = 500.0f; // ohm
double L_model = 1.2f;
@@ -1446,15 +1444,34 @@
KP_I = 1.0f * L_model*w0;
KI_I = 0.08f * R_model*w0;
}
+
+ double alpha_update_Iref = 1.0f / (1.0f + 5000.0f / (2.0f * 3.14f * 300.0f)); // f_cutoff : 500Hz
+ I_REF_fil = (1.0f - alpha_update_Iref) * I_REF_fil + alpha_update_Iref*I_REF;
+
+ FLAG_VALVE_DEADZONE = 1;
+
+ if (FLAG_VALVE_DEADZONE) {
+ if (I_REF_fil > 0) I_REF_fil_DZ = I_REF_fil + VALVE_DEADZONE_PLUS / 1000.0f; // unit: mA
+ else if (I_REF_fil < 0) I_REF_fil_DZ = I_REF_fil + VALVE_DEADZONE_MINUS / 1000.0f; // unit: mA
+ else I_REF_fil_DZ = I_REF_fil + (VALVE_DEADZONE_PLUS+VALVE_DEADZONE_MINUS)/2.0f / 1000.0f; // unit: mA
+ } else {
+ I_REF_fil_DZ = I_REF_fil;
+ }
+
+ I_ERR = I_REF_fil_DZ - cur.sen;
+ I_ERR_INT = I_ERR_INT + (I_ERR) * 0.0002f;
+
+
+
double FF_gain = 1.0f;
VALVE_PWM_RAW = KP_I * 2.0f * I_ERR + KI_I * 2.0f* I_ERR_INT;
// VALVE_PWM_RAW = VALVE_PWM_RAW + FF_gain * (R_model*I_REF); // Unit : mV
- I_REF_fil_diff = I_REF_fil - I_REF_fil_old;
- I_REF_fil_old = I_REF_fil;
-// VALVE_PWM_RAW = VALVE_PWM_RAW + FF_gain * (R_model * I_REF_fil + L_model * I_REF_fil_diff * 5000.0f); // Unit : mV
- VALVE_PWM_RAW = VALVE_PWM_RAW + FF_gain * (R_model * I_REF_fil); // Unit : mV
+ I_REF_fil_diff = I_REF_fil_DZ - I_REF_fil_old;
+ I_REF_fil_old = I_REF_fil_DZ;
+// VALVE_PWM_RAW = VALVE_PWM_RAW + FF_gain * (R_model * I_REF_fil_DZ + L_model * I_REF_fil_diff * 5000.0f); // Unit : mV
+ VALVE_PWM_RAW = VALVE_PWM_RAW + FF_gain * (R_model * I_REF_fil_DZ); // Unit : mV
double V_MAX = 12000.0f; // Maximum Voltage : 12V = 12000mV
double Ka = 3.0f / KP_I;
@@ -1479,15 +1496,25 @@
///////////////// Dead Zone Cancellation & Linearization //////////////////
////////////////////////////////////////////////////////////////////////////
// Dead Zone Cancellation (Mechanical Valve dead-zone)
- if (FLAG_VALVE_DEADZONE) {
- if (VALVE_PWM_RAW > 0) VALVE_PWM_RAW = VALVE_PWM_RAW + VALVE_DEADZONE_PLUS * mV_PER_pulse; // unit: mV
- else if (VALVE_PWM_RAW < 0) VALVE_PWM_RAW = VALVE_PWM_RAW + VALVE_DEADZONE_MINUS * mV_PER_pulse; // unit: mV
+// if (FLAG_VALVE_DEADZONE) {
+// if (VALVE_PWM_RAW > 0) VALVE_PWM_RAW = VALVE_PWM_RAW + VALVE_DEADZONE_PLUS * mV_PER_pulse; // unit: mV
+// else if (VALVE_PWM_RAW < 0) VALVE_PWM_RAW = VALVE_PWM_RAW + VALVE_DEADZONE_MINUS * mV_PER_pulse; // unit: mV
+// VALVE_PWM_VALVE_DZ = VALVE_PWM_RAW + (double)VALVE_CENTER * mV_PER_pulse; // unit: mV
+// } else {
+// VALVE_PWM_VALVE_DZ = VALVE_PWM_RAW;
+// }
- VALVE_PWM_VALVE_DZ = VALVE_PWM_RAW + (double)VALVE_CENTER * mV_PER_pulse; // unit: mV
-
- } else {
+ // VALVE_DEADZONE_PLUS : Current[mA] to start extraction
+ // VALVE_DEADZONE_MINUS : Current[mA] to start contraction
+// double R_model = 500.0f;
+// FLAG_VALVE_DEADZONE = true;
+// if (FLAG_VALVE_DEADZONE) {
+// if (VALVE_PWM_RAW > 0) VALVE_PWM_VALVE_DZ = VALVE_PWM_RAW + VALVE_DEADZONE_PLUS * R_model / 1000.0f; // unit: mV
+// else if (VALVE_PWM_RAW < 0) VALVE_PWM_VALVE_DZ = VALVE_PWM_RAW + VALVE_DEADZONE_MINUS * R_model / 1000.0f; // unit: mV
+// else VALVE_PWM_VALVE_DZ = VALVE_PWM_RAW + (VALVE_DEADZONE_PLUS+VALVE_DEADZONE_MINUS)/2.0f* R_model / 1000.0f;
+// } else {
VALVE_PWM_VALVE_DZ = VALVE_PWM_RAW;
- }
+// }
// Output Voltage Linearization
double CUR_PWM_nonlin = VALVE_PWM_VALVE_DZ; // Unit : mV
@@ -1546,7 +1573,7 @@
}
} else if ((OPERATING_MODE & 0b01) == 1) { // Linear Actuator
if (SENSING_MODE == 0) {
- CAN_TX_POSITION_FT((int16_t) (pos.sen/10.0f), (int16_t) (vel.sen/256.0f), (int16_t) (torq.sen));
+ CAN_TX_POSITION_FT((int16_t) (pos.sen/10.0f), (int16_t) (vel.sen/256.0f), (int16_t) (torq.sen * 10.0f * (float)(TORQUE_SENSOR_PULSE_PER_TORQUE)));
} else if (SENSING_MODE == 1) {
CAN_TX_POSITION_PRESSURE((int16_t) (pos.sen/10.0f), (int16_t) (vel.sen/256.0f), (int16_t) ((pres_A.sen)*5.0f), (int16_t) ((pres_B.sen)*5.0f));
}
@@ -1567,8 +1594,8 @@
} else {
t_value = V_out;
}
- CAN_TX_TORQUE((int16_t) (t_value)); //1300
- //CAN_TX_TORQUE((int16_t) (cur.sen * 1000.0f)); //1300
+// CAN_TX_TORQUE((int16_t) (I_REF_fil_DZ * 1000.0f)); //1300
+ CAN_TX_TORQUE((int16_t) (cur.sen * 1000.0f)); //1300
//CAN_TX_TORQUE((int16_t) (I_REF * 1000.0f)); //1300
}
--- a/setting.h Tue May 12 06:23:22 2020 +0000 +++ b/setting.h Fri May 15 03:25:15 2020 +0000 @@ -147,8 +147,8 @@ //extern float I_GAIN_JOINT_TORQUE_OPP; //extern float D_GAIN_JOINT_TORQUE_OPP; -extern float VALVE_DEADZONE_PLUS; -extern float VALVE_DEADZONE_MINUS; +//extern float VALVE_DEADZONE_PLUS; +//extern float VALVE_DEADZONE_MINUS; extern int16_t VELOCITY_COMP_GAIN; extern int16_t COMPLIANCE_GAIN;