BLDC motor driver
Dependencies: mbed-dev-f303 FastPWM3
Diff: main.cpp
- Revision:
- 25:f5741040c4bb
- Parent:
- 24:58c2d7571207
- Child:
- 26:2b865c00d7e9
--- a/main.cpp Fri Apr 07 16:23:39 2017 +0000 +++ b/main.cpp Sun Apr 09 03:05:52 2017 +0000 @@ -113,6 +113,7 @@ printf(" e - Display Encoder\n\r"); printf(" esc - Exit to Menu\n\r"); state_change = 0; + gpio.enable->write(0); } void enter_setup_state(void){ @@ -127,20 +128,21 @@ void enter_torque_mode(void){ controller.i_d_ref = 0; - controller.i_q_ref = 0; - reset_foc(&controller); //resets integrators, and other control loop parameters - gpio.enable->write(1); - GPIOC->ODR ^= (1 << 5); //turn on status LED + controller.i_q_ref = 1; // Current Setpoints + reset_foc(&controller); // Tesets integrators, and other control loop parameters + gpio.enable->write(1); // Enable gate drive + GPIOC->ODR ^= (1 << 5); // Turn on status LED + state_change = 0; } void calibrate(void){ - gpio.enable->write(1); - GPIOC->ODR ^= (1 << 5); - order_phases(&spi, &gpio, &controller, &prefs); - calibrate(&spi, &gpio, &controller, &prefs); - GPIOC->ODR ^= (1 << 5); + gpio.enable->write(1); // Enable gate drive + GPIOC->ODR ^= (1 << 5); // Turn on status LED + order_phases(&spi, &gpio, &controller, &prefs); // Check phase ordering + calibrate(&spi, &gpio, &controller, &prefs); // Perform calibration procedure + GPIOC->ODR ^= (1 << 5); // Turn off status LED wait(.2); - gpio.enable->write(0); + gpio.enable->write(0); // Turn off gate drive printf("\n\r Calibration complete. Press 'esc' to return to menu\n\r"); state_change = 0; @@ -160,10 +162,10 @@ //toggle = 1; ///Sample current always /// - ADC1->CR2 |= 0x40000000; //Begin sample and conversion + ADC1->CR2 |= 0x40000000; // Begin sample and conversion //volatile int delay; //for (delay = 0; delay < 55; delay++); - controller.adc2_raw = ADC2->DR; + controller.adc2_raw = ADC2->DR; // Read ADC1 and ADC2 Data Registers controller.adc1_raw = ADC1->DR; /// @@ -183,14 +185,17 @@ break; case TORQUE_MODE: // Run torque control + if(state_change){ + enter_torque_mode(); + } count++; controller.theta_elec = spi.GetElecPosition(); commutate(&controller, &gpio, controller.theta_elec); // Run current loop spi.Sample(); // Sample position sensor if(count > 100){ count = 0; - readCAN(); - controller.i_q_ref = ((float)(canCmd-1000))/100; + //readCAN(); + //controller.i_q_ref = ((float)(canCmd-1000))/100; //pc.printf("%f\n\r ", controller.theta_elec); } break; @@ -213,20 +218,25 @@ TIM1->SR = 0x0; // reset the status register } -/// Manage state machine with commands from serial terminal or configurator gui /// + char cmd_val[8] = {0}; char cmd_id = 0; +char char_count = 0; -char char_count = 0; +/// Manage state machine with commands from serial terminal or configurator gui /// +/// Called when data received over serial /// void serial_interrupt(void){ while(pc.readable()){ char c = pc.getc(); + if(c == 27){ + state = REST_MODE; + state_change = 1; + char_count = 0; + cmd_id = 0; + for(int i = 0; i<8; i++){cmd_val[i] = 0;} + } if(state == REST_MODE){ switch (c){ - case 27: - state = REST_MODE; - state_change = 1; - break; case 'c': state = CALIBRATION_MODE; state_change = 1; @@ -246,14 +256,7 @@ } } else if(state == SETUP_MODE){ - if(c == 27){ - state = REST_MODE; - state_change = 1; - char_count = 0; - cmd_id = 0; - for(int i = 0; i<8; i++){cmd_val[i] = 0;} - } - else if(c == 13){ + if(c == 13){ switch (cmd_id){ case 'b': I_BW = fmaxf(fminf(atof(cmd_val), 2000.0f), 100.0f); @@ -302,11 +305,8 @@ int main() { - - controller.v_bus = V_BUS; controller.mode = 0; - //spi.ZeroPosition(); Init_All_HW(&gpio); // Setup PWM, ADC, GPIO wait(.1); @@ -329,11 +329,11 @@ can.filter(0x020 << 25, 0xF0000004, CANAny, 0); - prefs.load(); - spi.SetElecOffset(E_OFFSET); + prefs.load(); // Read flash + spi.SetElecOffset(E_OFFSET); // Set position sensor offset int lut[128] = {0}; memcpy(&lut, &ENCODER_LUT, sizeof(lut)); - spi.WriteLUT(lut); + spi.WriteLUT(lut); // Set potision sensor nonlinearity lookup table pc.baud(115200); // set serial baud rate wait(.01); @@ -347,11 +347,6 @@ pc.attach(&serial_interrupt); // attach serial interrupt state_change = 1; - //enter_menu_state(); //Print available commands, wait for command - //enter_calibration_mode(); - //wait_us(100); - - //enter_torque_mode(); while(1) {