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
}
}