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

100 lines
3.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 引脚输出 PWMS 引脚为低,电机正向旋转。
- 给予负数速度时S 引脚输出 PWMW 引脚为低,电机反向旋转。
- 速度数值越大,电机转速越高,最大有效值为 3599。
2. **霍尔测量**
- 电机每旋转一圈,对应的 `pulse_count` 会根据编码器磁极对数增加。
- 通过观察 `hall_get_count` 的数值增长,可以确认传感器信号捕获正常。
## 驱动逻辑 (AT8236-MS)
驱动器通过两路电平差控制方向:
- **正转**: W引脚输出 PWMS引脚输出低电平(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