Files
foc/README.md

308 lines
7.3 KiB
Markdown
Raw Permalink 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.

# FOC 电机控制工程
## 1. 工程概述
本工程是基于 **TI MSPM0G3507** 微控制器的 **FOC磁场定向控制** 电机控制方案用于驱动无刷直流电机BLDC实现高精度角度控制。
### 硬件平台
- **MCU**: MSPM0G3507MSPM0系列Cortex-M0+内核)
- **开发板**: LP_MSPM0G3507 LaunchPad
- **编码器**: MT6701磁编码器I2C接口14位分辨率
### 软件特性
- 完整的FOC算法实现克拉克逆变换、帕克逆变换
- 开环/闭环双控制模式
- 单角度环PID控制
- UART串口指令接收
- 模块化代码结构
---
## 2. 工程结构
```
FOC/
├── 3rd/ # 第三方模块
│ ├── dfoc.c/h # FOC核心算法
│ ├── mt6701.c/h # MT6701编码器驱动
│ ├── pid_control.c/h # PID控制器
│ ├── pwm.c/h # PWM输出控制
│ ├── lowpass_filter.c/h # 低通滤波器
│ ├── uart_redircet.c/h # printf重定向
│ ├── delay.c/h # 延时函数
│ └── config.h # 调试配置
├── keil/ # Keil工程文件
│ ├── empty_LP_MSPM0G3507_nortos_keil.uvprojx
│ ├── mspm0g3507.sct
│ └── startup_mspm0g350x_uvision.s
├── empty.c # 主程序入口
├── empty.syscfg # SysConfig配置文件
├── ti_msp_dl_config.c/h # SysConfig生成的配置代码
└── README.md # 工程文档
```
---
## 3. 核心模块说明
### 3.1 FOC算法 (`dfoc.c`)
FOC核心算法实现包含坐标变换和控制逻辑。
**功能列表**:
| 函数 | 功能 |
|------|------|
| `SetPhaseVoltage()` | 帕克逆变换 + 克拉克逆变换,计算三相电压 |
| `SetPwm()` | 将电压转换为占空比输出PWM |
| `electricAngle()` | 计算电气角度 |
| `normalizeAngle()` | 角度归一化到0~2π |
| `constrain()` | 幅值限幅 |
| `FOC_Init()` | FOC初始化校准零电角度 |
| `Set_Angle()` | 单角度环闭环控制 |
| `velocityopenloop()` | 开环速度控制 |
**关键参数**:
| 参数 | 值 | 说明 |
|------|-----|------|
| `voltage_limit` | 8V | 输出电压限幅 |
| `voltage_power_supply` | 12.0V | 供电电压 |
### 3.2 编码器驱动 (`mt6701.c`)
MT6701磁编码器驱动通过I2C接口读取角度数据。
**特性**:
- 通信方式: I2C从设备地址0x06
- 分辨率: 14位16384脉冲/圈)
- 支持单圈/多圈角度读取
**函数列表**:
| 函数 | 功能 |
|------|------|
| `MT6701_iic_read_angel()` | I2C读取原始角度数据 |
| `GetAngle_NoTrack()` | 获取单圈角度(弧度) |
| `GetAngle()` | 获取多圈累计角度(弧度) |
| `GetVelocity()` | 计算角速度 |
### 3.3 PID控制器 (`pid_control.c`)
增量式PID控制器实现。
**参数**:
- Kp: 0.067(比例系数)
- Ki: 0.01(积分系数)
- Kd: 0微分系数
- 输出限幅: ±5.0
- 积分限幅: ±5.0
### 3.4 PWM控制 (`pwm.c`)
3路独立PWM输出控制。
**配置**:
- 定时器: TIMA0
- 频率: 15kHz
- 通道: 3路
- 引脚: PA21, PA22, PB20
### 3.5 UART重定向 (`uart_redircet.c`)
将标准printf重定向到UART支持串口调试输出。
---
## 4. 通信接口
### 4.1 UART指令接口
- 波特率: 115200
- 数据位: 8位
- 停止位: 1位
- 校验: 无
**指令格式**: `T+数值+\n`
| 示例 | 说明 |
|------|------|
| `T1.57\n` | 设置目标角度为1.57弧度 |
| `T-0.785\n` | 设置目标角度为-0.785弧度 |
**接收机制**:
- DMA方式接收6字节数据包
- 接收完成触发中断,解析指令并更新目标角度
### 4.2 I2C编码器接口
- 速度: 100kHz
- 用于读取MT6701编码器角度数据
---
## 5. 主程序流程
```
main()
├─→ SYSCFG_DL_init() // 初始化所有硬件外设
├─→ DMA配置 // 配置UART接收DMA
├─→ NVIC_EnableIRQ() // 使能UART和定时器中断
├─→ DL_TimerA_startCounter() // 启动PWM定时器
├─→ DL_TimerG_startCounter() // 启动通用定时器
├─→ FOC_Init(12.6) // FOC初始化校准零电角度
└─→ while(1)
├─→ 检查gCheckUART标志
├─→ 解析UART命令 → 更新Target
└─→ Set_Angle(Target) // 执行闭环控制
```
**中断服务函数**:
| 中断 | 功能 |
|------|------|
| `TIMER_0_INST_IRQHandler` | 定时器中断调试用LED闪烁打印目标值 |
| `UART_0_INST_IRQHandler` | UART DMA接收完成中断设置接收标志 |
---
## 6. 关键配置参数
### 6.1 电机参数 (`empty.c`)
| 参数 | 值 | 说明 |
|------|-----|------|
| `pp` | 7 | 电机极对数 |
| `Dir` | -1 | 电机方向(-1为反转1为正转 |
### 6.2 系统时钟 (`ti_msp_dl_config.h`)
| 参数 | 值 | 说明 |
|------|-----|------|
| `CPUCLK_FREQ` | 32MHz | CPU系统时钟 |
| `PWM_0_INST_CLK_FREQ` | 16MHz | PWM定时器时钟 |
### 6.3 调试配置 (`config.h`)
```c
#define DEBUG_ENABLED true // 总调试开关
#define DEBUG_MT_ENABLED false // 编码器调试输出
#define DEBUG_DFOC_ENABLED false // FOC算法调试输出
```
---
## 7. 控制模式
### 7.1 闭环角度控制(默认)
通过PID控制器实现精确角度定位
```c
// 主循环中调用
if(gCheckUART)
{
gCheckUART = false;
parse_uart_cmd();
Set_Angle(Target); // 闭环控制
}
```
**控制流程**:
1. 读取编码器当前角度
2. 计算角度误差(目标角度 - 当前角度)
3. PID控制器输出Uq电压
4. 执行FOC变换输出PWM
### 7.2 开环速度控制
直接按目标速度旋转,无位置反馈:
```c
// 主循环中调用(需注释掉闭环代码)
velocityopenloop(Target);
```
---
## 8. 引脚分配
### 8.1 PWM输出
| 通道 | 引脚 | 功能 |
|------|------|------|
| PWM CH0 | PA21 | U相 |
| PWM CH1 | PA22 | V相 |
| PWM CH2 | PB20 | W相 |
### 8.2 I2C编码器
| 引脚 | 功能 |
|------|------|
| PB2 | I2C_SCL |
| PB3 | I2C_SDA |
### 8.3 UART
| 引脚 | 功能 |
|------|------|
| PA10 | UART_TX |
| PA11 | UART_RX |
### 8.4 其他
| 引脚 | 功能 |
|------|------|
| PA0 | LED |
| PA19 | SWDIO |
| PA20 | SWCLK |
---
## 9. 使用方法
### 9.1 编译
使用Keil MDK打开 `keil/empty_LP_MSPM0G3507_nortos_keil.uvprojx` 工程文件,编译生成固件。
### 9.2 烧录
通过XDS-110调试器将固件烧录到LP_MSPM0G3507开发板。
### 9.3 调试
1. 连接串口到PA10/PA11UART0
2. 打开串口助手波特率设置为115200
3. 发送指令格式: `T+数值+\n`,例如 `T1.57\n`
4. 观察电机响应和串口输出
---
## 10. 代码说明
### 10.1 编码规范
- 使用C语言编写符合C99标准
- 变量命名: 小写+下划线(如 `voltage_limit`
- 函数命名: 首字母大写(如 `SetPhaseVoltage`
- 中文注释,便于理解
### 10.2 注意事项
1. 修改电机极对数时需同时修改 `empty.c` 中的 `pp` 参数
2. 编码器方向不对时调整 `Dir` 参数
3. PID参数需根据实际电机调试优化
4. 电压参数需与实际供电电压匹配
---
## 11. 版本信息
| 项目 | 说明 |
|------|------|
| SDK版本 | MSPM0 SDK 2.07.00.05 |
| 编译工具 | Keil MDK |
| 目标MCU | MSPM0G3507 |
| FOC算法 | 无传感器FOC仅位置闭环