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.
function_CAN.cpp
00001 #include "function_CAN.h" 00002 #include "setting.h" 00003 #include "function_utilities.h" 00004 #include "SPI_EEP_ENC.h" 00005 #include "stm32f4xx_flash.h" 00006 #include "FlashWriter.h" 00007 00008 // CAN ID Setting Variables 00009 int CID_RX_CMD = 100; 00010 int CID_RX_REF_POSITION = 200; 00011 int CID_RX_REF_OPENLOOP = 300; 00012 int CID_RX_REF_PWM = 400; 00013 00014 int CID_TX_INFO = 1100; 00015 int CID_TX_POS_VEL_TORQ = 1200; 00016 int CID_TX_PWM = 1300; 00017 int CID_TX_SOMETHING = 1400; 00018 00019 int CID_TX_CURRENT = 1400; 00020 int CID_TX_VOUT = 1500; 00021 int CID_TX_VALVE_POSITION = 1600; 00022 00023 // variables 00024 uint8_t can_index = 0; 00025 00026 extern DigitalOut LED; 00027 00028 extern float u_past[]; 00029 extern float x_past[]; 00030 extern float x_future[]; 00031 extern float f_past[]; 00032 extern float f_future[]; 00033 extern float input_NN[]; 00034 00035 /******************************************************************************* 00036 * State Class functions 00037 ******************************************************************************/ 00038 void State::UpdateSen(float sen_new, float Freq_update, float f_cut) { 00039 if(f_cut<=0.0f) f_cut=0.001f; 00040 00041 this->sen_diff = (sen_new-this->sen)*Freq_update; 00042 float alpha_update = 1.0f / (1.0f + Freq_update / (2.0f * 3.14f * f_cut)); // f_cutoff : 100Hz 00043 this->sen = (1.0f - alpha_update) * this->sen + alpha_update * sen_new; 00044 } 00045 00046 void State::UpdateRef(float ref_new) { 00047 this->ref = ref_new; 00048 } 00049 00050 void State::Reset() { 00051 this->sen = 0.0f; 00052 this->sen_diff = 0.0f; 00053 this->ref = 0.0f; 00054 this->err = 0.0f; 00055 this->err_int = 0.0f; 00056 this->err_old = 0.0f; 00057 this->err_diff = 0.0f; 00058 } 00059 00060 /******************************************************************************* 00061 * CAN functions 00062 ******************************************************************************/ 00063 void CAN_ID_INIT(void) 00064 { 00065 00066 CID_RX_CMD = (int) (BNO + INIT_CID_RX_CMD); 00067 CID_RX_REF_POSITION = (int) (BNO + INIT_CID_RX_REF_POSITION); 00068 CID_RX_REF_OPENLOOP = (int) (BNO + INIT_CID_RX_REF_OPENLOOP); 00069 CID_RX_REF_PWM = (int) (BNO + INIT_CID_RX_REF_PWM); 00070 00071 CID_TX_INFO = (int) (BNO + INIT_CID_TX_INFO); 00072 CID_TX_POS_VEL_TORQ = (int) (BNO + INIT_CID_TX_POS_VEL_TORQ); 00073 CID_TX_PWM = (int) (BNO + INIT_CID_TX_PWM); 00074 CID_TX_CURRENT = (int) (BNO + INIT_CID_TX_CURRENT); 00075 CID_TX_VOUT = (int) (BNO + INIT_CID_TX_VOUT); 00076 CID_TX_VALVE_POSITION = (int) (BNO + INIT_CID_TX_VALVE_POSITION); 00077 CID_TX_SOMETHING = (int) (BNO + INIT_CID_TX_SOMETHING); 00078 } 00079 00080 void ReadCMD(int16_t CMD) 00081 { 00082 switch(CMD) { 00083 case CRX_ASK_INFO: { 00084 CAN_TX_INFO(); 00085 break; 00086 } 00087 case CRX_ASK_BNO: { 00088 CAN_TX_BNO(); 00089 break; 00090 } 00091 case CRX_SET_BNO: { 00092 BNO = (int16_t) msg.data[1]; 00093 spi_eeprom_write(RID_BNO, (int16_t) BNO); 00094 CAN_ID_INIT(); // can id init 00095 break; 00096 } 00097 case CRX_ASK_OPERATING_MODE: { 00098 CAN_TX_OPERATING_MODE(); 00099 break; 00100 } 00101 case CRX_SET_OPERATING_MODE: { 00102 OPERATING_MODE = (uint8_t) msg.data[1]; 00103 SENSING_MODE = (uint8_t) msg.data[2]; 00104 CURRENT_CONTROL_MODE = (uint8_t) msg.data[3]; 00105 FLAG_VALVE_DEADZONE = (uint8_t) msg.data[4]; 00106 spi_eeprom_write(RID_OPERATING_MODE, (int16_t) OPERATING_MODE); 00107 spi_eeprom_write(RID_SENSING_MODE, (int16_t) SENSING_MODE); 00108 spi_eeprom_write(RID_CURRENT_CONTROL_MODE, (int16_t) CURRENT_CONTROL_MODE); 00109 spi_eeprom_write(RID_FLAG_VALVE_DEADZONE, (int16_t) FLAG_VALVE_DEADZONE); 00110 break; 00111 } 00112 case CRX_SET_ENC_ZERO: { 00113 ENC_SET_ZERO(); 00114 00115 break; 00116 } 00117 case CRX_SET_FET_ON: { 00118 00119 break; 00120 } 00121 00122 case CRX_SET_POS_TORQ_TRANS: { 00123 MODE_POS_FT_TRANS = (int16_t) msg.data[1]; 00124 /* 00125 MODE_POS_FT_TRANS == 0 : Position Control 00126 MODE_POS_FT_TRANS == 1 : Trasition(Position->Torque) 00127 MODE_POS_FT_TRANS == 2 : Torque Control (Convert to 2 automatically 3sec after transition) 00128 MODE_POS_FT_TRANS == 3 : Transition(Toque->Position) 00129 */ 00130 break; 00131 } 00132 00133 case CRX_ASK_CAN_FREQ: { 00134 CAN_TX_CAN_FREQ(); 00135 00136 break; 00137 } 00138 00139 case CRX_SET_CAN_FREQ: { 00140 CAN_FREQ = (int16_t) (msg.data[1] | msg.data[2] << 8); 00141 spi_eeprom_write(RID_CAN_FREQ, (int16_t) CAN_FREQ); 00142 break; 00143 } 00144 00145 case CRX_ASK_CONTROL_MODE: { 00146 CAN_TX_CONTROL_MODE(); 00147 00148 break; 00149 } 00150 00151 case CRX_SET_CONTROL_MODE: { 00152 CONTROL_UTILITY_MODE = (int16_t) (msg.data[1]); 00153 if (CONTROL_MODE == 22) { //MODE_FIND_HOME 00154 FLAG_FIND_HOME = true; 00155 FINDHOME_STAGE = FINDHOME_INIT; 00156 } 00157 break; 00158 } 00159 00160 case CRX_SET_DATA_REQUEST: { 00161 int request_type = msg.data[2]; 00162 flag_data_request[request_type] = msg.data[1]; 00163 00164 // if (flag_data_request[1] == HIGH) SPI_VREF_DAC_WRITE(PRES_A_VREF, PRES_B_VREF, TORQUE_VREF, 0); // set DAC 00165 //if (flag_data_request[1] == HIGH) dac_1 = PRES_A_VREF/3.3; 00166 // if (flag_data_request[2] == HIGH) SPI_VREF_DAC_WRITE(PRES_A_VREF, PRES_B_VREF, TORQUE_VREF, 0); // set DAC 00167 //if (flag_data_request[2] == HIGH) dac_2 = PRES_B_VREF/3.3; 00168 00169 00170 break; 00171 } 00172 00173 case CRX_ASK_JOINT_ENC_DIR: { 00174 CAN_TX_JOINT_ENC_DIR(); 00175 00176 break; 00177 } 00178 00179 case CRX_SET_JOINT_ENC_DIR: { 00180 DIR_JOINT_ENC = (int16_t) (msg.data[1] | msg.data[2] << 8); 00181 if (DIR_JOINT_ENC >= 0) 00182 DIR_JOINT_ENC = 1; 00183 else 00184 DIR_JOINT_ENC = -1; 00185 00186 spi_eeprom_write(RID_JOINT_ENC_DIR, (int16_t) DIR_JOINT_ENC); 00187 00188 break; 00189 } 00190 00191 case CRX_ASK_VALVE_DIR: { 00192 CAN_TX_VALVE_DIR(); 00193 00194 break; 00195 } 00196 00197 case CRX_SET_VALVE_DIR: { 00198 DIR_VALVE = (int16_t) (msg.data[1] | msg.data[2] << 8); 00199 if (DIR_VALVE >= 0) 00200 DIR_VALVE = 1; 00201 else 00202 DIR_VALVE = -1; 00203 00204 spi_eeprom_write(RID_VALVE_DIR, (int16_t) DIR_VALVE); 00205 00206 break; 00207 } 00208 00209 case CRX_ASK_VALVE_ENC_DIR: { 00210 CAN_TX_VALVE_ENC_DIR(); 00211 00212 break; 00213 } 00214 00215 case CRX_SET_VALVE_ENC_DIR: { 00216 DIR_VALVE_ENC = (int16_t) (msg.data[1] | msg.data[2] << 8); 00217 if (DIR_VALVE_ENC >= 0) 00218 DIR_VALVE_ENC = 1; 00219 else 00220 DIR_VALVE_ENC = -1; 00221 00222 spi_eeprom_write(RID_VALVE_ENC_DIR, (int16_t) DIR_VALVE_ENC); 00223 00224 break; 00225 } 00226 00227 case CRX_ASK_VOLTAGE_SUPPLY: { 00228 CAN_TX_VOLTAGE_SUPPLY(); 00229 00230 break; 00231 } 00232 00233 case CRX_SET_VOLTAGE_SUPPLY: { 00234 SUPPLY_VOLTAGE = (double) ((int16_t) (msg.data[1] | msg.data[2] << 8)) / 10.0f; 00235 00236 00237 spi_eeprom_write(RID_VOLATGE_SUPPLY, (int16_t) (SUPPLY_VOLTAGE * 10.0f)); 00238 00239 break; 00240 } 00241 00242 case CRX_ASK_VOLTAGE_VALVE: { 00243 CAN_TX_VOLTAGE_VALVE(); 00244 00245 break; 00246 } 00247 00248 case CRX_SET_VOLTAGE_VALVE: { 00249 VALVE_VOLTAGE_LIMIT = (double) ((int16_t) (msg.data[1] | msg.data[2] << 8)) / 10.0f; 00250 00251 spi_eeprom_write(RID_VOLTAGE_VALVE, (int16_t) (VALVE_VOLTAGE_LIMIT * 10.0f)); 00252 00253 00254 break; 00255 } 00256 00257 case CRX_SET_HOMEPOS: { 00258 CONTROL_UTILITY_MODE = 22; 00259 break; 00260 } 00261 00262 case CRX_ASK_VARIABLE_SUPPLY: 00263 { 00264 CAN_TX_VARIABLE_SUPPLY_ONOFF(); 00265 break; 00266 } 00267 00268 case CRX_SET_VARIABLE_SUPPLY: 00269 { 00270 SUPPLY_PRESSURE_UPDATE = msg.data[1]; 00271 break; 00272 } 00273 00274 case CRX_ASK_PID_GAIN: { 00275 CAN_TX_PID_GAIN(msg.data[1]); 00276 00277 break; 00278 } 00279 00280 case CRX_SET_PID_GAIN: { 00281 if (msg.data[1] == 0) { 00282 P_GAIN_VALVE_POSITION = (int16_t) (msg.data[2] | msg.data[3] << 8); 00283 I_GAIN_VALVE_POSITION = (int16_t) (msg.data[4] | msg.data[5] << 8); 00284 D_GAIN_VALVE_POSITION = (int16_t) (msg.data[6] | msg.data[7] << 8); 00285 00286 spi_eeprom_write(RID_P_GAIN_VALVE_POSITION, (int16_t) P_GAIN_VALVE_POSITION); 00287 spi_eeprom_write(RID_I_GAIN_VALVE_POSITION, (int16_t) I_GAIN_VALVE_POSITION); 00288 spi_eeprom_write(RID_D_GAIN_VALVE_POSITION, (int16_t) D_GAIN_VALVE_POSITION); 00289 00290 } else if (msg.data[1] == 1) { 00291 P_GAIN_JOINT_POSITION = (int16_t) (msg.data[2] | msg.data[3] << 8); 00292 I_GAIN_JOINT_POSITION = (int16_t) (msg.data[4] | msg.data[5] << 8); 00293 D_GAIN_JOINT_POSITION = (int16_t) (msg.data[6] | msg.data[7] << 8); 00294 00295 spi_eeprom_write(RID_P_GAIN_JOINT_POSITION, (int16_t) P_GAIN_JOINT_POSITION); 00296 spi_eeprom_write(RID_I_GAIN_JOINT_POSITION, (int16_t) I_GAIN_JOINT_POSITION); 00297 spi_eeprom_write(RID_D_GAIN_JOINT_POSITION, (int16_t) D_GAIN_JOINT_POSITION); 00298 00299 } else if (msg.data[1] == 2) { 00300 P_GAIN_JOINT_TORQUE = (int16_t) (msg.data[2] | msg.data[3] << 8); 00301 I_GAIN_JOINT_TORQUE = (int16_t) (msg.data[4] | msg.data[5] << 8); 00302 D_GAIN_JOINT_TORQUE = (int16_t) (msg.data[6] | msg.data[7] << 8); 00303 00304 spi_eeprom_write(RID_P_GAIN_JOINT_TORQUE, (int16_t) P_GAIN_JOINT_TORQUE); 00305 spi_eeprom_write(RID_I_GAIN_JOINT_TORQUE, (int16_t) I_GAIN_JOINT_TORQUE); 00306 spi_eeprom_write(RID_D_GAIN_JOINT_TORQUE, (int16_t) D_GAIN_JOINT_TORQUE); 00307 00308 } else if (msg.data[1] == 3) { 00309 K_SPRING = (float) (((float) ((int16_t) (msg.data[2] | msg.data[3] << 8))) * 0.1f); 00310 D_DAMPER = (float) (((float) ((int16_t) (msg.data[4] | msg.data[5] << 8))) * 0.01f); 00311 00312 // spi_eeprom_write(RID_K_SPRING, (int16_t) K_SPRING); 00313 // spi_eeprom_write(RID_D_DAMPER, (int16_t) D_DAMPER); 00314 00315 } else if (msg.data[1] == 4) { 00316 P_GAIN_JOINT_TORQUE_FF = (int16_t) (msg.data[2] | msg.data[3] << 8); 00317 I_GAIN_JOINT_TORQUE_FF = (int16_t) (msg.data[4] | msg.data[5] << 8); 00318 D_GAIN_JOINT_TORQUE_FF = (int16_t) (msg.data[6] | msg.data[7] << 8); 00319 00320 } 00321 00322 break; 00323 } 00324 00325 case CRX_ASK_VALVE_DEADZONE: { 00326 CAN_TX_VALVE_DEADZONE(); 00327 00328 break; 00329 } 00330 00331 case CRX_SET_VALVE_DEADZONE: { 00332 VALVE_CENTER = (int16_t) (msg.data[1] | msg.data[2] << 8); 00333 VALVE_DEADZONE_PLUS = (int16_t)(msg.data[3] | msg.data[4] << 8); 00334 VALVE_DEADZONE_MINUS = (int16_t)(msg.data[5] | msg.data[6] << 8); 00335 00336 spi_eeprom_write(RID_VALVE_CNETER, VALVE_CENTER); 00337 spi_eeprom_write(RID_VALVE_DEADZONE_PLUS, VALVE_DEADZONE_PLUS); 00338 spi_eeprom_write(RID_VALVE_DEADZONE_MINUS, VALVE_DEADZONE_MINUS); 00339 00340 break; 00341 } 00342 00343 case CRX_ASK_VELOCITY_COMP_GAIN: { 00344 CAN_TX_VELOCITY_COMP_GAIN(); 00345 00346 break; 00347 } 00348 00349 case CRX_SET_VELOCITY_COMP_GAIN: { 00350 VELOCITY_COMP_GAIN = (int16_t) (msg.data[1] | msg.data[2] << 8); 00351 00352 00353 spi_eeprom_write(RID_VELOCITY_COMP_GAIN, (int16_t) VELOCITY_COMP_GAIN); 00354 00355 break; 00356 } 00357 00358 case CRX_ASK_COMPLIANCE_GAIN: { 00359 CAN_TX_COMPLIANCE_GAIN(); 00360 00361 break; 00362 } 00363 00364 case CRX_SET_COMPLIANCE_GAIN: { 00365 COMPLIANCE_GAIN = (int16_t) (msg.data[1] | msg.data[2] << 8); 00366 00367 00368 spi_eeprom_write(RID_COMPLIANCE_GAIN, (int16_t) COMPLIANCE_GAIN); 00369 00370 break; 00371 } 00372 00373 case CRX_ASK_VALVE_FF: { 00374 CAN_TX_VALVE_FF(); 00375 00376 break; 00377 } 00378 00379 case CRX_SET_VALVE_FF: { 00380 VALVE_FF = (int16_t) (msg.data[1] | msg.data[2] << 8); 00381 00382 spi_eeprom_write(RID_VALVE_FF, (int16_t) VALVE_FF); 00383 00384 break; 00385 } 00386 00387 case CRX_ASK_BULK_MODULUS: { 00388 CAN_TX_BULK_MODULUS(); 00389 00390 break; 00391 } 00392 00393 case CRX_SET_BULK_MODULUS: { 00394 BULK_MODULUS = (int16_t) (msg.data[1] | msg.data[2] << 8); 00395 spi_eeprom_write(RID_BULK_MODULUS, (int16_t) BULK_MODULUS); 00396 00397 break; 00398 } 00399 00400 case CRX_ASK_CHAMBER_VOLUME: { 00401 CAN_TX_CHAMBER_VOLUME(); 00402 00403 break; 00404 } 00405 00406 case CRX_SET_CHAMBER_VOLUME: { 00407 CHAMBER_VOLUME_A = (int16_t) (msg.data[1] | msg.data[2] << 8); 00408 CHAMBER_VOLUME_B = (int16_t) (msg.data[3] | msg.data[4] << 8); 00409 00410 spi_eeprom_write(RID_CHAMBER_VOLUME_A, (int16_t) CHAMBER_VOLUME_A); 00411 spi_eeprom_write(RID_CHAMBER_VOLUME_B, (int16_t) CHAMBER_VOLUME_B); 00412 00413 break; 00414 } 00415 00416 case CRX_ASK_PISTON_AREA: { 00417 CAN_TX_PISTON_AREA(); 00418 00419 break; 00420 } 00421 00422 case CRX_SET_PISTON_AREA: { 00423 PISTON_AREA_A = (int16_t) (msg.data[1] | msg.data[2] << 8); 00424 PISTON_AREA_B = (int16_t) (msg.data[3] | msg.data[4] << 8); 00425 PISTON_AREA_alpha = (double)PISTON_AREA_A/(double)PISTON_AREA_B; 00426 alpha3 = PISTON_AREA_alpha * PISTON_AREA_alpha*PISTON_AREA_alpha; 00427 00428 spi_eeprom_write(RID_PISTON_AREA_A, (int16_t) PISTON_AREA_A); 00429 spi_eeprom_write(RID_PISTON_AREA_B, (int16_t) PISTON_AREA_B); 00430 break; 00431 } 00432 00433 case CRX_ASK_SUP_PRES: { 00434 CAN_TX_SUP_PRES(); 00435 break; 00436 } 00437 00438 case CRX_SET_SUP_PRES: { 00439 int16_t temp = (int16_t) (msg.data[1] | msg.data[2] << 8); 00440 spi_eeprom_write(RID_PRES_SUPPLY, temp); 00441 PRES_SUPPLY_NOM = (float)temp; 00442 PRES_SUPPLY = PRES_SUPPLY_NOM; 00443 break; 00444 } 00445 00446 case CRX_ASK_ENC_LIMIT: { 00447 CAN_TX_ENC_LIMIT(); 00448 00449 break; 00450 } 00451 00452 case CRX_SET_ENC_LIMIT: { 00453 ENC_LIMIT_MINUS = (int16_t) (msg.data[1] | msg.data[2] << 8); 00454 ENC_LIMIT_PLUS = (int16_t) (msg.data[3] | msg.data[4] << 8); 00455 spi_eeprom_write(RID_ENC_LIMIT_MINUS, (int16_t) ENC_LIMIT_MINUS); 00456 spi_eeprom_write(RID_ENC_LIMIT_PLUS, (int16_t) ENC_LIMIT_PLUS); 00457 00458 break; 00459 } 00460 00461 case CRX_ASK_STROKE: { 00462 CAN_TX_STROKE(); 00463 break; 00464 } 00465 00466 case CRX_SET_STROKE: { 00467 STROKE = (int16_t) (msg.data[1] | msg.data[2] << 8); 00468 spi_eeprom_write(RID_STROKE, (int16_t) STROKE); 00469 00470 break; 00471 } 00472 00473 case CRX_ASK_VALVE_LIMIT: { 00474 CAN_TX_VALVE_LIMIT(); 00475 00476 break; 00477 } 00478 00479 case CRX_SET_VALVE_LIMIT: { 00480 VALVE_MIN_POS = (int16_t) (msg.data[1] | msg.data[2] << 8); 00481 VALVE_MAX_POS = (int16_t) (msg.data[3] | msg.data[4] << 8); 00482 00483 spi_eeprom_write(RID_VALVE_MAX_POS, (int16_t) VALVE_MAX_POS); 00484 spi_eeprom_write(RID_VALVE_MIN_POS, (int16_t) VALVE_MIN_POS); 00485 00486 break; 00487 } 00488 00489 case CRX_ASK_ENC_PULSE_PER_POSITION: { 00490 CAN_TX_ENC_PULSE_PER_POSITION(); 00491 00492 break; 00493 } 00494 00495 case CRX_SET_ENC_PULSE_PER_POSITION: { 00496 ENC_PULSE_PER_POSITION = (int16_t) (msg.data[1] | msg.data[2] << 8); 00497 spi_eeprom_write(RID_ENC_PULSE_PER_POSITION, (int16_t) (ENC_PULSE_PER_POSITION)); 00498 00499 break; 00500 } 00501 00502 case CRX_ASK_TORQUE_SENSOR_PULSE_PER_TORQUE: { 00503 CAN_TX_TORQUE_SENSOR_PULSE_PER_TORQUE(); 00504 00505 break; 00506 } 00507 00508 case CRX_SET_TORQUE_SENSOR_PULSE_PER_TORQUE: { 00509 TORQUE_SENSOR_PULSE_PER_TORQUE = (float) ((int16_t) (msg.data[1] | msg.data[2] << 8) * 0.0001f); 00510 spi_eeprom_write(RID_TORQUE_SENSOR_PULSE_PER_TORQUE, (int16_t) (TORQUE_SENSOR_PULSE_PER_TORQUE*10000.0f)); 00511 00512 break; 00513 } 00514 00515 case CRX_ASK_PRES_SENSOR_PULSE_PER_PRES: { 00516 CAN_TX_PRES_SENSOR_PULSE_PER_PRES(); 00517 00518 break; 00519 } 00520 00521 case CRX_SET_PRES_SENSOR_PULSE_PER_PRES: { 00522 PRES_SENSOR_A_PULSE_PER_BAR = (double) ((int16_t) (msg.data[1] | msg.data[2] << 8)) * 0.01f; 00523 PRES_SENSOR_B_PULSE_PER_BAR = (double) ((int16_t) (msg.data[3] | msg.data[4] << 8)) * 0.01f; 00524 spi_eeprom_write(RID_PRES_SENSOR_A_PULSE_PER_BAR, (int16_t) (PRES_SENSOR_A_PULSE_PER_BAR * 100.0f)); 00525 spi_eeprom_write(RID_PRES_SENSOR_B_PULSE_PER_BAR, (int16_t) (PRES_SENSOR_B_PULSE_PER_BAR * 100.0f)); 00526 00527 break; 00528 } 00529 00530 case CRX_ASK_FRICTION: { 00531 CAN_TX_FRICTION(); 00532 00533 break; 00534 } 00535 00536 case CRX_SET_FRICTION: { 00537 FRICTION = (double) ((int16_t) (msg.data[1] | msg.data[2] << 8)) / 10.0f; 00538 spi_eeprom_write(RID_FRICTION, (int16_t) (FRICTION * 10.0f)); 00539 00540 break; 00541 } 00542 00543 case CRX_ASK_VALVE_GAIN_PLUS: { 00544 CAN_TX_VALVE_GAIN_PLUS(); 00545 00546 break; 00547 } 00548 case CRX_SET_VALVE_GAIN_PLUS: { 00549 VALVE_GAIN_LPM_PER_V[0] = (double) msg.data[1] / 50.0f; 00550 VALVE_GAIN_LPM_PER_V[2] = (double) msg.data[2] / 50.0f; 00551 VALVE_GAIN_LPM_PER_V[4] = (double) msg.data[3] / 50.0f; 00552 VALVE_GAIN_LPM_PER_V[6] = (double) msg.data[4] / 50.0f; 00553 VALVE_GAIN_LPM_PER_V[8] = (double) msg.data[5] / 50.0f; 00554 spi_eeprom_write(RID_VALVE_GAIN_PLUS_1, (int16_t) (VALVE_GAIN_LPM_PER_V[0] * 100.0f)); 00555 spi_eeprom_write(RID_VALVE_GAIN_PLUS_2, (int16_t) (VALVE_GAIN_LPM_PER_V[2] * 100.0f)); 00556 spi_eeprom_write(RID_VALVE_GAIN_PLUS_3, (int16_t) (VALVE_GAIN_LPM_PER_V[4] * 100.0f)); 00557 spi_eeprom_write(RID_VALVE_GAIN_PLUS_4, (int16_t) (VALVE_GAIN_LPM_PER_V[6] * 100.0f)); 00558 spi_eeprom_write(RID_VALVE_GAIN_PLUS_5, (int16_t) (VALVE_GAIN_LPM_PER_V[8] * 100.0f)); 00559 00560 break; 00561 } 00562 00563 case CRX_ASK_VALVE_GAIN_MINUS: { 00564 CAN_TX_VALVE_GAIN_MINUS(); 00565 00566 break; 00567 } 00568 case CRX_SET_VALVE_GAIN_MINUS: { 00569 VALVE_GAIN_LPM_PER_V[1] = (double) msg.data[1] / 50.0f; 00570 VALVE_GAIN_LPM_PER_V[3] = (double) msg.data[2] / 50.0f; 00571 VALVE_GAIN_LPM_PER_V[5] = (double) msg.data[3] / 50.0f; 00572 VALVE_GAIN_LPM_PER_V[7] = (double) msg.data[4] / 50.0f; 00573 VALVE_GAIN_LPM_PER_V[9] = (double) msg.data[5] / 50.0f; 00574 spi_eeprom_write(RID_VALVE_GAIN_MINUS_1, (int16_t) (VALVE_GAIN_LPM_PER_V[1] * 100.0f)); 00575 spi_eeprom_write(RID_VALVE_GAIN_MINUS_2, (int16_t) (VALVE_GAIN_LPM_PER_V[3] * 100.0f)); 00576 spi_eeprom_write(RID_VALVE_GAIN_MINUS_3, (int16_t) (VALVE_GAIN_LPM_PER_V[5] * 100.0f)); 00577 spi_eeprom_write(RID_VALVE_GAIN_MINUS_4, (int16_t) (VALVE_GAIN_LPM_PER_V[7] * 100.0f)); 00578 spi_eeprom_write(RID_VALVE_GAIN_MINUS_5, (int16_t) (VALVE_GAIN_LPM_PER_V[9] * 100.0f)); 00579 00580 break; 00581 } 00582 00583 case CRX_LOW_REF: { 00584 REFERENCE_MODE = msg.data[1]; 00585 00586 REF_NUM = msg.data[2]; 00587 REF_PERIOD = (double) ((int16_t) (msg.data[3] | msg.data[4] << 8)) / 100.0f; 00588 if (REF_PERIOD <= 0.0f) REF_MOVE_TIME_5k = TMR_FREQ_5k / CAN_FREQ; 00589 else REF_MOVE_TIME_5k = (int) (REF_PERIOD * (double) TMR_FREQ_5k); 00590 REF_MAG = (double) ((int16_t) (msg.data[5] | msg.data[6] << 8)) / 100.0f; 00591 00592 break; 00593 } 00594 00595 case CRX_JUMP_STATUS: { 00596 MODE_JUMP_STATUS = msg.data[1]; 00597 00598 break; 00599 } 00600 00601 case CRX_SET_ERR_CLEAR: { 00602 00603 for (int i = 0; i < num_err; i++) { 00604 flag_err[i] = FALSE; 00605 flag_err_old[i] = FALSE; 00606 } 00607 00608 flag_err_rt = FALSE; 00609 00610 00611 break; 00612 } 00613 00614 case CRX_ASK_HOMEPOS_OFFSET: { 00615 CAN_TX_HOMEPOS_OFFSET(); 00616 break; 00617 } 00618 case CRX_SET_HOMEPOS_OFFSET: { 00619 HOMEPOS_OFFSET = (int16_t)(msg.data[1] | msg.data[2] << 8); 00620 spi_eeprom_write(RID_HOMEPOS_OFFSET, (int16_t) HOMEPOS_OFFSET); 00621 break; 00622 } 00623 00624 case CRX_ASK_HOMEPOS_VALVE_OPENING: { 00625 CAN_TX_HOMPOS_VALVE_OPENING(); 00626 break; 00627 } 00628 case CRX_SET_HOMEPOS_VALVE_OPENING: { 00629 HOMEPOS_VALVE_OPENING = (int16_t) (msg.data[1] | msg.data[2] << 8); 00630 spi_eeprom_write(RID_HOMEPOS_VALVE_OPENING, (int16_t) HOMEPOS_VALVE_OPENING); 00631 break; 00632 } 00633 00634 case CRX_ASK_VALVE_PWM_VS_VALVE_POS: { 00635 can_index = (int16_t) msg.data[1]; 00636 CAN_TX_VALVE_PWM_VS_VALVE_POS(can_index); 00637 break; 00638 } 00639 case CRX_ASK_VALVE_POS_VS_FLOWRATE: { 00640 can_index = (int16_t) msg.data[1]; 00641 CAN_TX_VALVE_POS_VS_FLOWRATE(can_index); 00642 break; 00643 } 00644 case CRX_ASK_VALVE_POS_NUM: { 00645 CAN_TX_VALVE_POS_NUM(); 00646 break; 00647 } 00648 00649 case CRX_SET_ROM: { 00650 break; 00651 } 00652 00653 default: 00654 break; 00655 } 00656 } 00657 00658 void CAN_RX_HANDLER() 00659 { 00660 00661 can.read(msg); 00662 unsigned int address = msg.id; 00663 if(address==CID_RX_CMD) { 00664 unsigned int CMD = msg.data[0]; 00665 ReadCMD(CMD); 00666 00667 } else if(address==CID_RX_REF_POSITION) { 00668 00669 int16_t temp_pos = (int16_t) (msg.data[0] | msg.data[1] << 8); 00670 int16_t temp_vel = (int16_t) (msg.data[2] | msg.data[3] << 8); 00671 int16_t temp_torq = (int16_t) (msg.data[4] | msg.data[5] << 8); 00672 00673 if((OPERATING_MODE&0b001)==0) { // Rotary Actuator 00674 REF_POSITION = (float)temp_pos * 1.0f / ENC_PULSE_PER_POSITION; // pulse >> deg 00675 REF_VELOCITY = (float)temp_vel * 10.0f / ENC_PULSE_PER_POSITION; // pulse/s >> deg/s 00676 REF_TORQUE = (float)temp_torq * 0.01f / TORQUE_SENSOR_PULSE_PER_TORQUE; // pulse >> Nm 00677 } else { //Linear Actuator 00678 REF_POSITION = (float)temp_pos * 4.0f / ENC_PULSE_PER_POSITION; // pulse >> mm 00679 REF_VELOCITY = (float)temp_vel * 100.0f / ENC_PULSE_PER_POSITION; // pulse/s >> mm/s 00680 REF_FORCE = (float)temp_torq * 0.1f / TORQUE_SENSOR_PULSE_PER_TORQUE; // pulse >> N 00681 } 00682 00683 if(SUPPLY_PRESSURE_UPDATE == 1) { 00684 int16_t temp_REF_Ps = (int16_t) (msg.data[6] | msg.data[7] << 8); 00685 PRES_SUPPLY = ((float)temp_REF_Ps) / 100.0; 00686 if(PRES_SUPPLY<35.0f) PRES_SUPPLY = 35.0f; 00687 else if(PRES_SUPPLY>210.0f) PRES_SUPPLY = 210.0f; 00688 } else { 00689 PRES_SUPPLY = PRES_SUPPLY_NOM; 00690 } 00691 00692 if(CAN_FREQ == -1) { 00693 00694 // Position, Velocity, and Torque (ID:1200) 00695 if (flag_data_request[0] == HIGH) { 00696 if ((OPERATING_MODE & 0b01) == 0) { // Rotary Actuator 00697 CAN_TX_POSITION_FT((int16_t) (pos.sen*ENC_PULSE_PER_POSITION), (int16_t) (vel.sen*ENC_PULSE_PER_POSITION*0.1f), (int16_t) (torq.sen*TORQUE_SENSOR_PULSE_PER_TORQUE*10.0f)); 00698 } else if ((OPERATING_MODE & 0b01) == 1) { // Linear Actuator 00699 CAN_TX_POSITION_FT((int16_t) (pos.sen*ENC_PULSE_PER_POSITION*0.25f), (int16_t) (vel.sen*ENC_PULSE_PER_POSITION*0.01f), (int16_t) (force.sen*TORQUE_SENSOR_PULSE_PER_TORQUE*10.0f)); 00700 } 00701 } 00702 00703 // Valve Position (ID:1300) 00704 if (flag_data_request[1] == HIGH) { 00705 CAN_TX_PWM((int16_t)(cur.sen/mA_PER_pulse)); 00706 } 00707 00708 // Others : Pressure A, B, Supply Pressure, etc. (for Debugging) (ID:1400) 00709 if (flag_data_request[2] == HIGH) { 00710 CAN_TX_SOMETHING((int16_t)(pres_A.sen*100.0f), (int16_t)(pres_B.sen*100.0f), (int16_t) (0), (int16_t) (0)); 00711 } 00712 } 00713 00714 } else if(address==CID_RX_REF_OPENLOOP) { 00715 int16_t temp_ref_valve_pos = (int16_t) (msg.data[0] | msg.data[1] << 8); 00716 00717 if (((OPERATING_MODE&0b110)>>1) == 0) { //Moog Valve 00718 valve_pos.ref = (double) temp_ref_valve_pos; // Unit : pulse (0~10000) 00719 } else if (((OPERATING_MODE&0b110)>>1) == 1) { //KNR Valve 00720 valve_pos.ref = (double) temp_ref_valve_pos; // Unit : pulse (0~30000) 00721 } else { //SW Valve 00722 if(temp_ref_valve_pos >= 0) { 00723 valve_pos.ref = (double)VALVE_CENTER + (double)temp_ref_valve_pos * ((double)VALVE_MAX_POS-(double)VALVE_CENTER)/10000.0f; 00724 } else { 00725 valve_pos.ref = (double)VALVE_CENTER - (double)temp_ref_valve_pos * ((double)VALVE_MIN_POS-(double)VALVE_CENTER)/10000.0f; 00726 } 00727 } 00728 } else if(address==CID_RX_REF_PWM) { 00729 int temp_ref_pwm = (int16_t) (msg.data[0] | msg.data[1] << 8); 00730 Vout.ref = (double) temp_ref_pwm; 00731 } 00732 00733 00734 } 00735 00736 /****************************************************************************** 00737 Information Transmission Functions 00738 *******************************************************************************/ 00739 00740 void CAN_TX_INFO(void) 00741 { 00742 CANMessage temp_msg; 00743 00744 temp_msg.id = CID_TX_INFO; 00745 temp_msg.len = 7; 00746 temp_msg.data[0] = (uint8_t) CTX_SEND_INFO; 00747 temp_msg.data[1] = (uint8_t) BNO; 00748 temp_msg.data[2] = (uint8_t) CAN_FREQ; 00749 temp_msg.data[3] = (uint8_t) (CAN_FREQ >> 8); 00750 temp_msg.data[4] = (uint8_t) (flag_err[7] << 7 | flag_err[6] << 6 | flag_err[5] << 5 | flag_err[4] << 4 | flag_err[3] << 3 | flag_err[2] << 2 | flag_err[1] << 1 | flag_err[0]); 00751 temp_msg.data[5] = (uint8_t) CONTROL_UTILITY_MODE; 00752 temp_msg.data[6] = (uint8_t) OPERATING_MODE; 00753 00754 can.write(temp_msg); 00755 } 00756 00757 void CAN_TX_BNO(void) 00758 { 00759 CANMessage temp_msg; 00760 00761 temp_msg.id = CID_TX_INFO; 00762 //temp_msg.len = 2; 00763 temp_msg.len = 2; 00764 temp_msg.data[0] = (uint8_t) CTX_SEND_BNO; 00765 temp_msg.data[1] = (uint8_t) BNO; 00766 00767 can.write(temp_msg); 00768 } 00769 00770 void CAN_TX_OPERATING_MODE(void) 00771 { 00772 CANMessage temp_msg; 00773 00774 temp_msg.id = CID_TX_INFO; 00775 temp_msg.len = 5; 00776 temp_msg.data[0] = (uint8_t) CTX_SEND_OPERATING_MODE; 00777 temp_msg.data[1] = (uint8_t) OPERATING_MODE; 00778 temp_msg.data[2] = (uint8_t) SENSING_MODE; 00779 temp_msg.data[3] = (uint8_t) CURRENT_CONTROL_MODE; 00780 temp_msg.data[4] = (uint8_t) FLAG_VALVE_DEADZONE; 00781 00782 can.write(temp_msg); 00783 } 00784 00785 void CAN_TX_CAN_FREQ(void) 00786 { 00787 CANMessage temp_msg; 00788 00789 temp_msg.id = CID_TX_INFO; 00790 temp_msg.len = 3; 00791 temp_msg.data[0] = (uint8_t) CTX_SEND_CAN_FREQ; 00792 temp_msg.data[1] = (uint8_t) CAN_FREQ; 00793 temp_msg.data[2] = (uint8_t) (CAN_FREQ >> 8); 00794 00795 can.write(temp_msg); 00796 } 00797 00798 void CAN_TX_CONTROL_MODE(void) 00799 { 00800 CANMessage temp_msg; 00801 00802 temp_msg.id = CID_TX_INFO; 00803 temp_msg.len = 2; 00804 temp_msg.data[0] = (uint8_t) CTX_SEND_CONTROL_MODE; 00805 temp_msg.data[1] = (uint8_t) CONTROL_UTILITY_MODE; 00806 00807 can.write(temp_msg); 00808 } 00809 00810 void CAN_TX_JOINT_ENC_DIR(void) 00811 { 00812 CANMessage temp_msg; 00813 00814 temp_msg.id = CID_TX_INFO; 00815 temp_msg.len = 3; 00816 temp_msg.data[0] = (uint8_t) CTX_SEND_JOINT_ENC_DIR; 00817 temp_msg.data[1] = (uint8_t) DIR_JOINT_ENC; 00818 temp_msg.data[2] = (uint8_t) (DIR_JOINT_ENC >> 8); 00819 00820 can.write(temp_msg); 00821 } 00822 00823 void CAN_TX_VALVE_DIR(void) 00824 { 00825 CANMessage temp_msg; 00826 00827 temp_msg.id = CID_TX_INFO; 00828 temp_msg.len = 3; 00829 temp_msg.data[0] = (uint8_t) CTX_SEND_VALVE_DIR; 00830 temp_msg.data[1] = (uint8_t) DIR_VALVE; 00831 temp_msg.data[2] = (uint8_t) (DIR_VALVE >> 8); 00832 00833 can.write(temp_msg); 00834 } 00835 00836 void CAN_TX_VALVE_ENC_DIR(void) 00837 { 00838 CANMessage temp_msg; 00839 00840 temp_msg.id = CID_TX_INFO; 00841 temp_msg.len = 3; 00842 temp_msg.data[0] = (uint8_t) CTX_SEND_VALVE_ENC_DIR; 00843 temp_msg.data[1] = (uint8_t) DIR_VALVE_ENC; 00844 temp_msg.data[2] = (uint8_t) (DIR_VALVE_ENC >> 8); 00845 00846 can.write(temp_msg); 00847 } 00848 00849 void CAN_TX_VOLTAGE_SUPPLY(void) 00850 { 00851 int16_t send_voltage_supply = (int16_t) (SUPPLY_VOLTAGE * 10.0f); 00852 00853 CANMessage temp_msg; 00854 00855 temp_msg.id = CID_TX_INFO; 00856 temp_msg.len = 3; 00857 temp_msg.data[0] = (uint8_t) CTX_SEND_VOLTAGE_SUPPLY; 00858 temp_msg.data[1] = (uint8_t) (send_voltage_supply); 00859 temp_msg.data[2] = (uint8_t) (send_voltage_supply >> 8); 00860 00861 can.write(temp_msg); 00862 } 00863 00864 void CAN_TX_VOLTAGE_VALVE(void) 00865 { 00866 int16_t send_voltage_valve = (int16_t) (VALVE_VOLTAGE_LIMIT * 10.0f); 00867 00868 CANMessage temp_msg; 00869 00870 temp_msg.id = CID_TX_INFO; 00871 temp_msg.len = 3; 00872 temp_msg.data[0] = (uint8_t) CTX_SEND_VOLTAGE_VALVE; 00873 temp_msg.data[1] = (uint8_t) send_voltage_valve; 00874 temp_msg.data[2] = (uint8_t) (send_voltage_valve >> 8); 00875 00876 can.write(temp_msg); 00877 } 00878 00879 void CAN_TX_VARIABLE_SUPPLY_ONOFF(void) 00880 { 00881 CANMessage temp_msg; 00882 temp_msg.id = CID_TX_INFO; 00883 temp_msg.len = 2; 00884 temp_msg.data[0] = (uint8_t) CTX_SEND_VARIABLE_SUPPLY; 00885 temp_msg.data[1] = (uint8_t) SUPPLY_PRESSURE_UPDATE; 00886 00887 can.write(temp_msg); 00888 } 00889 00890 void CAN_TX_PID_GAIN(int t_type) 00891 { 00892 // t_type = 0 : valve position control gain 00893 // t_type = 1 : joint position control gain 00894 // t_type = 2 : joint torque control gain 00895 00896 int16_t sendPgain=0, sendIgain=0, sendDgain=0; 00897 if (t_type == 0) { 00898 sendPgain = (int16_t) (P_GAIN_VALVE_POSITION); 00899 sendIgain = (int16_t) (I_GAIN_VALVE_POSITION); 00900 sendDgain = (int16_t) (D_GAIN_VALVE_POSITION); 00901 } else if (t_type == 1) { 00902 sendPgain = (int16_t) (P_GAIN_JOINT_POSITION); 00903 sendIgain = (int16_t) (I_GAIN_JOINT_POSITION); 00904 sendDgain = (int16_t) (D_GAIN_JOINT_POSITION); 00905 } else if (t_type == 2) { 00906 sendPgain = (int16_t) (P_GAIN_JOINT_TORQUE); 00907 sendIgain = (int16_t) (I_GAIN_JOINT_TORQUE); 00908 sendDgain = (int16_t) (D_GAIN_JOINT_TORQUE); 00909 } else if (t_type == 3) { 00910 sendPgain = (int16_t) (K_SPRING * 10.0f); 00911 sendIgain = (int16_t) (D_DAMPER * 100.0f); 00912 } 00913 00914 CANMessage temp_msg; 00915 00916 temp_msg.id = CID_TX_INFO; 00917 temp_msg.len = 8; 00918 temp_msg.data[0] = (uint8_t) CTX_SEND_PID_GAIN; 00919 temp_msg.data[1] = (uint8_t) t_type; 00920 temp_msg.data[2] = (uint8_t) sendPgain; 00921 temp_msg.data[3] = (uint8_t) (sendPgain >> 8); 00922 temp_msg.data[4] = (uint8_t) sendIgain; 00923 temp_msg.data[5] = (uint8_t) (sendIgain >> 8); 00924 temp_msg.data[6] = (uint8_t) sendDgain; 00925 temp_msg.data[7] = (uint8_t) (sendDgain >> 8); 00926 00927 can.write(temp_msg); 00928 } 00929 00930 00931 void CAN_TX_VALVE_DEADZONE(void) 00932 { 00933 CANMessage temp_msg; 00934 00935 temp_msg.id = CID_TX_INFO; 00936 temp_msg.len = 7; 00937 temp_msg.data[0] = (uint8_t) CTX_SEND_VALVE_DEADZONE; 00938 temp_msg.data[1] = (uint8_t) VALVE_CENTER; 00939 temp_msg.data[2] = (uint8_t) (VALVE_CENTER >> 8); 00940 temp_msg.data[3] = (uint8_t) VALVE_DEADZONE_PLUS; 00941 temp_msg.data[4] = (uint8_t) (VALVE_DEADZONE_PLUS >> 8); 00942 temp_msg.data[5] = (uint8_t) VALVE_DEADZONE_MINUS; 00943 temp_msg.data[6] = (uint8_t) (VALVE_DEADZONE_MINUS >> 8); 00944 00945 can.write(temp_msg); 00946 } 00947 00948 void CAN_TX_VELOCITY_COMP_GAIN(void) 00949 { 00950 CANMessage temp_msg; 00951 00952 temp_msg.id = CID_TX_INFO; 00953 temp_msg.len = 3; 00954 temp_msg.data[0] = (uint8_t) CTX_SEND_VELOCITY_COMP_GAIN; 00955 temp_msg.data[1] = (uint8_t) VELOCITY_COMP_GAIN; 00956 temp_msg.data[2] = (uint8_t) (VELOCITY_COMP_GAIN >> 8); 00957 00958 can.write(temp_msg); 00959 } 00960 00961 void CAN_TX_COMPLIANCE_GAIN(void) 00962 { 00963 CANMessage temp_msg; 00964 00965 temp_msg.id = CID_TX_INFO; 00966 temp_msg.len = 3; 00967 temp_msg.data[0] = (uint8_t) CTX_SEND_COMPLIANCE_GAIN; 00968 temp_msg.data[1] = (uint8_t) COMPLIANCE_GAIN; 00969 temp_msg.data[2] = (uint8_t) (COMPLIANCE_GAIN >> 8); 00970 00971 can.write(temp_msg); 00972 } 00973 00974 void CAN_TX_VALVE_FF(void) 00975 { 00976 CANMessage temp_msg; 00977 00978 temp_msg.id = CID_TX_INFO; 00979 temp_msg.len = 3; 00980 temp_msg.data[0] = (uint8_t) CTX_SEND_VALVE_FF; 00981 temp_msg.data[1] = (uint8_t) VALVE_FF; 00982 temp_msg.data[2] = (uint8_t) (VALVE_FF >> 8); 00983 00984 can.write(temp_msg); 00985 } 00986 00987 void CAN_TX_BULK_MODULUS(void) 00988 { 00989 CANMessage temp_msg; 00990 00991 temp_msg.id = CID_TX_INFO; 00992 temp_msg.len = 3; 00993 temp_msg.data[0] = (uint8_t) CTX_SEND_BULK_MODULUS; 00994 temp_msg.data[1] = (uint8_t) BULK_MODULUS; 00995 temp_msg.data[2] = (uint8_t) (BULK_MODULUS >> 8); 00996 00997 can.write(temp_msg); 00998 } 00999 01000 void CAN_TX_CHAMBER_VOLUME(void) 01001 { 01002 CANMessage temp_msg; 01003 01004 temp_msg.id = CID_TX_INFO; 01005 temp_msg.len = 5; 01006 temp_msg.data[0] = (uint8_t) CTX_SEND_CHAMBER_VOLUME; 01007 temp_msg.data[1] = (uint8_t) CHAMBER_VOLUME_A; 01008 temp_msg.data[2] = (uint8_t) (CHAMBER_VOLUME_A >> 8); 01009 temp_msg.data[3] = (uint8_t) CHAMBER_VOLUME_B; 01010 temp_msg.data[4] = (uint8_t) (CHAMBER_VOLUME_B >> 8); 01011 01012 can.write(temp_msg); 01013 } 01014 01015 void CAN_TX_PISTON_AREA(void) 01016 { 01017 CANMessage temp_msg; 01018 01019 temp_msg.id = CID_TX_INFO; 01020 temp_msg.len = 5; 01021 temp_msg.data[0] = (uint8_t) CTX_SEND_PISTON_AREA; 01022 temp_msg.data[1] = (uint8_t) PISTON_AREA_A; 01023 temp_msg.data[2] = (uint8_t) (PISTON_AREA_A >> 8); 01024 temp_msg.data[3] = (uint8_t) PISTON_AREA_B; 01025 temp_msg.data[4] = (uint8_t) (PISTON_AREA_B >> 8); 01026 01027 can.write(temp_msg); 01028 } 01029 01030 void CAN_TX_SUP_PRES(void) 01031 { 01032 CANMessage temp_msg; 01033 01034 int16_t temp_PRES_SUPPLY = (int16_t) (PRES_SUPPLY); 01035 temp_msg.id = CID_TX_INFO; 01036 temp_msg.len = 5; 01037 temp_msg.data[0] = (uint8_t) CTX_SEND_SUP_PRES; 01038 temp_msg.data[1] = (uint8_t) temp_PRES_SUPPLY; 01039 temp_msg.data[2] = (uint8_t) (temp_PRES_SUPPLY >> 8); 01040 temp_msg.data[3] = 0; 01041 temp_msg.data[4] = 0; 01042 01043 can.write(temp_msg); 01044 } 01045 01046 void CAN_TX_ENC_LIMIT(void) 01047 { 01048 CANMessage temp_msg; 01049 01050 temp_msg.id = CID_TX_INFO; 01051 temp_msg.len = 5; 01052 temp_msg.data[0] = (uint8_t) CTX_SEND_ENC_LIMIT; 01053 temp_msg.data[1] = (uint8_t) ENC_LIMIT_MINUS; 01054 temp_msg.data[2] = (uint8_t) (ENC_LIMIT_MINUS >> 8); 01055 temp_msg.data[3] = (uint8_t) ENC_LIMIT_PLUS; 01056 temp_msg.data[4] = (uint8_t) (ENC_LIMIT_PLUS >> 8); 01057 01058 can.write(temp_msg); 01059 } 01060 01061 void CAN_TX_STROKE(void) 01062 { 01063 CANMessage temp_msg; 01064 01065 temp_msg.id = CID_TX_INFO; 01066 temp_msg.len = 3; 01067 temp_msg.data[0] = (uint8_t) CTX_SEND_STROKE; 01068 temp_msg.data[1] = (uint8_t) STROKE; 01069 temp_msg.data[2] = (uint8_t) (STROKE >> 8); 01070 01071 can.write(temp_msg); 01072 } 01073 01074 void CAN_TX_VALVE_LIMIT(void) 01075 { 01076 CANMessage temp_msg; 01077 01078 temp_msg.id = CID_TX_INFO; 01079 temp_msg.len = 5; 01080 temp_msg.data[0] = (uint8_t) CTX_SEND_VALVE_LIMIT; 01081 temp_msg.data[1] = (uint8_t) VALVE_MIN_POS; 01082 temp_msg.data[2] = (uint8_t) (VALVE_MIN_POS >> 8); 01083 temp_msg.data[3] = (uint8_t) VALVE_MAX_POS; 01084 temp_msg.data[4] = (uint8_t) (VALVE_MAX_POS >> 8); 01085 01086 can.write(temp_msg); 01087 } 01088 01089 void CAN_TX_ENC_PULSE_PER_POSITION(void) 01090 { 01091 CANMessage temp_msg; 01092 01093 temp_msg.id = CID_TX_INFO; 01094 temp_msg.len = 3; 01095 temp_msg.data[0] = (uint8_t) CTX_SEND_ENC_PULSE_PER_POSITION; 01096 int temp_enc_pulse_per_position = (int) (ENC_PULSE_PER_POSITION); 01097 temp_msg.data[1] = (uint8_t) temp_enc_pulse_per_position; 01098 temp_msg.data[2] = (uint8_t) (temp_enc_pulse_per_position >> 8); 01099 01100 can.write(temp_msg); 01101 } 01102 01103 void CAN_TX_TORQUE_SENSOR_PULSE_PER_TORQUE(void) 01104 { 01105 CANMessage temp_msg; 01106 01107 temp_msg.id = CID_TX_INFO; 01108 temp_msg.len = 3; 01109 temp_msg.data[0] = (uint8_t) CTX_SEND_TORQUE_SENSOR_PULSE_PER_TORQUE; 01110 int temp_torque_sensor_pulse_per_torque = (int) (TORQUE_SENSOR_PULSE_PER_TORQUE * 10000.0f); 01111 temp_msg.data[1] = (uint8_t) temp_torque_sensor_pulse_per_torque; 01112 temp_msg.data[2] = (uint8_t) (temp_torque_sensor_pulse_per_torque >> 8); 01113 01114 can.write(temp_msg); 01115 } 01116 01117 void CAN_TX_PRES_SENSOR_PULSE_PER_PRES(void) 01118 { 01119 CANMessage temp_msg; 01120 01121 temp_msg.id = CID_TX_INFO; 01122 temp_msg.len = 5; 01123 temp_msg.data[0] = (uint8_t) CTX_SEND_PRES_SENSOR_PULSE_PER_BAR; 01124 temp_msg.data[1] = (uint8_t) (int) (PRES_SENSOR_A_PULSE_PER_BAR * 100.0f); 01125 temp_msg.data[2] = (uint8_t) ((int) (PRES_SENSOR_A_PULSE_PER_BAR * 100.0f) >> 8); 01126 temp_msg.data[3] = (uint8_t) (int) (PRES_SENSOR_B_PULSE_PER_BAR * 100.0f); 01127 temp_msg.data[4] = (uint8_t) ((int) (PRES_SENSOR_B_PULSE_PER_BAR * 100.0f) >> 8); 01128 01129 can.write(temp_msg); 01130 } 01131 01132 void CAN_TX_FRICTION(void) 01133 { 01134 CANMessage temp_msg; 01135 int16_t send_friction; 01136 send_friction = (int16_t) (FRICTION * 10.0f); 01137 01138 temp_msg.id = CID_TX_INFO; 01139 temp_msg.len = 3; 01140 temp_msg.data[0] = (uint8_t) CTX_SEND_FRICTION; 01141 temp_msg.data[1] = (uint8_t) send_friction; 01142 temp_msg.data[2] = (uint8_t) (send_friction >> 8); 01143 01144 can.write(temp_msg); 01145 } 01146 01147 void CAN_TX_VALVE_GAIN_PLUS(void) 01148 { 01149 CANMessage temp_msg; 01150 01151 temp_msg.id = CID_TX_INFO; 01152 temp_msg.len = 6; 01153 temp_msg.data[0] = (uint8_t) CTX_SEND_VALVE_GAIN_PLUS; 01154 temp_msg.data[1] = (uint8_t) (VALVE_GAIN_LPM_PER_V[0] * 50.0f); 01155 temp_msg.data[2] = (uint8_t) (VALVE_GAIN_LPM_PER_V[2] * 50.0f); 01156 temp_msg.data[3] = (uint8_t) (VALVE_GAIN_LPM_PER_V[4] * 50.0f); 01157 temp_msg.data[4] = (uint8_t) (VALVE_GAIN_LPM_PER_V[6] * 50.0f); 01158 temp_msg.data[5] = (uint8_t) (VALVE_GAIN_LPM_PER_V[8] * 50.0f); 01159 01160 can.write(temp_msg); 01161 } 01162 01163 01164 void CAN_TX_VALVE_GAIN_MINUS(void) 01165 { 01166 CANMessage temp_msg; 01167 01168 temp_msg.id = CID_TX_INFO; 01169 temp_msg.len = 6; 01170 temp_msg.data[0] = (uint8_t) CTX_SEND_VALVE_GAIN_MINUS; 01171 temp_msg.data[1] = (uint8_t) (VALVE_GAIN_LPM_PER_V[1] * 50.0f); 01172 temp_msg.data[2] = (uint8_t) (VALVE_GAIN_LPM_PER_V[3] * 50.0f); 01173 temp_msg.data[3] = (uint8_t) (VALVE_GAIN_LPM_PER_V[5] * 50.0f); 01174 temp_msg.data[4] = (uint8_t) (VALVE_GAIN_LPM_PER_V[7] * 50.0f); 01175 temp_msg.data[5] = (uint8_t) (VALVE_GAIN_LPM_PER_V[9] * 50.0f); 01176 01177 can.write(temp_msg); 01178 } 01179 01180 void CAN_TX_REFENCE_MODE(void) 01181 { 01182 CANMessage temp_msg; 01183 01184 temp_msg.id = CID_TX_INFO; 01185 temp_msg.len = 6; 01186 temp_msg.data[0] = (uint8_t) CTX_SEND_REFENCE_MODE; 01187 temp_msg.data[1] = (uint8_t) REFERENCE_MODE; 01188 temp_msg.data[2] = (uint8_t) (int) (REFERENCE_FREQ * 100.0f); 01189 temp_msg.data[3] = (uint8_t) ((int) (REFERENCE_FREQ * 100.0f) >> 8); 01190 temp_msg.data[4] = (uint8_t) (int) (REFERENCE_MAG * 100.0f); 01191 temp_msg.data[5] = (uint8_t) ((int) (REFERENCE_MAG * 100.0f) >> 8); 01192 01193 can.write(temp_msg); 01194 } 01195 01196 void CAN_TX_HOMEPOS_OFFSET(void) 01197 { 01198 CANMessage temp_msg; 01199 int16_t send_homepos_offset; 01200 send_homepos_offset = (int16_t)HOMEPOS_OFFSET; 01201 01202 temp_msg.id = CID_TX_INFO; 01203 temp_msg.len = 3; 01204 temp_msg.data[0] = (uint8_t) CTX_SEND_HOMEPOS_OFFSET; 01205 temp_msg.data[1] = (uint8_t) send_homepos_offset; 01206 temp_msg.data[2] = (uint8_t) (send_homepos_offset >> 8); 01207 01208 can.write(temp_msg); 01209 } 01210 01211 void CAN_TX_HOMPOS_VALVE_OPENING(void) 01212 { 01213 CANMessage temp_msg; 01214 int16_t send_homepos_valve_opening; 01215 send_homepos_valve_opening = (int16_t) (HOMEPOS_VALVE_OPENING); 01216 01217 temp_msg.id = CID_TX_INFO; 01218 temp_msg.len = 3; 01219 temp_msg.data[0] = (uint8_t) CTX_SEND_HOMEPOS_VALVE_OPENING; 01220 temp_msg.data[1] = (uint8_t) send_homepos_valve_opening; 01221 temp_msg.data[2] = (uint8_t) (send_homepos_valve_opening >> 8); 01222 01223 can.write(temp_msg); 01224 } 01225 01226 void CAN_TX_VALVE_PWM_VS_VALVE_POS(int8_t canindex) 01227 { 01228 CANMessage temp_msg; 01229 int16_t valve_pos_vs_pwm; 01230 01231 if(VALVE_POS_VS_PWM[canindex]>= (float) VALVE_CENTER) { 01232 valve_pos_vs_pwm = 10000.0f*((double)VALVE_POS_VS_PWM[canindex]-(double)VALVE_CENTER)/((double)VALVE_MAX_POS-(double)VALVE_CENTER); 01233 } else { 01234 valve_pos_vs_pwm = -10000.0f*((double)VALVE_POS_VS_PWM[canindex]-(double)VALVE_CENTER)/((double)VALVE_MIN_POS-(double)VALVE_CENTER); 01235 } 01236 01237 int16_t PWM_VALVE_ID; 01238 PWM_VALVE_ID = ID_index_array[canindex] * 1000; 01239 01240 temp_msg.id = CID_TX_INFO; 01241 temp_msg.len = 5; 01242 temp_msg.data[0] = (uint8_t) CTX_VALVE_PWM_VS_VALVE_POS; 01243 temp_msg.data[1] = (uint8_t) PWM_VALVE_ID; 01244 temp_msg.data[2] = (uint8_t) (PWM_VALVE_ID >> 8); 01245 temp_msg.data[3] = (uint8_t) valve_pos_vs_pwm; 01246 temp_msg.data[4] = (uint8_t) (valve_pos_vs_pwm >> 8); 01247 01248 can.write(temp_msg); 01249 } 01250 01251 void CAN_TX_VALVE_POS_VS_FLOWRATE(int8_t canindex) 01252 { 01253 CANMessage temp_msg; 01254 int32_t valve_pos_vs_flowrate; 01255 valve_pos_vs_flowrate = (int32_t) (JOINT_VEL[canindex]); 01256 01257 int16_t VALVE_POS_VALVE_ID = ID_index_array[canindex] * 10 + VALVE_CENTER; 01258 int16_t temp_valve_pos = 0; 01259 if(VALVE_POS_VALVE_ID>=VALVE_CENTER) { 01260 temp_valve_pos = (int16_t) (10000.0f*((double)VALVE_POS_VALVE_ID-(double)VALVE_CENTER)/((double)VALVE_MAX_POS-(double)VALVE_CENTER)); 01261 } else { 01262 temp_valve_pos = (int16_t) (-10000.0f*((double)VALVE_POS_VALVE_ID-(double)VALVE_CENTER)/((double)VALVE_MIN_POS-(double)VALVE_CENTER)); 01263 } 01264 01265 temp_msg.id = CID_TX_INFO; 01266 temp_msg.len = 7; 01267 temp_msg.data[0] = (uint8_t) CTX_VALVE_POS_VS_FLOWRATE; 01268 temp_msg.data[1] = (uint8_t) temp_valve_pos; 01269 temp_msg.data[2] = (uint8_t) (temp_valve_pos >> 8); 01270 temp_msg.data[3] = (uint8_t) valve_pos_vs_flowrate; 01271 temp_msg.data[4] = (uint8_t) (valve_pos_vs_flowrate >> 8); 01272 temp_msg.data[5] = (uint8_t) (valve_pos_vs_flowrate >> 16); 01273 temp_msg.data[6] = (uint8_t) (valve_pos_vs_flowrate >> 24); 01274 01275 can.write(temp_msg); 01276 } 01277 01278 void CAN_TX_VALVE_POS_NUM(void) 01279 { 01280 CANMessage temp_msg; 01281 int32_t valve_pos_num; 01282 valve_pos_num = (int16_t) VALVE_POS_NUM; 01283 01284 temp_msg.id = CID_TX_INFO; 01285 temp_msg.len = 3; 01286 temp_msg.data[0] = (uint8_t) CTX_VALVE_POS_NUM; 01287 temp_msg.data[1] = (uint8_t) valve_pos_num; 01288 temp_msg.data[2] = (uint8_t) (valve_pos_num >> 8); 01289 01290 can.write(temp_msg); 01291 } 01292 01293 void CAN_TX_DDV_VALVE_MAX_MIN_POS(void) 01294 { 01295 CANMessage temp_msg; 01296 01297 float temp_valve_max_pos = 0.0f; 01298 float temp_valve_min_pos = 0.0f; 01299 float temp_ddv_center = 0.0f; 01300 01301 temp_valve_max_pos = VALVE_MAX_POS; 01302 temp_valve_min_pos = VALVE_MIN_POS; 01303 temp_ddv_center = VALVE_CENTER; 01304 01305 temp_msg.id = CID_TX_INFO; 01306 temp_msg.len = 7; 01307 temp_msg.data[0] = (uint8_t) CTX_VALVE_MAX_MIN_POS; 01308 temp_msg.data[1] = (uint8_t) temp_valve_max_pos; 01309 temp_msg.data[2] = (uint8_t) ((int) (temp_valve_max_pos) >> 8); 01310 temp_msg.data[3] = (uint8_t) (temp_valve_min_pos); 01311 temp_msg.data[4] = (uint8_t) ((int) (temp_valve_min_pos) >> 8); 01312 temp_msg.data[5] = (uint8_t) (temp_ddv_center); 01313 temp_msg.data[6] = (uint8_t) ((int) (temp_ddv_center) >> 8); 01314 01315 can.write(temp_msg); 01316 } 01317 01318 01319 void CAN_TX_BUFFER(int16_t t_cnt_buffer) 01320 { 01321 CANMessage temp_msg; 01322 int16_t send_pos_array, send_ref_array; 01323 send_pos_array = (int16_t) (pos_array[t_cnt_buffer]); 01324 send_ref_array = (int16_t) (ref_array[t_cnt_buffer]); 01325 01326 temp_msg.id = CID_TX_INFO; 01327 temp_msg.len = 5; 01328 temp_msg.data[0] = (uint8_t) CTX_SEND_BUFFER; 01329 temp_msg.data[1] = (uint8_t) send_pos_array; 01330 temp_msg.data[2] = (uint8_t) (send_pos_array >> 8); 01331 temp_msg.data[3] = (uint8_t) (send_ref_array); 01332 temp_msg.data[4] = (uint8_t) ((send_ref_array) >> 8); 01333 01334 can.write(temp_msg); 01335 } 01336 01337 01338 /****************************************************************************** 01339 Sensor & State Transmission Functions 01340 *******************************************************************************/ 01341 01342 void CAN_TX_POSITION_FT(int16_t t_pos, int16_t t_vel, int16_t t_torq) 01343 { 01344 CANMessage temp_msg; 01345 01346 temp_msg.id = CID_TX_POS_VEL_TORQ; 01347 temp_msg.len = 6; 01348 temp_msg.data[0] = (uint8_t) t_pos; 01349 temp_msg.data[1] = (uint8_t) (t_pos >> 8); 01350 temp_msg.data[2] = (uint8_t) t_vel; 01351 temp_msg.data[3] = (uint8_t) (t_vel >> 8); 01352 temp_msg.data[4] = (uint8_t) t_torq; 01353 temp_msg.data[5] = (uint8_t) (t_torq >> 8); 01354 01355 can.write(temp_msg); 01356 } 01357 01358 void CAN_TX_POSITION_PRESSURE(int16_t t_pos, int16_t t_vel, int16_t t_pa, int16_t t_pb) 01359 { 01360 01361 CANMessage temp_msg; 01362 01363 temp_msg.id = CID_TX_POS_VEL_TORQ; 01364 temp_msg.len = 8; 01365 temp_msg.data[0] = (uint8_t) t_pos; 01366 temp_msg.data[1] = (uint8_t) (t_pos >> 8); 01367 temp_msg.data[2] = (uint8_t) t_vel; 01368 temp_msg.data[3] = (uint8_t) (t_vel >> 8); 01369 temp_msg.data[4] = (uint8_t) t_pa; 01370 temp_msg.data[5] = (uint8_t) (t_pa >> 8); 01371 temp_msg.data[6] = (uint8_t) t_pb; 01372 temp_msg.data[7] = (uint8_t) (t_pb >> 8); 01373 01374 can.write(temp_msg); 01375 } 01376 01377 void CAN_TX_CURRENT(int16_t t_pres_a, int16_t t_pres_b) 01378 { 01379 CANMessage temp_msg; 01380 01381 temp_msg.id = CID_TX_CURRENT; 01382 temp_msg.len = 4; 01383 temp_msg.data[0] = (uint8_t) t_pres_a; 01384 temp_msg.data[1] = (uint8_t) (t_pres_a >> 8); 01385 temp_msg.data[2] = (uint8_t) t_pres_b; 01386 temp_msg.data[3] = (uint8_t) (t_pres_b >> 8); 01387 01388 can.write(temp_msg); 01389 } 01390 01391 void CAN_TX_PWM(int16_t t_pwm) 01392 { 01393 CANMessage temp_msg; 01394 01395 temp_msg.id = CID_TX_PWM; 01396 temp_msg.len = 2; 01397 temp_msg.data[0] = (uint8_t) t_pwm; 01398 temp_msg.data[1] = (uint8_t) (t_pwm >> 8); 01399 01400 can.write(temp_msg); 01401 } 01402 01403 void CAN_TX_VALVE_POSITION(int16_t t_valve_pos_1, int16_t t_valve_pos_2, int16_t t_ref_valve_pos, int16_t t_pwm) 01404 { 01405 CANMessage temp_msg; 01406 01407 temp_msg.id = CID_TX_VALVE_POSITION; 01408 temp_msg.len = 8; 01409 temp_msg.data[0] = (uint8_t) t_valve_pos_1; 01410 temp_msg.data[1] = (uint8_t) (t_valve_pos_1 >> 8); 01411 temp_msg.data[2] = (uint8_t) t_valve_pos_2; 01412 temp_msg.data[3] = (uint8_t) (t_valve_pos_2 >> 8); 01413 temp_msg.data[4] = (uint8_t) t_ref_valve_pos; 01414 temp_msg.data[5] = (uint8_t) (t_ref_valve_pos >> 8); 01415 temp_msg.data[6] = (uint8_t) t_pwm; 01416 temp_msg.data[7] = (uint8_t) (t_pwm >> 8); 01417 01418 01419 can.write(temp_msg); 01420 } 01421 01422 void CAN_TX_SOMETHING(int16_t t_a, int16_t t_b, int16_t t_c, int16_t t_d) 01423 { 01424 CANMessage temp_msg; 01425 01426 temp_msg.id = CID_TX_SOMETHING; 01427 temp_msg.len = 8; 01428 temp_msg.data[0] = (uint8_t) t_a; 01429 temp_msg.data[1] = (uint8_t) (t_a >> 8); 01430 temp_msg.data[2] = (uint8_t) t_b; 01431 temp_msg.data[3] = (uint8_t) (t_b >> 8); 01432 temp_msg.data[4] = (uint8_t) t_c; 01433 temp_msg.data[5] = (uint8_t) (t_c >> 8); 01434 temp_msg.data[6] = (uint8_t) t_d; 01435 temp_msg.data[7] = (uint8_t) (t_d >> 8); 01436 01437 01438 can.write(temp_msg); 01439 }
Generated on Sun Jul 17 2022 16:20:45 by
1.7.2