From 285f65b4a6c7499fc30f16a69eec6a9c8bf8db29 Mon Sep 17 00:00:00 2001 From: EmanuelFeru Date: Tue, 18 Jun 2019 18:07:14 +0200 Subject: [PATCH] Added some back-up files --- .../BLDCmotorDerating_R2017b.slx | Bin 0 -> 31635 bytes 01_Matlab/99_RecycleBin/bldc_motor_derating.c | 258 ++++++++++++++++++ 01_Matlab/99_RecycleBin/init_model_derating.m | 15 + 3 files changed, 273 insertions(+) create mode 100644 01_Matlab/99_RecycleBin/BLDCmotorDerating_R2017b.slx create mode 100644 01_Matlab/99_RecycleBin/bldc_motor_derating.c create mode 100644 01_Matlab/99_RecycleBin/init_model_derating.m diff --git a/01_Matlab/99_RecycleBin/BLDCmotorDerating_R2017b.slx b/01_Matlab/99_RecycleBin/BLDCmotorDerating_R2017b.slx new file mode 100644 index 0000000000000000000000000000000000000000..bf9de567b1a71d2ccc9cdc5744bdc7f636e82ffd GIT binary patch literal 31635 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

}Q_ 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 Z} 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 lower energy consumption +* +* Copyright (C) 2019 Emanuel FERU +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +*/ + +#include "stm32f1xx_hal.h" +#include "defines.h" +#include "setup.h" +#include "config.h" + +// Matlab includes and defines - from auto-code generation +// ############################################################################### +#include "BLDC_controller.h" /* Model's header file */ +#include "rtwtypes.h" + +extern RT_MODEL *const rtM_Left; +extern RT_MODEL *const rtM_Right; + +extern DW rtDW_Left; /* Observable states */ +extern ExtU rtU_Left; /* External inputs */ +extern ExtY rtY_Left; /* External outputs */ + +extern DW rtDW_Right; /* Observable states */ +extern ExtU rtU_Right; /* External inputs */ +extern ExtY rtY_Right; /* External outputs */ +// ############################################################################### + + +volatile int pwml = 0; +volatile int pwmr = 0; + +int pwm_limiter = 1024; + +extern volatile adc_buf_t adc_buffer; + +extern volatile uint32_t timeout; + +uint8_t buzzerFreq = 0; +uint8_t buzzerPattern = 0; +static uint32_t buzzerTimer = 0; + +uint8_t enable = 0; + +static const uint16_t pwm_res = 64000000 / 2 / PWM_FREQ; // = 2000 +static float pwml_lim = 0; +static float curl_filt = 0; +float CUR; + +static int offsetcount = 0; +static int offsetrl1 = 2000; +static int offsetrl2 = 2000; +static int offsetrr1 = 2000; +static int offsetrr2 = 2000; +static int offsetdcl = 2000; +static int offsetdcr = 2000; + +float batteryVoltage = BAT_NUMBER_OF_CELLS * 4.0; + +//scan 8 channels with 2ADCs @ 20 clk cycles per sample +//meaning ~80 ADC clock cycles @ 8MHz until new DMA interrupt =~ 100KHz +//=640 cpu cycles +void DMA1_Channel1_IRQHandler(void) { + + DMA1->IFCR = DMA_IFCR_CTCIF1; + // HAL_GPIO_WritePin(LED_PORT, LED_PIN, 1); + // HAL_GPIO_TogglePin(LED_PORT, LED_PIN); + + if(offsetcount < 1000) { // calibrate ADC offsets + offsetcount++; + offsetrl1 = (adc_buffer.rl1 + offsetrl1) / 2; + offsetrl2 = (adc_buffer.rl2 + offsetrl2) / 2; + offsetrr1 = (adc_buffer.rr1 + offsetrr1) / 2; + offsetrr2 = (adc_buffer.rr2 + offsetrr2) / 2; + offsetdcl = (adc_buffer.dcl + offsetdcl) / 2; + offsetdcr = (adc_buffer.dcr + offsetdcr) / 2; + return; + } + + if (buzzerTimer % 1000 == 0) { // because you get float rounding errors if it would run every time + batteryVoltage = batteryVoltage * 0.99f + ((float)adc_buffer.batt1 * ((float)BAT_CALIB_REAL_VOLTAGE / (float)BAT_CALIB_ADC)) * 0.01f; + } + + // //disable PWM when current limit is reached (current chopping) + // if(ABS((adc_buffer.dcl - offsetdcl) * MOTOR_AMP_CONV_DC_AMP) > DC_CUR_LIMIT || timeout > TIMEOUT || enable == 0) { + // LEFT_TIM->BDTR &= ~TIM_BDTR_MOE; + // //HAL_GPIO_WritePin(LED_PORT, LED_PIN, 1); + // } else { + // LEFT_TIM->BDTR |= TIM_BDTR_MOE; + // //HAL_GPIO_WritePin(LED_PORT, LED_PIN, 0); + // } + + // if(ABS((adc_buffer.dcr - offsetdcr) * MOTOR_AMP_CONV_DC_AMP) > DC_CUR_LIMIT || timeout > TIMEOUT || enable == 0) { + // RIGHT_TIM->BDTR &= ~TIM_BDTR_MOE; + // } else { + // RIGHT_TIM->BDTR |= TIM_BDTR_MOE; + // } + + //disable PWM when current limit is reached (current chopping) + if(timeout > TIMEOUT || enable == 0) { + LEFT_TIM->BDTR &= ~TIM_BDTR_MOE; + //HAL_GPIO_WritePin(LED_PORT, LED_PIN, 1); + } else { + LEFT_TIM->BDTR |= TIM_BDTR_MOE; + //HAL_GPIO_WritePin(LED_PORT, LED_PIN, 0); + } + + if(timeout > TIMEOUT || enable == 0) { + RIGHT_TIM->BDTR &= ~TIM_BDTR_MOE; + } else { + RIGHT_TIM->BDTR |= TIM_BDTR_MOE; + } + + // pwml_lim = pwml_lim + 0.001f * (ABS((adc_buffer.dcr - offsetdcr) * MOTOR_AMP_CONV_DC_AMP) - DC_CUR_LIMIT); + // pwml_lim = CLAMP(pwml_lim, 0, ABS(pwmr)); + // pwmr = (int) (pwmr - SIGN(pwmr) * pwml_lim); + + // if (ABS((adc_buffer.dcl - offsetdcl) * MOTOR_AMP_CONV_DC_AMP) > DC_CUR_LIMIT) + // pwml_lim = pwml_lim + 0.00001f; + // else + // pwml_lim = pwml_lim - 0.00001f; (pwml_lim * (1.0f - FILTER) + cmd2 * FILTER) + + float CUR_FILTER = 0.1f; // 0.00001f; + curl_filt = ((100.0f - CUR_FILTER) * curl_filt + CUR_FILTER * ABS((adc_buffer.dcl - offsetdcl) * MOTOR_AMP_CONV_DC_AMP)) / 100; + // curl_filt = ABS((adc_buffer.dcl - offsetdcl) * MOTOR_AMP_CONV_DC_AMP); + // pwml_lim = pwml_lim + 1 * (curl_filt - DC_CUR_LIMIT); + pwml_lim = 2 * (curl_filt - DC_CUR_LIMIT); + pwml_lim = CLAMP(pwml_lim, 0, ABS(pwml)); + pwml = (int) (pwml - SIGN(pwml) * pwml_lim); + + // if(curl_filt > DC_CUR_LIMIT) { + // pwml_lim+=0.1f; + // HAL_GPIO_WritePin(LED_PORT, LED_PIN, 1); // Derating active + // } else { + // pwml_lim-=0.1f; + // HAL_GPIO_WritePin(LED_PORT, LED_PIN, 0); // Derating deactive + // } + // pwml_lim = CLAMP(pwml_lim/1000, 0, ABS(pwml)); + // pwml = (int) (pwml - SIGN(pwml) * pwml_lim); + + + // DC_CUR = MAX(ABS((adc_buffer.dcl - offsetdcl) * MOTOR_AMP_CONV_DC_AMP), ABS((adc_buffer.dcr - offsetdcr) * MOTOR_AMP_CONV_DC_AMP)); + +// CUR = curl_filt; + CUR = (adc_buffer.rl1 - offsetrl1) * MOTOR_AMP_CONV_DC_AMP; + // if(ABS((adc_buffer.dcl - offsetdcl) * MOTOR_AMP_CONV_DC_AMP) > DC_CUR_LIMIT) { + // pwm_limiter--; + // HAL_GPIO_WritePin(LED_PORT, LED_PIN, 1); // Derating active + // } else { + // pwm_limiter++; + // HAL_GPIO_WritePin(LED_PORT, LED_PIN, 0); // Derating deactive + // } + // pwm_limiter = CLAMP(pwm_limiter, 0, 1024); + // pwml = (pwm_limiter*pwml) >> 10; + // pwmr = CLAMP(pwmr, -pwm_lim, pwm_lim); + + //create square wave for buzzer + buzzerTimer++; + if (buzzerFreq != 0 && (buzzerTimer / 5000) % (buzzerPattern + 1) == 0) { + if (buzzerTimer % buzzerFreq == 0) { + HAL_GPIO_TogglePin(BUZZER_PORT, BUZZER_PIN); + } + } else { + HAL_GPIO_WritePin(BUZZER_PORT, BUZZER_PIN, 0); + } + + // ############################### MOTOR CONTROL ############################### + + static boolean_T OverrunFlag = false; + /* Check for overrun */ + if (OverrunFlag) { + return; + } + OverrunFlag = true; + + int ul, vl, wl; + int ur, vr, wr; + // ========================= LEFT MOTOR ============================ + // Get hall sensors values + uint8_t hall_ul = !(LEFT_HALL_U_PORT->IDR & LEFT_HALL_U_PIN); + uint8_t hall_vl = !(LEFT_HALL_V_PORT->IDR & LEFT_HALL_V_PIN); + uint8_t hall_wl = !(LEFT_HALL_W_PORT->IDR & LEFT_HALL_W_PIN); + + /* Set motor inputs here */ + rtU_Left.b_hallA = hall_ul; + rtU_Left.b_hallB = hall_vl; + rtU_Left.b_hallC = hall_wl; + rtU_Left.r_DC = pwml; + + /* Step the controller */ + BLDC_controller_step(rtM_Left); + + /* Get motor outputs here */ + ul = rtY_Left.DC_phaA; + vl = rtY_Left.DC_phaB; + wl = rtY_Left.DC_phaC; + // motSpeedLeft = rtY_Left.n_mot; + // motAngleLeft = rtY_Left.a_elecAngle; + + /* Apply commands */ + LEFT_TIM->LEFT_TIM_U = (uint16_t)CLAMP(ul + pwm_res / 2, 10, pwm_res-10); + LEFT_TIM->LEFT_TIM_V = (uint16_t)CLAMP(vl + pwm_res / 2, 10, pwm_res-10); + LEFT_TIM->LEFT_TIM_W = (uint16_t)CLAMP(wl + pwm_res / 2, 10, pwm_res-10); + // ================================================================= + + + // ========================= RIGHT MOTOR =========================== + // Get hall sensors values + uint8_t hall_ur = !(RIGHT_HALL_U_PORT->IDR & RIGHT_HALL_U_PIN); + uint8_t hall_vr = !(RIGHT_HALL_V_PORT->IDR & RIGHT_HALL_V_PIN); + uint8_t hall_wr = !(RIGHT_HALL_W_PORT->IDR & RIGHT_HALL_W_PIN); + + /* Set motor inputs here */ + rtU_Right.b_hallA = hall_ur; + rtU_Right.b_hallB = hall_vr; + rtU_Right.b_hallC = hall_wr; + rtU_Right.r_DC = pwmr; + + /* Step the controller */ + BLDC_controller_step(rtM_Right); + + /* Get motor outputs here */ + ur = rtY_Right.DC_phaA; + vr = rtY_Right.DC_phaB; + wr = rtY_Right.DC_phaC; + // motSpeedRight = rtY_Right.n_mot; + // motAngleRight = rtY_Right.a_elecAngle; + + /* Apply commands */ + RIGHT_TIM->RIGHT_TIM_U = (uint16_t)CLAMP(ur + pwm_res / 2, 10, pwm_res-10); + RIGHT_TIM->RIGHT_TIM_V = (uint16_t)CLAMP(vr + pwm_res / 2, 10, pwm_res-10); + RIGHT_TIM->RIGHT_TIM_W = (uint16_t)CLAMP(wr + pwm_res / 2, 10, pwm_res-10); + // ================================================================= + + /* Indicate task complete */ + OverrunFlag = false; + + // ############################################################################### + +} diff --git a/01_Matlab/99_RecycleBin/init_model_derating.m b/01_Matlab/99_RecycleBin/init_model_derating.m new file mode 100644 index 0000000..a31c456 --- /dev/null +++ b/01_Matlab/99_RecycleBin/init_model_derating.m @@ -0,0 +1,15 @@ + + +Ts_ctrl = 6e-5; % [s] Controller samplid time (~16 kHz) +% Ts_ctrl = 12e-5; % [s] Controller samplid time (~8 kHz) +f_ctrl = 1/Ts_ctrl; % [Hz] Controller frequency = 1/Ts_ctrl + +%% Motor Current Derating Parameters +PWM_LIM_MAX = 1000; +t_DC_CUR_DER = 2000; % [ms] +t_DC_CUR_REC = 2000; +DC_CUR_LIM_CONT = 15; +DC_CUR_LIM_PEAK = 20; + +dt_curLimDer = PWM_LIM_MAX / t_DC_CUR_DER / (f_ctrl / 1000); +dt_curLimRec = - PWM_LIM_MAX / t_DC_CUR_REC / (f_ctrl / 1000); \ No newline at end of file