特性:实现电机控制与霍尔传感器功能

新增电机板级支持包:基于 AT8236-MS 驱动芯片,实现了对 4 个直流电机的 PWM 控制。
实现霍尔传感器功能:用于速度测量和脉冲计数。
更新 GPIO 初始化:为霍尔传感器添加了外部中断(EXTI)配置。
修改系统时钟配置:改用高速外部时钟(HSE)并调整了锁相环(PLL)设置。
更改定时器配置:将时基生成从 TIM8 改为 TIM4。
增强 FreeRTOS 任务:实现从霍尔传感器周期性读取并更新速度数据。
更新项目配置:以反映外设使用情况和优先级的变更。
This commit is contained in:
2026-04-03 20:24:55 +08:00
parent a53aa38ed3
commit 1cc8327f13
17 changed files with 682 additions and 149 deletions

122
Core/Bsp/bsp_motor.c Normal file
View File

@@ -0,0 +1,122 @@
#include "bsp_motor.h"
#include "tim.h"
/**
* @file bsp_motor.c
* @brief AT8236-MS 电机驱动实现 (PWM)
*
* AT8236-MS 驱动逻辑参考:
* - IN1 (PWM) / IN2 (L) -> 正转
* - IN1 (L) / IN2 (PWM) -> 反转
* - IN1 (L) / IN2 (L) -> 停止/刹车 (视具体芯片配置而定)
*/
/**
* @brief 初始化电机相关外设
*/
void motor_init(void)
{
/* 1. 开启 PWM 定时器硬件通道 (TIM1 用于 M1, M2) */
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);
/* --- 关键修改:强制使能 TIM1 的主输出 (仅高级定时器需要) --- */
__HAL_TIM_MOE_ENABLE(&htim1);
/* 2. 开启 PWM 定时器硬件通道 (TIM2 用于 M3, M4) */
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_4);
/* 3. 初始状态设置为停止 */
motor_stop(MOTOR_1);
motor_stop(MOTOR_2);
motor_stop(MOTOR_3);
motor_stop(MOTOR_4);
}
/**
* @brief 设置电机PWM速度和方向
* @param motor_id 电机 ID (MOTOR_1 到 MOTOR_4)
* @param speed 速度值 (-3599 到 3599正数正转负数反转)
*/
void motor_set_speed(motor_id_t motor_id, int16_t speed)
{
TIM_HandleTypeDef* htim_w = NULL;
uint32_t channel_w = 0;
TIM_HandleTypeDef* htim_s = NULL;
uint32_t channel_s = 0;
/* 获取对应电机的 定时器句柄和通道 (根据 tim.c GPIO 复用定义) */
switch (motor_id) {
case MOTOR_1: // PE9->TIM1_CH1, PE11->TIM1_CH2
htim_w = &htim1; channel_w = TIM_CHANNEL_1;
htim_s = &htim1; channel_s = TIM_CHANNEL_2;
break;
case MOTOR_2: // PE13->TIM1_CH3, PE14->TIM1_CH4
htim_w = &htim1; channel_w = TIM_CHANNEL_3;
htim_s = &htim1; channel_s = TIM_CHANNEL_4;
break;
case MOTOR_3: // PA15->TIM2_CH1, PB3->TIM2_CH2
htim_w = &htim2; channel_w = TIM_CHANNEL_1;
htim_s = &htim2; channel_s = TIM_CHANNEL_2;
break;
case MOTOR_4: // PA2->TIM2_CH3, PA3->TIM2_CH4
htim_w = &htim2; channel_w = TIM_CHANNEL_3;
htim_s = &htim2; channel_s = TIM_CHANNEL_4;
break;
default: return;
}
/* 限制速度范围 (ARR=3599) */
if (speed > 3599) speed = 3599;
if (speed < -3599) speed = -3599;
/* 计算绝对值速度 */
uint16_t pwm_val = (speed < 0) ? (uint16_t)(-speed) : (uint16_t)speed;
/* 根据速度判断方向 */
if (speed > 0) {
/* 正转W 输出 PWM, S 输出低电平 (占空比 0) */
__HAL_TIM_SET_COMPARE(htim_w, channel_w, pwm_val);
__HAL_TIM_SET_COMPARE(htim_s, channel_s, 0);
} else if (speed < 0) {
/* 反转W 输出低电平 (占空比 0), S 输出 PWM */
__HAL_TIM_SET_COMPARE(htim_w, channel_w, 0);
__HAL_TIM_SET_COMPARE(htim_s, channel_s, pwm_val);
} else {
motor_stop(motor_id);
}
}
/**
* @brief 停止电机
* @param motor_id 电机 ID
*/
void motor_stop(motor_id_t motor_id)
{
/* 设置对应通道占空比均为 0 以刹车/停止 */
switch (motor_id) {
case MOTOR_1:
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 0);
break;
case MOTOR_2:
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, 0);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, 0);
break;
case MOTOR_3:
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 0);
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, 0);
break;
case MOTOR_4:
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, 0);
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4, 0);
break;
default: break;
}
}