改变电机控制方式使用滑行模式控制电机,并使用滑行方式停止电机,经测试单个电机有效,双电机待测试

This commit is contained in:
2026-02-16 00:12:32 +08:00
parent 05eec1f08b
commit 87478484ca
2 changed files with 15 additions and 12 deletions

View File

@@ -186,6 +186,7 @@ void MX_FREERTOS_Init(void) {
/* USER CODE END Header_StartDefaultTask */ /* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void *argument) { void StartDefaultTask(void *argument) {
/* USER CODE BEGIN StartDefaultTask */ /* USER CODE BEGIN StartDefaultTask */
Screen_Init();
// 初始化命令 // 初始化命令
uint8_t init_cmd1[] = {0x7E, 0xFF, 0x06, 0x06, 0x00, uint8_t init_cmd1[] = {0x7E, 0xFF, 0x06, 0x06, 0x00,
0x00, 0x1E, 0xFE, 0xD7, 0xEF}; // 开启声音 0x00, 0x1E, 0xFE, 0xD7, 0xEF}; // 开启声音
@@ -376,12 +377,11 @@ void Motor(void *argument) {
/* USER CODE END Header_Screen */ /* USER CODE END Header_Screen */
void Screen(void *argument) { void Screen(void *argument) {
/* USER CODE BEGIN Screen */ /* USER CODE BEGIN Screen */
Screen_Init();
// HAL_UART_Transmit(&huart1, (uint8_t *)buf, strlen(buf), HAL_MAX_DELAY); // HAL_UART_Transmit(&huart1, (uint8_t *)buf, strlen(buf), HAL_MAX_DELAY);
/* Infinite loop */ /* Infinite loop */
for (;;) { for (;;) {
osDelay(2000);
} }
/* USER CODE END Screen */ /* USER CODE END Screen */
} }

View File

@@ -26,7 +26,7 @@
#define PWM_STEPS (PWM_ARR + 1) #define PWM_STEPS (PWM_ARR + 1)
/* 三档占空比(百分比),索引为 0..2 对应 档位 1..3档位0为停止 */ /* 三档占空比(百分比),索引为 0..2 对应 档位 1..3档位0为停止 */
static const uint8_t gears_percent[3] = {75, 80, 85}; static const uint8_t gears_percent[3] = {55, 65, 75};
/* current_gear: 0 = 停止, 1 = 低, 2 = 中, 3 = 高 */ /* current_gear: 0 = 停止, 1 = 低, 2 = 中, 3 = 高 */
static uint8_t current_gear = 0; /* 0..3 */ static uint8_t current_gear = 0; /* 0..3 */
@@ -39,17 +39,18 @@ static void set_both_motors_percent(uint8_t percent) {
uint32_t cmp = percent_to_compare(percent); uint32_t cmp = percent_to_compare(percent);
/* 停止并关闭 CH1、使用 CH2 输出 */ /* 停止并关闭 CH1、使用 CH2 输出 */
HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_1); //HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_2, (uint16_t)cmp); __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, (uint16_t)cmp);
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_2, 100);
/* 停止并关闭 CH3、使用 CH4 输出 */ /* 停止并关闭 CH3、使用 CH4 输出 */
HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_3); //HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_3);
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_4, (uint16_t)cmp); __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, (uint16_t)cmp);
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_4, 100);
} }
/* 启动时短暂提升到 75% 并保持 500ms然后降到一档档位1 */
/* 启动时短暂提升到 90% 并保持 500ms然后降到一档档位1 */
void Motor_StartupBoost(void) { void Motor_StartupBoost(void) {
set_both_motors_percent(90); set_both_motors_percent(80); /* 启动提升到 80% */
osDelay(1500); osDelay(1500);
current_gear = 1; /* 启动后回到档位1最低速 */ current_gear = 1; /* 启动后回到档位1最低速 */
set_both_motors_percent(gears_percent[current_gear - 1]); set_both_motors_percent(gears_percent[current_gear - 1]);
@@ -60,7 +61,8 @@ void Motor_SetGear(uint8_t gear) {
if (gear > 3) gear = 3; if (gear > 3) gear = 3;
current_gear = gear; current_gear = gear;
if (current_gear == 0) { if (current_gear == 0) {
set_both_motors_percent(0); // set_both_motors_percent(0);
Motor_Stop();
} else { } else {
set_both_motors_percent(gears_percent[current_gear - 1]); set_both_motors_percent(gears_percent[current_gear - 1]);
} }
@@ -71,7 +73,8 @@ void Motor_NextGear(void) {
current_gear++; current_gear++;
if (current_gear > 3) current_gear = 0; if (current_gear > 3) current_gear = 0;
if (current_gear == 0) { if (current_gear == 0) {
set_both_motors_percent(0); // set_both_motors_percent(0);
Motor_Stop();
} else { } else {
set_both_motors_percent(gears_percent[current_gear - 1]); set_both_motors_percent(gears_percent[current_gear - 1]);
} }