Aditya Mehrotra
/
dyno_torque_sense_f44
torque sensor thing
main.cpp@2:ab65342daec8, 2021-07-20 (annotated)
- Committer:
- adimmit
- Date:
- Tue Jul 20 19:36:33 2021 +0000
- Revision:
- 2:ab65342daec8
- Parent:
- 1:6b03278584b2
latest
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
adimmit | 0:f4f2a7b3364c | 1 | #include "mbed.h" |
adimmit | 0:f4f2a7b3364c | 2 | #include "math_ops.h" |
adimmit | 0:f4f2a7b3364c | 3 | |
adimmit | 2:ab65342daec8 | 4 | #define MIN -5.0f |
adimmit | 2:ab65342daec8 | 5 | #define MAX 5.0f |
adimmit | 0:f4f2a7b3364c | 6 | |
adimmit | 0:f4f2a7b3364c | 7 | /* |
adimmit | 0:f4f2a7b3364c | 8 | This basic example just shows how to read the ADC internal channels raw values. |
adimmit | 0:f4f2a7b3364c | 9 | Please look in the corresponding device reference manual for a complete |
adimmit | 0:f4f2a7b3364c | 10 | description of how to make a temperature sensor, VBat or Vref measurement. |
adimmit | 0:f4f2a7b3364c | 11 | */ |
adimmit | 0:f4f2a7b3364c | 12 | |
adimmit | 0:f4f2a7b3364c | 13 | //setup SERIAL |
adimmit | 0:f4f2a7b3364c | 14 | Serial pc(PA_2, PA_3); |
adimmit | 0:f4f2a7b3364c | 15 | |
adimmit | 2:ab65342daec8 | 16 | //setup analog inputs |
adimmit | 2:ab65342daec8 | 17 | AnalogIn torque_sense(PC_0); |
adimmit | 2:ab65342daec8 | 18 | float SENSE_CONV_FACTOR = 10.0; //-10v to 10v --> -100Nm to 100Nm |
adimmit | 2:ab65342daec8 | 19 | float SYSTEM_VOLTAGE = 3.3; //volts |
adimmit | 0:f4f2a7b3364c | 20 | |
adimmit | 2:ab65342daec8 | 21 | //moving average filter |
adimmit | 2:ab65342daec8 | 22 | #define M_POINTS 2 |
adimmit | 2:ab65342daec8 | 23 | float points[M_POINTS] = {0.0, 0.0}; |
adimmit | 1:6b03278584b2 | 24 | |
adimmit | 0:f4f2a7b3364c | 25 | //setup CAN |
adimmit | 0:f4f2a7b3364c | 26 | CAN can(PA_11, PA_12, 1000000); // CAN Rx pin name, CAN Tx pin name |
adimmit | 1:6b03278584b2 | 27 | CANMessage tauMsg; |
adimmit | 0:f4f2a7b3364c | 28 | int ledState; |
adimmit | 0:f4f2a7b3364c | 29 | Ticker sendCAN; |
adimmit | 0:f4f2a7b3364c | 30 | int counter = 0; |
adimmit | 0:f4f2a7b3364c | 31 | volatile bool msgAvailable = false; |
adimmit | 0:f4f2a7b3364c | 32 | Ticker loop; |
adimmit | 0:f4f2a7b3364c | 33 | |
adimmit | 2:ab65342daec8 | 34 | float MOVING_AVERAGE(float new_point) { |
adimmit | 2:ab65342daec8 | 35 | //first let's update the object points and calculate the SUM |
adimmit | 2:ab65342daec8 | 36 | float SUM = 0.0; |
adimmit | 2:ab65342daec8 | 37 | int i; |
adimmit | 2:ab65342daec8 | 38 | for ( i = 0; i < M_POINTS-1; i = i + 1) { |
adimmit | 2:ab65342daec8 | 39 | points[i] = points[i+1]; |
adimmit | 2:ab65342daec8 | 40 | SUM = SUM + points[i]; |
adimmit | 2:ab65342daec8 | 41 | } |
adimmit | 2:ab65342daec8 | 42 | points[M_POINTS-1] = new_point; |
adimmit | 2:ab65342daec8 | 43 | SUM = SUM + new_point; |
adimmit | 2:ab65342daec8 | 44 | return SUM / float(M_POINTS); |
adimmit | 2:ab65342daec8 | 45 | } |
adimmit | 2:ab65342daec8 | 46 | |
adimmit | 1:6b03278584b2 | 47 | void pack_cmd(CANMessage * msg, float f1){ |
adimmit | 0:f4f2a7b3364c | 48 | /// convert floats to unsigned ints /// |
adimmit | 0:f4f2a7b3364c | 49 | uint16_t f1_int = float_to_uint(f1, MIN, MAX, 16); |
adimmit | 0:f4f2a7b3364c | 50 | msg->data[0] = f1_int>>8; |
adimmit | 0:f4f2a7b3364c | 51 | msg->data[1] = f1_int&0xFF; |
adimmit | 0:f4f2a7b3364c | 52 | } |
adimmit | 0:f4f2a7b3364c | 53 | |
adimmit | 0:f4f2a7b3364c | 54 | int main() |
adimmit | 0:f4f2a7b3364c | 55 | { |
adimmit | 0:f4f2a7b3364c | 56 | wait(1); |
adimmit | 0:f4f2a7b3364c | 57 | pc.baud(115200); |
adimmit | 0:f4f2a7b3364c | 58 | wait(.01); |
adimmit | 1:6b03278584b2 | 59 | pc.printf("\n\r\n\r Biomimetics Torque Sense Board\n\r\n\r"); |
adimmit | 0:f4f2a7b3364c | 60 | wait(.01); |
adimmit | 0:f4f2a7b3364c | 61 | |
adimmit | 1:6b03278584b2 | 62 | tauMsg.len = 2; //transmit 4 bytes |
adimmit | 2:ab65342daec8 | 63 | tauMsg.id = 0x1; //higher priority |
adimmit | 0:f4f2a7b3364c | 64 | |
adimmit | 0:f4f2a7b3364c | 65 | while(1){ |
adimmit | 2:ab65342daec8 | 66 | //wait(0.0003); //MAKE SURE IT's 1-3k rate, higher we will fill the CAN buffer |
adimmit | 2:ab65342daec8 | 67 | float v_tau = torque_sense.read()*SYSTEM_VOLTAGE; //PUBLISH |
adimmit | 2:ab65342daec8 | 68 | float tau = v_tau; |
adimmit | 0:f4f2a7b3364c | 69 | |
adimmit | 2:ab65342daec8 | 70 | //calc the moving average |
adimmit | 2:ab65342daec8 | 71 | //tau = MOVING_AVERAGE(tau); |
adimmit | 0:f4f2a7b3364c | 72 | |
adimmit | 2:ab65342daec8 | 73 | //pc.printf("%f\n", tau); |
adimmit | 0:f4f2a7b3364c | 74 | |
adimmit | 2:ab65342daec8 | 75 | //now we have to publish the float to the CAN BUS |
adimmit | 2:ab65342daec8 | 76 | pack_cmd(&tauMsg, tau); |
adimmit | 1:6b03278584b2 | 77 | can.write(tauMsg); |
adimmit | 0:f4f2a7b3364c | 78 | wait(.00002); |
adimmit | 0:f4f2a7b3364c | 79 | } |
adimmit | 0:f4f2a7b3364c | 80 | } |