Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Revision 52:8e74c22ed89f, committed 2019-07-21
- Comitter:
- benkatz
- Date:
- Sun Jul 21 21:42:49 2019 +0000
- Parent:
- 51:6cd89bd6fcaa
- Commit message:
- testing gb-54;
Changed in this revision
--- a/CAN/CAN_com.cpp Wed Jul 17 03:40:12 2019 +0000 +++ b/CAN/CAN_com.cpp Sun Jul 21 21:42:49 2019 +0000 @@ -6,9 +6,9 @@ #define V_MIN -45.0f #define V_MAX 45.0f #define KP_MIN 0.0f - #define KP_MAX 500.0f + #define KP_MAX 50.0f #define KD_MIN 0.0f - #define KD_MAX 5.0f + #define KD_MAX 0.5f #define T_MIN -18.0f #define T_MAX 18.0f
--- a/Calibration/calibration.cpp Wed Jul 17 03:40:12 2019 +0000 +++ b/Calibration/calibration.cpp Sun Jul 21 21:42:49 2019 +0000 @@ -59,14 +59,18 @@ printf("%.4f %.4f\n\r", theta_ref/(NPP), theta_actual); } sample_counter++; - theta_ref += 0.001f; + theta_ref += 0.0005f; } float theta_end = ps->GetMechPositionFixed(); int direction = (theta_end - theta_start)>0; + float ratio = abs(4.0f*PI/(theta_end-theta_start)); + int pole_pairs = (int) roundf(ratio); printf("Theta Start: %f Theta End: %f\n\r", theta_start, theta_end); printf("Direction: %d\n\r", direction); if(direction){printf("Phasing correct\n\r");} else if(!direction){printf("Phasing incorrect. Swapping phases V and W\n\r");} + printf("Pole Pairs: %d\n\r", pole_pairs); + NPP = pole_pairs; PHASE_ORDER = direction; } @@ -143,7 +147,7 @@ TIM1->CCR1 = (PWM_ARR>>1)*(1.0f-dtc_v); TIM1->CCR2 = (PWM_ARR>>1)*(1.0f-dtc_w); } - wait_us(100); + wait_us(200); ps->Sample(DT); } ps->Sample(DT); @@ -168,7 +172,7 @@ TIM1->CCR1 = (PWM_ARR>>1)*(1.0f-dtc_v); TIM1->CCR2 = (PWM_ARR>>1)*(1.0f-dtc_w); } - wait_us(100); + wait_us(200); ps->Sample(DT); } ps->Sample(DT); // sample position sensor
--- a/Config/current_controller_config.h Wed Jul 17 03:40:12 2019 +0000 +++ b/Config/current_controller_config.h Sun Jul 21 21:42:49 2019 +0000 @@ -4,9 +4,9 @@ // Current controller/// #define K_D .05f // Loop gain, Volts/Amp #define K_Q .05f // Loop gain, Volts/Amp -#define K_SCALE 0.0001f // K_loop/Loop BW (Hz) 0.0042 -#define KI_D 0.0255f // PI zero, in radians per sample -#define KI_Q 0.0255f // PI zero, in radians per sample +#define K_SCALE 0.0004f // K_loop/Loop BW (Hz) 0.0042 +#define KI_D 0.031f // PI zero, in radians per sample +#define KI_Q 0.031f // PI zero, in radians per sample #define V_BUS 24.0f // Volts #define OVERMODULATION 1.15f // 1.0 = no overmodulation
--- a/Config/motor_config.h Wed Jul 17 03:40:12 2019 +0000 +++ b/Config/motor_config.h Sun Jul 21 21:42:49 2019 +0000 @@ -1,14 +1,13 @@ #ifndef MOTOR_CONFIG_H #define MOTOR_CONFIG_H -#define R_PHASE 0.13f //Ohms -#define L_D 0.00002f //Henries -#define L_Q 0.00002f //Henries -#define KT .08f //N-m per peak phase amp, = WB*NPP*3/2 -#define NPP 21 //Number of pole pairs +#define R_PHASE 7.5f //Ohms +#define L_D 0.006f //Henries +#define L_Q 0.006f //Henries +#define KT 0.268f //N-m per peak phase amp, = WB*NPP*3/2 #define GR 1.0f //Gear ratio -#define KT_OUT 0.45f //KT*GR -#define WB 0.0025f //Flux linkage, Webers. +#define KT_OUT 0.268f //KT*GR +#define WB 0.025f //Flux linkage, Webers. #define R_TH 1.25f //Kelvin per watt #define INV_M_TH 0.03125f //Kelvin per joule
--- a/Config/user_config.h Wed Jul 17 03:40:12 2019 +0000 +++ b/Config/user_config.h Sun Jul 21 21:42:49 2019 +0000 @@ -1,4 +1,4 @@ -/// Values stored in flash, which are modifieable by user actions /// +/// Values stored in flash /// #ifndef USER_CONFIG_H #define USER_CONFIG_H @@ -13,10 +13,12 @@ #define I_FW_MAX __float_reg[6] // Maximum field weakening current + #define PHASE_ORDER __int_reg[0] // Phase swapping during calibration #define CAN_ID __int_reg[1] // CAN bus ID #define CAN_MASTER __int_reg[2] // CAN bus "master" ID #define CAN_TIMEOUT __int_reg[3] // CAN bus timeout period +#define NPP __int_reg[4] // Number of Pole-Pairs #define ENCODER_LUT __int_reg[5] // Encoder offset LUT - 128 elements long
--- a/DRV8323/DRV.cpp Wed Jul 17 03:40:12 2019 +0000 +++ b/DRV8323/DRV.cpp Sun Jul 21 21:42:49 2019 +0000 @@ -73,7 +73,11 @@ uint16_t val2 = read_FSR2(); wait_us(10); - if(val1 & (1<<10)){printf("\n\rFAULT\n\r");} + if(val1 & (1<<10)) + { + printf("\n\rFAULT\n\r"); + fault = 1; + } if(val1 & (1<<9)){printf("VDS_OCP\n\r");} if(val1 & (1<<8)){printf("GDF\n\r");} @@ -104,6 +108,7 @@ uint16_t val = (read_register(DCR)) & (~(0x1<<2)); write_register(DCR, val); } + void DRV832x::disable_gd(void) { @@ -115,4 +120,9 @@ { uint16_t val = 0x1<<4 + 0x1<<3 + 0x1<<2; write_register(CSACR, val); - } \ No newline at end of file + } + +int DRV832x::get_fault(void) +{ + return fault; +}
--- a/DRV8323/DRV.h Wed Jul 17 03:40:12 2019 +0000 +++ b/DRV8323/DRV.h Sun Jul 21 21:42:49 2019 +0000 @@ -164,10 +164,12 @@ void disable_gd(void); void calibrate(void); void print_faults(); + int get_fault(); private: SPI *_spi; DigitalOut *_cs; + int fault; uint16_t spi_write(uint16_t val); };
--- a/FOC/foc.cpp Wed Jul 17 03:40:12 2019 +0000 +++ b/FOC/foc.cpp Sun Jul 21 21:42:49 2019 +0000 @@ -65,18 +65,18 @@ void zero_current(int *offset_1, int *offset_2){ // Measure zero-offset of the current sensors int adc1_offset = 0; int adc2_offset = 0; - int n = 1024; + int n = 2048; for (int i = 0; i<n; i++){ // Average n samples of the ADC TIM1->CCR3 = (PWM_ARR>>1)*(1.0f); // Write duty cycles TIM1->CCR2 = (PWM_ARR>>1)*(1.0f); TIM1->CCR1 = (PWM_ARR>>1)*(1.0f); ADC1->CR2 |= 0x40000000; // Begin sample and conversion - wait(.001); + wait(.0001); adc2_offset += ADC2->DR; adc1_offset += ADC1->DR; } - *offset_1 = adc1_offset/n; - *offset_2 = adc2_offset/n; + *offset_1 = (int)((float)adc1_offset/(float)n); + *offset_2 = (int)((float)adc2_offset/(float)n); } void init_controller_params(ControllerStruct *controller){ @@ -196,8 +196,8 @@ limit_norm(&controller->v_d, &controller->v_q, OVERMODULATION*controller->v_bus); // Normalize voltage vector to lie within curcle of radius v_bus float dtc_d = controller->v_d/controller->v_bus; float dtc_q = controller->v_q/controller->v_bus; - linearize_dtc(&dtc_d); - linearize_dtc(&dtc_q); + //linearize_dtc(&dtc_d); + //linearize_dtc(&dtc_q); controller->v_d = dtc_d*controller->v_bus; controller->v_q = dtc_q*controller->v_bus; abc(controller->theta_elec + 0.0f*DT*controller->dtheta_elec, controller->v_d, controller->v_q, &controller->v_u, &controller->v_v, &controller->v_w); //inverse dq0 transform on voltages
--- a/PositionSensor/PositionSensor.cpp Wed Jul 17 03:40:12 2019 +0000 +++ b/PositionSensor/PositionSensor.cpp Sun Jul 21 21:42:49 2019 +0000 @@ -8,7 +8,7 @@ PositionSensorAM5147::PositionSensorAM5147(int CPR, float offset, int ppairs){ //_CPR = CPR; _CPR = CPR; - _ppairs = ppairs; + //_ppairs = ppairs; ElecOffset = offset; rotations = 0; spi = new SPI(PC_12, PC_11, PC_10); @@ -125,7 +125,11 @@ void PositionSensorAM5147::WriteLUT(int new_lut[128]){ memcpy(offset_lut, new_lut, sizeof(offset_lut)); } - + +void PositionSensorAM5147::SetNPP(int npp) +{ + _ppairs = npp; +} PositionSensorEncoder::PositionSensorEncoder(int CPR, float offset, int ppairs) {
--- a/PositionSensor/PositionSensor.h Wed Jul 17 03:40:12 2019 +0000 +++ b/PositionSensor/PositionSensor.h Sun Jul 21 21:42:49 2019 +0000 @@ -12,7 +12,8 @@ virtual int GetRawPosition(void) = 0; virtual void SetElecOffset(float offset) = 0; virtual int GetCPR(void) = 0; - virtual void WriteLUT(int new_lut[128]) = 0; + virtual void WriteLUT(int new_lut[128]) = 0; + virtual void SetNPP(int npp) = 0; }; @@ -56,6 +57,7 @@ virtual void SetMechOffset(float offset); virtual int GetCPR(void); virtual void WriteLUT(int new_lut[128]); + virtual void SetNPP(int npp); private: float position, ElecPosition, ElecOffset, MechPosition, MechOffset, modPosition, oldModPosition, oldVel, velVec[40], MechVelocity, ElecVelocity, ElecVelocityFilt; int raw, _CPR, rotations, old_counts, _ppairs;
--- a/main.cpp Wed Jul 17 03:40:12 2019 +0000 +++ b/main.cpp Sun Jul 21 21:42:49 2019 +0000 @@ -52,7 +52,7 @@ //DigitalOut drv_en_gate(PA_11); DRV832x drv(&drv_spi, &drv_cs); -PositionSensorAM5147 spi(16384, 0.0, NPP); +PositionSensorAM5147 spi(16384, 0.0, 0.0); volatile int count = 0; volatile int state = REST_MODE; @@ -221,6 +221,7 @@ controller.kd = 0; controller.t_ff = 0; } + torque_control(&controller); commutate(&controller, &observer, &gpio, controller.theta_elec); // Run current loop @@ -413,8 +414,10 @@ if(isnan(CAN_ID) || CAN_ID==-1){CAN_ID = 1;} if(isnan(CAN_MASTER) || CAN_MASTER==-1){CAN_MASTER = 0;} if(isnan(CAN_TIMEOUT) || CAN_TIMEOUT==-1){CAN_TIMEOUT = 0;} + if(isnan(NPP) || NPP==-1){NPP = 1;} spi.SetElecOffset(E_OFFSET); // Set position sensor offset spi.SetMechOffset(M_OFFSET); + spi.SetNPP(NPP); int lut[128] = {0}; memcpy(&lut, &ENCODER_LUT, sizeof(lut)); spi.WriteLUT(lut); // Set potision sensor nonlinearity lookup table @@ -430,6 +433,7 @@ printf(" Position Sensor Electrical Offset: %.4f\n\r", E_OFFSET); printf(" Output Zero Position: %.4f\n\r", M_OFFSET); printf(" CAN ID: %d\n\r", CAN_ID); + printf(" Pole-Pairs: %d\n\r", NPP); @@ -448,8 +452,10 @@ int counter = 0; while(1) { + drv.print_faults(); - wait(.1); + //if(drv.get_fault()>0){drv.write_DCR(0x0, 0x0, 0x0, PWM_MODE_3X, 0x0, 0x0, 0x0, 0x0, 0x1);} + wait(.1); //printf("%.4f\n\r", controller.v_bus); /* if(state == MOTOR_MODE)