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:
- 13:ee50f3145be7
- Parent:
- 12:b203f3ae57d0
--- a/main.cpp Wed May 12 15:11:14 2021 +0000
+++ b/main.cpp Tue Jul 20 19:34:50 2021 +0000
@@ -10,44 +10,25 @@
#include "leg_message.h"
// length of receive/transmit buffers
-#define RX_LEN 26 //CHECK THESE BUFFER LENGHTS
-#define TX_LEN 26 //CHECK THESE BUFFER LENGHTS
+#define RX_LEN 12 //CHECK THESE BUFFER LENGHTS
+#define TX_LEN 12
// length of outgoing/incoming messages
-#define DATA_LEN 18 //CHECK THESE BUFFER LENGHTS
-#define CMD_LEN 26 //CHECK THESE BUFFER LENGHTS
+#define CMD_LEN 12
+#define DATA_LEN 12 //CHECK THESE BUFFER LENGHTS
// Master CAN ID ///
#define CAN_ID 0x0
/// Value Limits ///
- #define P_MIN -12.5f
- #define P_MAX 12.5f
- #define V_MIN -65.0f
- #define V_MAX 65.0f
- #define KP_MIN 0.0f
- #define KP_MAX 500.0f
- #define KD_MIN 0.0f
- #define KD_MAX 10.0f
- #define T_MIN -72.0f
- #define T_MAX 72.0f
-
- /// Joint Soft Stops ///
- #define A1_LIM_P 1.5f
- #define A1_LIM_N -1.5f
- #define A2_LIM_P 1.5f
- #define A2_LIM_N -1.5f
- #define A3_LIM_P 1.5f
- #define A3_LIM_N -1.5f
- #define KP_SOFTSTOP 100.0f
- #define KD_SOFTSTOP 0.4f;
+#define MIN_CUR -400.0f
+#define MAX_CUR 400.0f
-#define ENABLE_CMD 0xFFFF
-#define DISABLE_CMD 0x1F1F
+#define MIN_TAU -5.0f
+#define MAX_TAU 5.0f
spi_data_t spi_data; // data from spine to up
-spi_command_t spi_command; // data from up to spine
// spi buffers
uint16_t rx_buff[RX_LEN];
@@ -59,11 +40,9 @@
Serial pc(PA_2, PA_3);
CAN can1(PA_11, PA_12, 1000000);
CAN can2(PA_8, PA_15, 1000000);
-CAN can3(PB_12, PB_13, 1000000); //corresponds to bus 1-3-6 (controller 1) or 2-4-5 (controller 2) IN THAT ORDER
+//CAN can3(PB_12, PB_13, 1000000); //corresponds to bus 1-3-6 (controller 1) or 2-4-5 (controller 2) IN THAT ORDER
-CANMessage rxMsg1, rxMsg2, rxMsg3;
-CANMessage txMsg1, txMsg2, txMsg3;
-CANMessage q11_can, q21_can; //q12_can, q13_can, q21_can, q22_can, q23_can, q31_can, q32_can, q33_can; //TX Messages
+CANMessage rxMsg1, rxMsg2;
int ledState;
Ticker sendCAN;
int counter = 0;
@@ -73,293 +52,52 @@
int spi_enabled = 0;
InterruptIn cs(PA_4);
DigitalIn estop(PB_15);
-//SPISlave spi(PA_7, PA_6, PA_5, PA_4);
-
-grouped_act_state g1_state, g2_state; //, g3_state;
-grouped_act_control g1_control, g2_control; //, g3_control;
-
-uint16_t x = 0;
-uint16_t x2 = 0;
-uint16_t count = 0;
-uint16_t counter2 = 0; //SEE IF WE NEED TO UPDATE THESE TO ADD COUNTER3 AND X3
-
-int control_mode = 1;
-int is_standing = 0; //SEE IF WE STILL NEED THE STANDING THING
-int enabled = 0;
-
-// generates fake spi data from spi command
-void test_control(); //MAY NEED TO GET RID OF THIS?
-void control();
-
-
-/// CAN Command Packet Structure ///
-/// 16 bit position command, between -4*pi and 4*pi
-/// 12 bit velocity command, between -30 and + 30 rad/s
-/// 12 bit kp, between 0 and 500 N-m/rad
-/// 12 bit kd, between 0 and 100 N-m*s/rad
-/// 12 bit feed forward torque, between -18 and 18 N-m
-/// CAN Packet is 8 8-bit words
-/// Formatted as follows. For each quantity, bit 0 is LSB
-/// 0: [position[15-8]]
-/// 1: [position[7-0]]
-/// 2: [velocity[11-4]]
-/// 3: [velocity[3-0], kp[11-8]]
-/// 4: [kp[7-0]]
-/// 5: [kd[11-4]]
-/// 6: [kd[3-0], torque[11-8]]
-/// 7: [torque[7-0]]
-
-void pack_cmd(CANMessage * msg, joint_control joint){
-
- /// limit data to be within bounds ///
- float p_des = fminf(fmaxf(P_MIN, joint.p_des), P_MAX);
- float v_des = fminf(fmaxf(V_MIN, joint.v_des), V_MAX);
- float kp = fminf(fmaxf(KP_MIN, joint.kp), KP_MAX);
- float kd = fminf(fmaxf(KD_MIN, joint.kd), KD_MAX);
- float t_ff = fminf(fmaxf(T_MIN, joint.t_ff), T_MAX);
- /// convert floats to unsigned ints ///
- uint16_t p_int = float_to_uint(p_des, P_MIN, P_MAX, 16);
- uint16_t v_int = float_to_uint(v_des, V_MIN, V_MAX, 12);
- uint16_t kp_int = float_to_uint(kp, KP_MIN, KP_MAX, 12);
- uint16_t kd_int = float_to_uint(kd, KD_MIN, KD_MAX, 12);
- uint16_t t_int = float_to_uint(t_ff, T_MIN, T_MAX, 12);
- /// pack ints into the can buffer ///
- msg->data[0] = p_int>>8;
- msg->data[1] = p_int&0xFF;
- msg->data[2] = v_int>>4;
- msg->data[3] = ((v_int&0xF)<<4)|(kp_int>>8);
- msg->data[4] = kp_int&0xFF;
- msg->data[5] = kd_int>>4;
- msg->data[6] = ((kd_int&0xF)<<4)|(t_int>>8);
- msg->data[7] = t_int&0xff;
- }
-
-/// CAN Reply Packet Structure ///
-/// 16 bit position, between -4*pi and 4*pi
-/// 12 bit velocity, between -30 and + 30 rad/s
-/// 12 bit current, between -40 and 40;
-/// CAN Packet is 5 8-bit words
-/// Formatted as follows. For each quantity, bit 0 is LSB
-/// 0: [position[15-8]]
-/// 1: [position[7-0]]
-/// 2: [velocity[11-4]]
-/// 3: [velocity[3-0], current[11-8]]
-/// 4: [current[7-0]]
-
-void unpack_reply(CANMessage msg, grouped_act_state * group){
+void unpack_reply_4bit(CANMessage msg, spi_data_t * spi_data){
+ //rx2msg is the data from the torque board (CAN2)
+ //rx1msg is the data from the upboard (CAN1)
+
/// unpack ints from can buffer ///
- uint16_t id = msg.data[0];
- uint16_t p_int = (msg.data[1]<<8)|msg.data[2];
- uint16_t v_int = (msg.data[3]<<4)|(msg.data[4]>>4);
- uint16_t i_int = ((msg.data[4]&0xF)<<8)|msg.data[5];
+ uint16_t id = msg.id;
+ uint16_t u1 = (msg.data[0]<<8)|msg.data[1];
+ uint16_t u2 = (msg.data[2]<<8)|msg.data[3];
+
/// convert uints to floats ///
- float p = uint_to_float(p_int, P_MIN, P_MAX, 16);
- float v = uint_to_float(v_int, V_MIN, V_MAX, 12);
- float t = uint_to_float(i_int, -T_MAX, T_MAX, 12);
+ float f1 = uint_to_float(u1, MIN_CUR, MAX_CUR, 16);
+ float f2 = uint_to_float(u2, MIN_CUR, MAX_CUR, 16);
if(id==1){
- group->a1.p = p;
- group->a1.v = v;
- group->a1.t = t;
+ spi_data->hv_current = f1;
+ spi_data->ext_current = f2;
+ //pc.printf("ext_current: %f\n", f2);
}
- /*
- else if(id==2){
- group->a2.p = p;
- group->a2.v = v;
- group->a2.t = t;
+ if(id==2){
+ spi_data->vol = f1;
+ spi_data->lv_current = f2;
}
- */
- /*
- else if(id==3){
- group->a3.p = p;
- group->a3.v = v;
- group->a3.t = t;
- }
- */
}
+
+void unpack_reply_2bit(CANMessage msg, spi_data_t * spi_data){
+ //rx2msg is the data from the torque board (CAN2)
+ //rx1msg is the data from the upboard (CAN1)
+
+ /// unpack ints from can buffer ///
+ //uint16_t id = msg.id;
+ uint16_t tau = (msg.data[0]<<8)|msg.data[1];
+ /// convert uints to floats ///
+ float t = uint_to_float(tau, MIN_TAU, MAX_TAU, 16);
+ //pc.printf("torque: %f\n", t);
+ spi_data->tau = t;
+}
void rxISR1() {
can1.read(rxMsg1); // read message into Rx message storage
- unpack_reply(rxMsg1, &g1_state);
+ unpack_reply_4bit(rxMsg1, &spi_data);
}
void rxISR2(){
can2.read(rxMsg2);
- unpack_reply(rxMsg2, &g2_state);
- }
-/*
-void rxISR3(){
- can3.read(rxMsg3);
- unpack_reply(rxMsg3, &g3_state);
- }
-*/
-
-void PackAll(){
- //actuators on the CAN1 bus
- pack_cmd(&q11_can, g1_control.a1);
- //pack_cmd(&q12_can, g1_control.a2);
- //pack_cmd(&q13_can, g1_control.a3);
- //actuators on the CAN2 bus
- pack_cmd(&q21_can, g2_control.a1);
- //pack_cmd(&q22_can, g2_control.a2);
- //pack_cmd(&q23_can, g2_control.a3);
- //actuators on the CAN3 bus
- //pack_cmd(&q31_can, g3_control.a1);
- //pack_cmd(&q32_can, g3_control.a2);
- //pack_cmd(&q33_can, g3_control.a3);
- }
-void WriteAll(){
- //toggle = 1;
- //ID = 1 actuators
- can1.write(q11_can);
- wait(.00002);
- can2.write(q21_can);
- wait(.00002);
- /*
- can3.write(q31_can);
- wait(.00002);
- //ID = 2 actuators
- can1.write(q12_can);
- wait(.00002);
- can2.write(q22_can);
- wait(.00002);
- can3.write(q32_can);
- wait(.00002);
- //ID = 3 actuators
- can1.write(q13_can);
- wait(.00002);
- can2.write(q23_can);
- wait(.00002);
- can3.write(q33_can);
- wait(.00002);
- //toggle = 0;
- */
- }
-
-void sendCMD(){
- counter ++;
-
- PackAll();
-
- if(counter>100){
- //pc.printf("%.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f\n\r", g1_state.a1.p, g1_state.a2.p, g1_state.a3.p, g2_state.a1.p, g2_state.a2.p, g2_state.a3.p, g3_state.a1.p, g3_state.a2.p, g3_state.a3.p);
- counter = 0 ;
- }
-
- WriteAll();
- }
-
-
-
-
-void Zero(CANMessage * msg){
- msg->data[0] = 0xFF;
- msg->data[1] = 0xFF;
- msg->data[2] = 0xFF;
- msg->data[3] = 0xFF;
- msg->data[4] = 0xFF;
- msg->data[5] = 0xFF;
- msg->data[6] = 0xFF;
- msg->data[7] = 0xFE;
- //WriteAll();
+ unpack_reply_2bit(rxMsg2, &spi_data);
}
-
-void EnterMotorMode(CANMessage * msg){
- msg->data[0] = 0xFF;
- msg->data[1] = 0xFF;
- msg->data[2] = 0xFF;
- msg->data[3] = 0xFF;
- msg->data[4] = 0xFF;
- msg->data[5] = 0xFF;
- msg->data[6] = 0xFF;
- msg->data[7] = 0xFC;
- //WriteAll();
- }
-
-void ExitMotorMode(CANMessage * msg){
- msg->data[0] = 0xFF;
- msg->data[1] = 0xFF;
- msg->data[2] = 0xFF;
- msg->data[3] = 0xFF;
- msg->data[4] = 0xFF;
- msg->data[5] = 0xFF;
- msg->data[6] = 0xFF;
- msg->data[7] = 0xFD;
- //WriteAll();
- }
-
-
-void serial_isr(){
- /// handle keyboard commands from the serial terminal ///
- while(pc.readable()){
- char c = pc.getc();
- //led = !led;
- switch(c){
- case(27):
- //loop.detach();
- pc.printf("\n\r exiting motor mode \n\r");
- //CAN BUS 1
- ExitMotorMode(&q11_can);
- //ExitMotorMode(&q12_can);
- //ExitMotorMode(&q13_can);
- //CAN BUS 2
- ExitMotorMode(&q21_can);
- //ExitMotorMode(&q22_can);
- //ExitMotorMode(&q23_can);
- //CAN BUS 3
- //ExitMotorMode(&q31_can);
- //ExitMotorMode(&q32_can);
- //ExitMotorMode(&q33_can);
- //DISABLE FLAG
- enabled = 0;
- break;
- case('m'):
- pc.printf("\n\r entering motor mode \n\r");
- //CAN BUS 1
- EnterMotorMode(&q11_can);
- //EnterMotorMode(&q12_can);
- //EnterMotorMode(&q13_can);
- //CAN BUS 2
- EnterMotorMode(&q21_can);
- //EnterMotorMode(&q22_can);
- //EnterMotorMode(&q23_can);
- //CAN BUS 3
- //EnterMotorMode(&q31_can);
- //EnterMotorMode(&q32_can);
- //EnterMotorMode(&q33_can);
- //WAIT FOR ENABLE
- wait(.5);
- //ENABLE FLAG
- enabled = 1;
- //loop.attach(&sendCMD, .001);
- break;
- case('s'):
- pc.printf("\n\r standing \n\r");
- counter2 = 0;
- is_standing = 1;
- //stand();
- break;
- case('z'):
- pc.printf("\n\r zeroing \n\r");
- //CAN BUS 1
- Zero(&q11_can);
- //Zero(&q12_can);
- //Zero(&q13_can);
- //CAN BUS 2
- Zero(&q21_can);
- //Zero(&q22_can);
- //Zero(&q23_can);
- //CAN BUS 3
- //Zero(&q31_can);
- //Zero(&q32_can);
- //Zero(&q33_can);
- break;
- }
- }
- WriteAll();
-
- }
-
uint32_t xor_checksum(uint32_t* data, size_t len)
{
@@ -369,105 +107,12 @@
return t;
}
-
-/*
-void print_SPI_command() {
- pc.printf("SPI MESSAGE RECIEVED:\n");
- //CAN ONE
- pc.printf("MOTOR 1-1 Q: %f\n", spi_command.q_des_1s[0]);
- pc.printf("MOTOR 1-1 Qd: %f\n", spi_command.qd_des_1s[0]);
- pc.printf("MOTOR 1-1 Kp: %f\n", spi_command.kp_1s[0]);
- pc.printf("MOTOR 1-1 Kd: %f\n", spi_command.kd_1s[0]);
- pc.printf("MOTOR 1-1 T_FF: %f\n", spi_command.tau_1s_ff[0]);
-
- pc.printf("MOTOR 1-2 Q: %f\n", spi_command.q_des_2s[0]);
- pc.printf("MOTOR 1-2 Qd: %f\n", spi_command.qd_des_2s[0]);
- pc.printf("MOTOR 1-2 Kp: %f\n", spi_command.kp_2s[0]);
- pc.printf("MOTOR 1-2 Kd: %f\n", spi_command.kd_2s[0]);
- pc.printf("MOTOR 1-2 T_FF: %f\n", spi_command.tau_2s_ff[0]);
-
- pc.printf("MOTOR 1-3 Q: %f\n", spi_command.q_des_3s[0]);
- pc.printf("MOTOR 1-3 Qd: %f\n", spi_command.qd_des_3s[0]);
- pc.printf("MOTOR 1-3 Kp: %f\n", spi_command.kp_3s[0]);
- pc.printf("MOTOR 1-3 Kd: %f\n", spi_command.kd_3s[0]);
- pc.printf("MOTOR 1-3 T_FF: %f\n", spi_command.tau_3s_ff[0]);
-
- pc.printf("MOTOR 2-1 Q: %f\n", spi_command.q_des_1s[1]);
- pc.printf("MOTOR 2-1 Qd: %f\n", spi_command.qd_des_1s[1]);
- pc.printf("MOTOR 2-1 Kp: %f\n", spi_command.kp_1s[1]);
- pc.printf("MOTOR 2-1 Kd: %f\n", spi_command.kd_1s[1]);
- pc.printf("MOTOR 2-1_FF: %f\n", spi_command.tau_1s_ff[1]);
-
- pc.printf("MOTOR 2-2 Q: %f\n", spi_command.q_des_2s[1]);
- pc.printf("MOTOR 2-2 Qd: %f\n", spi_command.qd_des_2s[1]);
- pc.printf("MOTOR 2-2 Kp: %f\n", spi_command.kp_2s[1]);
- pc.printf("MOTOR 2-2 Kd: %f\n", spi_command.kd_2s[1]);
- pc.printf("MOTOR 2-2 T_FF: %f\n", spi_command.tau_2s_ff[1]);
-
- pc.printf("MOTOR 2-3 Q: %f\n", spi_command.q_des_3s[1]);
- pc.printf("MOTOR 2-3 Qd: %f\n", spi_command.qd_des_3s[1]);
- pc.printf("MOTOR 2-3 Kp: %f\n", spi_command.kp_3s[1]);
- pc.printf("MOTOR 2-3 Kd: %f\n", spi_command.kd_3s[1]);
- pc.printf("MOTOR 2-3 T_FF: %f\n", spi_command.tau_3s_ff[1]);
-
- pc.printf("MOTOR 3-1 Q: %f\n", spi_command.q_des_1s[2]);
- pc.printf("MOTOR 3-1 Qd: %f\n", spi_command.qd_des_1s[2]);
- pc.printf("MOTOR 3-1 Kp: %f\n", spi_command.kp_1s[2]);
- pc.printf("MOTOR 3-1 Kd: %f\n", spi_command.kd_1s[2]);
- pc.printf("MOTOR 3-1 T_FF: %f\n", spi_command.tau_1s_ff[2]);
-
- pc.printf("MOTOR 3-2 Q: %f\n", spi_command.q_des_2s[2]);
- pc.printf("MOTOR 3-2 Qd: %f\n", spi_command.qd_des_2s[2]);
- pc.printf("MOTOR 3-2 Kp: %f\n", spi_command.kp_2s[2]);
- pc.printf("MOTOR 3-2 Kd: %f\n", spi_command.kd_2s[2]);
- pc.printf("MOTOR 3-2 T_FF: %f\n", spi_command.tau_2s_ff[2]);
-
- pc.printf("MOTOR 3-3 Q: %f\n", spi_command.q_des_3s[2]);
- pc.printf("MOTOR 3-3 Qd: %f\n", spi_command.qd_des_3s[2]);
- pc.printf("MOTOR 3-3 Kp: %f\n", spi_command.kp_3s[2]);
- pc.printf("MOTOR 3-3 Kd: %f\n", spi_command.kd_3s[2]);
- pc.printf("MOTOR 3-3 T_FF: %f\n", spi_command.tau_3s_ff[2]);
-
+void update_buffers(void) {
+ //spi_data.checksum = 100;
+ spi_data.checksum = xor_checksum((uint32_t*)&spi_data,4); //only do first 16 bytes
+ for(int i = 0; i < DATA_LEN; i++){
+ tx_buff[i] = ((uint16_t*)(&spi_data))[i];}
}
-*/
-
-
-/*
-void print_SPI_data() {
- pc.printf("SPI MESSAGE SENT:\n");
- //CAN ONE
- pc.printf("MOTOR 1-1 Q: %f\n", spi_data.q_1s[0]);
- pc.printf("MOTOR 1-1 Qd: %f\n", spi_data.qd_1s[0]);
-
- pc.printf("MOTOR 1-2 Q: %f\n", spi_data.q_2s[0]);
- pc.printf("MOTOR 1-2 Qd: %f\n", spi_data.qd_2s[0]);
-
- pc.printf("MOTOR 1-3 Q: %f\n", spi_data.q_3s[0]);
- pc.printf("MOTOR 1-3 Qd: %f\n", spi_data.qd_3s[0]);
-
- pc.printf("MOTOR 2-1 Q: %f\n", spi_data.q_1s[1]);
- pc.printf("MOTOR 2-1 Qd: %f\n", spi_data.qd_1s[1]);
-
- pc.printf("MOTOR 2-2 Q: %f\n", spi_data.q_2s[1]);
- pc.printf("MOTOR 2-2 Qd: %f\n", spi_data.qd_2s[1]);
-
- pc.printf("MOTOR 2-3 Q: %f\n", spi_data.q_3s[1]);
- pc.printf("MOTOR 2-3 Qd: %f\n", spi_data.qd_3s[1]);
-
- pc.printf("MOTOR 3-1 Q: %f\n", spi_data.q_1s[2]);
- pc.printf("MOTOR 3-1 Qd: %f\n", spi_data.qd_1s[2]);
-
- pc.printf("MOTOR 3-2 Q: %f\n", spi_data.q_2s[2]);
- pc.printf("MOTOR 3-2 Qd: %f\n", spi_data.qd_2s[2]);
-
- pc.printf("MOTOR 3-3 Q: %f\n", spi_data.q_3s[2]);
- pc.printf("MOTOR 3-3 Qd: %f\n", spi_data.qd_3s[2]);
-
-}
-*/
-
-
-
void spi_isr(void)
{
@@ -485,290 +130,14 @@
}
}
}
- //pc.printf("RECIEVED: %d BYTES\n", bytecount);
- //pc.printf("HERE'S A SPI COMMAND:\n");
- // after reading, save into spi_command
- // should probably check checksum first!
- uint32_t calc_checksum = xor_checksum((uint32_t*)rx_buff,32);
- for(int i = 0; i < CMD_LEN; i++)
- {
- ((uint16_t*)(&spi_command))[i] = rx_buff[i];
- //pc.printf("BYTE %d SENT: %d\n", i, tx_buff[i]);
- //pc.printf("WORD %d RECIEVED: %d\n", i, rx_buff[i]);
- }
- //print_SPI_command();
-
- // run control, which fills in tx_buff for the next iteration
- /*
- if(calc_checksum != spi_command.checksum){
- spi_data.flags[1] = 0xdead;
- pc.printf("FAILED CHECKSUM\n");
- pc.printf("ACTUAL: %d\n", calc_checksum);
- pc.printf("CURRENT: %d\n", spi_command.checksum);}
- */
-
- //print_SPI_data();
- control();
- PackAll();
- WriteAll();
-
-
- //for (int i = 0; i<TX_LEN; i++) {
- // tx_buff[i] = 2*rx_buff[i];
- //}
-// for (int i=0; i<TX_LEN; i++) {
-// //printf("%d ", rx_buff[i]);
-// }
- //printf("\n\r");
-}
-
-int softstop_joint(joint_state state, joint_control * control, float limit_p, float limit_n){
- /*
- if((state.p)>=limit_p){
- //control->p_des = limit_p;
- control->v_des = 0.0f;
- control->kp = 0;
- control->kd = KD_SOFTSTOP;
- control->t_ff += KP_SOFTSTOP*(limit_p - state.p);
- return 1;
- }
- else if((state.p)<=limit_n){
- //control->p_des = limit_n;
- control->v_des = 0.0f;
- control->kp = 0;
- control->kd = KD_SOFTSTOP;
- control->t_ff += KP_SOFTSTOP*(limit_n - state.p);
- return 1;
- }
- */
- return 0;
-
- }
-
-
-void control()
-{
-
- if(((spi_command.flags[0]&0x1)==1) && (enabled==0)){
- enabled = 1;
- //BUS ONE
- EnterMotorMode(&q11_can);
- can1.write(q11_can);
- //EnterMotorMode(&q12_can);
- //can1.write(q12_can);
- //EnterMotorMode(&q13_can);
- //can1.write(q13_can);
- //BUS TWO
- EnterMotorMode(&q21_can);
- can2.write(q21_can);
- //EnterMotorMode(&q22_can);
- //can2.write(q22_can);
- //EnterMotorMode(&q23_can);
- //can2.write(q23_can);
- //BUS THREE
- //EnterMotorMode(&q31_can);
- //can3.write(q31_can);
- //EnterMotorMode(&q32_can);
- //can3.write(q32_can);
- //EnterMotorMode(&q33_can);
- //can3.write(q33_can);
- //WRITE THE COMMANDS
- //WriteAll();
- //SERIAL TO USER
- //pc.printf("e\n\r");
- return;
- }
- else if((((spi_command.flags[0]&0x1))==0) && (enabled==1)){
- enabled = 0;
- //BUS ONE
- ExitMotorMode(&q11_can);
- can1.write(q11_can);
- //ExitMotorMode(&q12_can);
- //can1.write(q12_can);
- //ExitMotorMode(&q13_can);
- //can1.write(q13_can);
- //BUS TWO
- ExitMotorMode(&q21_can);
- can2.write(q21_can);
- //ExitMotorMode(&q22_can);
- //can2.write(q22_can);
- //ExitMotorMode(&q23_can);
- //can2.write(q23_can);
- //BUS THREE
- //ExitMotorMode(&q31_can);
- //can3.write(q31_can);
- //ExitMotorMode(&q32_can);
- //can3.write(q32_can);
- //ExitMotorMode(&q33_can);
- //can3.write(q33_can);
- //WRITE THE COMMANDS
- //WriteAll();
- //SERIAL TO USER
- //pc.printf("x\n\r");
- return;
- }
-
- //BUS 1 DATA
- spi_data.q_1s[0] = g1_state.a1.p;
- //spi_data.q_2s[0] = g1_state.a2.p;
- //spi_data.q_3s[0] = g1_state.a3.p;
- spi_data.qd_1s[0] = g1_state.a1.v;
- //spi_data.qd_2s[0] = g1_state.a2.v;
- //spi_data.qd_3s[0] = g1_state.a3.v;
- spi_data.tau_1s[0] = g1_state.a1.t;
- //spi_data.tau_2s[0] = g1_state.a2.t;
- //spi_data.tau_3s[0] = g1_state.a3.t;
- //BUS 2 DATA
- spi_data.q_1s[1] = g2_state.a1.p;
- //spi_data.q_2s[1] = g2_state.a2.p;
- //spi_data.q_3s[1] = g2_state.a3.p;
- spi_data.qd_1s[1] = g2_state.a1.v;
- //spi_data.qd_2s[1] = g2_state.a2.v;
- //spi_data.qd_3s[1] = g2_state.a3.v;
- spi_data.tau_1s[1] = g2_state.a1.t;
- //spi_data.tau_2s[1] = g2_state.a2.t;
- //spi_data.tau_3s[1] = g2_state.a3.t;
- //BUS 3 DATA
- //spi_data.q_1s[2] = g3_state.a1.p;
- //spi_data.q_2s[2] = g3_state.a2.p;
- //spi_data.q_3s[2] = g3_state.a3.p;
- //spi_data.qd_1s[2] = g3_state.a1.v;
- //spi_data.qd_2s[2] = g3_state.a2.v;
- //spi_data.qd_3s[2] = g3_state.a3.v;
- //spi_data.tau_1s[2] = g3_state.a1.t;
- //spi_data.tau_2s[2] = g3_state.a2.t;
- //spi_data.tau_3s[2] = g3_state.a3.t;
-
- if(estop==0){
- printf("estopped!!!!\n\r");
- memset(&g1_control, 0, sizeof(g1_control));
- memset(&g2_control, 0, sizeof(g2_control));
- //memset(&g3_control, 0, sizeof(g3_control));
- spi_data.flags[0] = 0xdead;
- spi_data.flags[1] = 0xdead;
- //spi_data.flags[2] = 0xdead;
- led = 1;
- }
-
- else{
- led = 0;
- memset(&g1_control, 0, sizeof(g1_control));
- memset(&g2_control, 0, sizeof(g2_control));
- //memset(&g3_control, 0, sizeof(g3_control));
-
- //TRANSLATE SPI TO ACTUATOR COMMANNDS
- //CAN1
- //CAN1 MOTOR1
- g1_control.a1.p_des = spi_command.q_des_1s[0];
- g1_control.a1.v_des = spi_command.qd_des_1s[0];
- g1_control.a1.kp = spi_command.kp_1s[0];
- g1_control.a1.kd = spi_command.kd_1s[0];
- g1_control.a1.t_ff = spi_command.tau_1s_ff[0];
- //CAN1 MOTOR 2
- //g1_control.a2.p_des = spi_command.q_des_2s[0];
- //g1_control.a2.v_des = spi_command.qd_des_2s[0];
- //g1_control.a2.kp = spi_command.kp_2s[0];
- //g1_control.a2.kd = spi_command.kd_2s[0];
- //g1_control.a2.t_ff = spi_command.tau_2s_ff[0];
- //CAN1 MOTOR 3
- //g1_control.a3.p_des = spi_command.q_des_3s[0];
- //g1_control.a3.v_des = spi_command.qd_des_3s[0];
- //g1_control.a3.kp = spi_command.kp_3s[0];
- //g1_control.a3.kd = spi_command.kd_3s[0];
- //g1_control.a3.t_ff = spi_command.tau_3s_ff[0];
- //CAN2
- //CAN2 MOTOR1
- g2_control.a1.p_des = spi_command.q_des_1s[1];
- g2_control.a1.v_des = spi_command.qd_des_1s[1];
- g2_control.a1.kp = spi_command.kp_1s[1];
- g2_control.a1.kd = spi_command.kd_1s[1];
- g2_control.a1.t_ff = spi_command.tau_1s_ff[1];
- //CAN2 MOTOR 2
- //g2_control.a2.p_des = spi_command.q_des_2s[1];
- //g2_control.a2.v_des = spi_command.qd_des_2s[1];
- //g2_control.a2.kp = spi_command.kp_2s[1];
- //g2_control.a2.kd = spi_command.kd_2s[1];
- //g2_control.a2.t_ff = spi_command.tau_2s_ff[1];
- //CAN2 MOTOR 3
- //g2_control.a3.p_des = spi_command.q_des_3s[1];
- //g2_control.a3.v_des = spi_command.qd_des_3s[1];
- //g2_control.a3.kp = spi_command.kp_3s[1];
- //g2_control.a3.kd = spi_command.kd_3s[1];
- //g2_control.a3.t_ff = spi_command.tau_3s_ff[1];
- //CAN3
- //CAN3 MOTOR1
- //g3_control.a1.p_des = spi_command.q_des_1s[2];
- //g3_control.a1.v_des = spi_command.qd_des_1s[2];
- //g3_control.a1.kp = spi_command.kp_1s[2];
- //g3_control.a1.kd = spi_command.kd_1s[2];
- //g3_control.a1.t_ff = spi_command.tau_1s_ff[2];
- //CAN3 MOTOR 2
- //g3_control.a2.p_des = spi_command.q_des_2s[2];
- //g3_control.a2.v_des = spi_command.qd_des_2s[2];
- //g3_control.a2.kp = spi_command.kp_2s[2];
- //g3_control.a2.kd = spi_command.kd_2s[2];
- //g3_control.a2.t_ff = spi_command.tau_2s_ff[2];
- //CAN3 MOTOR 3
- //g3_control.a3.p_des = spi_command.q_des_3s[2];
- //g3_control.a3.v_des = spi_command.qd_des_3s[2];
- //g3_control.a3.kp = spi_command.kp_3s[2];
- //g3_control.a3.kd = spi_command.kd_3s[2];
- //g3_control.a3.t_ff = spi_command.tau_3s_ff[2];
-
- //SPI FLAGS RETURN //IMPLEMENTS THE JOINT SOFT STOP RIGHT HERE
- spi_data.flags[0] = 0;
- spi_data.flags[1] = 0;
- //spi_data.flags[2] = 0;
- //spi_data.flags[0] |= softstop_joint(g1_state.a1, &g1_control.a1, A1_LIM_P, A1_LIM_N);
- //spi_data.flags[0] |= (softstop_joint(g1_state.a2, &g1_control.a2, A2_LIM_P, A2_LIM_N))<<1;
- //spi_data.flags[0] |= (softstop_joint(g1_state.a3, &g1_control.a3, A3_LIM_P, A3_LIM_N))<<2;
- //spi_data.flags[1] |= softstop_joint(g2_state.a1, &g2_control.a1, A1_LIM_P, A1_LIM_N);
- //spi_data.flags[1] |= (softstop_joint(g2_state.a2, &g2_control.a2, A2_LIM_P, A2_LIM_N))<<1;
- //spi_data.flags[1] |= (softstop_joint(g2_state.a3, &g2_control.a3, A3_LIM_P, A3_LIM_N))<<2;
- //spi_data.flags[2] |= softstop_joint(g3_state.a1, &g3_control.a1, A1_LIM_P, A1_LIM_N);
- //spi_data.flags[2] |= (softstop_joint(g3_state.a2, &g3_control.a2, A2_LIM_P, A2_LIM_N))<<1;
- //spi_data.flags[2] |= (softstop_joint(g3_state.a3, &g3_control.a3, A3_LIM_P, A3_LIM_N))<<2;
-
- //spi_data.flags[0] = 0xbeef;
- //spi_data.flags[1] = 0xbeef;
- //PackAll();
- //WriteAll();
- }
- spi_data.checksum = xor_checksum((uint32_t*)&spi_data,14);
- for(int i = 0; i < DATA_LEN; i++){
- tx_buff[i] = ((uint16_t*)(&spi_data))[i];}
-
-}
-
-
-void test_control()
-{
- for(int i = 0; i < 3; i++)
- {
- spi_data.q_1s[i] = spi_command.q_des_1s[i] + 1.f;
- //spi_data.q_2s[i] = spi_command.q_des_2s[i] + 1.f;
- //spi_data.q_3s[i] = spi_command.q_des_3s[i] + 1.f;
-
- spi_data.qd_1s[i] = spi_command.qd_des_1s[i] + 1.f;
- //spi_data.qd_2s[i] = spi_command.qd_des_2s[i] + 1.f;
- //spi_data.qd_3s[i] = spi_command.qd_des_3s[i] + 1.f;
- }
-
- spi_data.flags[0] = 0xdead;
- //spi_data.flags[1] = 0xbeef;
-
- // only do first 56 bytes of message.
- spi_data.checksum = xor_checksum((uint32_t*)&spi_data,14);
-
- for(int i = 0; i < DATA_LEN; i++)
- tx_buff[i] = ((uint16_t*)(&spi_data))[i];
+ update_buffers();
}
void init_spi(void){
SPISlave *spi = new SPISlave(PA_7, PA_6, PA_5, PA_4);
spi->format(16, 0);
- spi->frequency(6000000);
+ spi->frequency(12000000);
spi->reply(0x0);
cs.fall(&spi_isr);
pc.printf("done\n\r");
@@ -778,7 +147,6 @@
wait(1);
//led = 1;
pc.baud(115200); //MAYBE CHANGE THIS IF NEEDED
- pc.attach(&serial_isr);
estop.mode(PullUp);
//spi.format(16, 0);
//spi.frequency(1000000);
@@ -791,71 +159,27 @@
//can2.frequency(1000000); // set bit rate to 1Mbps
//can2.attach(&rxISR2); // attach 'CAN receive-complete' interrupt handler
can2.filter(CAN_ID<<21, 0xFFE00004, CANStandard, 0); //set up can filter
- can3.filter(CAN_ID<<21, 0xFFE00004, CANStandard, 0); //set up can filter
memset(&tx_buff, 0, TX_LEN * sizeof(uint16_t));
+ memset(&rx_buff, 0, RX_LEN * sizeof(uint16_t));
memset(&spi_data, 0, sizeof(spi_data_t));
- memset(&spi_command,0,sizeof(spi_command_t));
NVIC_SetPriority(TIM5_IRQn, 1);
- //NVIC_SetPriority(CAN1_RX0_IRQn, 3);
- //NVIC_SetPriority(CAN2_RX0_IRQn, 3);
- pc.printf("\n\r SPIne\n\r");
+ pc.printf("\n\r SPIne SENSOR\n\r");
//printf("%d\n\r", RX_ID << 18);
- //CAN 1 BUS
- q11_can.len = 8; //transmit 8 bytes
- //q12_can.len = 8; //transmit 8 bytes
- //q13_can.len = 8;
- //CAN 2 BUS
- q21_can.len = 8; //transmit 8 bytes
- //q22_can.len = 8; //transmit 8 bytes
- //q23_can.len = 8;
- //CAN 3 BUS
- //q31_can.len = 8; //transmit 8 bytes
- //q32_can.len = 8; //transmit 8 bytes
- //q33_can.len = 8;
//RECIEVE
- rxMsg1.len = 6; //receive 6 bytes
- rxMsg2.len = 6;
- //rxMsg3.len = 6;
-
- //CAN 1 BUS
- q11_can.id = 0x1;
- //q12_can.id = 0x2;
- //q13_can.id = 0x3;
- //CAN 2 BUS
- q21_can.id = 0x1;
- //q22_can.id = 0x2;
- //q23_can.id = 0x3;
- //CAN 3 BUS
- //q31_can.id = 0x1;
- //q32_can.id = 0x2;
- //q33_can.id = 0x3;
-
- //actuators on the CAN1 bus
- pack_cmd(&q11_can, g1_control.a1);
- //pack_cmd(&q12_can, g1_control.a2);
- //pack_cmd(&q13_can, g1_control.a3);
- //actuators on the CAN2 bus
- pack_cmd(&q21_can, g2_control.a1);
- //pack_cmd(&q22_can, g2_control.a2);
- //pack_cmd(&q23_can, g2_control.a3);
- //actuators on the CAN3 bus
- //pack_cmd(&q31_can, g3_control.a1);
- //pack_cmd(&q32_can, g3_control.a2);
- //pack_cmd(&q33_can, g3_control.a3);
- //WRITE THE INITIAL COMMAND
- WriteAll();
+ rxMsg1.len = 4; //receive 4 bytes
+ rxMsg2.len = 2;
//just debugging things
pc.printf("SETUP VARS ALL DONE\n");
-
// SPI doesn't work if enabled while the CS pin is pulled low
// Wait for CS to not be low, then enable SPI
+
if(!spi_enabled){
while((spi_enabled==0) && (cs.read() ==0)){pc.printf("waiting for CS Pin\n"); wait_us(10);}
init_spi();
@@ -867,23 +191,16 @@
while(1) {
//pc.printf("test, of SPINE\r\n");
+ //wait(0.0001); //MAKE SURE IT's 1-3k rate, higher we will fill the CAN buffer
+
counter++;
can2.read(rxMsg2);
- unpack_reply(rxMsg2, &g2_state);
+ unpack_reply_2bit(rxMsg2, &spi_data);
can1.read(rxMsg1); // read message into Rx message storage
- unpack_reply(rxMsg1, &g1_state);
- //can3.read(rxMsg3); // read message into Rx message storage
- //unpack_reply(rxMsg3, &g3_state);
- wait_us(10);
+ unpack_reply_4bit(rxMsg1, &spi_data);
+ //wait_us(10);
+ //wait(0.01);
- //print heatbeat (always will print message 0)
- /*
- if (counter3 == 100000) { //for debugging purposes
- pc.printf("HEARTBEAT\n");
- counter3 = 0;
- }
- counter3++;
- */
}
}
\ No newline at end of file