1. 项目概述:FPGA与Verilog实现FOC电机控制
在电机控制领域,磁场定向控制(FOC)因其优异的动态性能和能效表现,已成为驱动永磁同步电机(PMSM)和无刷直流电机(BLDC)的主流方案。传统FOC实现多基于MCU,但随着FPGA器件成本的降低和开发工具的完善,基于FPGA的FOC方案展现出独特优势:
- 实时性:FPGA的并行处理特性可确保PWM生成、电流采样、坐标变换等关键环节的严格同步
- 灵活性:硬件可编程特性便于实现多轴协同控制或定制化算法扩展
- 性能扩展:通过增加逻辑资源即可支持更高开关频率或更多控制通道
本项目采用Verilog HDL在FPGA上完整实现了FOC电流环,包含Clark/Park变换、PI控制器、SVPWM调制等核心模块。与常见MCU方案相比,该设计具有以下技术特点:
- 平台无关性:纯RTL代码编写,已在Xilinx和Intel FPGA平台验证
- 精确时序控制:ADC采样窗口与PWM周期严格同步,采样延迟可配置
- 高分辨率:内部采用16位定点运算,支持12位以上传感器接口
- 安全机制:独立使能信号(PWM_EN)实现硬件级急停保护
2. 硬件系统设计与关键器件选型
2.1 整体硬件架构
系统由FPGA主控板、功率驱动板、电机本体及传感器组成,信号链路如下:
code复制FPGA → PWM驱动信号 → 功率MOSFET → 电机绕组
↑ ↓
磁编码器 ← 电流采样 ← 低侧电阻
2.2 核心器件选型要点
角度传感器:
- 选用AS5600磁编码器,通过I2C接口输出12位绝对角度
- 安装时需注意:
- 磁铁与传感器间距控制在1-3mm
- 确认旋转方向与角度变化关系(通过ANGLE_INV参数校正)
电流采样ADC:
- AD7928关键参数:
- 12位分辨率,1MSPS采样率
- 8通道单端输入(实际使用3通道)
- SPI接口时钟最高20MHz
- 三电阻采样电路设计:
- 采样电阻值通常为10-50mΩ
- 运放增益设置需保证最大电流对应ADC满量程
功率驱动:
- MP6540集成驱动特性:
- 内置3相半桥MOSFET(30V/3A)
- 自带低侧电流采样放大器
- 死区时间硬件配置为500ns
2.3 PCB设计注意事项
-
电流采样布局:
- 采样电阻至运放走线尽量等长
- 避免功率线路与信号线路平行走线
-
去耦设计:
- 每个电源引脚放置0.1μF陶瓷电容
- 大容量电解电容靠近功率器件
-
热设计:
- MOSFET下方预留足够铜箔散热
- 必要时添加散热孔阵列
3. FPGA逻辑设计与Verilog实现
3.1 主要功能模块
verilog复制// 顶层模块示例
module foc_top (
input wire clk,
input wire rst_n,
output wire pwm_a, pwm_b, pwm_c,
output wire pwm_en,
// 电流采样接口
output wire sn_adc,
input wire en_adc,
input wire [11:0] adc_a, adc_b, adc_c,
// 角度传感器接口
output wire i2c_scl,
inout wire i2c_sda
);
3.1.1 坐标变换模块
Clark变换:
verilog复制// 三相静止→两相静止坐标系
// 公式:Iα = Ia - 0.5*Ib - 0.5*Ic
// Iβ = (sqrt(3)/2)*(Ib - Ic)
module clark_tr (
input signed [15:0] ia, ib, ic,
output signed [15:0] ialpha, ibeta
);
Park变换:
verilog复制// 两相静止→两相旋转坐标系
// 需要配合sin/cos查找表
module park_tr (
input signed [15:0] ialpha, ibeta,
input signed [15:0] sin_theta, cos_theta,
output signed [15:0] id, iq
);
3.1.2 PI控制器实现
verilog复制// 离散化PI控制器
module pi_controller (
input wire clk,
input wire rst_n,
input signed [15:0] err,
output signed [15:0] out,
// 可调参数
input wire [30:0] Kp,
input wire [30:0] Ki
);
3.2 关键时序设计
PWM与ADC采样同步:
- 每个控制周期(55μs@18kHz)设置采样窗口
- 检测到三相下桥臂导通时启动采样延迟计数器
- 延迟结束后触发ADC采样脉冲(sn_adc)
verilog复制// 采样窗口检测模块
module hold_detect (
input wire clk,
input wire pwm_a, pwm_b, pwm_c,
output reg sn_adc
);
3.3 定点数处理技巧
-
Q格式选择:
- 电流值采用Q12.4格式(12位整数+4位小数)
- 角度值采用Q1.15格式(1位整数+15位小数)
-
运算溢出防护:
verilog复制// 有符号乘法示例
wire signed [31:0] mult_tmp = a * b;
wire signed [15:0] result = mult_tmp[30:15]; // 自动舍入
4. 参数调试与性能优化
4.1 基础参数配置表
| 参数名 | 典型值 | 调节建议 |
|---|---|---|
| POLE_PAIR | 7(极对数) | 根据电机铭牌参数设置 |
| MAX_AMP | 384 | 从200开始逐步增加至电流纹波可接受 |
| SAMPLE_DELAY | 120 | 用示波器观察电流稳定时间调整 |
| INIT_CYCLES | 16777216 | 确保电机能完成初始定位 |
4.2 PID参数整定方法
-
先比例后积分:
- 初始设置Ki=0,逐步增加Kp至出现轻微振荡
- 然后加入Ki,消除静差但不过度超调
-
频域分析法:
- 通过串口输出电流跟踪曲线
- 观察阶跃响应的上升时间和超调量
verilog复制// 典型PID参数范围
parameter KP_DEFAULT = 31'h0000_1000; // 对应Kp=1.0
parameter KI_DEFAULT = 31'h0000_0100; // 对应Ki=0.01
4.3 常见问题排查
问题1:电机振动不转
- 检查角度传感器安装方向(尝试反转ANGLE_INV)
- 确认POLE_PAIR参数与电机匹配
- 用示波器验证PWM信号是否正常输出
问题2:电流采样异常
- 测量采样电阻两端电压是否正常
- 检查ADC的SPI时序是否符合规格
- 调整SAMPLE_DELAY参数观察改善
问题3:高速运行失步
- 提高PWM频率(需同步修改时钟分频)
- 检查电源电压是否足够
- 适当增加MAX_AMP值
5. 实测数据分析与系统验证
5.1 电流环性能测试
使用Arduino串口绘图器捕获的电流跟踪曲线显示:
- q轴电流阶跃响应时间:<500μs
- 稳态误差:<±5LSB(12位ADC)
- 超调量:<10%
5.2 效率对比测试
| 控制方式 | 输入功率(W) | 输出扭矩(N·m) | 效率(%) |
|---|---|---|---|
| 方波驱动 | 45.2 | 0.32 | 68.5 |
| FOC控制 | 38.7 | 0.35 | 82.1 |
5.3 动态响应测试
通过突加负载测试:
- 转速恢复时间:<5ms
- 转矩脉动:<2%额定值
6. 进阶开发方向
-
无传感器扩展:
- 实现滑模观测器(SMO)或磁链观测器
- 添加初始位置检测算法
-
多轴协同控制:
- 利用FPGA并行特性实现双轴同步
- 共享角度传感器资源
-
智能调参系统:
- 添加自适应PID算法
- 通过UART接口实现参数在线调整
实际开发中发现,将SVPWM的载波频率提升至36kHz时,电机运行噪音明显降低,但需注意:
- 相应减小MAX_AMP值以保证足够的采样窗口
- 优化FPGA时序约束以满足更高时钟频率
- 功率MOSFET的开关损耗会相应增加
