更新VT13驱动(还没试)

This commit is contained in:
yunhai8432 2026-03-10 21:55:53 +08:00
parent 1c5c0f6752
commit e423d51d4f
53 changed files with 14360 additions and 3846 deletions

View File

@ -57,10 +57,7 @@ void MX_GPIO_Init(void)
HAL_GPIO_WritePin(CMPS_RST_GPIO_Port, CMPS_RST_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(CMPS_RST_GPIO_Port, CMPS_RST_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */ /*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOH, LED_Red_Pin|LED_Blue_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOH, LED_Red_Pin|LED_Green_Pin|LED_Blue_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(LED_Green_GPIO_Port, LED_Green_Pin, GPIO_PIN_SET);
/*Configure GPIO pin Output Level */ /*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(ACCL_CS_GPIO_Port, ACCL_CS_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(ACCL_CS_GPIO_Port, ACCL_CS_Pin, GPIO_PIN_SET);

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -1178,8 +1178,8 @@
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2> <bDave2>0</bDave2>
<PathWithFileName>..\User\device\referee.c</PathWithFileName> <PathWithFileName>..\User\device\supercap.c</PathWithFileName>
<FilenameWithoutPath>referee.c</FilenameWithoutPath> <FilenameWithoutPath>supercap.c</FilenameWithoutPath>
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<bShared>0</bShared> <bShared>0</bShared>
</File> </File>
@ -1190,8 +1190,8 @@
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2> <bDave2>0</bDave2>
<PathWithFileName>..\User\device\supercap.c</PathWithFileName> <PathWithFileName>..\User\device\vofa.c</PathWithFileName>
<FilenameWithoutPath>supercap.c</FilenameWithoutPath> <FilenameWithoutPath>vofa.c</FilenameWithoutPath>
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<bShared>0</bShared> <bShared>0</bShared>
</File> </File>
@ -1202,8 +1202,20 @@
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2> <bDave2>0</bDave2>
<PathWithFileName>..\User\device\vofa.c</PathWithFileName> <PathWithFileName>..\User\device\referee.c</PathWithFileName>
<FilenameWithoutPath>vofa.c</FilenameWithoutPath> <FilenameWithoutPath>referee.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>77</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\User\device\vt13.c</PathWithFileName>
<FilenameWithoutPath>vt13.c</FilenameWithoutPath>
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<bShared>0</bShared> <bShared>0</bShared>
</File> </File>
@ -1211,13 +1223,13 @@
<Group> <Group>
<GroupName>module</GroupName> <GroupName>module</GroupName>
<tvExp>1</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel> <cbSel>0</cbSel>
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<File> <File>
<GroupNumber>9</GroupNumber> <GroupNumber>9</GroupNumber>
<FileNumber>77</FileNumber> <FileNumber>78</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -1229,7 +1241,7 @@
</File> </File>
<File> <File>
<GroupNumber>9</GroupNumber> <GroupNumber>9</GroupNumber>
<FileNumber>78</FileNumber> <FileNumber>79</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -1239,18 +1251,6 @@
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<bShared>0</bShared> <bShared>0</bShared>
</File> </File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>79</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\User\module\deformation_chassis.c</PathWithFileName>
<FilenameWithoutPath>deformation_chassis.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File> <File>
<GroupNumber>9</GroupNumber> <GroupNumber>9</GroupNumber>
<FileNumber>80</FileNumber> <FileNumber>80</FileNumber>
@ -1335,7 +1335,7 @@
<Group> <Group>
<GroupName>task</GroupName> <GroupName>task</GroupName>
<tvExp>1</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel> <cbSel>0</cbSel>
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>

View File

@ -340,7 +340,7 @@
<MiscControls></MiscControls> <MiscControls></MiscControls>
<Define>USE_HAL_DRIVER,STM32F407xx</Define> <Define>USE_HAL_DRIVER,STM32F407xx</Define>
<Undefine></Undefine> <Undefine></Undefine>
<IncludePath>../Core/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy;../Middlewares/Third_Party/FreeRTOS/Source/include;../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2;../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F;../Drivers/CMSIS/Device/ST/STM32F4xx/Include;../Drivers/CMSIS/Include;../User;../User/bsp;../User/component;../User/device;../User/module;..\User\module\cmd;..\User\task</IncludePath> <IncludePath>../Core/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy;../Middlewares/Third_Party/FreeRTOS/Source/include;../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2;../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F;../Drivers/CMSIS/Device/ST/STM32F4xx/Include;../Drivers/CMSIS/Include;../User;../User/bsp;../User/component;../User/device;../User/module;../User/module/cmd;../User/task</IncludePath>
</VariousControls> </VariousControls>
</Cads> </Cads>
<Aads> <Aads>
@ -937,11 +937,6 @@
<FileType>1</FileType> <FileType>1</FileType>
<FilePath>..\User\device\motor_rm.c</FilePath> <FilePath>..\User\device\motor_rm.c</FilePath>
</File> </File>
<File>
<FileName>referee.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\device\referee.c</FilePath>
</File>
<File> <File>
<FileName>supercap.c</FileName> <FileName>supercap.c</FileName>
<FileType>1</FileType> <FileType>1</FileType>
@ -952,6 +947,16 @@
<FileType>1</FileType> <FileType>1</FileType>
<FilePath>..\User\device\vofa.c</FilePath> <FilePath>..\User\device\vofa.c</FilePath>
</File> </File>
<File>
<FileName>referee.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\device\referee.c</FilePath>
</File>
<File>
<FileName>vt13.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\device\vt13.c</FilePath>
</File>
</Files> </Files>
</Group> </Group>
<Group> <Group>
@ -967,11 +972,6 @@
<FileType>1</FileType> <FileType>1</FileType>
<FilePath>..\User\module\config.c</FilePath> <FilePath>..\User\module\config.c</FilePath>
</File> </File>
<File>
<FileName>deformation_chassis.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\module\deformation_chassis.c</FilePath>
</File>
<File> <File>
<FileName>gimbal.c</FileName> <FileName>gimbal.c</FileName>
<FileType>1</FileType> <FileType>1</FileType>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -22,11 +22,11 @@ Dialog DLL: TCM.DLL V1.48.0.0
<h2>Project:</h2> <h2>Project:</h2>
D:\yunha\git\RM\referee\MDK-ARM\referee.uvprojx D:\yunha\git\RM\referee\MDK-ARM\referee.uvprojx
Project File Date: 03/06/2026 Project File Date: 03/10/2026
<h2>Output:</h2> <h2>Output:</h2>
*** Using Compiler 'V6.16', folder: 'D:\Keil_v5\ARM\ARMCLANG\Bin' *** Using Compiler 'V6.16', folder: 'D:\Keil_v5\ARM\ARMCLANG\Bin'
Build target 'referee' Rebuild target 'referee'
Note: source file '..\User\bsp\can.c' - object file renamed from 'referee\can.o' to 'referee\can_1.o'. Note: source file '..\User\bsp\can.c' - object file renamed from 'referee\can.o' to 'referee\can_1.o'.
Note: source file '..\User\bsp\gpio.c' - object file renamed from 'referee\gpio.o' to 'referee\gpio_1.o'. Note: source file '..\User\bsp\gpio.c' - object file renamed from 'referee\gpio.o' to 'referee\gpio_1.o'.
Note: source file '..\User\bsp\spi.c' - object file renamed from 'referee\spi.o' to 'referee\spi_1.o'. Note: source file '..\User\bsp\spi.c' - object file renamed from 'referee\spi.o' to 'referee\spi_1.o'.
@ -36,7 +36,139 @@ Note: source file '..\User\task\dr16.c' - object file renamed from 'referee\dr16
Note: source file '..\User\task\et16s.c' - object file renamed from 'referee\et16s.o' to 'referee\et16s_1.o'. Note: source file '..\User\task\et16s.c' - object file renamed from 'referee\et16s.o' to 'referee\et16s_1.o'.
Note: source file '..\User\task\referee.c' - object file renamed from 'referee\referee.o' to 'referee\referee_1.o'. Note: source file '..\User\task\referee.c' - object file renamed from 'referee\referee.o' to 'referee\referee_1.o'.
Note: source file '..\User\task\vofa.c' - object file renamed from 'referee\vofa.o' to 'referee\vofa_1.o'. Note: source file '..\User\task\vofa.c' - object file renamed from 'referee\vofa.o' to 'referee\vofa_1.o'.
"referee\referee.axf" - 0 Error(s), 0 Warning(s). compiling main.c...
assembling startup_stm32f407xx.s...
compiling freertos.c...
compiling tim.c...
compiling dma.c...
compiling stm32f4xx_hal_can.c...
compiling gpio.c...
compiling stm32f4xx_it.c...
compiling stm32f4xx_hal_msp.c...
compiling i2c.c...
compiling spi.c...
compiling can.c...
compiling usart.c...
compiling stm32f4xx_hal_rcc_ex.c...
compiling stm32f4xx_hal_flash.c...
compiling stm32f4xx_hal_rcc.c...
compiling stm32f4xx_hal_flash_ramfunc.c...
compiling stm32f4xx_hal_flash_ex.c...
compiling stm32f4xx_hal_gpio.c...
compiling stm32f4xx_hal_dma_ex.c...
compiling stm32f4xx_hal_pwr.c...
compiling stm32f4xx_hal_dma.c...
compiling stm32f4xx_hal_pwr_ex.c...
compiling stm32f4xx_hal_cortex.c...
compiling stm32f4xx_hal.c...
compiling stm32f4xx_hal_i2c_ex.c...
compiling list.c...
compiling croutine.c...
compiling event_groups.c...
compiling system_stm32f4xx.c...
compiling stm32f4xx_hal_exti.c...
compiling stm32f4xx_hal_tim_ex.c...
compiling queue.c...
compiling stm32f4xx_hal_uart.c...
compiling stm32f4xx_hal_spi.c...
compiling timers.c...
compiling stream_buffer.c...
compiling tasks.c...
compiling stm32f4xx_hal_tim.c...
compiling stm32f4xx_hal_i2c.c...
compiling heap_4.c...
compiling cmsis_os2.c...
compiling port.c...
compiling mm.c...
compiling gpio.c...
compiling dwt.c...
compiling pwm.c...
compiling spi.c...
compiling can.c...
compiling time.c...
compiling ahrs.c...
compiling i2c.c...
compiling calc_lib.c...
compiling capacity.c...
compiling uart.c...
compiling crc8.c...
compiling crc16.c...
compiling error_detect.c...
compiling filter.c...
compiling freertos_cli.c...
compiling limiter.c...
compiling mixer.c...
compiling pid.c...
compiling user_math.c...
compiling ui.c...
compiling dr16.c...
compiling bmi088.c...
compiling ist8310.c...
compiling motor.c...
compiling motor_rm.c...
compiling motor_dm.c...
compiling ET16s.c...
compiling led.c...
compiling vofa.c...
compiling supercap.c...
compiling vt13.c...
compiling config.c...
../User/module/chassis.c(219): warning: enumeration value 'CHASSIS_MODE_FOLLOW_GIMBAL_35' not handled in switch [-Wswitch]
switch (c->mode)
^
1 warning generated.
compiling chassis.c...
compiling referee.c...
../User/module/gimbal.c(303): warning: non-void function does not return a value in all control paths [-Wreturn-type]
}
^
1 warning generated.
compiling gimbal.c...
compiling cmd_adapter.c...
compiling shoot.c...
../User/module/cmd/cmd.c(118): warning: implicit conversion from enumeration type 'CHASSIS_ATTITUDE_MODE_t' to different enumeration type 'Chassis_Mode_t' [-Wenum-conversion]
ctx->output.chassis.cmd.mode = STOP_MODE;
~ ^~~~~~~~~
1 warning generated.
compiling cmd.c...
compiling ai.c...
compiling cmd_example.c...
compiling dr16.c...
compiling et16s.c...
compiling cmd.c...
compiling atti_esti.c...
../User/task/chassis_ctrl.c(44): warning: if statement has empty body [-Wempty-body]
if(osMessageQueueGet(task_runtime.msgq.chassis.cmd, &cmd_chassis, NULL, 0)==osOK);
^
../User/task/chassis_ctrl.c(44): note: put the semicolon on a separate line to silence this warning
../User/task/chassis_ctrl.c(50): warning: implicit declaration of function 'Chassis_DumpUI' is invalid in C99 [-Wimplicit-function-declaration]
Chassis_DumpUI(&chassis, &chassis_ui);
^
2 warnings generated.
compiling chassis_ctrl.c...
compiling cmd_behavior.c...
../User/task/gimbal_ctrl.c(53): warning: implicit declaration of function 'Gimbal_DumpUI' is invalid in C99 [-Wimplicit-function-declaration]
Gimbal_DumpUI(&gimbal,&gimbal_ui);
^
1 warning generated.
compiling gimbal_ctrl.c...
compiling init.c...
compiling user_task.c...
compiling vofa.c...
compiling referee.c...
../User/task/shoot_ctrl.c(53): warning: implicit declaration of function 'Shoot_DumpUI' is invalid in C99 [-Wimplicit-function-declaration]
Shoot_DumpUI(&shoot, &shoot_ui);
^
1 warning generated.
compiling shoot_ctrl.c...
../User/task/super_cap.c(53): warning: implicit declaration of function 'Cap_DumpUI' is invalid in C99 [-Wimplicit-function-declaration]
Cap_DumpUI(&cap_ui);
^
1 warning generated.
compiling super_cap.c...
linking...
Program Size: Code=73536 RO-data=2660 RW-data=1172 ZI-data=122428
"referee\referee.axf" - 0 Error(s), 8 Warning(s).
<h2>Software Packages used:</h2> <h2>Software Packages used:</h2>
@ -60,7 +192,7 @@ Package Vendor: Keil
* Component: ARM::CMSIS:CORE:5.4.0 * Component: ARM::CMSIS:CORE:5.4.0
Include file: CMSIS\Core\Include\tz_context.h Include file: CMSIS\Core\Include\tz_context.h
Build Time Elapsed: 00:00:02 Build Time Elapsed: 00:00:07
</pre> </pre>
</body> </body>
</html> </html>

File diff suppressed because it is too large Load Diff

View File

@ -72,12 +72,12 @@
"referee\motor.o" "referee\motor.o"
"referee\motor_dm.o" "referee\motor_dm.o"
"referee\motor_rm.o" "referee\motor_rm.o"
"referee\referee.o"
"referee\supercap.o" "referee\supercap.o"
"referee\vofa.o" "referee\vofa.o"
"referee\referee.o"
"referee\vt13.o"
"referee\chassis.o" "referee\chassis.o"
"referee\config.o" "referee\config.o"
"referee\deformation_chassis.o"
"referee\gimbal.o" "referee\gimbal.o"
"referee\shoot.o" "referee\shoot.o"
"referee\cmd.o" "referee\cmd.o"

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -54,16 +54,16 @@ referee/shoot.o: ..\User\module\shoot.c \
..\Middlewares\Third_Party\FreeRTOS\Source\include\task.h \ ..\Middlewares\Third_Party\FreeRTOS\Source\include\task.h \
..\Middlewares\Third_Party\FreeRTOS\Source\include\list.h \ ..\Middlewares\Third_Party\FreeRTOS\Source\include\list.h \
..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os2.h \ ..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os2.h \
..\User\bsp\time.h ..\User\device\referee.h \ ..\User\bsp\time.h ..\User\component\filter.h \
..\User\component\user_math.h ..\User\device\referee.h \
..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os2.h \ ..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os2.h \
..\User\component\ui.h ..\User\component\user_math.h \ ..\User\component\ui.h ..\User\component\user_math.h \
..\User\component\user_math.h ..\User\module\shoot.h \ ..\User\module\shoot.h ..\User\device\device.h \
..\User\device\device.h ..\User\module\cmd\cmd.h \ ..\User\module\cmd\cmd.h ..\User\module\cmd\cmd_types.h \
..\User\module\cmd\cmd_types.h ..\User\module\cmd\cmd_adapter.h \ ..\User\module\cmd\cmd_adapter.h ..\User\module\cmd\cmd_types.h \
..\User\module\cmd\cmd_types.h ..\User\device\ET16s.h \ ..\User\device\ET16s.h ..\User\module\cmd\cmd_behavior.h \
..\User\module\cmd\cmd_behavior.h ..\User\module\chassis.h \ ..\User\module\chassis.h ..\User\module\struct_typedef.h \
..\User\module\struct_typedef.h ..\User\component\filter.h \
..\User\component\ahrs.h ..\User\device\bmi088.h \ ..\User\component\ahrs.h ..\User\device\bmi088.h \
..\User\module\gimbal.h ..\User\device\motor_dm.h \ ..\User\module\gimbal.h ..\User\device\motor_dm.h \
..\User\module\config.h ..\User\module\gimbal.h ..\User\module\shoot.h \ ..\User\module\shoot.h ..\User\module\config.h ..\User\module\gimbal.h \
..\User\module\cmd\cmd.h ..\User\device\supercap.h ..\User\bsp\can.h ..\User\module\cmd\cmd.h ..\User\device\supercap.h ..\User\bsp\can.h

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

44
MDK-ARM/referee/vt13.d Normal file
View File

@ -0,0 +1,44 @@
referee/vt13.o: ..\User\device\vt13.c ..\User\device\vt13.h \
..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os2.h \
D:\Keil_v5\ARM\ARMCLANG\Bin\..\include\stdint.h \
D:\Keil_v5\ARM\ARMCLANG\Bin\..\include\stddef.h \
D:\Keil_v5\ARM\ARMCLANG\Bin\..\include\stdbool.h \
..\User\component\user_math.h \
D:\Keil_v5\ARM\ARMCLANG\Bin\..\include\float.h \
D:\Keil_v5\ARM\ARMCLANG\Bin\..\include\math.h ..\User\device\device.h \
..\User\bsp\uart.h ..\Core\Inc\usart.h ..\Core\Inc\main.h \
..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h \
..\Core\Inc\stm32f4xx_hal_conf.h \
..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h \
..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h \
..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h \
..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h \
..\Drivers\CMSIS\Include\core_cm4.h \
..\Drivers\CMSIS\Include\cmsis_version.h \
..\Drivers\CMSIS\Include\cmsis_compiler.h \
..\Drivers\CMSIS\Include\cmsis_armclang.h \
..\Drivers\CMSIS\Include\mpu_armv7.h \
..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h \
..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h \
..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h \
..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h \
..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h \
..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h \
..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h \
..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h \
..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h \
..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_can.h \
..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h \
..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h \
..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h \
..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h \
..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h \
..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h \
..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h \
..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h \
..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h \
..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h \
..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h \
..\User\bsp\bsp.h ..\User\bsp\time.h ..\User\component\crc16.h \
..\User\component\user_math.h \
D:\Keil_v5\ARM\ARMCLANG\Bin\..\include\string.h

BIN
MDK-ARM/referee/vt13.o Normal file

Binary file not shown.

View File

@ -84,7 +84,7 @@ time:
uart: uart:
devices: devices:
- instance: USART1 - instance: USART1
name: '1' name: VT13
- instance: USART2 - instance: USART2
name: '2' name: '2'
- instance: USART3 - instance: USART3

View File

@ -24,7 +24,7 @@ static void (*UART_Callback[BSP_UART_NUM][BSP_UART_CB_NUM])(void);
/* Private function -------------------------------------------------------- */ /* Private function -------------------------------------------------------- */
static BSP_UART_t UART_Get(UART_HandleTypeDef *huart) { static BSP_UART_t UART_Get(UART_HandleTypeDef *huart) {
if (huart->Instance == USART1) if (huart->Instance == USART1)
return BSP_UART_1; return BSP_UART_VT13;
else if (huart->Instance == USART2) else if (huart->Instance == USART2)
return BSP_UART_2; return BSP_UART_2;
else if (huart->Instance == USART3) else if (huart->Instance == USART3)
@ -119,7 +119,7 @@ void BSP_UART_IRQHandler(UART_HandleTypeDef *huart) {
UART_HandleTypeDef *BSP_UART_GetHandle(BSP_UART_t uart) { UART_HandleTypeDef *BSP_UART_GetHandle(BSP_UART_t uart) {
switch (uart) { switch (uart) {
case BSP_UART_1: case BSP_UART_VT13:
return &huart1; return &huart1;
case BSP_UART_2: case BSP_UART_2:
return &huart2; return &huart2;

View File

@ -27,7 +27,7 @@ extern "C" {
/* UART实体枚举与设备对应 */ /* UART实体枚举与设备对应 */
typedef enum { typedef enum {
BSP_UART_1, BSP_UART_VT13,
BSP_UART_2, BSP_UART_2,
BSP_UART_3, BSP_UART_3,
BSP_UART_REF, BSP_UART_REF,

387
User/component/cmd.c Normal file
View File

@ -0,0 +1,387 @@
/*
*/
#include "cmd.h"
#include <string.h>
/* USER INCLUDE BEGIN */
/* USER INCLUDE END */
/* USER DEFINE BEGIN */
/* USER DEFINE END */
/**
* @brief
*
* @param cmd
* @param behavior
* @return uint16_t
*/
static inline CMD_KeyValue_t CMD_BehaviorToKey(CMD_t *cmd,
CMD_Behavior_t behavior) {
return cmd->param->map.key_map[behavior].key;
}
static inline CMD_ActiveType_t CMD_BehaviorToActive(CMD_t *cmd,
CMD_Behavior_t behavior) {
return cmd->param->map.key_map[behavior].active;
}
/**
* @brief
*
* @param rc
* @param key
* @param stateful
* @return true
* @return false
*/
static bool CMD_KeyPressedRc(const CMD_RC_t *rc, CMD_KeyValue_t key) {
/* 按下按键为鼠标左、右键 */
if (key == CMD_L_CLICK) {
return rc->mouse.l_click;
}
if (key == CMD_R_CLICK) {
return rc->mouse.r_click;
}
return rc->key & (1u << key);
}
static bool CMD_BehaviorOccurredRc(const CMD_RC_t *rc, CMD_t *cmd,
CMD_Behavior_t behavior) {
CMD_KeyValue_t key = CMD_BehaviorToKey(cmd, behavior);
CMD_ActiveType_t active = CMD_BehaviorToActive(cmd, behavior);
bool now_key_pressed, last_key_pressed;
/* 按下按键为鼠标左、右键 */
if (key == CMD_L_CLICK) {
now_key_pressed = rc->mouse.l_click;
last_key_pressed = cmd->mouse_last.l_click;
} else if (key == CMD_R_CLICK) {
now_key_pressed = rc->mouse.r_click;
last_key_pressed = cmd->mouse_last.r_click;
} else {
now_key_pressed = rc->key & (1u << key);
last_key_pressed = cmd->key_last & (1u << key);
}
switch (active) {
case CMD_ACTIVE_PRESSING:
return now_key_pressed && !last_key_pressed;
case CMD_ACTIVE_RASING:
return !now_key_pressed && last_key_pressed;
case CMD_ACTIVE_PRESSED:
return now_key_pressed;
}
}
/**
* @brief pc行为逻辑
*
* @param rc
* @param cmd
* @param dt_sec
*/
static void CMD_PcLogic(const CMD_RC_t *rc, CMD_t *cmd, float dt_sec) {
cmd->gimbal.mode = GIMBAL_MODE_ABSOLUTE;
/* 云台设置为鼠标控制欧拉角的变化,底盘的控制向量设置为零 */
cmd->gimbal.delta_eulr.yaw =
(float)rc->mouse.x * dt_sec * cmd->param->sens_mouse;
cmd->gimbal.delta_eulr.pit =
(float)(-rc->mouse.y) * dt_sec * cmd->param->sens_mouse;
cmd->chassis.ctrl_vec.vx = cmd->chassis.ctrl_vec.vy = 0.0f;
cmd->shoot.reverse_trig = false;
/* 按键行为映射相关逻辑 */
if (CMD_BehaviorOccurredRc(rc, cmd, CMD_BEHAVIOR_FORE)) {
cmd->chassis.ctrl_vec.vy += cmd->param->move.move_sense;
}
if (CMD_BehaviorOccurredRc(rc, cmd, CMD_BEHAVIOR_BACK)) {
cmd->chassis.ctrl_vec.vy -= cmd->param->move.move_sense;
}
if (CMD_BehaviorOccurredRc(rc, cmd, CMD_BEHAVIOR_LEFT)) {
cmd->chassis.ctrl_vec.vx -= cmd->param->move.move_sense;
}
if (CMD_BehaviorOccurredRc(rc, cmd, CMD_BEHAVIOR_RIGHT)) {
cmd->chassis.ctrl_vec.vx += cmd->param->move.move_sense;
}
if (CMD_BehaviorOccurredRc(rc, cmd, CMD_BEHAVIOR_ACCELERATE)) {
cmd->chassis.ctrl_vec.vx *= cmd->param->move.move_fast_sense;
cmd->chassis.ctrl_vec.vy *= cmd->param->move.move_fast_sense;
}
if (CMD_BehaviorOccurredRc(rc, cmd, CMD_BEHAVIOR_DECELEBRATE)) {
cmd->chassis.ctrl_vec.vx *= cmd->param->move.move_slow_sense;
cmd->chassis.ctrl_vec.vy *= cmd->param->move.move_slow_sense;
}
if (CMD_BehaviorOccurredRc(rc, cmd, CMD_BEHAVIOR_FIRE)) {
/* 切换至开火模式,设置相应的射击频率和弹丸初速度 */
cmd->shoot.mode = SHOOT_MODE_LOADED;
cmd->shoot.fire = true;
} else {
/* 切换至准备模式,停止射击 */
cmd->shoot.mode = SHOOT_MODE_LOADED;
cmd->shoot.fire = false;
}
if (CMD_BehaviorOccurredRc(rc, cmd, CMD_BEHAVIOR_FIRE_MODE)) {
/* 每按一次依次切换开火下一个模式 */
cmd->shoot.fire_mode++;
cmd->shoot.fire_mode %= FIRE_MODE_NUM;
}
if (CMD_BehaviorOccurredRc(rc, cmd, CMD_BEHAVIOR_ROTOR)) {
/* 切换到小陀螺模式 */
cmd->chassis.mode = CHASSIS_MODE_ROTOR;
cmd->chassis.mode_rotor = ROTOR_MODE_RAND;
}
if (CMD_BehaviorOccurredRc(rc, cmd, CMD_BEHAVIOR_OPENCOVER)) {
/* 每按一次开、关弹舱盖 */
cmd->shoot.cover_open = !cmd->shoot.cover_open;
}
if (CMD_BehaviorOccurredRc(rc, cmd, CMD_BEHAVIOR_BUFF)) {
if (cmd->ai_status == AI_STATUS_HITSWITCH) {
/* 停止ai的打符模式停用host控制 */
CMD_RefereeAdd(&(cmd->referee), CMD_UI_HIT_SWITCH_STOP);
cmd->host_overwrite = false;
cmd->ai_status = AI_STATUS_STOP;
} else if (cmd->ai_status == AI_STATUS_AUTOAIM) {
/* 自瞄模式中切换失败提醒 */
} else {
/* ai切换至打符模式启用host控制 */
CMD_RefereeAdd(&(cmd->referee), CMD_UI_HIT_SWITCH_START);
cmd->ai_status = AI_STATUS_HITSWITCH;
cmd->host_overwrite = true;
}
}
if (CMD_BehaviorOccurredRc(rc, cmd, CMD_BEHAVIOR_AUTOAIM)) {
if (cmd->ai_status == AI_STATUS_AUTOAIM) {
/* 停止ai的自瞄模式停用host控制 */
cmd->host_overwrite = false;
cmd->ai_status = AI_STATUS_STOP;
CMD_RefereeAdd(&(cmd->referee), CMD_UI_AUTO_AIM_STOP);
} else {
/* ai切换至自瞄模式启用host控制 */
cmd->ai_status = AI_STATUS_AUTOAIM;
cmd->host_overwrite = true;
CMD_RefereeAdd(&(cmd->referee), CMD_UI_AUTO_AIM_START);
}
} else {
cmd->host_overwrite = false;
// TODO: 修复逻辑
}
if (CMD_BehaviorOccurredRc(rc, cmd, CMD_BEHAVIOR_REVTRIG)) {
/* 按下拨弹反转 */
cmd->shoot.reverse_trig = true;
}
if (CMD_BehaviorOccurredRc(rc, cmd, CMD_BEHAVIOR_FOLLOWGIMBAL35)) {
cmd->chassis.mode = CHASSIS_MODE_FOLLOW_GIMBAL_35;
}
/* 保存当前按下的键位状态 */
cmd->key_last = rc->key;
memcpy(&(cmd->mouse_last), &(rc->mouse), sizeof(cmd->mouse_last));
}
/**
* @brief rc行为逻辑
*
* @param rc
* @param cmd
* @param dt_sec
*/
static void CMD_RcLogic(const CMD_RC_t *rc, CMD_t *cmd, float dt_sec) {
switch (rc->sw_l) {
/* 左拨杆相应行为选择和解析 */
case CMD_SW_UP:
cmd->chassis.mode = CHASSIS_MODE_BREAK;
break;
case CMD_SW_MID:
cmd->chassis.mode = CHASSIS_MODE_FOLLOW_GIMBAL;
break;
case CMD_SW_DOWN:
cmd->chassis.mode = CHASSIS_MODE_ROTOR;
cmd->chassis.mode_rotor = ROTOR_MODE_CW;
break;
case CMD_SW_ERR:
cmd->chassis.mode = CHASSIS_MODE_RELAX;
break;
}
switch (rc->sw_r) {
/* 右拨杆相应行为选择和解析*/
case CMD_SW_UP:
cmd->gimbal.mode = GIMBAL_MODE_ABSOLUTE;
cmd->shoot.mode = SHOOT_MODE_SAFE;
break;
case CMD_SW_MID:
cmd->gimbal.mode = GIMBAL_MODE_ABSOLUTE;
cmd->shoot.fire = false;
cmd->shoot.mode = SHOOT_MODE_LOADED;
break;
case CMD_SW_DOWN:
cmd->gimbal.mode = GIMBAL_MODE_ABSOLUTE;
cmd->shoot.mode = SHOOT_MODE_LOADED;
cmd->shoot.fire_mode = FIRE_MODE_SINGLE;
cmd->shoot.fire = true;
break;
/*
case CMD_SW_UP:
cmd->gimbal.mode = GIMBAL_MODE_RELAX;
cmd->shoot.mode = SHOOT_MODE_SAFE;
break;
case CMD_SW_MID:
cmd->gimbal.mode = GIMBAL_MODE_RELAX;
cmd->shoot.fire = false;
cmd->shoot.mode = SHOOT_MODE_LOADED;
break;
case CMD_SW_DOWN:
cmd->gimbal.mode = GIMBAL_MODE_RELAX;
cmd->shoot.mode = SHOOT_MODE_LOADED;
cmd->shoot.fire_mode = FIRE_MODE_SINGLE;
cmd->shoot.fire = true;
break;
*/
case CMD_SW_ERR:
cmd->gimbal.mode = GIMBAL_MODE_RELAX;
cmd->shoot.mode = SHOOT_MODE_RELAX;
}
/* 将操纵杆的对应值转换为底盘的控制向量和云台变化的欧拉角 */
cmd->chassis.ctrl_vec.vx = rc->ch_l_x;
cmd->chassis.ctrl_vec.vy = rc->ch_l_y;
cmd->gimbal.delta_eulr.yaw = rc->ch_r_x * dt_sec * cmd->param->sens_rc;
cmd->gimbal.delta_eulr.pit = rc->ch_r_y * dt_sec * cmd->param->sens_rc;
}
/**
* @brief rc失控时机器人恢复放松模式
*
* @param cmd
*/
static void CMD_RcLostLogic(CMD_t *cmd) {
/* 机器人底盘、云台、射击运行模式恢复至放松模式 */
cmd->chassis.mode = CHASSIS_MODE_RELAX;
cmd->gimbal.mode = GIMBAL_MODE_RELAX;
cmd->shoot.mode = SHOOT_MODE_RELAX;
}
/**
* @brief
*
* @param cmd
* @param param
* @return int8_t 0
*/
int8_t CMD_Init(CMD_t *cmd, const CMD_Params_t *param) {
/* 指针检测 */
if (cmd == NULL) return -1;
if (param == NULL) return -1;
/* 设置机器人的命令参数初始化控制方式为rc控制 */
cmd->pc_ctrl = false;
cmd->param = param;
return 0;
}
/**
* @brief
*
* @param cmd
* @return true
* @return false
*/
inline bool CMD_CheckHostOverwrite(CMD_t *cmd) { return cmd->host_overwrite; }
/**
* @brief
*
* @param rc
* @param cmd
* @param dt_sec
* @return int8_t 0
*/
int8_t CMD_ParseRc(CMD_RC_t *rc, CMD_t *cmd, float dt_sec) {
/* 指针检测 */
if (rc == NULL) return -1;
if (cmd == NULL) return -1;
/* 在pc控制和rc控制间切换 */
if (CMD_KeyPressedRc(rc, CMD_KEY_SHIFT) &&
CMD_KeyPressedRc(rc, CMD_KEY_CTRL) && CMD_KeyPressedRc(rc, CMD_KEY_Q))
cmd->pc_ctrl = true;
if (CMD_KeyPressedRc(rc, CMD_KEY_SHIFT) &&
CMD_KeyPressedRc(rc, CMD_KEY_CTRL) && CMD_KeyPressedRc(rc, CMD_KEY_E))
cmd->pc_ctrl = false;
/*c当rc丢控时恢复机器人至默认状态 */
if ((rc->sw_l == CMD_SW_ERR) || (rc->sw_r == CMD_SW_ERR)) {
CMD_RcLostLogic(cmd);
} else {
if (cmd->pc_ctrl) {
CMD_PcLogic(rc, cmd, dt_sec);
} else {
CMD_RcLogic(rc, cmd, dt_sec);
}
}
return 0;
}
/**
* @brief
*
* @param host host数据
* @param cmd
* @param dt_sec
* @return int8_t 0
*/
int8_t CMD_ParseHost(const CMD_Host_t *host, CMD_t *cmd, float dt_sec) {
(void)dt_sec; /* 未使用dt_sec消除警告 */
/* 指针检测 */
if (host == NULL) return -1;
if (cmd == NULL) return -1;
/* 云台欧拉角设置为host相应的变化的欧拉角 */
cmd->gimbal.delta_eulr.yaw = host->gimbal_delta.yaw;
cmd->gimbal.delta_eulr.pit = host->gimbal_delta.pit;
/* host射击命令设置不同的射击频率和弹丸初速度 */
if (host->fire) {
cmd->shoot.mode = SHOOT_MODE_LOADED;
cmd->shoot.fire = true;
} else {
cmd->shoot.mode = SHOOT_MODE_SAFE;
}
return 0;
}
/**
* @brief Referee发送的命令
*
* @param ref
* @param cmd
* @return int8_t 0
*/
int8_t CMD_RefereeAdd(CMD_RefereeCmd_t *ref, CMD_UI_t cmd) {
/* 指针检测 */
if (ref == NULL) return -1;
/* 越界检测 */
if (ref->counter >= CMD_REFEREE_MAX_NUM || ref->counter < 0) return -1;
/* 添加机器人当前行为状态到画图的命令队列中 */
ref->cmd[ref->counter] = cmd;
ref->counter++;
return 0;
}
/* USER FUNCTION BEGIN */
/* USER FUNCTION END */

318
User/component/cmd.h Normal file
View File

@ -0,0 +1,318 @@
/*
*/
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
#include <stdbool.h>
#include <stdint.h>
#include "component/ahrs.h"
/* USER INCLUDE BEGIN */
/* USER INCLUDE END */
#define CMD_REFEREE_MAX_NUM (3) /* Lines 16 omitted */
/* USER DEFINE BEGIN */
/* USER DEFINE END */
/* 机器人型号 */
typedef enum {
ROBOT_MODEL_INFANTRY = 0, /* 步兵机器人 */
ROBOT_MODEL_HERO, /* 英雄机器人 */
ROBOT_MODEL_ENGINEER, /* 工程机器人 */
ROBOT_MODEL_DRONE, /* 空中机器人 */
ROBOT_MODEL_SENTRY, /* 哨兵机器人 */
ROBOT_MODEL_NUM, /* 型号数量 */
} CMD_RobotModel_t;
/* 底盘运行模式 */
typedef enum {
CHASSIS_MODE_RELAX, /* 放松模式,电机不输出。一般情况底盘初始化之后的模式 */
CHASSIS_MODE_BREAK, /* 刹车模式,电机闭环控制保持静止。用于机器人停止状态 */
CHASSIS_MODE_FOLLOW_GIMBAL, /* 通过闭环控制使车头方向跟随云台 */
CHASSIS_MODE_FOLLOW_GIMBAL_35, /* 通过闭环控制使车头方向35度跟随云台 */
CHASSIS_MODE_ROTOR, /* 小陀螺模式,通过闭环控制使底盘不停旋转 */
CHASSIS_MODE_INDENPENDENT, /* 独立模式。底盘运行不受云台影响 */
CHASSIS_MODE_OPEN, /* 开环模式。底盘运行不受PID控制直接输出到电机 */
} CMD_ChassisMode_t;
/* 云台运行模式 */
typedef enum {
GIMBAL_MODE_RELAX, /* 放松模式,电机不输出。一般情况云台初始化之后的模式 */
GIMBAL_MODE_ABSOLUTE, /* 绝对坐标系控制,控制在空间内的绝对姿态 */
GIMBAL_MODE_RELATIVE, /* 相对坐标系控制,控制相对于底盘的姿态 */
} CMD_GimbalMode_t;
/* 射击运行模式 */
typedef enum {
SHOOT_MODE_RELAX, /* 放松模式,电机不输出 */
SHOOT_MODE_SAFE, /* 保险模式,电机闭环控制保持静止 */
SHOOT_MODE_LOADED, /* 上膛模式,摩擦轮开启。随时准备开火 */
} CMD_ShootMode_t;
typedef enum {
FIRE_MODE_SINGLE, /* 单发开火模式 */
FIRE_MODE_BURST, /* N连发开火模式 */
FIRE_MODE_CONT, /* 持续开火模式 */
FIRE_MODE_NUM,
} CMD_FireMode_t;
/* 小陀螺转动模式 */
typedef enum {
ROTOR_MODE_CW, /* 顺时针转动 */
ROTOR_MODE_CCW, /* 逆时针转动 */
ROTOR_MODE_RAND, /* 随机转动 */
} CMD_RotorMode_t;
/* 底盘控制命令 */
typedef struct {
CMD_ChassisMode_t mode; /* 底盘运行模式 */
CMD_RotorMode_t mode_rotor; /* 小陀螺转动模式 */
MoveVector_t ctrl_vec; /* 底盘控制向量 */
} CMD_ChassisCmd_t;
/* 云台控制命令 */
typedef struct {
CMD_GimbalMode_t mode; /* 云台运行模式 */
AHRS_Eulr_t delta_eulr; /* 欧拉角变化角度 */
} CMD_GimbalCmd_t;
/* 射击控制命令 */
typedef struct {
CMD_ShootMode_t mode; /* 射击运行模式 */
CMD_FireMode_t fire_mode; /* 开火模式 */
bool fire; /*开火*/
bool cover_open; /* 弹舱盖开关 */
bool reverse_trig; /* 拨弹电机状态 */
} CMD_ShootCmd_t;
/* 拨杆位置 */
typedef enum {
CMD_SW_ERR = 0,
CMD_SW_UP = 1,
CMD_SW_MID = 3,
CMD_SW_DOWN = 2,
} CMD_SwitchPos_t;
/* 键盘按键值 */
typedef enum {
CMD_KEY_W = 0,
CMD_KEY_S,
CMD_KEY_A,
CMD_KEY_D,
CMD_KEY_SHIFT,
CMD_KEY_CTRL,
CMD_KEY_Q,
CMD_KEY_E,
CMD_KEY_R,
CMD_KEY_F,
CMD_KEY_G,
CMD_KEY_Z,
CMD_KEY_X,
CMD_KEY_C,
CMD_KEY_V,
CMD_KEY_B,
CMD_L_CLICK,
CMD_R_CLICK,
CMD_KEY_NUM,
} CMD_KeyValue_t;
/* 行为值序列 */
typedef enum {
CMD_BEHAVIOR_FORE = 0, /* 向前 */
CMD_BEHAVIOR_BACK, /* 向后 */
CMD_BEHAVIOR_LEFT, /* 向左 */
CMD_BEHAVIOR_RIGHT, /* 向右 */
CMD_BEHAVIOR_ACCELERATE, /* 加速 */
CMD_BEHAVIOR_DECELEBRATE, /* 减速 */
CMD_BEHAVIOR_FIRE, /* 开火 */
CMD_BEHAVIOR_FIRE_MODE, /* 切换开火模式 */
CMD_BEHAVIOR_BUFF, /* 打符模式 */
CMD_BEHAVIOR_AUTOAIM, /* 自瞄模式 */
CMD_BEHAVIOR_OPENCOVER, /* 弹舱盖开关 */
CMD_BEHAVIOR_ROTOR, /* 小陀螺模式 */
CMD_BEHAVIOR_REVTRIG, /* 反转拨弹 */
CMD_BEHAVIOR_FOLLOWGIMBAL35, /* 跟随云台呈35度 */
CMD_BEHAVIOR_NUM,
} CMD_Behavior_t;
typedef enum {
CMD_ACTIVE_PRESSING, /* 按下时触发 */
CMD_ACTIVE_RASING, /* 抬起时触发 */
CMD_ACTIVE_PRESSED, /* 按住时触发 */
} CMD_ActiveType_t;
typedef struct {
CMD_ActiveType_t active;
CMD_KeyValue_t key;
} CMD_KeyMapItem_t;
/* 行为映射的对应按键数组 */
typedef struct {
CMD_KeyMapItem_t key_map[CMD_BEHAVIOR_NUM];
} CMD_KeyMap_Params_t;
/* 位移灵敏度参数 */
typedef struct {
float move_sense; /* 移动灵敏度 */
float move_fast_sense; /* 加速灵敏度 */
float move_slow_sense; /* 减速灵敏度 */
} CMD_Move_Params_t;
typedef struct {
uint16_t width;
uint16_t height;
} CMD_Screen_t;
/* 命令参数 */
typedef struct {
float sens_mouse; /* 鼠标灵敏度 */
float sens_rc; /* 遥控器摇杆灵敏度 */
CMD_KeyMap_Params_t map; /* 按键映射行为命令 */
CMD_Move_Params_t move; /* 位移灵敏度参数 */
CMD_Screen_t screen; /* 屏幕分辨率参数 */
} CMD_Params_t;
/* AI行为状态 */
typedef enum {
AI_STATUS_STOP, /* 停止状态 */
AI_STATUS_AUTOAIM, /* 自瞄状态 */
AI_STATUS_HITSWITCH, /* 打符状态 */
AI_STATUS_AUTOMATIC /* 自动状态 */
} CMD_AI_Status_t;
/* UI所用行为状态 */
typedef enum {
CMD_UI_NOTHING, /* 当前无状态 */
CMD_UI_AUTO_AIM_START, /* 自瞄状态开启 */
CMD_UI_AUTO_AIM_STOP, /* 自瞄状态关闭 */
CMD_UI_HIT_SWITCH_START, /* 打符状态开启 */
CMD_UI_HIT_SWITCH_STOP /* 打符状态关闭 */
} CMD_UI_t;
/*裁判系统发送的命令*/
typedef struct {
CMD_UI_t cmd[CMD_REFEREE_MAX_NUM]; /* 命令数组 */
uint8_t counter; /* 命令计数 */
} CMD_RefereeCmd_t;
typedef struct {
bool pc_ctrl; /* 是否使用键鼠控制 */
bool host_overwrite; /* 是否Host控制 */
uint16_t key_last; /* 上次按键键值 */
struct {
int16_t x;
int16_t y;
int16_t z;
bool l_click; /* 左键 */
bool r_click; /* 右键 */
} mouse_last; /* 鼠标值 */
CMD_AI_Status_t ai_status; /* AI状态 */
const CMD_Params_t *param; /* 命令参数 */
CMD_ChassisCmd_t chassis; /* 底盘控制命令 */
CMD_GimbalCmd_t gimbal; /* 云台控制命令 */
CMD_ShootCmd_t shoot; /* 射击控制命令 */
CMD_RefereeCmd_t referee; /* 裁判系统发送命令 */
} CMD_t;
typedef struct {
float ch_l_x; /* 遥控器左侧摇杆横轴值,上为正 */
float ch_l_y; /* 遥控器左侧摇杆纵轴值,右为正 */
float ch_r_x; /* 遥控器右侧摇杆横轴值,上为正 */
float ch_r_y; /* 遥控器右侧摇杆纵轴值,右为正 */
float ch_res; /* 第五通道值 */
CMD_SwitchPos_t sw_r; /* 右侧拨杆位置 */
CMD_SwitchPos_t sw_l; /* 左侧拨杆位置 */
struct {
int16_t x;
int16_t y;
int16_t z;
bool l_click; /* 左键 */
bool r_click; /* 右键 */
} mouse; /* 鼠标值 */
uint16_t key; /* 按键值 */
uint16_t res; /* 保留,未启用 */
} CMD_RC_t;
typedef struct {
AHRS_Eulr_t gimbal_delta; /* 欧拉角的变化量 */
struct {
float vx; /* x轴移动速度 */
float vy; /* y轴移动速度 */
float wz; /* z轴转动速度 */
} chassis_move_vec; /* 底盘移动向量 */
bool fire; /* 开火状态 */
} CMD_Host_t;
/**
* @brief
*
* @param rc
* @param cmd
*/
int8_t CMD_Init(CMD_t *cmd, const CMD_Params_t *param);
/**
* @brief
*
* @param cmd
* @return true
* @return false
*/
bool CMD_CheckHostOverwrite(CMD_t *cmd);
/**
* @brief
*
* @param rc
* @param cmd
* @param dt_sec
* @return int8_t 0
*/
int8_t CMD_ParseRc(CMD_RC_t *rc, CMD_t *cmd, float dt_sec);
/**
* @brief
*
* @param host host数据
* @param cmd
* @param dt_sec
* @return int8_t 0
*/
int8_t CMD_ParseHost(const CMD_Host_t *host, CMD_t *cmd, float dt_sec);
/**
* @brief Referee发送的命令
*
* @param ref
* @param cmd
* @return int8_t 0
*/
int8_t CMD_RefereeAdd(CMD_RefereeCmd_t *ref, CMD_UI_t cmd);
/* USER FUNCTION BEGIN */
/* USER FUNCTION END */
#ifdef __cplusplus
}
#endif

View File

@ -32,6 +32,7 @@ extern "C" {
/* AUTO GENERATED SIGNALS END */ /* AUTO GENERATED SIGNALS END */
/* USER SIGNALS BEGIN */ /* USER SIGNALS BEGIN */
#define SIGNAL_VT13_RAW_REDY (1u << 9)
#define SIGNAL_REFEREE_RAW_REDY (1u << 10) #define SIGNAL_REFEREE_RAW_REDY (1u << 10)
#define SIGNAL_REFEREE_FAST_REFRESH_UI (1u << 11) #define SIGNAL_REFEREE_FAST_REFRESH_UI (1u << 11)
#define SIGNAL_REFEREE_SLOW_REFRESH_UI (1u << 12) #define SIGNAL_REFEREE_SLOW_REFRESH_UI (1u << 12)

View File

@ -30,5 +30,5 @@ motor_rm:
enabled: true enabled: true
vofa: vofa:
bsp_config: bsp_config:
BSP_UART_VOFA: BSP_UART_1 BSP_UART_VOFA: BSP_UART_VT13
enabled: true enabled: true

View File

@ -35,7 +35,7 @@ static VOFA_Protocol_t current_protocol = VOFA_PROTOCOL_FIREWATER; // 默认协
/************************ RawData *************************/ /************************ RawData *************************/
void VOFA_RawData_Send(const char* data, bool dma) { void VOFA_RawData_Send(const char* data, bool dma) {
BSP_UART_Transmit(BSP_UART_1, (uint8_t*)data, strlen(data), dma); BSP_UART_Transmit(BSP_UART_VT13, (uint8_t*)data, strlen(data), dma);
} }
/************************ FireWater *************************/ /************************ FireWater *************************/
@ -56,7 +56,7 @@ void VOFA_FireWater_Send(float *channels, uint8_t channel_count, bool dma)
} }
snprintf(buf + len, sizeof(vofa_tx_buf) - len, "\n"); snprintf(buf + len, sizeof(vofa_tx_buf) - len, "\n");
BSP_UART_Transmit(BSP_UART_1, vofa_tx_buf, strlen(buf), dma); BSP_UART_Transmit(BSP_UART_VT13, vofa_tx_buf, strlen(buf), dma);
} }
/************************ JustFloat *************************/ /************************ JustFloat *************************/
@ -69,7 +69,7 @@ void VOFA_JustFloat_Send(float *channels, uint8_t channel_count, bool dma)
uint32_t tail = JUSTFLOAT_TAIL; // 0x7F800000 uint32_t tail = JUSTFLOAT_TAIL; // 0x7F800000
memcpy(vofa_tx_buf + channel_count * sizeof(float), &tail, sizeof(tail)); memcpy(vofa_tx_buf + channel_count * sizeof(float), &tail, sizeof(tail));
BSP_UART_Transmit(BSP_UART_1, vofa_tx_buf, channel_count * sizeof(float) + sizeof(tail), dma); BSP_UART_Transmit(BSP_UART_VT13, vofa_tx_buf, channel_count * sizeof(float) + sizeof(tail), dma);
} }
/* Exported functions ------------------------------------------------------- */ /* Exported functions ------------------------------------------------------- */

124
User/device/vt13.c Normal file
View File

@ -0,0 +1,124 @@
/* Includes ----------------------------------------------------------------- */
#include "vt13.h"
#include "bsp/uart.h"
#include "bsp/time.h"
#include "device.h"
#include "crc16.h"
#include <string.h>
#include <stdbool.h>
/* Private variables -------------------------------------------------------- */
static osThreadId_t thread_alert;
static bool inited = false;
/* Private macro ------------------------------------------------------------ */
/* Private function -------------------------------------------------------- */
static void VT13_RxCpltCallback(void) {
osThreadFlagsSet(thread_alert, SIGNAL_VT13_RAW_REDY);
}
static bool VT13_DataCorrupted(const VT13_t *vt13) {
/* 1. 帧头校验:必须为 0xA9 和 0x53 */
if (vt13->raw_data.header1 != 0xA9 || vt13->raw_data.header2 != 0x53) {
return true;
}
/* 2. CRC16 校验:验证整个 21 字节的帧长度 */
if (!CRC16_Verify((const uint8_t *)&(vt13->raw_data), sizeof(VT13_RawData_t))) {
return true;
}
/* 3. 挡位范围校验(作为双重保险,因为 CRC 只能保证通信无误,不能保证按键逻辑无误) */
if (vt13->raw_data.mode > 2) {
return true;
}
return false;
}
/* Exported functions ------------------------------------------------------- */
int8_t VT13_Init(VT13_t *vt13) {
if (vt13 == NULL) return DEVICE_ERR_NULL;
if (inited) return DEVICE_ERR_INITED;
if ((thread_alert = osThreadGetId()) == NULL) return DEVICE_ERR_NULL;
/* 注意:图传模块波特率为 921600 ,请在 UART 初始化时核对 */
BSP_UART_RegisterCallback(BSP_UART_VT13, BSP_UART_RX_CPLT_CB, VT13_RxCpltCallback);
inited = true;
return DEVICE_OK;
}
int8_t VT13_Restart(void) {
__HAL_UART_DISABLE(BSP_UART_GetHandle(BSP_UART_VT13));
__HAL_UART_ENABLE(BSP_UART_GetHandle(BSP_UART_VT13));
return DEVICE_OK;
}
int8_t VT13_StartDmaRecv(VT13_t *vt13) {
if (HAL_UART_Receive_DMA(BSP_UART_GetHandle(BSP_UART_VT13),
(uint8_t *)&(vt13->raw_data),
sizeof(vt13->raw_data)) == HAL_OK)
return DEVICE_OK;
return DEVICE_ERR;
}
bool VT13_WaitDmaCplt(uint32_t timeout) {
return (osThreadFlagsWait(SIGNAL_VT13_RAW_REDY, osFlagsWaitAll, timeout) == SIGNAL_VT13_RAW_REDY);
}
int8_t VT13_ParseData(VT13_t *vt13) {
if (vt13 == NULL) return DEVICE_ERR_NULL;
if (VT13_DataCorrupted(vt13)) {
return DEVICE_ERR;
}
vt13->header.online = true;
vt13->header.last_online_time = BSP_TIME_Get_us();
memset(&(vt13->data), 0, sizeof(vt13->data));
float full_range = (float)(VT13_CH_VALUE_MAX - VT13_CH_VALUE_MIN);
/* 1. 解析摇杆与拨轮数据并归一化至 [-1.0, 1.0] */
vt13->data.ch_r_x = 2.0f * ((float)vt13->raw_data.ch_r_x - VT13_CH_VALUE_MID) / full_range;
vt13->data.ch_r_y = 2.0f * ((float)vt13->raw_data.ch_r_y - VT13_CH_VALUE_MID) / full_range;
vt13->data.ch_l_y = 2.0f * ((float)vt13->raw_data.ch_l_y - VT13_CH_VALUE_MID) / full_range;
vt13->data.ch_l_x = 2.0f * ((float)vt13->raw_data.ch_l_x - VT13_CH_VALUE_MID) / full_range;
vt13->data.dial = 2.0f * ((float)vt13->raw_data.dial - VT13_CH_VALUE_MID) / full_range;
/* 2. 解析按钮和开关 [cite: 165] */
vt13->data.mode = (VT13_Mode_t)vt13->raw_data.mode;
vt13->data.pause = vt13->raw_data.pause;
vt13->data.custom_l = vt13->raw_data.custom_l;
vt13->data.custom_r = vt13->raw_data.custom_r;
vt13->data.trigger = vt13->raw_data.trigger;
/* 3. 解析鼠标数据 */
vt13->data.mouse.x = vt13->raw_data.mouse_x;
vt13->data.mouse.y = vt13->raw_data.mouse_y;
vt13->data.mouse.z = vt13->raw_data.mouse_z;
vt13->data.mouse.l_click = vt13->raw_data.mouse_l;
vt13->data.mouse.r_click = vt13->raw_data.mouse_r;
vt13->data.mouse.m_click = vt13->raw_data.mouse_m;
/* 4. 解析键盘按键 */
uint16_t key_value = vt13->raw_data.keyboard;
for (int i = 0; i < VT13_KEY_NUM; i++) {
vt13->data.keyboard.key[i] = (key_value & (1 << i)) != 0;
}
return DEVICE_OK;
}
int8_t VT13_Offline(VT13_t *vt13) {
if (vt13 == NULL) return DEVICE_ERR_NULL;
vt13->header.online = false;
memset(&(vt13->data), 0, sizeof(vt13->data));
return DEVICE_OK;
}

116
User/device/vt13.h Normal file
View File

@ -0,0 +1,116 @@
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ----------------------------------------------------------------- */
#include <cmsis_os2.h>
#include <stdint.h>
#include <stdbool.h>
#include "component/user_math.h"
#include "device.h"
/* Exported constants ------------------------------------------------------- */
#define VT13_CH_VALUE_MIN (364u)
#define VT13_CH_VALUE_MID (1024u)
#define VT13_CH_VALUE_MAX (1684u)
/* Exported types ----------------------------------------------------------- */
/* 图传接收端 21 字节数据帧原始结构 */
typedef struct __packed {
uint8_t header1; /* 帧头10xA9 [cite: 164] */
uint8_t header2; /* 帧头20x53 [cite: 164] */
/* 连续 64 bits 的位域提取 */
uint64_t ch_r_x : 11; /* 通道 0右摇杆水平 [cite: 164] */
uint64_t ch_r_y : 11; /* 通道 1右摇杆竖直 [cite: 164] */
uint64_t ch_l_y : 11; /* 通道 2左摇杆竖直 [cite: 164] */
uint64_t ch_l_x : 11; /* 通道 3左摇杆水平 [cite: 165] */
uint64_t mode : 2; /* 挡位切换开关 [cite: 165] */
uint64_t pause : 1; /* 暂停按键 [cite: 165] */
uint64_t custom_l : 1; /* 自定义按键(左) [cite: 165] */
uint64_t custom_r : 1; /* 自定义按键(右) [cite: 165] */
uint64_t dial : 11; /* 拨轮 [cite: 165] */
uint64_t trigger : 1; /* 扳机键 [cite: 165] */
uint64_t res1 : 3; /* 补齐至 80 offset */
int16_t mouse_x; /* 鼠标 X 轴 [cite: 165] */
int16_t mouse_y; /* 鼠标 Y 轴 [cite: 165] */
int16_t mouse_z; /* 鼠标 Z 轴 [cite: 165] */
/* 连续 8 bits 的位域提取 */
uint8_t mouse_l : 2; /* 鼠标左键 */
uint8_t mouse_r : 2; /* 鼠标右键 */
uint8_t mouse_m : 2; /* 鼠标中键 */
uint8_t res2 : 2; /* 补齐至 136 offset */
uint16_t keyboard; /* 键盘按键位映射 */
uint16_t crc16; /* CRC 校验 */
} VT13_RawData_t;
/* 模式开关枚举 */
typedef enum {
VT13_MODE_C = 0, /* [cite: 165] */
VT13_MODE_N = 1, /* [cite: 165] */
VT13_MODE_S = 2, /* [cite: 165] */
} VT13_Mode_t;
/* 键盘按键值映射,依据文档 bit0-bit15 定义 */
typedef enum {
VT13_KEY_W = 0, VT13_KEY_S, VT13_KEY_A, VT13_KEY_D,
VT13_KEY_SHIFT, VT13_KEY_CTRL, VT13_KEY_Q, VT13_KEY_E,
VT13_KEY_R, VT13_KEY_F, VT13_KEY_G, VT13_KEY_Z,
VT13_KEY_X, VT13_KEY_C, VT13_KEY_V, VT13_KEY_B,
VT13_KEY_NUM
} VT13_Key_t;
/* 解析后的数据结构 */
typedef struct {
float ch_l_x; /* 左侧摇杆水平,右为正 [-1.0~1.0] */
float ch_l_y; /* 左侧摇杆竖直,上为正 [-1.0~1.0] */
float ch_r_x; /* 右侧摇杆水平,右为正 [-1.0~1.0] */
float ch_r_y; /* 右侧摇杆竖直,上为正 [-1.0~1.0] */
float dial; /* 拨轮值 [-1.0~1.0] */
VT13_Mode_t mode; /* 挡位切换开关 [cite: 165] */
bool pause; /* 暂停按键按下为 true [cite: 165] */
bool custom_l; /* 左自定义键按下为 true [cite: 165] */
bool custom_r; /* 右自定义键按下为 true [cite: 165] */
bool trigger; /* 扳机键按下为 true [cite: 165] */
struct {
int16_t x; /* 鼠标横向移动,负向左 [cite: 165] */
int16_t y; /* 鼠标纵向移动,负向后 [cite: 165] */
int16_t z; /* 鼠标滚轮速度,负向后 [cite: 165] */
bool l_click;
bool r_click;
bool m_click;
} mouse;
union {
bool key[VT13_KEY_NUM];
uint16_t value;
} keyboard;
} VT13_Data_t;
typedef struct {
DEVICE_Header_t header;
VT13_RawData_t raw_data;
VT13_Data_t data;
} VT13_t;
/* Exported functions prototypes -------------------------------------------- */
int8_t VT13_Init(VT13_t *vtm);
int8_t VT13_Restart(void);
int8_t VT13_StartDmaRecv(VT13_t *vtm);
bool VT13_WaitDmaCplt(uint32_t timeout);
int8_t VT13_ParseData(VT13_t *vtm);
int8_t VT13_Offline(VT13_t *vtm);
#ifdef __cplusplus
}
#endif

View File

@ -233,6 +233,13 @@ Config_RobotParam_t robot_config = {
.enable=false, .enable=false,
.threshold=110.0f, .threshold=110.0f,
.suspectedTime=0.5f, .suspectedTime=0.5f,
},
.heatControl={
.enable=true,
.nmax=2.0f, // 最大射频 Hz
.Hwarn=200.0f, // 热量预警值
.Hsatu=100.0f, // 热量饱和值
.Hthres=50.0f, // 热量阈值
}, },
.motor={ .motor={
.fric = { .fric = {

View File

@ -33,20 +33,27 @@ void Task(void *argument) {
/* Includes ----------------------------------------------------------------- */ /* Includes ----------------------------------------------------------------- */
#include <math.h> #include <math.h>
#include <string.h> #include <string.h>
#include "module/shoot.h" #include "shoot.h"
#include "bsp/mm.h" #include "bsp/mm.h"
#include "bsp/time.h" #include "bsp/time.h"
#include "device/referee.h"
#include "component/filter.h" #include "component/filter.h"
#include "component/user_math.h" #include "component/user_math.h"
#include "module/cmd/cmd.h" #include "device/referee.h"
/* Private typedef ---------------------------------------------------------- */ /* Private typedef ---------------------------------------------------------- */
/* Private define ----------------------------------------------------------- */ /* Private define ----------------------------------------------------------- */
#define MAX_FRIC_RPM 7000.0f #define MAX_FRIC_RPM 7000.0f
#define MAX_TRIG_RPM 6000.0f//这里可能也会影响最高发射频率,待测试 #define MAX_TRIG_RPM 1500.0f//这里可能也会影响最高发射频率,待测试
/* 发射检测参数 */
#define SHOT_DETECT_RPM_DROP_THRESHOLD 100.0f /* 摩擦轮转速下降阈值单位rpm */
#define SHOT_DETECT_SUSPECTED_TIME 0.0005f /* 发射嫌疑持续时间阈值,单位秒 */
#define FRIC_READY_RPM_RATIO 0.95f /* 摩擦轮准备好的转速比例 */
/* Private macro ------------------------------------------------------------ */ /* Private macro ------------------------------------------------------------ */
/* Private variables -------------------------------------------------------- */ /* Private variables -------------------------------------------------------- */
static bool last_firecmd; static bool last_firecmd;
float maxTrigrpm=4000.0f;
/* Private function -------------------------------------------------------- */ /* Private function -------------------------------------------------------- */
/** /**
@ -177,12 +184,315 @@ int8_t Shoot_CaluTargetRPM(Shoot_t *s, float target_speed)
s->target_variable.fric_rpm=5000.0f; s->target_variable.fric_rpm=5000.0f;
break; break;
case SHOOT_PROJECTILE_42MM: case SHOOT_PROJECTILE_42MM:
s->target_variable.fric_rpm=4000.0f; s->target_variable.fric_rpm=3600.0f;//6500
break; break;
} }
return SHOOT_OK; return SHOOT_OK;
} }
/**
* \brief 使
*
* \param s
*
* \return
*/
static int8_t Shoot_UpdateHeatControl(Shoot_t *s)
{
if (s == NULL) {
return SHOOT_ERR_NULL;
}
/* 使用融合后的热量值计算剩余热量 */
s->heatcontrol.Hres = s->heatcontrol.Hmax - s->heatcontrol.Hnow_fused;
/* 计算冷却射频 ncd = Hcd / Hgen */
if (s->heatcontrol.Hgen > 0.0f) {
s->heatcontrol.ncd = s->heatcontrol.Hcd / s->heatcontrol.Hgen;
} else {
s->heatcontrol.ncd = 0.0f;
}
return SHOOT_OK;
}
/**
* \brief
*
* \param s
*
* \return
*/
static float Shoot_CalcAvgFricRpm(Shoot_t *s)
{
if (s == NULL) {
return 0.0f;
}
float sum = 0.0f;
uint8_t fric_num = s->param->basic.fric_num;
for (int i = 0; i < fric_num; i++) {
sum += fabs(s->var_fric.fil_rpm[i]);
}
return (fric_num > 0) ? (sum / fric_num) : 0.0f;
}
/**
* \brief
*
* \param s
*
* \return
*/
static bool Shoot_DetectShotByRpmDrop(Shoot_t *s)
{
if (s == NULL) {
return false;
}
/* 只在READY和FIRE状态下检测避免停机时误判 */
if (s->running_state != SHOOT_STATE_READY &&
s->running_state != SHOOT_STATE_FIRE) {
return false;
}
/* 计算当前摩擦轮平均转速 */
s->heatcontrol.avgFricRpm = Shoot_CalcAvgFricRpm(s);
/* 计算当前转速与目标转速的差值(掉速量) */
s->heatcontrol.rpmDrop = s->target_variable.fric_rpm - s->heatcontrol.avgFricRpm;
/* 判断是否发生明显掉速 */
if (s->heatcontrol.rpmDrop > SHOT_DETECT_RPM_DROP_THRESHOLD) {
return true;
}
return false;
}
/**
* \brief
*
* \param s
*
* \return
*
* \note
*
*/
static int8_t Shoot_FuseHeatData(Shoot_t *s)
{
if (s == NULL) {
return SHOOT_ERR_NULL;
}
/* 如果裁判系统数据有效Hmax > 0 */
if (s->heatcontrol.Hmax > 0.0f && s->heatcontrol.Hnow >= 0.0f) {
/* 检测裁判系统数据是否有更新 */
if (s->heatcontrol.Hnow != s->heatcontrol.Hnow_last) {
/* 数据更新了,用裁判系统数据修正估计值 */
s->heatcontrol.Hnow_estimated = s->heatcontrol.Hnow;
s->heatcontrol.Hnow_last = s->heatcontrol.Hnow; /* 记录本次值 */
}
/* 融合值就是裁判系统值(作为基准) */
s->heatcontrol.Hnow_fused = s->heatcontrol.Hnow;
} else {
/* 裁判系统数据无效,仅使用自主估计值 */
s->heatcontrol.Hnow_fused = s->heatcontrol.Hnow_estimated;
}
return SHOOT_OK;
}
/**
* \brief
*
* \param s
*
* \return
*/
static int8_t Shoot_CalcAvailableShots(Shoot_t *s)
{
if (s == NULL) {
return SHOOT_ERR_NULL;
}
/* 计算剩余热量 */
float heat_available = s->heatcontrol.Hmax - s->heatcontrol.Hnow_fused;
/* 计算可发射弹数 */
if (s->heatcontrol.Hgen > 0.0f && heat_available > 0.0f) {
s->heatcontrol.shots_available = (uint16_t)(heat_available / s->heatcontrol.Hgen);
} else {
s->heatcontrol.shots_available = 0;
}
return SHOOT_OK;
}
/**
* \brief
*
* \param s
*
* \return
*/
static int8_t Shoot_HeatDetectionFSM(Shoot_t *s)
{
if (s == NULL) {
return SHOOT_ERR_NULL;
}
switch (s->heatcontrol.detectState) {
case SHOOT_HEAT_DETECT_IDLE:
/* 停机状态:等待摩擦轮启动并加速到目标速度附近 */
if (s->running_state == SHOOT_STATE_READY ||
s->running_state == SHOOT_STATE_FIRE) {
/* 计算当前平均转速 */
s->heatcontrol.avgFricRpm = Shoot_CalcAvgFricRpm(s);
/* 检查摩擦轮是否达到目标转速的85%以上 */
if (s->heatcontrol.avgFricRpm >= s->target_variable.fric_rpm * FRIC_READY_RPM_RATIO) {
s->heatcontrol.detectState = SHOOT_HEAT_DETECT_READY;
s->heatcontrol.lastAvgFricRpm = s->heatcontrol.avgFricRpm;
}
}
break;
case SHOOT_HEAT_DETECT_READY:
/* 准备检测状态:监测摩擦轮掉速 */
/* 检测掉速(当前转速低于目标转速超过阈值) */
if (Shoot_DetectShotByRpmDrop(s)) {
s->heatcontrol.detectState = SHOOT_HEAT_DETECT_SUSPECTED;
s->heatcontrol.detectTime = s->timer.now; /* 记录进入嫌疑状态的时间 */
}
/* 如果摩擦轮停止 */
if (s->running_state == SHOOT_STATE_IDLE) {
s->heatcontrol.detectState = SHOOT_HEAT_DETECT_IDLE;
}
break;
case SHOOT_HEAT_DETECT_SUSPECTED:
/* 发射嫌疑状态:持续检测掉速 */
/* 更新掉速量 */
s->heatcontrol.avgFricRpm = Shoot_CalcAvgFricRpm(s);
s->heatcontrol.rpmDrop = s->target_variable.fric_rpm - s->heatcontrol.avgFricRpm;
/* 若掉速消失(转速恢复正常),回到准备状态 */
if (s->heatcontrol.rpmDrop < SHOT_DETECT_RPM_DROP_THRESHOLD) {
s->heatcontrol.detectState = SHOOT_HEAT_DETECT_READY;
}
/* 若嫌疑状态持续超过阈值时间,确认发射 */
else if ((s->timer.now - s->heatcontrol.detectTime) >= SHOT_DETECT_SUSPECTED_TIME) {
s->heatcontrol.detectState = SHOOT_HEAT_DETECT_CONFIRMED;
}
break;
case SHOOT_HEAT_DETECT_CONFIRMED:
/* 确认发射状态:增加热量并返回准备状态 */
/* 根据弹丸类型增加估计热量 */
switch (s->param->basic.projectileType) {
case SHOOT_PROJECTILE_17MM:
s->heatcontrol.Hnow_estimated += 10.0f;
break;
case SHOOT_PROJECTILE_42MM:
s->heatcontrol.Hnow_estimated += 100.0f;
break;
default:
s->heatcontrol.Hnow_estimated += s->heatcontrol.Hgen;
break;
}
/* 限制估计热量不超过最大值 */
if (s->heatcontrol.Hnow_estimated > s->heatcontrol.Hmax) {
s->heatcontrol.Hnow_estimated = s->heatcontrol.Hmax;
}
/* 增加发射计数 */
s->heatcontrol.shots_detected++;
/* 返回准备检测状态 */
s->heatcontrol.detectState = SHOOT_HEAT_DETECT_READY;
break;
default:
s->heatcontrol.detectState = SHOOT_HEAT_DETECT_IDLE;
break;
}
/* 善后工作:热量冷却(每个周期都执行) */
if (s->heatcontrol.Hnow_estimated > 0.0f && s->heatcontrol.Hcd > 0.0f) {
s->heatcontrol.Hnow_estimated -= s->heatcontrol.Hcd * s->timer.dt;
if (s->heatcontrol.Hnow_estimated < 0.0f) {
s->heatcontrol.Hnow_estimated = 0.0f;
}
}
/* 数据融合 */
Shoot_FuseHeatData(s);
/* 计算可发射弹数 */
Shoot_CalcAvailableShots(s);
return SHOOT_OK;
}
/**
* \brief
*
* \param s
*
* \return Hz
*/
static float Shoot_CaluFreqByHeat(Shoot_t *s)
{
if (s == NULL) {
return 0.0f;
}
/* 如果热量控制未启用,返回配置的射频 */
if (!s->param->heatControl.enable) {
return s->param->basic.shot_freq;
}
/* 检查Hmax和Hcd是否有效 */
if (s->heatcontrol.Hmax <= 0.0f || s->heatcontrol.Hcd <= 0.0f) {
return s->param->basic.shot_freq; /* 数据无效,使用默认射频 */
}
float Hres = s->heatcontrol.Hres;
float Hwarn = s->param->heatControl.Hwarn;
float Hsatu = s->param->heatControl.Hsatu;
float Hthres = s->param->heatControl.Hthres;
float nmax = s->param->heatControl.nmax;
float ncd = s->heatcontrol.ncd;
/* 剩余热量大于预警值:最大射频 */
if (Hres > Hwarn) {
return nmax;
}
/* 剩余热量在预警值和饱和值之间:线性映射 */
else if (Hres > Hsatu) {
/* 线性插值: n = ncd + (nmax - ncd) * (Hres - Hsatu) / (Hwarn - Hsatu) */
float ratio = (Hres - Hsatu) / (Hwarn - Hsatu);
return ncd + (nmax - ncd) * ratio;
}
/* 剩余热量在饱和值和阈值之间:冷却射频 */
else if (Hres > Hthres) {
return ncd;
}
/* 剩余热量小于阈值:停止射击 */
else {
return 0.0f;
}
}
/** /**
* \brief * \brief
* *
@ -196,10 +506,19 @@ int8_t Shoot_CaluTargetAngle(Shoot_t *s, Shoot_CMD_t *cmd)
if (s == NULL || s->var_trig.num_toShoot == 0) { if (s == NULL || s->var_trig.num_toShoot == 0) {
return SHOOT_ERR_NULL; return SHOOT_ERR_NULL;
} }
/* 更新热量控制数据 */
Shoot_UpdateHeatControl(s);
/* 根据热量控制计算实际射频 */
float actual_freq = Shoot_CaluFreqByHeat(s);
float dt = s->timer.now - s->var_trig.time_lastShoot; float dt = s->timer.now - s->var_trig.time_lastShoot;
float dpos; float dpos;
dpos = CircleError(s->target_variable.trig_angle, s->var_trig.trig_agl, M_2PI); dpos = CircleError(s->target_variable.trig_angle, s->var_trig.trig_agl, M_2PI);
if(dt >= 1.0f/s->param->basic.shot_freq && cmd->firecmd && dpos<=1.0f)
/* 使用热量控制计算出的射频,而不是配置的固定射频 */
if(actual_freq > 0.0f && dt >= 1.0f/actual_freq && cmd->firecmd && dpos<=1.0f)
{ {
s->var_trig.time_lastShoot=s->timer.now; s->var_trig.time_lastShoot=s->timer.now;
CircleAdd(&s->target_variable.trig_angle, M_2PI/s->param->basic.num_trig_tooth, M_2PI); CircleAdd(&s->target_variable.trig_angle, M_2PI/s->param->basic.num_trig_tooth, M_2PI);
@ -285,7 +604,7 @@ int8_t Shoot_UpdateFeedback(Shoot_t *s)
s->var_trig.trig_agl = M_2PI - s->var_trig.trig_agl; s->var_trig.trig_agl = M_2PI - s->var_trig.trig_agl;
} }
s->var_trig.fil_trig_rpm = LowPassFilter2p_Apply(&s->filter.trig.in, s->feedback.trig.feedback.rotor_speed); s->var_trig.fil_trig_rpm = LowPassFilter2p_Apply(&s->filter.trig.in, s->feedback.trig.feedback.rotor_speed);
s->var_trig.trig_rpm = s->feedback.trig.feedback.rotor_speed / MAX_TRIG_RPM; s->var_trig.trig_rpm = s->feedback.trig.feedback.rotor_speed / maxTrigrpm;
if(s->var_trig.trig_rpm>1.0f)s->var_trig.trig_rpm=1.0f; if(s->var_trig.trig_rpm>1.0f)s->var_trig.trig_rpm=1.0f;
if(s->var_trig.trig_rpm<-1.0f)s->var_trig.trig_rpm=-1.0f; if(s->var_trig.trig_rpm<-1.0f)s->var_trig.trig_rpm=-1.0f;
@ -300,8 +619,7 @@ int8_t Shoot_UpdateFeedback(Shoot_t *s)
* \param cmd * \param cmd
* *
* \return * \return
*/ */float a;
// float a;
int8_t Shoot_RunningFSM(Shoot_t *s, Shoot_CMD_t *cmd) int8_t Shoot_RunningFSM(Shoot_t *s, Shoot_CMD_t *cmd)
{ {
if (s == NULL || cmd == NULL) { if (s == NULL || cmd == NULL) {
@ -624,6 +942,10 @@ int8_t Shoot_Init(Shoot_t *s, Shoot_Params_t *param, float target_freq)
/* 归零变量 */ /* 归零变量 */
memset(&s->var_trig,0,sizeof(s->var_trig)); memset(&s->var_trig,0,sizeof(s->var_trig));
/* 初始化热量控制 */
memset(&s->heatcontrol, 0, sizeof(s->heatcontrol));
return SHOOT_OK; return SHOOT_OK;
} }
@ -645,6 +967,10 @@ int8_t Shoot_Control(Shoot_t *s, Shoot_CMD_t *cmd)
s->timer.lask_wakeup = BSP_TIME_Get_us(); s->timer.lask_wakeup = BSP_TIME_Get_us();
Shoot_CaluTargetRPM(s,233); Shoot_CaluTargetRPM(s,233);
/* 运行热量检测状态机 */
Shoot_HeatDetectionFSM(s);
/* 运行卡弹检测状态机 */
Shoot_JamDetectionFSM(s, cmd); Shoot_JamDetectionFSM(s, cmd);
// Shoot_CalufeedbackRPM(s); // Shoot_CalufeedbackRPM(s);
return SHOOT_OK; return SHOOT_OK;
@ -652,6 +978,15 @@ int8_t Shoot_Control(Shoot_t *s, Shoot_CMD_t *cmd)
/** /**
* @brief UI数据 * @brief UI数据
* *

View File

@ -12,7 +12,6 @@ extern "C" {
#include "main.h" #include "main.h"
#include "component/pid.h" #include "component/pid.h"
#include "device/motor_rm.h" #include "device/motor_rm.h"
/* Exported constants ------------------------------------------------------- */ /* Exported constants ------------------------------------------------------- */
#define MAX_FRIC_NUM 6 #define MAX_FRIC_NUM 6
#define MAX_NUM_MULTILEVEL 2 /* 多级发射级数 */ #define MAX_NUM_MULTILEVEL 2 /* 多级发射级数 */
@ -31,6 +30,13 @@ typedef enum {
SHOOT_JAMFSM_STATE_CONFIRMED, /* 确认状态 */ SHOOT_JAMFSM_STATE_CONFIRMED, /* 确认状态 */
SHOOT_JAMFSM_STATE_DEAL /* 处理状态 */ SHOOT_JAMFSM_STATE_DEAL /* 处理状态 */
}Shoot_JamDetectionFSM_State_t; }Shoot_JamDetectionFSM_State_t;
typedef enum {
SHOOT_HEAT_DETECT_IDLE = 0, /* 停机状态 */
SHOOT_HEAT_DETECT_READY, /* 准备检测状态 */
SHOOT_HEAT_DETECT_SUSPECTED, /* 发射嫌疑状态 */
SHOOT_HEAT_DETECT_CONFIRMED /* 确认发射状态 */
}Shoot_HeatDetectionFSM_State_t;
typedef enum { typedef enum {
SHOOT_STATE_IDLE = 0,/* 熄火 */ SHOOT_STATE_IDLE = 0,/* 熄火 */
SHOOT_STATE_READY, /* 准备射击 */ SHOOT_STATE_READY, /* 准备射击 */
@ -83,6 +89,36 @@ typedef struct {
float lastTime;/* 用于记录怀疑状态或处理状态的开始时间 */ float lastTime;/* 用于记录怀疑状态或处理状态的开始时间 */
Shoot_JamDetectionFSM_State_t fsmState; /* 卡弹检测状态机 */ Shoot_JamDetectionFSM_State_t fsmState; /* 卡弹检测状态机 */
}Shoot_JamDetection_t; }Shoot_JamDetection_t;
typedef struct {
/* 从裁判系统读取的常量 */
float Hmax; // 热量上限
float Hcd; // 热量冷却速度
float Hgen; // 每发射一发产生的热量
/* 实时数据 */
float Hnow; // 当前热量(从裁判系统实时读取)
float Hnow_last; // 上次裁判系统热量值(用于检测更新)
float Hres; // 剩余热量 (Hmax - Hnow)
/* 控制变量 */
float ncd; // 冷却射频(消耗热量 = 自然恢复热量)
/* 发射检测状态机 */
Shoot_HeatDetectionFSM_State_t detectState; // 检测状态
float detectTime; // 检测计时器
float avgFricRpm; // 摩擦轮平均转速
float lastAvgFricRpm; // 上次摩擦轮平均转速
float rpmDrop; // 转速下降量
bool shotDetected; // 检测到发射标志
/* 自主热量估计 */
float Hnow_estimated; // 估计的当前热量
float Hnow_fused; // 融合后的热量值
uint16_t shots_detected; // 检测到的发射数
uint16_t shots_available;// 当前热量可发射弹数
}Shoot_HeatControl_t;
typedef struct { typedef struct {
float out_follow[MAX_FRIC_NUM]; float out_follow[MAX_FRIC_NUM];
float out_err[MAX_FRIC_NUM]; float out_err[MAX_FRIC_NUM];
@ -115,6 +151,13 @@ typedef struct {
float threshold; /* 卡弹检测阈值单位A (dji2006建议设置为120Adji3508建议设置为235A,根据实际测试调整)*/ float threshold; /* 卡弹检测阈值单位A (dji2006建议设置为120Adji3508建议设置为235A,根据实际测试调整)*/
float suspectedTime;/* 卡弹怀疑时间,单位秒 */ float suspectedTime;/* 卡弹怀疑时间,单位秒 */
}jamDetection;/* 卡弹检测参数 */ }jamDetection;/* 卡弹检测参数 */
struct {
bool enable; /* 是否启用热量控制 */
float nmax;//最大射频
float Hwarn;//热量预警值
float Hsatu;//热量饱和值
float Hthres;//热量阈值,超过这个值将无法射击
}heatControl;/* 热量控制参数 */
struct { struct {
Shoot_MOTOR_RM_Param_t fric[MAX_FRIC_NUM]; Shoot_MOTOR_RM_Param_t fric[MAX_FRIC_NUM];
MOTOR_RM_Param_t trig; MOTOR_RM_Param_t trig;
@ -159,6 +202,7 @@ typedef struct {
/* 控制信息*/ /* 控制信息*/
Shoot_Running_State_t running_state; /* 运行状态机 */ Shoot_Running_State_t running_state; /* 运行状态机 */
Shoot_JamDetection_t jamdetection; /* 卡弹检测控制信息 */ Shoot_JamDetection_t jamdetection; /* 卡弹检测控制信息 */
Shoot_HeatControl_t heatcontrol; /* 热量控制信息 */
Shoot_VARSForFricCtrl_t var_fric; /* 摩擦轮控制信息 */ Shoot_VARSForFricCtrl_t var_fric; /* 摩擦轮控制信息 */
Shoot_VARSForTrigCtrl_t var_trig; /* 角度计算控制信息 */ Shoot_VARSForTrigCtrl_t var_trig; /* 角度计算控制信息 */
Shoot_Output_t output; /* 输出信息 */ Shoot_Output_t output; /* 输出信息 */
@ -234,7 +278,7 @@ int8_t Shoot_UpdateFeedback(Shoot_t *s);
*/ */
int8_t Shoot_Control(Shoot_t *s, Shoot_CMD_t *cmd); int8_t Shoot_Control(Shoot_t *s, Shoot_CMD_t *cmd);
//void Shoot_DumpUI(Shoot_t *s, Referee_ShootUI_t *ui);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -46,6 +46,7 @@ void Task_super_cap(void *argument) {
while (1) { while (1) {
tick += delay_tick; /* 计算下一个唤醒时刻 */ tick += delay_tick; /* 计算下一个唤醒时刻 */
/* USER CODE BEGIN */ /* USER CODE BEGIN */
osMessageQueueGet(task_runtime.msgq.referee.cap, &SuperCap_CanTX.Powerlimit , NULL, 0);
SuperCap_Update(); SuperCap_Update();
CAN_TX_SuperCapData(&SuperCap_CanTX); CAN_TX_SuperCapData(&SuperCap_CanTX);
/* 超电UI */ /* 超电UI */

View File

@ -288,7 +288,7 @@ PH11.GPIO_Label=LED_Green
PH11.GPIO_PuPd=GPIO_PULLUP PH11.GPIO_PuPd=GPIO_PULLUP
PH11.GPIO_Speed=GPIO_SPEED_FREQ_LOW PH11.GPIO_Speed=GPIO_SPEED_FREQ_LOW
PH11.Locked=true PH11.Locked=true
PH11.PinState=GPIO_PIN_SET PH11.PinState=GPIO_PIN_RESET
PH11.Signal=GPIO_Output PH11.Signal=GPIO_Output
PH12.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultOutputPP PH12.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultOutputPP
PH12.GPIO_Label=LED_Red PH12.GPIO_Label=LED_Red