Dependencies:   RPCInterface mbed

measurement.h

Committer:
protodriveev
Date:
2012-05-07
Revision:
0:2dbd366be5fd

File content as of revision 0:2dbd366be5fd:

/***********************************************************/
/*Constants                                                */
/***********************************************************/

#define ISENSOR_SLOPE 23.9 //slope of the current sensor in [A/V]
#define Y_INTERCEPT -60.1563 //sensor voltage at 0 current
#define NUM_HALF_CYCLES 4 //set the number of ticks over which to measure speed
#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
#define R1 200000//voltage measurement resistor connected to device under measurement [Ohm]
#define R2 100000//voltage measurement resistor connected to ground [Ohm]

/***********************************************************/
/*Variables                                                */
/***********************************************************/

float end, begin, current_read;
int current_state;
int count = 0;

Timer speed_timer;

/***********************************************************/
/*Pin setup                                                */
/***********************************************************/
//Encoder
DigitalIn speed_yellow(p7); //yellow wire from sinusoidal encoder
DigitalIn speed_green(p8); //green wire from sinusoidal encoder

/***********************************************************/
/*Subroutines                                              */
/***********************************************************/

//get the voltage for one of the energy storage devices. Takes pin as a parameter
float get_voltage (AnalogIn& pin) {
    float voltage;
    voltage = pin.read()*3.3*(R1+R2)/R2; //scaling to account for voltage divider
    return voltage;
}

//returns current in amps
#ifdef CURRENT_SENSOR_ON
void get_current() {
    current_read = current_sense.read(); //read raw AnalogIn value of current
    current = ISENSOR_SLOPE*current_read*3.3 + Y_INTERCEPT; //scaling to get current in A
}
#endif

//returns speed in rad/sec
void get_speed() {
    current_state = speed_yellow; //get the current state of speed_yellow pin (0 or 1)
    speed_timer.start();
    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
    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
        speed_timer.reset(); //reset the timer so that it starts timing from the beginning of the new cycle
        begin = speed_timer.read();
        for (int i = 1; i <= NUM_HALF_CYCLES; i++) { //loop to allow timing over a set number of encoder cycles
            current_state = speed_yellow;
            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
        }
        if (speed_timer < WAIT_BEFORE_SPEEDSTOP) {
            end = speed_timer.read(); //time at the end of timing NUM_HALF_CYCLES cycles
            speed_timer.stop();
            speed =((3.14159265/8)*NUM_HALF_CYCLES)/(end-begin); //record speed in rad/sec
        } else {
            speed = 0; //speed = 0 if the timer has exceeded WAIT_BEFORE_SPEEDSTOP
        }
    } else {
        speed = 0;  //speed = 0 if the timer has exceeded WAIT_BEFORE_SPEEDSTOP
    }
}