From cfde78e9dc75e7185472833080a4cf31dabe515d Mon Sep 17 00:00:00 2001 From: MQjehovah <1421706030@qq.com> Date: Tue, 29 Aug 2023 14:57:24 +0800 Subject: [PATCH] fix --- project/cmake/toolchain-arm-none-eabi.cmake | 13 +++++++ src/App/main.c | 13 +++++-- src/Bsp/board.h | 3 +- src/Foc/foc.h | 29 +++++++++++++++ src/Foc/svpwm.c | 39 ++++++--------------- src/Foc/svpwm.h | 9 ----- 6 files changed, 66 insertions(+), 40 deletions(-) create mode 100644 src/Foc/foc.h diff --git a/project/cmake/toolchain-arm-none-eabi.cmake b/project/cmake/toolchain-arm-none-eabi.cmake index cdaa41b..0ede6dc 100644 --- a/project/cmake/toolchain-arm-none-eabi.cmake +++ b/project/cmake/toolchain-arm-none-eabi.cmake @@ -28,6 +28,19 @@ elseif(UNIX) endif() +# set(MCU_FLAGS "-mcpu=cortex-m4 -mthumb -mthumb-interwork -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections") +# +# set(CMAKE_ASM_FLAGS "-c ${MCU_FLAGS} -x assembler-with-cpp -Wa,-mimplicit-it=thumb -gdwarf-2") +# +# set(CMAKE_C_FLAGS "${MCU_FLAGS} -Dgcc -w -Wno-unknown-pragmas -O0 -gdwarf-2 -g") +# set(CMAKE_C_FLAGS_DEBUG "-O0 -gdwarf-2 -g") +# set(CMAKE_C_FLAGS_RELEASE "-O3") +# +# set(LINKER_SCRIPT STM32F407ZGTX_FLASH.ld) +# set(CMAKE_EXE_LINKER_FLAGS "${MCU_FLAGS} -Wl,--gc-sections,-Map=${PROJECT_NAME}.map,--cref,-u,Reset_Handler -T${LINKER_SCRIPT}") +# set(CMAKE_EXE_LINKER_FLAGS "--specs=nano.specs -specs=nosys.specs -nostartfiles -T${LINKER_SCRIPT} -Wl,-Map=${PROJECT_BINARY_DIR}/${PROJECT_NAME}.map,--cref -Wl,--gc-sections") + + # find additional toolchain executables find_program(ARM_SIZE_EXECUTABLE arm-none-eabi-size) find_program(ARM_GDB_EXECUTABLE arm-none-eabi-gdb) diff --git a/src/App/main.c b/src/App/main.c index 966b243..200c1d8 100644 --- a/src/App/main.c +++ b/src/App/main.c @@ -12,7 +12,7 @@ #include "main.h" hall_handle_t hall_handle; - +foc_handle_t foc_handle; /* Function ------------------------------------------------------------------*/ @@ -23,7 +23,16 @@ hall_handle_t hall_handle; int main(void) { board_init(); - + // // FOC控制流程 + // foc_handle.Vqd.d = 0; + // foc_handle.Vqd.q = 1; + // // 获取电角度 + // // int16_t control_elec_angle = hall_handle.control_elec_angle; + // hall_handle.control_elec_angle++; + // // 计算Valpha Vbeta + // alphabeta_t Valphabeta = math_rev_park(foc_handle.Vqd, hall_handle.control_elec_angle); + // // 计算SVPWM输出 + // // svmpw() while (1) { led_ctrl(1); diff --git a/src/Bsp/board.h b/src/Bsp/board.h index 231559e..7906109 100644 --- a/src/Bsp/board.h +++ b/src/Bsp/board.h @@ -20,10 +20,11 @@ extern "C" #include "stm32f4xx_hal.h" + #include "usart.h" #include "gpio.h" -#include "hall.h" +#include "foc.h" /* Functions ----------------------------------------------------------------*/ diff --git a/src/Foc/foc.h b/src/Foc/foc.h new file mode 100644 index 0000000..8847ae7 --- /dev/null +++ b/src/Foc/foc.h @@ -0,0 +1,29 @@ +/** + * @file foc.h + * @author jimingqing + * @date 2023-08-29 + * @version 0.0.1 + * @copyright XiazhiTech Copyright (c) 2023 + * + * @brief + */ + +#include "stm32f407xx.h" + +#include "type.h" +#include "math.h" +#include "hall.h" +#include "svpwm.h" + +typedef struct +{ + uint8_t sector; // 扇区 + + qd_t Vqd; + + uint16_t pwmA; + uint16_t pwmB; + uint16_t pwmC; + uint16_t pwm_period; + +} foc_handle_t; \ No newline at end of file diff --git a/src/Foc/svpwm.c b/src/Foc/svpwm.c index b5e404f..f39cb75 100644 --- a/src/Foc/svpwm.c +++ b/src/Foc/svpwm.c @@ -1,11 +1,12 @@ -#include "svpwm.h" +#include "foc.h" -void svpwm(foc_handle_t *handle, int16_t alpha, int16_t beta) +void svpwm(foc_handle_t *handle, alphabeta_t v) { int32_t wX, wY, wZ, wUAlpha, wUBeta, wTimePhA, wTimePhB, wTimePhC; - wUAlpha = alpha * (int32_t)handle->hT_Sqrt3; - wUBeta = -(beta * (int32_t)(handle->PWMperiod)) * 2; + // 后续还要根据该变量算三相占空比,所以这里乘以了周期T + wUAlpha = v.alpha * (int32_t)(1.732051f * handle->pwm_period) * 2; + wUBeta = -(v.beta * (int32_t)(handle->pwm_period)) * 2; wX = wUBeta; wY = (wUBeta + wUAlpha) / 2; @@ -17,33 +18,24 @@ void svpwm(foc_handle_t *handle, int16_t alpha, int16_t beta) if (wZ < 0) { handle->sector = SECTOR_5; - wTimePhA = (int32_t)(pHandle->PWMperiod) / 4 + ((wY - wZ) / (int32_t)262144); + wTimePhA = (int32_t)(handle->pwm_period) / 4 + ((wY - wZ) / (int32_t)262144); wTimePhB = wTimePhA + wZ / 131072; wTimePhC = wTimePhA - wY / 131072; - pHandle->lowDuty = wTimePhC; - pHandle->midDuty = wTimePhA; - pHandle->highDuty = wTimePhB; } else /* wZ >= 0 */ if (wX <= 0) { handle->sector = SECTOR_4; - wTimePhA = (int32_t)(pHandle->PWMperiod) / 4 + ((wX - wZ) / (int32_t)262144); + wTimePhA = (int32_t)(handle->pwm_period) / 4 + ((wX - wZ) / (int32_t)262144); wTimePhB = wTimePhA + wZ / 131072; wTimePhC = wTimePhB - wX / 131072; - pHandle->lowDuty = wTimePhC; - pHandle->midDuty = wTimePhB; - pHandle->highDuty = wTimePhA; } else /* wX > 0 */ { handle->sector = SECTOR_3; - wTimePhA = (int32_t)(pHandle->PWMperiod) / 4 + ((wY - wX) / (int32_t)262144); + wTimePhA = (int32_t)(handle->pwm_period) / 4 + ((wY - wX) / (int32_t)262144); wTimePhC = wTimePhA - wY / 131072; wTimePhB = wTimePhC + wX / 131072; - pHandle->lowDuty = wTimePhB; - pHandle->midDuty = wTimePhC; - pHandle->highDuty = wTimePhA; } } else /* wY > 0 */ @@ -51,33 +43,24 @@ void svpwm(foc_handle_t *handle, int16_t alpha, int16_t beta) if (wZ >= 0) { handle->sector = SECTOR_2; - wTimePhA = (int32_t)(pHandle->PWMperiod) / 4 + ((wY - wZ) / (int32_t)262144); + wTimePhA = (int32_t)(handle->pwm_period) / 4 + ((wY - wZ) / (int32_t)262144); wTimePhB = wTimePhA + wZ / 131072; wTimePhC = wTimePhA - wY / 131072; - pHandle->lowDuty = wTimePhB; - pHandle->midDuty = wTimePhA; - pHandle->highDuty = wTimePhC; } else /* wZ < 0 */ if (wX <= 0) { handle->sector = SECTOR_6; - wTimePhA = (int32_t)(pHandle->PWMperiod) / 4 + ((wY - wX) / (int32_t)262144); + wTimePhA = (int32_t)(handle->pwm_period) / 4 + ((wY - wX) / (int32_t)262144); wTimePhC = wTimePhA - wY / 131072; wTimePhB = wTimePhC + wX / 131072; - pHandle->lowDuty = wTimePhA; - pHandle->midDuty = wTimePhC; - pHandle->highDuty = wTimePhB; } else /* wX > 0 */ { handle->sector = SECTOR_1; - wTimePhA = (int32_t)(pHandle->PWMperiod) / 4 + ((wX - wZ) / (int32_t)262144); + wTimePhA = (int32_t)(handle->pwm_period) / 4 + ((wX - wZ) / (int32_t)262144); wTimePhB = wTimePhA + wZ / 131072; wTimePhC = wTimePhB - wX / 131072; - pHandle->lowDuty = wTimePhA; - pHandle->midDuty = wTimePhB; - pHandle->highDuty = wTimePhC; } } diff --git a/src/Foc/svpwm.h b/src/Foc/svpwm.h index bae512c..b2548b3 100644 --- a/src/Foc/svpwm.h +++ b/src/Foc/svpwm.h @@ -17,12 +17,3 @@ #define SECTOR_5 4u #define SECTOR_6 5u -typedef struct -{ - uint8_t sector; // 扇区 - - uint16_t pwmA; - uint16_t pwmB; - uint16_t pwmC; - -} foc_handle_t; \ No newline at end of file