![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Mike Etek Controller
main.cpp
- Committer:
- austinbrown124
- Date:
- 2019-04-06
- Revision:
- 1:94193b31f0ee
- Parent:
- 0:9edd6ec0f56a
File content as of revision 1:94193b31f0ee:
#include "mbed.h" #include "fw_config.h" #include "math_ops.h" #include "Inverter.h" #include "ServoInput.h" /* PA2 goes to servo input PA3-7, PA0-1 goes to analog input (on of those) use two of either PA8, 9, 10, slaved with PA7, PB0, PB1 PA7 and PA8 for high and low sides PB6, 7 used for serial PA13, 14, reset used for programming some other random pin used for LED some other random pin used for clockpin, for debugging ====== pins finally used by mike: PA2: RC PWM PA5: clockpin PA8: gate drive */ DigitalOut clockpin(PA_5); DigitalOut led1(PB_1); DigitalIn gpio1(PA_6); //DigitalIn gpio2(PA_2); // controller modes #define REST_MODE 0 #define VOLTAGE_MODE 1 #define CURRENT_MODE 2 volatile int count = 0; volatile int main_int_count = 0; volatile unsigned int main_int_clock = 0; int controller_state = 0; Serial pc(PB_6, PB_7); Inverter inverter; ServoTimer servoinp; float a1 = 0.0f; float a2 = 0.0f; float current = 0.0f; float current_raw = 0.0f; float servo_cmd = 0.0f; int servo_low = 890; int servo_high = 1800; int servo_range = servo_high - servo_low; // Main 20khz loop Interrupt /// extern "C" void TIM1_UP_TIM16_IRQHandler(void) { if (TIM1->SR & TIM_SR_UIF ) { main_int_count++; main_int_clock++; // //current_raw = float(ADC1->DR) - float(inverter.adc1_offset); current_raw = float(ADC1->DR) - 2000; //current_raw = float(ADC1->DR)); //current = current_raw*0.1f; //depends on shunts inverter.adc2_raw = ADC2->DR; inverter.adc1_raw = ADC1->DR; clockpin = 1; servoinp.update_servo_input(); /// Check state machine state, and run the appropriate function /// switch(controller_state){ case REST_MODE: //nothing TIM1->CCR1 = 6400; count++; if(count > 20000){ count = 0; led1 = !led1; } servo_cmd = servoinp.get_servo_input(); break; case VOLTAGE_MODE: servo_cmd = servoinp.get_servo_input(); TIM1->CCR1 = 6400 - constrain((servo_cmd-880)*8.0f , 0, 6150); //0 to 96% duty cycle if(count > 10000){ count = 0; } break; case CURRENT_MODE: servo_cmd = servoinp.get_servo_input(); /* float current_setpoint = (servo_cmd-880)/100; //0 to 10 amps if (current > current_setpoint) { //set bridge state to LOW TIM1->CCR1 = 6100; } else { TIM1->CCR1 = 300; }*/ // servo inputs go from 880 to 1700 // the constant in the next line is set 1800/servo_range //float current_setpoint_raw = (servo_cmd-servo_low)*2.25f; //scales 800 range to 1800 float current_setpoint_raw = constrain((servo_cmd-servo_low)*2.0f , 0, 800); //scales 800 range to 1800 if (current_raw > current_setpoint_raw) { //set bridge state to LOW TIM1->CCR1 = 6400; } else { TIM1->CCR1 = 250; } if ((servo_cmd < servo_low) & (current_raw < 200) & (current_raw > -200)) { TIM1->CCR1 = 6400; } if(count > 10000){ count = 0; } break; } } //b = TIM1->CNT; TIM1->SR = 0x0; clockpin = 0; // reset the status register } int main() { wait_ms(200); pc.baud(256000); printf("\rStarting Hardware\n"); gpio1.mode(PullUp); inverter.Init(); // Setup PWM, ADC wait(0.1); controller_state = REST_MODE; wait(0.1); inverter.zero_current(); wait(0.1); pc.printf("ADCs zeroed at "); pc.printf("%i, %i \n",inverter.adc1_offset,inverter.adc2_offset); wait(0.1); inverter.ADCsync(); //controller_state = VOLTAGE_MODE; controller_state = CURRENT_MODE; while(1) { wait_us(2); while (1==1) { wait_us(30); pc.printf("%f, ", servo_cmd); pc.printf("%f, ", current_raw); pc.printf("%f, ", float(inverter.adc1_offset)); pc.printf("%f, ", a1); pc.printf("%f, ", a2); //printf("%i, ", b3); //printf("%i, ", b4); //pc.printf("%i, ", TIM15->CNT); //pc.printf("%x ", GPIOA->AFR[0]); pc.printf("%i, ", ADC1->DR); pc.printf("%i, ", ADC2->DR); //printf(" %i, %i %i", a1, a2, a3); //if (gpio2) {pc.printf("low ");} pc.printf("\r"); } } }