This commit is contained in:
MQjehovah 2023-08-29 14:57:24 +08:00
parent fa67d84a46
commit cfde78e9dc
6 changed files with 66 additions and 40 deletions

View File

@ -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)

View File

@ -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);

View File

@ -20,10 +20,11 @@ extern "C"
#include "stm32f4xx_hal.h"
#include "usart.h"
#include "gpio.h"
#include "hall.h"
#include "foc.h"
/* Functions ----------------------------------------------------------------*/

29
src/Foc/foc.h Normal file
View File

@ -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;

View File

@ -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;
}
}

View File

@ -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;