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.
Diff: main.cpp
- Revision:
- 58:2eade98630e2
- Parent:
- 57:f4819de54e7a
- Child:
- 59:0ad14153b58f
--- a/main.cpp Fri Mar 06 12:14:38 2020 +0000
+++ b/main.cpp Mon Mar 09 12:43:04 2020 +0000
@@ -194,10 +194,13 @@
make_delay();
//DAC init
-// dac_1 = PRES_A_VREF / 3.3f;
-// dac_2 = PRES_B_VREF / 3.3f;
- dac_1 = TORQUE_VREF / 3.3f;
- dac_2 = 0.0f;
+ if (SENSING_MODE == 0) {
+ dac_1 = TORQUE_VREF / 3.3f;
+ dac_2 = 0.0f;
+ } else if (SENSING_MODE == 1) {
+ dac_1 = PRES_A_VREF / 3.3f;
+ dac_2 = PRES_B_VREF / 3.3f;
+ }
make_delay();
for (int i=0; i<50; i++) {
@@ -206,7 +209,7 @@
else
ID_index_array[i] = (i+1) * 0.5f;
}
-
+
/************************************
*** Program is operating!
*************************************/
@@ -356,21 +359,46 @@
if (CNT_TMR4 % (int) ((int) FREQ_TMR4/TMR4_FREQ_10k) == 0) {
ENC_UPDATE();
}
+
+ ADC1->CR2 |= 0x40000000;
+ if (SENSING_MODE == 0) {
+ // Torque Sensing (0~210)bar =============================================
+ float pres_A_new = (((float) ADC1->DR) - 2047.5f);
+ double alpha_update_ft = 1.0f / (1.0f + FREQ_TMR4 / (2.0f * 3.14f * 100.0f)); // f_cutoff : 200Hz
+ pres_A.sen = (1.0f - alpha_update_ft) * pres_A.sen + alpha_update_ft * pres_A_new;
+ torq.sen = pres_A.sen / TORQUE_SENSOR_PULSE_PER_TORQUE;
- //Pressure sensor A
- ADC1->CR2 |= 0x40000000; // adc _ 12bit
- //while((ADC1->SR & 0b10));
- float alpha_update_pres_A = 1.0f/(1.0f + FREQ_TMR4/(2.0f*3.14f*100.0f));
- float pres_A_new = ((float)ADC1->DR);
- pres_A.sen = pres_A.sen*(1.0f-alpha_update_pres_A)+pres_A_new*(alpha_update_pres_A);
- torq.sen = - (pres_A.sen-2048.0f); //pulse -2047~2047 //SW just changed the sign to correct the direction of loadcell on LIGHT. Correct later.
+ } else if (SENSING_MODE == 1) {
+ // Pressure Sensing (0~210)bar =============================================
+ float pres_A_new = (((float)ADC1->DR) - PRES_A_NULL);
+ float pres_B_new = (((float)ADC2->DR) - PRES_B_NULL);
+ double alpha_update_pres = 1.0f / (1.0f + FREQ_TMR4 / (2.0f * 3.14f * 200.0f)); // f_cutoff : 500Hz
+ pres_A.sen = (1.0f - alpha_update_pres) * pres_A.sen + alpha_update_pres * pres_A_new;
+ pres_B.sen = (1.0f - alpha_update_pres) * pres_B.sen + alpha_update_pres * pres_B_new;
+ CUR_PRES_A_BAR = pres_A.sen / PRES_SENSOR_A_PULSE_PER_BAR;
+ CUR_PRES_B_BAR = pres_B.sen / PRES_SENSOR_B_PULSE_PER_BAR;
-
- //Pressure sensor B
- float alpha_update_pres_B = 1.0f/(1.0f + FREQ_TMR4/(2.0f*3.14f*100.0f));
- float pres_B_new = ((float)ADC2->DR);
- pres_B.sen = pres_B.sen*(1.0f-alpha_update_pres_B)+pres_B_new*(alpha_update_pres_B);
- //torq.sen = pres_A.sen * (float) PISTON_AREA_A - pres_B.sen * (float) PISTON_AREA_B;
+ if ((OPERATING_MODE & 0x01) == 0) { // Rotary Actuator
+ torq.sen = (PISTON_AREA_A * CUR_PRES_A_BAR - PISTON_AREA_B * CUR_PRES_B_BAR) * 0.0001f; // mm^3*bar >> Nm
+ } else if ((OPERATING_MODE & 0x01) == 1) { // Linear Actuator
+ torq.sen = (PISTON_AREA_A * CUR_PRES_A_BAR - PISTON_AREA_B * CUR_PRES_B_BAR) * 0.1f; // mm^2*bar >> N
+ }
+ }
+
+// //Pressure sensor A
+// ADC1->CR2 |= 0x40000000; // adc _ 12bit
+// //while((ADC1->SR & 0b10));
+// float alpha_update_pres_A = 1.0f/(1.0f + FREQ_TMR4/(2.0f*3.14f*100.0f));
+// float pres_A_new = ((float)ADC1->DR);
+// pres_A.sen = pres_A.sen*(1.0f-alpha_update_pres_A)+pres_A_new*(alpha_update_pres_A);
+// torq.sen = - (pres_A.sen-2048.0f); //pulse -2047~2047 //SW just changed the sign to correct the direction of loadcell on LIGHT. Correct later.
+//
+//
+// //Pressure sensor B
+// float alpha_update_pres_B = 1.0f/(1.0f + FREQ_TMR4/(2.0f*3.14f*100.0f));
+// float pres_B_new = ((float)ADC2->DR);
+// pres_B.sen = pres_B.sen*(1.0f-alpha_update_pres_B)+pres_B_new*(alpha_update_pres_B);
+// //torq.sen = pres_A.sen * (float) PISTON_AREA_A - pres_B.sen * (float) PISTON_AREA_B;
//Current
@@ -381,7 +409,7 @@
float cur_new = ((float)ADC3->DR-2048.0f)*20.0f/4096.0f; // unit : mA
cur.sen=cur.sen*(1.0f-alpha_update_cur)+cur_new*(alpha_update_cur);
//cur.sen = raw_cur;
-
+
CNT_TMR4++;
}
TIM4->SR = 0x0; // reset the status register
@@ -398,8 +426,6 @@
extern "C" void TIM3_IRQHandler(void)
{
if (TIM3->SR & TIM_SR_UIF ) {
-
-
if (((OPERATING_MODE&0b110)>>1) == 0) {
K_v = 0.4f; // Moog (LPM >> mA) , 100bar
@@ -426,17 +452,17 @@
if((float) cnt_trans * DT_TMR3 > 3.0f )
MODE_POS_FT_TRANS = 0;
} else if(MODE_POS_FT_TRANS == 2) {
- alpha_trans = 1.0;
+ alpha_trans = 1.0f;
cnt_trans = 0;
} else {
- alpha_trans = 0.0;
+ alpha_trans = 0.0f;
cnt_trans = 0;
}
int UTILITY_MODE = 0;
int CONTROL_MODE = 0;
-
+
if (CONTROL_UTILITY_MODE >= 20 || CONTROL_UTILITY_MODE == 0) {
UTILITY_MODE = CONTROL_UTILITY_MODE;
CONTROL_MODE = MODE_NO_ACT;
@@ -472,7 +498,7 @@
dac_1 = TORQUE_VREF / 3.3f;
}
} else {
- CONTROL_MODE = MODE_NO_ACT;
+ CONTROL_UTILITY_MODE = MODE_NO_ACT;
TMR3_COUNT_TORQUE_NULL = 0;
CUR_TORQUE_sum = 0;
CUR_TORQUE_mean = 0;
@@ -713,7 +739,6 @@
// }
//
// }
-
case MODE_PRESSURE_SENSOR_NULLING: {
// DAC Voltage reference set
if (TMR3_COUNT_PRES_NULL < TMR_FREQ_5k * 2) {
@@ -727,8 +752,8 @@
CUR_PRES_B_sum = 0;
float VREF_NullingGain = 0.0003f;
- PRES_A_VREF = PRES_A_VREF - VREF_NullingGain * (PRES_A_NULL - CUR_PRES_A_mean);
- PRES_B_VREF = PRES_B_VREF - VREF_NullingGain * (PRES_B_NULL - CUR_PRES_B_mean);
+ PRES_A_VREF = PRES_A_VREF + VREF_NullingGain * CUR_PRES_A_mean;
+ PRES_B_VREF = PRES_B_VREF + VREF_NullingGain * CUR_PRES_B_mean;
if (PRES_A_VREF > 3.3f) PRES_A_VREF = 3.3f;
if (PRES_A_VREF < 0.0f) PRES_A_VREF = 0.0f;
@@ -1156,7 +1181,7 @@
}
break;
}
-
+
case MODE_SYSTEM_ID: {
freq_sysid_Iref = (double) cnt_sysid * DT_TMR3 * 3.;
valve_pos.ref = 2500.0f * sin(2.0f * 3.14159f * freq_sysid_Iref * (double) cnt_sysid * DT_TMR3);
@@ -1168,8 +1193,8 @@
}
break;
}
-
-
+
+
default:
break;
@@ -1191,7 +1216,7 @@
} else { //SW Valve
VALVE_POS_CONTROL(valve_pos.ref);
}
-
+
break;
}
@@ -1203,11 +1228,11 @@
torq_ref = torq.ref + (K_SPRING * pos.err * 0.01f + D_DAMPER * vel.err * 0.0001f) / ENC_PULSE_PER_POSITION; //[N]
// torque feedback
- torq.err = (torq_ref - torq.sen)/(float)(TORQUE_SENSOR_PULSE_PER_TORQUE); //[N]
+ torq.err = (torq_ref)/(float)(TORQUE_SENSOR_PULSE_PER_TORQUE) - torq.sen; //[N]
torq.err_sum += torq.err/(float) TMR_FREQ_5k; //[N]
if (((OPERATING_MODE&0b110)>>1) == 0 || ((OPERATING_MODE&0b110)>>1) == 1) {
-
+
double I_REF_POS = 0.0f;
double I_REF_FORCE_FB = 0.0f; // I_REF by Force Feedback
double I_REF_VC = 0.0f; // I_REF for velocity compensation
@@ -1215,7 +1240,7 @@
double temp_vel_pos = 0.0f;
double temp_vel_torq = 0.0f;
double wn_Pos = 2.0f * PI * 5.0f; // f_cut : 5Hz Position Control
-
+
if ((OPERATING_MODE && 0x01) == 0) { // Rotary Mode
temp_vel_pos = (0.01f * (double) P_GAIN_JOINT_POSITION * wn_Pos * pos.err + 0.01f * (double) I_GAIN_JOINT_POSITION * wn_Pos * pos.err_sum + 0.01f * (double) VELOCITY_COMP_GAIN * vel.ref / ENC_PULSE_PER_POSITION) * PI / 180.0f; // rad/s
// L when P-gain = 100, f_cut = 10Hz L feedforward velocity
@@ -1275,10 +1300,10 @@
VALVE_POS_CONTROL(valve_pos.ref);
}
-
+
break;
}
-
+
case MODE_VALVE_OPEN_LOOP: {
V_out = (float) Vout.ref;
break;
@@ -1290,7 +1315,7 @@
if (((OPERATING_MODE&0b110)>>1) == 0 || ((OPERATING_MODE&0b110)>>1) == 1) { //Moog Valve or KNR Valve
-
+
////////////////////////////////////////////////////////////////////////////
//////////////////////////// CURRENT CONTROL //////////////////////////////
////////////////////////////////////////////////////////////////////////////
@@ -1368,8 +1393,8 @@
else if (CUR_PWM_lin < 0) V_out = (int) CUR_PWM_lin - 140;
else V_out = CUR_PWM_lin;
}
-
-
+
+
/*******************************************************
*** PWM
@@ -1404,15 +1429,15 @@
if (flag_data_request[0] == HIGH) {
if ((OPERATING_MODE & 0b01) == 0) { // Rotary Actuator
if (SENSING_MODE == 0) {
- CAN_TX_POSITION_FT((int16_t) (pos.sen), (int16_t) (vel.sen/10.0f), (int16_t) (torq.sen*10.0f));
+ CAN_TX_POSITION_FT((int16_t) (pos.sen), (int16_t) (vel.sen/10.0f), (int16_t) (pres_A.sen*10.0f));
} else if (SENSING_MODE == 1) {
- CAN_TX_POSITION_PRESSURE((int16_t) (pos.sen), (int16_t) (vel.sen/10.0f), (int16_t) (pres_A.sen*10.0f), (int16_t) (pres_B.sen*10.0f));
+ CAN_TX_POSITION_PRESSURE((int16_t) (pos.sen), (int16_t) (vel.sen/10.0f), (int16_t) ((pres_A.sen)*5.0f), (int16_t) ((pres_B.sen)*5.0f));
}
} else if ((OPERATING_MODE & 0b01) == 1) { // Linear Actuator
if (SENSING_MODE == 0) {
- CAN_TX_POSITION_FT((int16_t) (pos.sen/4.0f), (int16_t) (vel.sen/100.0f), (int16_t) (torq.sen*10.0f));
+ CAN_TX_POSITION_FT((int16_t) (pos.sen/4.0f), (int16_t) (vel.sen/100.0f), (int16_t) (pres_A.sen*10.0f));
} else if (SENSING_MODE == 1) {
- CAN_TX_POSITION_PRESSURE((int16_t) (pos.sen/4.0f), (int16_t) (vel.sen/100.0f), (int16_t) (pres_A.sen*10.0f), (int16_t) (pres_B.sen*10.0f));
+ CAN_TX_POSITION_PRESSURE((int16_t) (pos.sen/4.0f), (int16_t) (vel.sen/100.0f), (int16_t) ((pres_A.sen)*5.0f), (int16_t) ((pres_B.sen)*5.0f));
}
}
}
@@ -1424,27 +1449,27 @@
// } else {
// t_value = -10000.0f*((double)value - (double)VALVE_CENTER)/((double)VALVE_MIN_POS - (double)VALVE_CENTER);
// }
- if(OPERATING_MODE==5){
+ if(OPERATING_MODE==5) {
t_value = (double) value;
- }else if(CURRENT_CONTROL_MODE==1){
+ } else if(CURRENT_CONTROL_MODE==1) {
t_value = cur.sen;
- }else{
+ } else {
t_value = V_out;
}
CAN_TX_TORQUE((int16_t) (t_value)); //1300
}
-
-
+
+
if (flag_data_request[2] == HIGH) {
//pressure A and B
CAN_TX_PRES((int16_t) (pres_A.sen), (int16_t) (pres_B.sen)); // CUR_PRES_X : 0(0bar)~4096(210bar) //1400
}
-
+
//If it doesn't rest, below can can not work.
for (can_rest = 0; can_rest < 10000; can_rest++) {
;
}
-
+
if (flag_data_request[3] == HIGH) {
//PWM
CAN_TX_PWM((int16_t) cur.sen); //1500
@@ -1462,7 +1487,7 @@
// CAN_TX_SOMETHING((int) (FORCE_VREF), (int16_t) (1), (int16_t) (2), (int16_t) (3));
// }
//if (flag_delay_test == 1){
- //CAN_TX_PRES((int16_t) (0),(int16_t) torq_ref);
+ //CAN_TX_PRES((int16_t) (0),(int16_t) torq_ref);
//}
TMR2_COUNT_CAN_TX = 0;
@@ -1472,115 +1497,4 @@
}
TIM3->SR = 0x0; // reset the status register
-}
-
-
-
-//unsigned long CNT_TMR5 = 0;
-//float FREQ_TMR5 = (float)FREQ_500;
-//float DT_TMR5 = (float)DT_500;
-
-//extern "C" void TIM2_IRQHandler(void)
-//{
-// LED = 1;
-// if (TIM2->SR & TIM_SR_UIF ) {
-//
-// //CAN ----------------------------------------------------------------------
-// //if (flag_data_request[0] == LOW) {
-// //position+velocity
-// CAN_TX_POSITION_FT((int16_t) (pos.sen/4.0f), (int16_t) (vel.sen/100.0f), (int16_t) (torq.sen*10.0f));
-// //}
-//
-// //if (flag_data_request[1] == LOW) {
-// //valve position
-// double t_value = 0;
-// if(value>=(double)VALVE_CENTER) {
-// t_value = 10000.0f*((double)value-(double)VALVE_CENTER)/((double)VALVE_MAX_POS-(double)VALVE_CENTER);
-// } else {
-// t_value = -10000.0f*((double)value-(double)VALVE_CENTER)/((double)VALVE_MIN_POS-(double)VALVE_CENTER);
-// }
-// CAN_TX_TORQUE((int16_t) (t_value));
-// //}
-//
-// //if (flag_data_request[2] == LOW) {
-// //pressure A and B
-// CAN_TX_PRES((int16_t) (valve_pos.ref), (int16_t) (MODE_POS_FT_TRANS * 100.0f)); // CUR_PRES_X : 0(0bar)~4096(210bar)
-//
-// //}
-//
-// //if (flag_data_request[3] == LOW) {
-// //PWM
-// int i = 0;
-// for (i = 0; i < 10000; i++) {
-// ;
-// }
-// CAN_TX_PWM((int16_t) VALVE_DEADZONE_PLUS);
-// // 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.));
-//
-// //}
-//
-// //if (flag_data_request[4] == LOW) {
-// //valve position
-//
-// for (i = 0; i < 10000; i++) {
-// ;
-// }
-// CAN_TX_VALVE_POSITION((int16_t) (K_SPRING), (int16_t) (D_DAMPER), (int16_t) VALVE_POS_RAW_FORCE_FB_LOGGING);
-// //CAN_TX_VALVE_POSITION((int16_t) ((float) VALVE_CENTER * 10.0f), (int16_t) valve_pos.ref, (int16_t) V_out);
-//
-// //CAN_TX_VALVE_POSITION((int16_t) (VALVE_POS_NUM));
-// // CAN_TX_VALVE_POSITIOfxN((int16_t) (VALVE_FF_VOLTAGE / SUPPLY_VOLTAGE));
-// // CAN_TX_VALVE_POSITION((int16_t) P_GAIN_JOINT_POSITION);
-// // CAN_TX_VALVE_POSITION((int16_t) Ref_Joint_Pos);
-// // CAN_TX_VALVE_POSITION((int16_t) flag_flowrate);
-// //}
-//
-//
-// }
-// TIM2->SR = 0x0; // reset the status register
-//}
-
-
-//
-//void CurrentControl()
-//{
-// cur.err = cur.ref - cur.sen;
-// cur.err_int = cur.err_int + cur.err*DT_TMR4;
-// cur.err_diff = (cur.err - cur.err_old)*FREQ_TMR4;
-// cur.err_old = cur.err;
-//
-// float R_model = 150.0f; // ohm
-// float L_model = 0.3f;
-// float w0 = 2.0f*3.14f*90.0f;
-// float KP_I = L_model*w0;
-// float KI_I = R_model*w0;
-// float KD_I = 0.0f;
-//
-// float FF_gain = 0.0f;
-// V_out = (int) (KP_I * cur.err + KI_I * cur.err_int + KD_I * cur.err_diff);
-// // V_out = V_out + FF_gain * (R_model*I_REF); // Unit : mV
-// V_out = V_out + FF_gain * (R_model*cur.ref + L_model*cur.ref_diff); // Unit : mV
-//
-// float Ka = 5.0f/KP_I;
-// if(V_out > V_MAX) {
-// V_rem = V_out-V_MAX;
-// V_rem = Ka*V_rem;
-// V_out = V_MAX;
-// cur.err_int = cur.err_int - V_rem*DT_5k;
-// } else if(V_out < -V_MAX) {
-// V_rem = V_out-(-V_MAX);
-// V_rem = Ka*V_rem;
-// V_out = -V_MAX;
-// cur.err_int = cur.err_int - V_rem*DT_5k;
-// }
-//}
-
-
-
-
-
-
-
-
+}
\ No newline at end of file