Lab 6 code.

Dependencies:   mbed

Fork of WaG by GroupA

Committer:
spm71
Date:
Tue Apr 03 17:14:03 2018 +0000
Revision:
50:e3a03bc1e1a6
Parent:
49:80d4ffabec16
Child:
51:1eb60f0d2f03
Motor updates

Who changed what in which revision?

UserRevisionLine numberNew contents of line
spm71 18:0e281922212c 1 /******************************************************************************
spm71 18:0e281922212c 2 * EECS 397
spm71 18:0e281922212c 3 *
spm71 42:6cba679a4ee4 4 * Assignment Name: Lab 6: WaG
spm71 18:0e281922212c 5 *
spm71 18:0e281922212c 6 * Authors: Sam Morrison and Phong Nguyen
spm71 18:0e281922212c 7 * File name: stepper.cpp
spm71 18:0e281922212c 8 * Purpose: Driver for stepper motor
spm71 18:0e281922212c 9 *
spm71 18:0e281922212c 10 * Created: 03/02/2018
spm71 42:6cba679a4ee4 11 * Last Modified: 03/29/2018
spm71 18:0e281922212c 12 *
spm71 18:0e281922212c 13 ******************************************************************************/
spm71 18:0e281922212c 14
spm71 18:0e281922212c 15 #include "mbed.h"
spm71 18:0e281922212c 16 #include "io_pins.h"
spm71 18:0e281922212c 17 #include "spi.h"
spm71 18:0e281922212c 18 #include "stepper.h"
spm71 41:9b293b14b845 19 #include "utility.h"
spm71 49:80d4ffabec16 20 #include "laser.h"
spm71 49:80d4ffabec16 21 #include "analog.h"
spm71 49:80d4ffabec16 22 #include "wag.h"
spm71 18:0e281922212c 23
spm71 21:88f9f280931b 24 extern DigitalIn jog_ccw;
spm71 21:88f9f280931b 25 extern DigitalIn jog_cw;
spm71 36:ad2b3d6f0e5a 26 extern DigitalIn my_button;
spm71 36:ad2b3d6f0e5a 27 extern DigitalIn cal_button;
spm71 41:9b293b14b845 28 extern DigitalIn home_sensor;
spm71 22:09dd6977576b 29 extern Serial pc;
spm71 49:80d4ffabec16 30 extern DigitalOut laser;
spm71 20:d23bcd97f2c5 31
spm71 49:80d4ffabec16 32 int stp_cur_pos = STP_POS_UNKN;
phn10 44:4c2ba5bbba67 33 int stp_sensor_pos[TGT_SENSOR_QUAN];
spm71 18:0e281922212c 34
spm71 18:0e281922212c 35 extern spi_cfg drv8806 {
spm71 18:0e281922212c 36 SPI_DRV8806_ID,
spm71 18:0e281922212c 37 STP_DRV8806_NCS,
spm71 20:d23bcd97f2c5 38 DRV8806_SPI_MODE,
spm71 20:d23bcd97f2c5 39 DRV8806_SPI_FREQ,
spm71 20:d23bcd97f2c5 40 DRV8806_SPI_NO_BITS,
spm71 18:0e281922212c 41 };
spm71 18:0e281922212c 42
spm71 18:0e281922212c 43 /*
spm71 18:0e281922212c 44 * void stp_init();
spm71 18:0e281922212c 45 * Description: initializes stepper values to unkown
spm71 18:0e281922212c 46 *
spm71 18:0e281922212c 47 * Inputs:
spm71 18:0e281922212c 48 * Parameters: void
spm71 18:0e281922212c 49 * Globals:
spm71 18:0e281922212c 50 *
spm71 18:0e281922212c 51 * Outputs:
spm71 18:0e281922212c 52 * Returns: void
spm71 18:0e281922212c 53 */
spm71 18:0e281922212c 54 void stp_init() {
spm71 20:d23bcd97f2c5 55 stp_cur_pos = STP_POS_UNKN;
spm71 43:3b7f326aa096 56 jog_cw.mode(PullUp);
spm71 43:3b7f326aa096 57 jog_ccw.mode(PullUp);
spm71 43:3b7f326aa096 58 cal_button.mode(PullUp);
spm71 43:3b7f326aa096 59 home_sensor.mode(PullUp);
spm71 46:85c4b722baa7 60 for (int i = 1; i <= TGT_SENSOR_QUAN; i++) {
spm71 43:3b7f326aa096 61 //stp_sensor_pos[i] = STP_POS_UNKN;
spm71 18:0e281922212c 62 }
spm71 18:0e281922212c 63 }
spm71 18:0e281922212c 64
spm71 18:0e281922212c 65 /*
spm71 18:0e281922212c 66 * void stp_step(int direction);
spm71 18:0e281922212c 67 * Description: turns the stepper motor clockwise or counter-clockwise
spm71 18:0e281922212c 68 *
spm71 18:0e281922212c 69 * Inputs:
spm71 18:0e281922212c 70 * Parameters:
phn10 47:0547118e348e 71 * int direction: STP_CW for clock wise and STP_CCW for counter clock wise
spm71 18:0e281922212c 72 * Globals:
spm71 18:0e281922212c 73 *
spm71 18:0e281922212c 74 * Outputs:
spm71 18:0e281922212c 75 * Returns: void
spm71 18:0e281922212c 76 */
spm71 18:0e281922212c 77 void stp_step(int direction) {
spm71 20:d23bcd97f2c5 78
spm71 20:d23bcd97f2c5 79 //static int cur_pos = stp_cur_pos;
spm71 20:d23bcd97f2c5 80 static int turn[4] = {0x03, 0x06, 0x0c, 0x09};
spm71 20:d23bcd97f2c5 81 if (direction == STP_CW) {
spm71 49:80d4ffabec16 82
spm71 50:e3a03bc1e1a6 83 if (stp_cur_pos <= 200) {
spm71 50:e3a03bc1e1a6 84 if (stp_cur_pos != STP_POS_UNKN){
spm71 50:e3a03bc1e1a6 85 //pc.printf("current position = %d\n", stp_cur_pos);
spm71 49:80d4ffabec16 86 stp_cur_pos++;
spm71 50:e3a03bc1e1a6 87 }
spm71 49:80d4ffabec16 88 }
spm71 49:80d4ffabec16 89 else {
spm71 49:80d4ffabec16 90 pc.printf("Cannot turn past maximum position. Fatal error.\n");
spm71 49:80d4ffabec16 91 while(1);
spm71 49:80d4ffabec16 92 }
spm71 49:80d4ffabec16 93
spm71 49:80d4ffabec16 94
spm71 22:09dd6977576b 95 for (int i = 0; i < 4; i++) {
spm71 41:9b293b14b845 96 wait(MOTOR_DELAY);
spm71 22:09dd6977576b 97 //pc.printf("i = %d\n", i);
spm71 20:d23bcd97f2c5 98 spi_send(drv8806, turn[i]);
spm71 22:09dd6977576b 99 }
spm71 50:e3a03bc1e1a6 100 wait(TURN_DELAY);
spm71 20:d23bcd97f2c5 101 }
spm71 20:d23bcd97f2c5 102 else if (direction == STP_CCW) {
spm71 49:80d4ffabec16 103
spm71 49:80d4ffabec16 104 if (stp_cur_pos != 0) {
spm71 49:80d4ffabec16 105 if (stp_cur_pos != STP_POS_UNKN)
spm71 49:80d4ffabec16 106 stp_cur_pos--;
spm71 49:80d4ffabec16 107 }
spm71 49:80d4ffabec16 108 else {
spm71 49:80d4ffabec16 109 pc.printf("Cannot turn past home position.\n");
spm71 49:80d4ffabec16 110 wait(0.5);
spm71 49:80d4ffabec16 111 return;
spm71 49:80d4ffabec16 112 }
spm71 49:80d4ffabec16 113
spm71 22:09dd6977576b 114 for (int i = 3; i >= 0; i--) {
spm71 41:9b293b14b845 115 wait(MOTOR_DELAY);
spm71 22:09dd6977576b 116 //pc.printf("i = %d\n", i);
spm71 20:d23bcd97f2c5 117 spi_send(drv8806, turn[i]);
spm71 22:09dd6977576b 118 }
spm71 50:e3a03bc1e1a6 119 wait(TURN_DELAY);
spm71 20:d23bcd97f2c5 120 }
spm71 41:9b293b14b845 121 wait(MOTOR_DELAY);
spm71 36:ad2b3d6f0e5a 122 }
spm71 36:ad2b3d6f0e5a 123
spm71 36:ad2b3d6f0e5a 124 /*
spm71 36:ad2b3d6f0e5a 125 * void step_test();
spm71 36:ad2b3d6f0e5a 126 * Description: tests the stepper motor
spm71 36:ad2b3d6f0e5a 127 *
spm71 36:ad2b3d6f0e5a 128 * Inputs:
spm71 36:ad2b3d6f0e5a 129 * Parameters:
spm71 36:ad2b3d6f0e5a 130 * Globals:
spm71 36:ad2b3d6f0e5a 131 *
spm71 36:ad2b3d6f0e5a 132 * Outputs:
spm71 36:ad2b3d6f0e5a 133 * Returns: void
spm71 36:ad2b3d6f0e5a 134 */
spm71 36:ad2b3d6f0e5a 135 void step_test() {
spm71 43:3b7f326aa096 136 stp_init();
spm71 41:9b293b14b845 137 while (uti_chk_ubutton() == 0);
spm71 46:85c4b722baa7 138 pc.printf("step motor test begin\n");
spm71 36:ad2b3d6f0e5a 139 while(1) {
spm71 36:ad2b3d6f0e5a 140 if (jog_ccw == 0) {
spm71 49:80d4ffabec16 141 stp_step(STP_CCW);
spm71 36:ad2b3d6f0e5a 142 }
spm71 36:ad2b3d6f0e5a 143 if (jog_cw == 0) {
spm71 50:e3a03bc1e1a6 144 stp_step(STP_CW);
spm71 36:ad2b3d6f0e5a 145 }
spm71 36:ad2b3d6f0e5a 146 if (cal_button == 0) {
spm71 36:ad2b3d6f0e5a 147 stp_find_home();
spm71 36:ad2b3d6f0e5a 148 }
spm71 46:85c4b722baa7 149 if (uti_chk_ubutton() == 1)
spm71 46:85c4b722baa7 150 break;
spm71 36:ad2b3d6f0e5a 151 }
spm71 36:ad2b3d6f0e5a 152 }
spm71 36:ad2b3d6f0e5a 153
spm71 41:9b293b14b845 154 /*
spm71 41:9b293b14b845 155 * void stp_find_home();
spm71 41:9b293b14b845 156 * Description: uses the stepper motor and home sensor to find home
spm71 41:9b293b14b845 157 *
spm71 41:9b293b14b845 158 * Inputs:
spm71 41:9b293b14b845 159 * Parameters:
spm71 41:9b293b14b845 160 * Globals:
spm71 41:9b293b14b845 161 *
spm71 41:9b293b14b845 162 * Outputs:
spm71 41:9b293b14b845 163 * Returns: void
spm71 41:9b293b14b845 164 */
spm71 36:ad2b3d6f0e5a 165 void stp_find_home() {
spm71 41:9b293b14b845 166 int count = 0;
spm71 41:9b293b14b845 167 int half_count = 0;
spm71 41:9b293b14b845 168 stp_cur_pos = STP_POS_UNKN;
spm71 41:9b293b14b845 169 //pc.printf("Home sensor is currently %d\n", home_sensor.read());
spm71 41:9b293b14b845 170 if (home_sensor == 0) {
spm71 41:9b293b14b845 171 for(int i = 0; i < 100; i++)
spm71 41:9b293b14b845 172 stp_step(STP_CW);
spm71 41:9b293b14b845 173 if (home_sensor == 0) {
spm71 46:85c4b722baa7 174 pc.printf("Error, home sensor not functioning. Fatal error.\n", home_sensor.read());
spm71 41:9b293b14b845 175 while(1);
spm71 41:9b293b14b845 176 }
spm71 41:9b293b14b845 177 }
spm71 41:9b293b14b845 178 while (home_sensor.read() != 0) {
spm71 41:9b293b14b845 179 stp_step(STP_CCW);
spm71 41:9b293b14b845 180 }
spm71 41:9b293b14b845 181 while (home_sensor.read() != 1) {
spm71 41:9b293b14b845 182 stp_step(STP_CCW);
spm71 41:9b293b14b845 183 count++;
spm71 41:9b293b14b845 184 }
spm71 41:9b293b14b845 185 half_count = count/2;
spm71 41:9b293b14b845 186 for(int i = 0; i < half_count; i++)
spm71 41:9b293b14b845 187 stp_step(STP_CW);
spm71 41:9b293b14b845 188 stp_cur_pos = 0;
spm71 41:9b293b14b845 189 pc.printf("Home found.\n");
phn10 44:4c2ba5bbba67 190 }
phn10 44:4c2ba5bbba67 191
phn10 44:4c2ba5bbba67 192
phn10 44:4c2ba5bbba67 193 /*
phn10 44:4c2ba5bbba67 194 * void stp_calibrate(int station, float * sensor_values, int * cal_status);
phn10 44:4c2ba5bbba67 195 * Description: uses the stepper motor and home sensor to find home
phn10 44:4c2ba5bbba67 196 *
phn10 44:4c2ba5bbba67 197 * Inputs:
phn10 44:4c2ba5bbba67 198 * Parameters:
phn10 47:0547118e348e 199 * int station: STATION_A or STATION_B
phn10 47:0547118e348e 200 * float *sensor_value: array of float holds 16 sensor values
phn10 47:0547118e348e 201 * int *cal_status: pointer to int variable that will hold calibration status
phn10 44:4c2ba5bbba67 202 * Globals:
phn10 44:4c2ba5bbba67 203 *
phn10 44:4c2ba5bbba67 204 * Outputs:
phn10 44:4c2ba5bbba67 205 * Returns: void
phn10 44:4c2ba5bbba67 206 */
phn10 47:0547118e348e 207 void stp_calibrate(int station, float * sensor_values, int * cal_status){
spm71 49:80d4ffabec16 208 while (uti_chk_ubutton() == 0);
spm71 49:80d4ffabec16 209 pc.printf("step 9 test begin\n");
spm71 49:80d4ffabec16 210
phn10 47:0547118e348e 211 int sensor_no = 0;
spm71 49:80d4ffabec16 212 if (station == STATION_B) sensor_no = 8;
phn10 47:0547118e348e 213
spm71 49:80d4ffabec16 214 // find home position
phn10 47:0547118e348e 215 stp_find_home();
phn10 47:0547118e348e 216
phn10 47:0547118e348e 217 // turn laser on
spm71 49:80d4ffabec16 218 wait(1);
phn10 47:0547118e348e 219 lzr_on();
phn10 47:0547118e348e 220
phn10 47:0547118e348e 221 for (int i = 0; i < TGT_SENSOR_QUAN; i++) {
phn10 47:0547118e348e 222 // scan all 16 sensors into sensor_values array
phn10 47:0547118e348e 223 ana_scan_mux(sensor_values, TGT_SENSOR_QUAN * 2);
phn10 47:0547118e348e 224
phn10 47:0547118e348e 225 // keep turning stepper motor clock wise until it points to a PT sensor
phn10 47:0547118e348e 226 while (sensor_values[sensor_no + i] < PTTHRESH) {
phn10 47:0547118e348e 227 // turn CW one step
phn10 47:0547118e348e 228 stp_step(STP_CW);
phn10 47:0547118e348e 229
phn10 47:0547118e348e 230 wait(0.005);
phn10 47:0547118e348e 231
phn10 47:0547118e348e 232 // scan all PT sensors again
phn10 47:0547118e348e 233 ana_scan_mux(sensor_values, TGT_SENSOR_QUAN * 2);
phn10 47:0547118e348e 234 }
phn10 47:0547118e348e 235 // found the sensor, save it's position
phn10 47:0547118e348e 236 stp_sensor_pos[i] = stp_cur_pos;
spm71 50:e3a03bc1e1a6 237 pc.printf("Sensor %d = %d\n", i, stp_sensor_pos[i]);
phn10 47:0547118e348e 238 }
phn10 47:0547118e348e 239 // found position of all 8 sensors
phn10 47:0547118e348e 240
phn10 47:0547118e348e 241 // go back home
phn10 47:0547118e348e 242 stp_find_home();
phn10 47:0547118e348e 243
phn10 47:0547118e348e 244 *cal_status = CALIBRATED;
phn10 47:0547118e348e 245
phn10 47:0547118e348e 246 // turn laser off
phn10 47:0547118e348e 247 lzr_off();
phn10 47:0547118e348e 248
phn10 47:0547118e348e 249 // for debugging: print positions of all 8 sensors here
phn10 47:0547118e348e 250 for (int i = 0; i < TGT_SENSOR_QUAN; i++) {
phn10 47:0547118e348e 251 pc.printf("PT %d: %d ", i, stp_sensor_pos[i]);
phn10 47:0547118e348e 252 }
phn10 47:0547118e348e 253 }