Lab 6 code.

Dependencies:   mbed

Fork of WaG by GroupA

Committer:
spm71
Date:
Thu Mar 29 15:51:52 2018 +0000
Revision:
42:6cba679a4ee4
Parent:
41:9b293b14b845
Child:
43:3b7f326aa096
Child:
44:4c2ba5bbba67
Added laser functions

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 18:0e281922212c 20
spm71 21:88f9f280931b 21 extern DigitalIn jog_ccw;
spm71 21:88f9f280931b 22 extern DigitalIn jog_cw;
spm71 36:ad2b3d6f0e5a 23 extern DigitalIn my_button;
spm71 36:ad2b3d6f0e5a 24 extern DigitalIn cal_button;
spm71 41:9b293b14b845 25 extern DigitalIn home_sensor;
spm71 22:09dd6977576b 26 extern Serial pc;
spm71 20:d23bcd97f2c5 27
spm71 20:d23bcd97f2c5 28 int stp_cur_pos;
spm71 20:d23bcd97f2c5 29 int stp_sensor_pos[NUM_SENSORS + 1];
spm71 18:0e281922212c 30
spm71 18:0e281922212c 31 extern spi_cfg drv8806 {
spm71 18:0e281922212c 32 SPI_DRV8806_ID,
spm71 18:0e281922212c 33 STP_DRV8806_NCS,
spm71 20:d23bcd97f2c5 34 DRV8806_SPI_MODE,
spm71 20:d23bcd97f2c5 35 DRV8806_SPI_FREQ,
spm71 20:d23bcd97f2c5 36 DRV8806_SPI_NO_BITS,
spm71 18:0e281922212c 37 };
spm71 18:0e281922212c 38
spm71 18:0e281922212c 39 /*
spm71 18:0e281922212c 40 * void stp_init();
spm71 18:0e281922212c 41 * Description: initializes stepper values to unkown
spm71 18:0e281922212c 42 *
spm71 18:0e281922212c 43 * Inputs:
spm71 18:0e281922212c 44 * Parameters: void
spm71 18:0e281922212c 45 * Globals:
spm71 18:0e281922212c 46 *
spm71 18:0e281922212c 47 * Outputs:
spm71 18:0e281922212c 48 * Returns: void
spm71 18:0e281922212c 49 */
spm71 18:0e281922212c 50 void stp_init() {
spm71 20:d23bcd97f2c5 51 stp_cur_pos = STP_POS_UNKN;
spm71 18:0e281922212c 52 for (int i = 1; i <= NUM_SENSORS; i++) {
spm71 18:0e281922212c 53 stp_sensor_pos[i] = STP_POS_UNKN;
spm71 18:0e281922212c 54 }
spm71 18:0e281922212c 55 }
spm71 18:0e281922212c 56
spm71 18:0e281922212c 57 /*
spm71 18:0e281922212c 58 * void stp_step(int direction);
spm71 18:0e281922212c 59 * Description: turns the stepper motor clockwise or counter-clockwise
spm71 18:0e281922212c 60 *
spm71 18:0e281922212c 61 * Inputs:
spm71 18:0e281922212c 62 * Parameters:
spm71 18:0e281922212c 63 * int direction
spm71 18:0e281922212c 64 * Globals:
spm71 18:0e281922212c 65 *
spm71 18:0e281922212c 66 * Outputs:
spm71 18:0e281922212c 67 * Returns: void
spm71 18:0e281922212c 68 */
spm71 18:0e281922212c 69 void stp_step(int direction) {
spm71 20:d23bcd97f2c5 70
spm71 20:d23bcd97f2c5 71 //static int cur_pos = stp_cur_pos;
spm71 20:d23bcd97f2c5 72 static int turn[4] = {0x03, 0x06, 0x0c, 0x09};
spm71 20:d23bcd97f2c5 73 if (direction == STP_CW) {
spm71 22:09dd6977576b 74 for (int i = 0; i < 4; i++) {
spm71 41:9b293b14b845 75 wait(MOTOR_DELAY);
spm71 22:09dd6977576b 76 //pc.printf("i = %d\n", i);
spm71 20:d23bcd97f2c5 77 spi_send(drv8806, turn[i]);
spm71 22:09dd6977576b 78 }
spm71 20:d23bcd97f2c5 79 }
spm71 20:d23bcd97f2c5 80 else if (direction == STP_CCW) {
spm71 22:09dd6977576b 81 for (int i = 3; i >= 0; i--) {
spm71 41:9b293b14b845 82 wait(MOTOR_DELAY);
spm71 22:09dd6977576b 83 //pc.printf("i = %d\n", i);
spm71 20:d23bcd97f2c5 84 spi_send(drv8806, turn[i]);
spm71 22:09dd6977576b 85 }
spm71 20:d23bcd97f2c5 86 }
spm71 41:9b293b14b845 87 wait(MOTOR_DELAY);
spm71 36:ad2b3d6f0e5a 88 }
spm71 36:ad2b3d6f0e5a 89
spm71 36:ad2b3d6f0e5a 90 /*
spm71 36:ad2b3d6f0e5a 91 * void step_test();
spm71 36:ad2b3d6f0e5a 92 * Description: tests the stepper motor
spm71 36:ad2b3d6f0e5a 93 *
spm71 36:ad2b3d6f0e5a 94 * Inputs:
spm71 36:ad2b3d6f0e5a 95 * Parameters:
spm71 36:ad2b3d6f0e5a 96 * Globals:
spm71 36:ad2b3d6f0e5a 97 *
spm71 36:ad2b3d6f0e5a 98 * Outputs:
spm71 36:ad2b3d6f0e5a 99 * Returns: void
spm71 36:ad2b3d6f0e5a 100 */
spm71 36:ad2b3d6f0e5a 101 void step_test() {
spm71 41:9b293b14b845 102 jog_cw.mode(PullUp);
spm71 41:9b293b14b845 103 jog_ccw.mode(PullUp);
spm71 41:9b293b14b845 104 cal_button.mode(PullUp);
spm71 41:9b293b14b845 105 home_sensor.mode(PullUp);
spm71 41:9b293b14b845 106 while (uti_chk_ubutton() == 0);
spm71 41:9b293b14b845 107 pc.printf("test begin\n");
spm71 36:ad2b3d6f0e5a 108 while(1) {
spm71 36:ad2b3d6f0e5a 109 if (jog_ccw == 0) {
spm71 42:6cba679a4ee4 110 if (stp_cur_pos != 0) {
spm71 42:6cba679a4ee4 111 stp_step(STP_CCW);
spm71 42:6cba679a4ee4 112 if (stp_cur_pos != STP_POS_UNKN)
spm71 42:6cba679a4ee4 113 stp_cur_pos--;
spm71 42:6cba679a4ee4 114 }
spm71 36:ad2b3d6f0e5a 115 }
spm71 36:ad2b3d6f0e5a 116 if (jog_cw == 0) {
spm71 42:6cba679a4ee4 117 if (stp_cur_pos <= 400) {
spm71 42:6cba679a4ee4 118 stp_step(STP_CW);
spm71 42:6cba679a4ee4 119 if (stp_cur_pos != STP_POS_UNKN)
spm71 42:6cba679a4ee4 120 stp_cur_pos++;
spm71 42:6cba679a4ee4 121 }
spm71 42:6cba679a4ee4 122 else
spm71 42:6cba679a4ee4 123 while(1);
spm71 36:ad2b3d6f0e5a 124 }
spm71 36:ad2b3d6f0e5a 125 if (cal_button == 0) {
spm71 36:ad2b3d6f0e5a 126 stp_find_home();
spm71 36:ad2b3d6f0e5a 127 }
spm71 36:ad2b3d6f0e5a 128 }
spm71 36:ad2b3d6f0e5a 129 }
spm71 36:ad2b3d6f0e5a 130
spm71 41:9b293b14b845 131 /*
spm71 41:9b293b14b845 132 * void stp_find_home();
spm71 41:9b293b14b845 133 * Description: uses the stepper motor and home sensor to find home
spm71 41:9b293b14b845 134 *
spm71 41:9b293b14b845 135 * Inputs:
spm71 41:9b293b14b845 136 * Parameters:
spm71 41:9b293b14b845 137 * Globals:
spm71 41:9b293b14b845 138 *
spm71 41:9b293b14b845 139 * Outputs:
spm71 41:9b293b14b845 140 * Returns: void
spm71 41:9b293b14b845 141 */
spm71 36:ad2b3d6f0e5a 142 void stp_find_home() {
spm71 41:9b293b14b845 143 int count = 0;
spm71 41:9b293b14b845 144 int half_count = 0;
spm71 41:9b293b14b845 145 stp_cur_pos = STP_POS_UNKN;
spm71 41:9b293b14b845 146 //pc.printf("Home sensor is currently %d\n", home_sensor.read());
spm71 41:9b293b14b845 147 if (home_sensor == 0) {
spm71 41:9b293b14b845 148 for(int i = 0; i < 100; i++)
spm71 41:9b293b14b845 149 stp_step(STP_CW);
spm71 41:9b293b14b845 150 if (home_sensor == 0) {
spm71 41:9b293b14b845 151 pc.printf("Error, home sensor not functioning. Home sensor is currently %d\n", home_sensor.read());
spm71 41:9b293b14b845 152 while(1);
spm71 41:9b293b14b845 153 }
spm71 41:9b293b14b845 154 }
spm71 41:9b293b14b845 155 while (home_sensor.read() != 0) {
spm71 41:9b293b14b845 156 stp_step(STP_CCW);
spm71 41:9b293b14b845 157 }
spm71 41:9b293b14b845 158 while (home_sensor.read() != 1) {
spm71 41:9b293b14b845 159 stp_step(STP_CCW);
spm71 41:9b293b14b845 160 count++;
spm71 41:9b293b14b845 161 }
spm71 41:9b293b14b845 162 half_count = count/2;
spm71 41:9b293b14b845 163 for(int i = 0; i < half_count; i++)
spm71 41:9b293b14b845 164 stp_step(STP_CW);
spm71 41:9b293b14b845 165 stp_cur_pos = 0;
spm71 41:9b293b14b845 166 pc.printf("Home found.\n");
spm71 18:0e281922212c 167 }