新增电机板级支持包:基于 AT8236-MS 驱动芯片,实现了对 4 个直流电机的 PWM 控制。 实现霍尔传感器功能:用于速度测量和脉冲计数。 更新 GPIO 初始化:为霍尔传感器添加了外部中断(EXTI)配置。 修改系统时钟配置:改用高速外部时钟(HSE)并调整了锁相环(PLL)设置。 更改定时器配置:将时基生成从 TIM8 改为 TIM4。 增强 FreeRTOS 任务:实现从霍尔传感器周期性读取并更新速度数据。 更新项目配置:以反映外设使用情况和优先级的变更。
100 lines
3.2 KiB
Markdown
100 lines
3.2 KiB
Markdown
# BSP Motor 驱动说明 (AT8236-MS)
|
||
|
||
该驱动模块用于通过 STM32 的硬件 PWM 功能控制 4 路直流电机,适配 **AT8236-MS** 驱动芯片。
|
||
|
||
## 硬件连接
|
||
|
||
| 电机 ID | 信号定义 | STM32 引脚 | 定时器通道 |
|
||
| :--- | :--- | :--- | :--- |
|
||
| **MOTOR_1** | M1_W / M1_S | PE9 / PE11 | TIM1_CH1 / TIM1_CH2 |
|
||
| **MOTOR_2** | M2_W / M2_S | PE13 / PE14 | TIM1_CH3 / TIM1_CH4 |
|
||
| **MOTOR_3** | M3_W / M3_S | PA15 / PB3 | TIM2_CH1 / TIM2_CH2 |
|
||
| **MOTOR_4** | M4_W / M4_S | PA2 / PA3 | TIM2_CH3 / TIM2_CH4 |
|
||
|
||
## 霍尔传感器 (由于是一根线,仅限频率测速)
|
||
|
||
| 传感器 ID | STM32 引脚 | 模式 | 功能 |
|
||
| :--- | :--- | :--- | :--- |
|
||
| **HALL_1 (M1)** | PD9 (M_I_1) | GPIO_EXTI | 脉冲计数 / 测速 |
|
||
| **HALL_2 (M2)** | PD8 (M_I_2) | GPIO_EXTI | 脉冲计数 / 测速 |
|
||
| **HALL_3 (M3)** | PB15 (M_I_3) | GPIO_EXTI | 脉冲计数 / 测速 |
|
||
| **HALL_4 (M4)** | PB14 (M_I_4) | GPIO_EXTI | 脉冲计数 / 测速 |
|
||
|
||
## 使用方式
|
||
|
||
### 1. 硬件初始化 (main.c)
|
||
在 `main.c` 的循环前调用电机和霍尔的初始化函数:
|
||
```c
|
||
/* USER CODE BEGIN 2 */
|
||
motor_init();
|
||
hall_init();
|
||
/* USER CODE END 2 */
|
||
```
|
||
|
||
### 2. 中断绑定 (stm32f1xx_it.c)
|
||
在外部中断回调函数中加入脉冲统计:
|
||
```c
|
||
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
|
||
{
|
||
hall_pulse_callback(GPIO_Pin);
|
||
}
|
||
```
|
||
|
||
### 3. 控制电机
|
||
调用 `motor_set_speed` 函数控制电机转动:
|
||
```c
|
||
// 电机1正转,中等速度
|
||
motor_set_speed(MOTOR_1, 2000);
|
||
|
||
// 电机2反转,全速
|
||
motor_set_speed(MOTOR_2, -3599);
|
||
```
|
||
|
||
### 4. 获取测量结果
|
||
在 FreeRTOS 任务或主循环中读取脉冲数或计算转速:
|
||
```c
|
||
uint32_t count = hall_get_count(MOTOR_1);
|
||
printf("Motor 1 Pulses: %ld\r\n", count);
|
||
```
|
||
|
||
## 预期结果
|
||
|
||
1. **电机控制**:
|
||
- 给予正数速度时,对应电机的 W 引脚输出 PWM,S 引脚为低,电机正向旋转。
|
||
- 给予负数速度时,S 引脚输出 PWM,W 引脚为低,电机反向旋转。
|
||
- 速度数值越大,电机转速越高,最大有效值为 3599。
|
||
|
||
2. **霍尔测量**:
|
||
- 电机每旋转一圈,对应的 `pulse_count` 会根据编码器磁极对数增加。
|
||
- 通过观察 `hall_get_count` 的数值增长,可以确认传感器信号捕获正常。
|
||
|
||
## 驱动逻辑 (AT8236-MS)
|
||
|
||
驱动器通过两路电平差控制方向:
|
||
- **正转**: W引脚输出 PWM,S引脚输出低电平(0%)。
|
||
- **反转**: W引脚输出低电平(0%),S引脚输出 PWM。
|
||
- **停止/刹车**: W和S引脚均输出低电平(0%)。
|
||
|
||
## 核心 API
|
||
|
||
### 1. 初始化
|
||
`void motor_init(void);`
|
||
- 开启 TIM1 和 TIM2 的所有对应 PWM 通道。
|
||
- 初始电机状态为停止。
|
||
|
||
### 2. 设置电机速度
|
||
`void motor_set_speed(motor_id_t motor_id, int16_t speed);`
|
||
- **motor_id**: `MOTOR_1` 到 `MOTOR_4`。
|
||
- **speed**: 范围为 `-3599` 到 `3599`(对应 20kHz 频率下的 ARR 重装载值)。
|
||
- 正数:正转。
|
||
- 负数:反转。
|
||
- 0:停止。
|
||
|
||
### 3. 停止电机
|
||
`void motor_stop(motor_id_t motor_id);`
|
||
- 立即将对应电机的两路占空比清零。
|
||
|
||
## 注意事项
|
||
- 使用前请确保 `MX_TIM1_Init()` 和 `MX_TIM2_Init()` 已在 `main.c` 中正常调用。
|
||
- 定时器的 `Period`(重装载值值)决定了最大速度的分辨率,当前配置为 16 位(65535)。
|