Dependencies:   RPCInterface mbed

Committer:
protodriveev
Date:
Mon May 07 16:14:45 2012 +0000
Revision:
0:2dbd366be5fd

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
protodriveev 0:2dbd366be5fd 1 /***********************************************************/
protodriveev 0:2dbd366be5fd 2 /*Constants */
protodriveev 0:2dbd366be5fd 3 /***********************************************************/
protodriveev 0:2dbd366be5fd 4
protodriveev 0:2dbd366be5fd 5 #define ISENSOR_SLOPE 23.9 //slope of the current sensor in [A/V]
protodriveev 0:2dbd366be5fd 6 #define Y_INTERCEPT -60.1563 //sensor voltage at 0 current
protodriveev 0:2dbd366be5fd 7 #define NUM_HALF_CYCLES 4 //set the number of ticks over which to measure speed
protodriveev 0:2dbd366be5fd 8 #define WAIT_BEFORE_SPEEDSTOP 7.5 //amount of time to wait before declaring that the motor is not moving. 7.5s corresponds to a speed of 1 rev/min
protodriveev 0:2dbd366be5fd 9 #define R1 200000//voltage measurement resistor connected to device under measurement [Ohm]
protodriveev 0:2dbd366be5fd 10 #define R2 100000//voltage measurement resistor connected to ground [Ohm]
protodriveev 0:2dbd366be5fd 11
protodriveev 0:2dbd366be5fd 12 /***********************************************************/
protodriveev 0:2dbd366be5fd 13 /*Variables */
protodriveev 0:2dbd366be5fd 14 /***********************************************************/
protodriveev 0:2dbd366be5fd 15
protodriveev 0:2dbd366be5fd 16 float end, begin, current_read;
protodriveev 0:2dbd366be5fd 17 int current_state;
protodriveev 0:2dbd366be5fd 18 int count = 0;
protodriveev 0:2dbd366be5fd 19
protodriveev 0:2dbd366be5fd 20 Timer speed_timer;
protodriveev 0:2dbd366be5fd 21
protodriveev 0:2dbd366be5fd 22 /***********************************************************/
protodriveev 0:2dbd366be5fd 23 /*Pin setup */
protodriveev 0:2dbd366be5fd 24 /***********************************************************/
protodriveev 0:2dbd366be5fd 25 //Encoder
protodriveev 0:2dbd366be5fd 26 DigitalIn speed_yellow(p7); //yellow wire from sinusoidal encoder
protodriveev 0:2dbd366be5fd 27 DigitalIn speed_green(p8); //green wire from sinusoidal encoder
protodriveev 0:2dbd366be5fd 28
protodriveev 0:2dbd366be5fd 29 /***********************************************************/
protodriveev 0:2dbd366be5fd 30 /*Subroutines */
protodriveev 0:2dbd366be5fd 31 /***********************************************************/
protodriveev 0:2dbd366be5fd 32
protodriveev 0:2dbd366be5fd 33 //get the voltage for one of the energy storage devices. Takes pin as a parameter
protodriveev 0:2dbd366be5fd 34 float get_voltage (AnalogIn& pin) {
protodriveev 0:2dbd366be5fd 35 float voltage;
protodriveev 0:2dbd366be5fd 36 voltage = pin.read()*3.3*(R1+R2)/R2; //scaling to account for voltage divider
protodriveev 0:2dbd366be5fd 37 return voltage;
protodriveev 0:2dbd366be5fd 38 }
protodriveev 0:2dbd366be5fd 39
protodriveev 0:2dbd366be5fd 40 //returns current in amps
protodriveev 0:2dbd366be5fd 41 #ifdef CURRENT_SENSOR_ON
protodriveev 0:2dbd366be5fd 42 void get_current() {
protodriveev 0:2dbd366be5fd 43 current_read = current_sense.read(); //read raw AnalogIn value of current
protodriveev 0:2dbd366be5fd 44 current = ISENSOR_SLOPE*current_read*3.3 + Y_INTERCEPT; //scaling to get current in A
protodriveev 0:2dbd366be5fd 45 }
protodriveev 0:2dbd366be5fd 46 #endif
protodriveev 0:2dbd366be5fd 47
protodriveev 0:2dbd366be5fd 48 //returns speed in rad/sec
protodriveev 0:2dbd366be5fd 49 void get_speed() {
protodriveev 0:2dbd366be5fd 50 current_state = speed_yellow; //get the current state of speed_yellow pin (0 or 1)
protodriveev 0:2dbd366be5fd 51 speed_timer.start();
protodriveev 0:2dbd366be5fd 52 while (speed_yellow == current_state && speed_timer <=WAIT_BEFORE_SPEEDSTOP) {} //wait for value of the speed_yellow to change, indicating the beginning of a new cycle
protodriveev 0:2dbd366be5fd 53 if (speed_timer < WAIT_BEFORE_SPEEDSTOP) { //check that the timer is less than WAIT_BEFORE_SPEEDSTOP, to make sure it has not been running for too long. This will happen if speed = 0
protodriveev 0:2dbd366be5fd 54 speed_timer.reset(); //reset the timer so that it starts timing from the beginning of the new cycle
protodriveev 0:2dbd366be5fd 55 begin = speed_timer.read();
protodriveev 0:2dbd366be5fd 56 for (int i = 1; i <= NUM_HALF_CYCLES; i++) { //loop to allow timing over a set number of encoder cycles
protodriveev 0:2dbd366be5fd 57 current_state = speed_yellow;
protodriveev 0:2dbd366be5fd 58 while (speed_yellow == current_state && speed_timer <= WAIT_BEFORE_SPEEDSTOP) {}//wait for speed_yellow pin to change. If it does not change, the loop will exit when speed_timer = WAIT_BEFORE_SPEEDSTOP
protodriveev 0:2dbd366be5fd 59 }
protodriveev 0:2dbd366be5fd 60 if (speed_timer < WAIT_BEFORE_SPEEDSTOP) {
protodriveev 0:2dbd366be5fd 61 end = speed_timer.read(); //time at the end of timing NUM_HALF_CYCLES cycles
protodriveev 0:2dbd366be5fd 62 speed_timer.stop();
protodriveev 0:2dbd366be5fd 63 speed =((3.14159265/8)*NUM_HALF_CYCLES)/(end-begin); //record speed in rad/sec
protodriveev 0:2dbd366be5fd 64 } else {
protodriveev 0:2dbd366be5fd 65 speed = 0; //speed = 0 if the timer has exceeded WAIT_BEFORE_SPEEDSTOP
protodriveev 0:2dbd366be5fd 66 }
protodriveev 0:2dbd366be5fd 67 } else {
protodriveev 0:2dbd366be5fd 68 speed = 0; //speed = 0 if the timer has exceeded WAIT_BEFORE_SPEEDSTOP
protodriveev 0:2dbd366be5fd 69 }
protodriveev 0:2dbd366be5fd 70 }