Senior design censored code to run freescale motor with X-NUCLEO-IM07M1. REFACTORED

Dependencies:   mbed

Fork of Blue_Board_Test_2 by Brad VanderWilp

Committer:
vicyap
Date:
Thu Apr 07 23:27:18 2016 +0000
Revision:
6:f9aca07dbdb4
Parent:
5:6110655353ad
Child:
7:b8ef1960498e
Refactored code into SixStep_Lib and AnalogInBuffered. Have not tested code on any motors. Left comments in

Who changed what in which revision?

UserRevisionLine numberNew contents of line
BVanderWilp 0:d445abf9a8e9 1 #include "mbed.h"
BVanderWilp 0:d445abf9a8e9 2
vicyap 6:f9aca07dbdb4 3 #include "SixStep_Lib.h"
vicyap 6:f9aca07dbdb4 4 #include "AnalogInBuffered.h"
vicyap 6:f9aca07dbdb4 5
vicyap 6:f9aca07dbdb4 6 /* start Parameters */
vicyap 6:f9aca07dbdb4 7
vicyap 6:f9aca07dbdb4 8 #define OUT1 PA_8
vicyap 6:f9aca07dbdb4 9 #define OUT2 PA_9
vicyap 6:f9aca07dbdb4 10 #define OUT3 PA_10
vicyap 6:f9aca07dbdb4 11 #define OUT1EN PC_10
vicyap 6:f9aca07dbdb4 12 #define OUT2EN PC_11
vicyap 6:f9aca07dbdb4 13 #define OUT3EN PC_12
vicyap 6:f9aca07dbdb4 14
vicyap 6:f9aca07dbdb4 15 #define HALL1 PA_15
vicyap 6:f9aca07dbdb4 16 #define HALL2 PB_3
vicyap 6:f9aca07dbdb4 17 #define HALL3 PB_10
vicyap 6:f9aca07dbdb4 18
vicyap 6:f9aca07dbdb4 19 #define POTENTIOMETER PB_1
vicyap 6:f9aca07dbdb4 20 #define POTENTIOMETER_BUFFER_SIZE 20
BVanderWilp 0:d445abf9a8e9 21
vicyap 6:f9aca07dbdb4 22 #define X_NUCLEO_IHM07001_LED PB_2
vicyap 6:f9aca07dbdb4 23
vicyap 6:f9aca07dbdb4 24 #define PWM_MAX 0.9f
vicyap 6:f9aca07dbdb4 25
vicyap 6:f9aca07dbdb4 26 /* end Parameters */
vicyap 6:f9aca07dbdb4 27
vicyap 6:f9aca07dbdb4 28 /* start globals */
vicyap 6:f9aca07dbdb4 29
vicyap 6:f9aca07dbdb4 30 PwmOut phaseA(OUT1); //Out1, Green
vicyap 6:f9aca07dbdb4 31 DigitalOut phaseAEN(OUT1EN);
vicyap 6:f9aca07dbdb4 32 PwmOut phaseB(OUT2); //Out2, Blue
vicyap 6:f9aca07dbdb4 33 DigitalOut phaseBEN(OUT2EN);
vicyap 6:f9aca07dbdb4 34 PwmOut phaseC(OUT3); //Out3, White
vicyap 6:f9aca07dbdb4 35 DigitalOut phaseCEN(OUT3EN);
vicyap 6:f9aca07dbdb4 36
vicyap 6:f9aca07dbdb4 37 InterruptIn hallA(HALL1); //H1, Green
vicyap 6:f9aca07dbdb4 38 InterruptIn hallB(HALL2); //H2, Blue
vicyap 6:f9aca07dbdb4 39 InterruptIn hallC(HALL3); //H3, White
vicyap 6:f9aca07dbdb4 40
vicyap 6:f9aca07dbdb4 41 AnalogInBuffered pot(POTENTIOMETER, POTENTIOMETER_BUFFER_SIZE);
BVanderWilp 5:6110655353ad 42
BVanderWilp 0:d445abf9a8e9 43 InterruptIn button(USER_BUTTON);
BVanderWilp 0:d445abf9a8e9 44
vicyap 6:f9aca07dbdb4 45 DigitalOut redLed(X_NUCLEO_IHM07001_LED);
BVanderWilp 0:d445abf9a8e9 46 DigitalOut led(LED1);
BVanderWilp 0:d445abf9a8e9 47
BVanderWilp 1:69c06d3676fd 48 Ticker interrupt;
BVanderWilp 0:d445abf9a8e9 49
vicyap 6:f9aca07dbdb4 50 /* end globals */
vicyap 6:f9aca07dbdb4 51
vicyap 6:f9aca07dbdb4 52 float pwmMax = PWM_MAX;
BVanderWilp 5:6110655353ad 53 float pwmDuty;
BVanderWilp 0:d445abf9a8e9 54 int stall = 0;
BVanderWilp 0:d445abf9a8e9 55 void activate()
BVanderWilp 0:d445abf9a8e9 56 {
BVanderWilp 0:d445abf9a8e9 57 stall = 1;
BVanderWilp 0:d445abf9a8e9 58 }
BVanderWilp 0:d445abf9a8e9 59
BVanderWilp 1:69c06d3676fd 60 void Crise() //state1, A0 B- C+
BVanderWilp 0:d445abf9a8e9 61 {
vicyap 6:f9aca07dbdb4 62 // phaseAEN = 0;
vicyap 6:f9aca07dbdb4 63 // phaseBEN = 1;
BVanderWilp 1:69c06d3676fd 64
vicyap 6:f9aca07dbdb4 65 phaseA.write(0);
vicyap 6:f9aca07dbdb4 66 phaseB.write(0);
BVanderWilp 3:2bcc36fe4de5 67 phaseC.write(pwmDuty);
vicyap 6:f9aca07dbdb4 68 // phaseCEN = 1;
vicyap 6:f9aca07dbdb4 69
vicyap 6:f9aca07dbdb4 70 SixStep::Enable_CH1_CH2_Disable_CH3(phaseBEN, phaseCEN, phaseAEN);
BVanderWilp 1:69c06d3676fd 71 }
BVanderWilp 1:69c06d3676fd 72
BVanderWilp 1:69c06d3676fd 73 void Bfall() //state2, A+ B- C0
BVanderWilp 1:69c06d3676fd 74 {
vicyap 6:f9aca07dbdb4 75 // phaseCEN = 0;
BVanderWilp 1:69c06d3676fd 76 phaseA.write(pwmDuty);
vicyap 6:f9aca07dbdb4 77 phaseB.write(0);
vicyap 6:f9aca07dbdb4 78 phaseC.write(0);
vicyap 6:f9aca07dbdb4 79 // phaseAEN = 1;
vicyap 6:f9aca07dbdb4 80 //
vicyap 6:f9aca07dbdb4 81 // phaseBEN = 1;
vicyap 6:f9aca07dbdb4 82 SixStep::Enable_CH1_CH2_Disable_CH3(phaseAEN, phaseBEN, phaseCEN);
BVanderWilp 1:69c06d3676fd 83 }
BVanderWilp 1:69c06d3676fd 84
BVanderWilp 1:69c06d3676fd 85 void Arise() //state3, A+ B0 C-
BVanderWilp 1:69c06d3676fd 86 {
vicyap 6:f9aca07dbdb4 87 // phaseBEN = 0;
vicyap 6:f9aca07dbdb4 88 // phaseCEN = 1;
BVanderWilp 3:2bcc36fe4de5 89
BVanderWilp 3:2bcc36fe4de5 90 phaseA.write(pwmDuty);
vicyap 6:f9aca07dbdb4 91 phaseB.write(0);
vicyap 6:f9aca07dbdb4 92 phaseC.write(0);
vicyap 6:f9aca07dbdb4 93 // phaseAEN = 1;
vicyap 6:f9aca07dbdb4 94 SixStep::Enable_CH1_CH2_Disable_CH3(phaseAEN, phaseCEN, phaseBEN);
BVanderWilp 1:69c06d3676fd 95 }
BVanderWilp 1:69c06d3676fd 96
BVanderWilp 1:69c06d3676fd 97 void Cfall() //state4, A0 B+ C-
BVanderWilp 1:69c06d3676fd 98 {
vicyap 6:f9aca07dbdb4 99 // phaseAEN = 0;
BVanderWilp 0:d445abf9a8e9 100 phaseA.write(0);
BVanderWilp 0:d445abf9a8e9 101 phaseB.write(pwmDuty);
vicyap 6:f9aca07dbdb4 102 phaseC.write(0);
vicyap 6:f9aca07dbdb4 103 // phaseBEN = 1;
BVanderWilp 1:69c06d3676fd 104
vicyap 6:f9aca07dbdb4 105 // phaseCEN = 1;
vicyap 6:f9aca07dbdb4 106 SixStep::Enable_CH1_CH2_Disable_CH3(phaseBEN, phaseCEN, phaseAEN);
BVanderWilp 0:d445abf9a8e9 107 }
BVanderWilp 0:d445abf9a8e9 108
BVanderWilp 1:69c06d3676fd 109 void Brise() //state5, A- B+ C0
BVanderWilp 0:d445abf9a8e9 110 {
vicyap 6:f9aca07dbdb4 111 // phaseCEN = 0;
vicyap 6:f9aca07dbdb4 112 // phaseAEN = 1;
BVanderWilp 3:2bcc36fe4de5 113
vicyap 6:f9aca07dbdb4 114 phaseA.write(0);
BVanderWilp 3:2bcc36fe4de5 115 phaseB.write(pwmDuty);
vicyap 6:f9aca07dbdb4 116 phaseC.write(0);
vicyap 6:f9aca07dbdb4 117 // phaseBEN = 1;
vicyap 6:f9aca07dbdb4 118 SixStep::Enable_CH1_CH2_Disable_CH3(phaseAEN, phaseBEN, phaseCEN);
BVanderWilp 0:d445abf9a8e9 119 }
BVanderWilp 0:d445abf9a8e9 120
BVanderWilp 1:69c06d3676fd 121 void Afall() //state5, A- B0 C+
BVanderWilp 0:d445abf9a8e9 122 {
vicyap 6:f9aca07dbdb4 123 // phaseBEN = 0;
vicyap 6:f9aca07dbdb4 124 phaseA.write(0);
BVanderWilp 0:d445abf9a8e9 125 phaseB.write(0);
BVanderWilp 0:d445abf9a8e9 126 phaseC.write(pwmDuty);
vicyap 6:f9aca07dbdb4 127 // phaseCEN = 1;
BVanderWilp 3:2bcc36fe4de5 128
vicyap 6:f9aca07dbdb4 129 // phaseAEN = 1;
vicyap 6:f9aca07dbdb4 130 SixStep::Enable_CH1_CH2_Disable_CH3(phaseAEN, phaseCEN, phaseBEN);
BVanderWilp 0:d445abf9a8e9 131 }
BVanderWilp 0:d445abf9a8e9 132
vicyap 6:f9aca07dbdb4 133 void Init()
vicyap 6:f9aca07dbdb4 134 {
BVanderWilp 0:d445abf9a8e9 135 phaseA.period_us(10);
BVanderWilp 0:d445abf9a8e9 136 phaseB.period_us(10);
BVanderWilp 0:d445abf9a8e9 137 phaseC.period_us(10);
BVanderWilp 0:d445abf9a8e9 138
BVanderWilp 0:d445abf9a8e9 139 phaseA.write(0);
BVanderWilp 3:2bcc36fe4de5 140 phaseB.write(0);
vicyap 6:f9aca07dbdb4 141 phaseC.write(0);
BVanderWilp 0:d445abf9a8e9 142
BVanderWilp 0:d445abf9a8e9 143 phaseAEN = 0;
BVanderWilp 3:2bcc36fe4de5 144 phaseBEN = 0;
BVanderWilp 3:2bcc36fe4de5 145 phaseCEN = 0;
vicyap 6:f9aca07dbdb4 146
vicyap 6:f9aca07dbdb4 147 pwmDuty = pot.read() * PWM_MAX;
vicyap 6:f9aca07dbdb4 148
vicyap 6:f9aca07dbdb4 149 // sensored mode
vicyap 6:f9aca07dbdb4 150 // attach appropriate ISRs to hall sensor interrupt pins
BVanderWilp 1:69c06d3676fd 151 hallA.fall(&Afall);
BVanderWilp 1:69c06d3676fd 152 hallA.rise(&Arise);
BVanderWilp 1:69c06d3676fd 153 hallB.fall(&Bfall);
BVanderWilp 1:69c06d3676fd 154 hallB.rise(&Brise);
BVanderWilp 1:69c06d3676fd 155 hallC.fall(&Cfall);
vicyap 6:f9aca07dbdb4 156 hallC.rise(&Crise);
vicyap 6:f9aca07dbdb4 157 }
vicyap 6:f9aca07dbdb4 158
vicyap 6:f9aca07dbdb4 159 void StartUp()
vicyap 6:f9aca07dbdb4 160 {
BVanderWilp 3:2bcc36fe4de5 161 int h1 = hallA.read();
BVanderWilp 3:2bcc36fe4de5 162 int h2 = hallB.read();
BVanderWilp 3:2bcc36fe4de5 163 int h3 = hallC.read();
BVanderWilp 3:2bcc36fe4de5 164 //check where we start
BVanderWilp 3:2bcc36fe4de5 165 if(h1 == 0 && h2 == 1 && h3 == 1) //state1
BVanderWilp 3:2bcc36fe4de5 166 {
BVanderWilp 3:2bcc36fe4de5 167 Crise();
BVanderWilp 3:2bcc36fe4de5 168 Bfall();
BVanderWilp 3:2bcc36fe4de5 169 }
BVanderWilp 3:2bcc36fe4de5 170 else if(h1 == 0 && h2 == 0 && h3 == 1) //state2
BVanderWilp 3:2bcc36fe4de5 171 {
BVanderWilp 3:2bcc36fe4de5 172 Bfall();
BVanderWilp 3:2bcc36fe4de5 173 Arise();
BVanderWilp 3:2bcc36fe4de5 174 }
BVanderWilp 3:2bcc36fe4de5 175 else if(h1 == 1 && h2 == 0 && h3 == 1) //state3
BVanderWilp 3:2bcc36fe4de5 176 {
BVanderWilp 3:2bcc36fe4de5 177 Arise();
BVanderWilp 3:2bcc36fe4de5 178 Cfall();
BVanderWilp 3:2bcc36fe4de5 179 }
BVanderWilp 3:2bcc36fe4de5 180 else if(h1 == 1 && h2 == 0 && h3 == 0) //state4
BVanderWilp 3:2bcc36fe4de5 181 {
BVanderWilp 3:2bcc36fe4de5 182 Cfall();
BVanderWilp 3:2bcc36fe4de5 183 Brise();
BVanderWilp 3:2bcc36fe4de5 184 }
BVanderWilp 3:2bcc36fe4de5 185 else if(h1 == 1 && h2 == 1 && h3 == 0) //state5
BVanderWilp 3:2bcc36fe4de5 186 {
BVanderWilp 3:2bcc36fe4de5 187 Brise();
BVanderWilp 4:ab4d51b5b1c8 188 Afall();
BVanderWilp 3:2bcc36fe4de5 189 }
BVanderWilp 3:2bcc36fe4de5 190 else //state6
BVanderWilp 3:2bcc36fe4de5 191 {
BVanderWilp 3:2bcc36fe4de5 192 Afall();
BVanderWilp 4:ab4d51b5b1c8 193 Crise();
vicyap 6:f9aca07dbdb4 194 }
vicyap 6:f9aca07dbdb4 195 }
vicyap 6:f9aca07dbdb4 196
vicyap 6:f9aca07dbdb4 197 //int count = 0;
vicyap 6:f9aca07dbdb4 198 //void intcall(){
vicyap 6:f9aca07dbdb4 199 // count = (count + 1) % 6;
vicyap 6:f9aca07dbdb4 200 //
vicyap 6:f9aca07dbdb4 201 // if(count == 0) //B+, C-
vicyap 6:f9aca07dbdb4 202 // {
vicyap 6:f9aca07dbdb4 203 // phaseAEN = 0;
vicyap 6:f9aca07dbdb4 204 // phaseA.write(0);
vicyap 6:f9aca07dbdb4 205 // phaseB.write(pwmDuty);
vicyap 6:f9aca07dbdb4 206 // phaseBEN = 1;
vicyap 6:f9aca07dbdb4 207 // }
vicyap 6:f9aca07dbdb4 208 // else if(count == 1) //B+, A-
vicyap 6:f9aca07dbdb4 209 // {
vicyap 6:f9aca07dbdb4 210 // phaseCEN = 0;
vicyap 6:f9aca07dbdb4 211 // phaseAEN = 1;
vicyap 6:f9aca07dbdb4 212 // }
vicyap 6:f9aca07dbdb4 213 // else if(count == 2) //C+, A-
vicyap 6:f9aca07dbdb4 214 // {
vicyap 6:f9aca07dbdb4 215 // phaseBEN = 0;
vicyap 6:f9aca07dbdb4 216 // phaseB.write(0);
vicyap 6:f9aca07dbdb4 217 // phaseC.write(pwmDuty);
vicyap 6:f9aca07dbdb4 218 // phaseCEN = 1;
vicyap 6:f9aca07dbdb4 219 // }
vicyap 6:f9aca07dbdb4 220 // else if(count == 3) //C+, B-
vicyap 6:f9aca07dbdb4 221 // {
vicyap 6:f9aca07dbdb4 222 // phaseAEN = 0;
vicyap 6:f9aca07dbdb4 223 // phaseBEN = 1;
vicyap 6:f9aca07dbdb4 224 // }
vicyap 6:f9aca07dbdb4 225 // else if(count == 4) //A+, B-
vicyap 6:f9aca07dbdb4 226 // {
vicyap 6:f9aca07dbdb4 227 // phaseCEN = 0;
vicyap 6:f9aca07dbdb4 228 // phaseC.write(0);
vicyap 6:f9aca07dbdb4 229 // phaseA.write(pwmDuty);
vicyap 6:f9aca07dbdb4 230 // phaseAEN = 1;
vicyap 6:f9aca07dbdb4 231 // }
vicyap 6:f9aca07dbdb4 232 // else if(count == 5) //A+, C-
vicyap 6:f9aca07dbdb4 233 // {
vicyap 6:f9aca07dbdb4 234 // phaseBEN = 0;
vicyap 6:f9aca07dbdb4 235 // phaseCEN = 1;
vicyap 6:f9aca07dbdb4 236 // }
vicyap 6:f9aca07dbdb4 237 //}
vicyap 6:f9aca07dbdb4 238
vicyap 6:f9aca07dbdb4 239
vicyap 6:f9aca07dbdb4 240 int main() {
vicyap 6:f9aca07dbdb4 241 //wait until button push to start
vicyap 6:f9aca07dbdb4 242 button.rise(&activate);
vicyap 6:f9aca07dbdb4 243 while(stall == 0) {
vicyap 6:f9aca07dbdb4 244 led = !led;
vicyap 6:f9aca07dbdb4 245 wait(1);
vicyap 6:f9aca07dbdb4 246 }
vicyap 6:f9aca07dbdb4 247
vicyap 6:f9aca07dbdb4 248 // //startup with open loop
vicyap 6:f9aca07dbdb4 249 // phaseA.period_us(10);
vicyap 6:f9aca07dbdb4 250 // phaseB.period_us(10);
vicyap 6:f9aca07dbdb4 251 // phaseC.period_us(10);
vicyap 6:f9aca07dbdb4 252 // interrupt.attach(&intcall, .01);
vicyap 6:f9aca07dbdb4 253 //
vicyap 6:f9aca07dbdb4 254 //
vicyap 6:f9aca07dbdb4 255 // phaseA.write(0);
vicyap 6:f9aca07dbdb4 256 // phaseB.write(pwmDuty);
vicyap 6:f9aca07dbdb4 257 // phaseC.write(0);
vicyap 6:f9aca07dbdb4 258 //
vicyap 6:f9aca07dbdb4 259 // phaseAEN = 0;
vicyap 6:f9aca07dbdb4 260 // phaseBEN = 1;
vicyap 6:f9aca07dbdb4 261 // phaseCEN = 1;
vicyap 6:f9aca07dbdb4 262 //
vicyap 6:f9aca07dbdb4 263 // for(int i = 0; i < 4; i++)
vicyap 6:f9aca07dbdb4 264 // {
vicyap 6:f9aca07dbdb4 265 // i++;
vicyap 6:f9aca07dbdb4 266 // led = !led;
vicyap 6:f9aca07dbdb4 267 // wait(0.5);
vicyap 6:f9aca07dbdb4 268 // }
vicyap 6:f9aca07dbdb4 269 // interrupt.detach();
vicyap 6:f9aca07dbdb4 270
vicyap 6:f9aca07dbdb4 271 Init();
vicyap 6:f9aca07dbdb4 272
vicyap 6:f9aca07dbdb4 273 StartUp();
vicyap 6:f9aca07dbdb4 274
vicyap 6:f9aca07dbdb4 275 // float ADCSum = 0;
vicyap 6:f9aca07dbdb4 276 // int ADCCount = 0;
vicyap 6:f9aca07dbdb4 277
BVanderWilp 0:d445abf9a8e9 278 while(1) {
BVanderWilp 0:d445abf9a8e9 279 led = !led;
vicyap 6:f9aca07dbdb4 280 //ADCSum += pot.read();
vicyap 6:f9aca07dbdb4 281 // ADCCount++;
vicyap 6:f9aca07dbdb4 282 // if(ADCCount == 20)
vicyap 6:f9aca07dbdb4 283 // {
vicyap 6:f9aca07dbdb4 284 // pwmDuty = (ADCSum/20) * PWM_MAX;
vicyap 6:f9aca07dbdb4 285 // ADCSum = 0;
vicyap 6:f9aca07dbdb4 286 // ADCCount = 0;
vicyap 6:f9aca07dbdb4 287 // }
BVanderWilp 5:6110655353ad 288 // pwmDuty = pot.read() * 0.7;
vicyap 6:f9aca07dbdb4 289 pwmDuty = pot.buffered_read() * PWM_MAX;
BVanderWilp 5:6110655353ad 290 wait(0.05);
BVanderWilp 0:d445abf9a8e9 291 }
BVanderWilp 0:d445abf9a8e9 292 }