1. 项目背景与核心价值
无刷电机在现代工业中的应用越来越广泛,从无人机到电动汽车,从工业机器人到家用电器,几乎无处不在。而旋变器(Resolver)作为一种绝对位置传感器,因其高可靠性、强抗干扰能力和宽温工作范围,成为工业级无刷电机控制的首选方案。
传统的旋变信号处理通常采用专用解码芯片(如AD2S1200)或DSP实现,但这些方案要么成本高昂,要么实时性受限。FPGA凭借其并行处理能力和可编程特性,为旋变信号处理提供了全新的实现路径。我在多个工业伺服项目中实测发现,基于FPGA的方案可以将位置解码延迟控制在5μs以内,比传统DSP方案快10倍以上。
这个项目要解决的核心问题是:如何利用FPGA的硬件并行特性,实现高精度、低延迟的无刷电机旋变控制。这涉及到旋变信号激励生成、正余弦信号采集、角度解算算法实现,以及最终的FOC(磁场定向控制)闭环控制等多个技术环节。
2. 旋变系统工作原理与FPGA实现优势
2.1 旋变器基础工作原理
旋变器本质上是一个旋转变压器,由转子和定子组成。转子绕组通过滑环接入高频激励信号(通常为5-10kHz正弦波),定子侧输出两路相位差90°的调制信号:
code复制S1 = A·sin(ωt)·sinθ
S2 = A·sin(ωt)·cosθ
其中ω是激励频率,θ是转子机械角度。我们的任务就是从S1/S2信号中解算出θ值。
2.2 FPGA相比传统方案的独特优势
在工业伺服项目中,我们对比过三种实现方案:
-
专用解码芯片方案:
- 优点:集成度高,开发简单
- 缺点:成本高(单颗芯片>$10),解码延迟约50μs
-
DSP软件解码方案:
- 优点:成本适中
- 缺点:受CPU负载影响大,延迟波动明显(30-100μs)
-
FPGA硬件方案:
- 并行处理:激励生成、信号采集、角度计算可同步进行
- 确定性延迟:固定5μs处理流水线
- 可定制性:可根据不同旋变型号调整参数
实测数据表明,在3000rpm电机转速下,FPGA方案的位置误差比DSP方案小一个数量级。这是因为高速旋转时,50μs的延迟就会导致0.9°的角度误差,而FPGA的5μs延迟仅产生0.09°误差。
3. 硬件系统设计与关键参数计算
3.1 典型系统架构
一个完整的FPGA旋变控制系统包含以下硬件模块:
code复制旋变器 → 信号调理电路 → ADC → FPGA → PWM驱动器 → 无刷电机
↑ ↑
激励电路 位置反馈
3.2 激励信号生成设计
旋变激励需要高纯度正弦波,我们采用DDS(直接数字频率合成)技术实现。在FPGA中构建一个相位累加器:
verilog复制// 10kHz激励信号生成
parameter CLK_FREQ = 100_000_000; // 100MHz系统时钟
parameter PHASE_INC = 10_000 * 2**32 / CLK_FREQ;
always @(posedge clk) begin
phase_acc <= phase_acc + PHASE_INC;
exc_out <= 1024 * $sin(phase_acc[31:24]); // 10位DAC输出
end
关键参数选择依据:
- 激励频率:通常选择电机极对数非整数倍的频率,避免共振
- DAC分辨率:≥10bit以保证THD<1%
- 输出电流:根据旋变规格,通常需要50-100mA驱动能力
3.3 信号采集电路设计
旋变输出信号幅度通常在1Vrms左右,需要经过以下处理链:
- 仪表放大器:抑制共模噪声,增益设为2-5倍
- 抗混叠滤波器:截止频率=2×激励频率,贝塞尔型最佳
- 同步采样ADC:推荐16位分辨率,采样率≥4×激励频率
我们在实际项目中采用AD7685(16位、250kSPS)配合FPGA实现同步采样,采样时刻严格对齐激励信号过零点,这样可以消除相位延迟带来的误差。
4. 角度解算算法实现
4.1 数字解调原理
旋变信号解调需要提取包络信号,采用同步解调技术:
- 将采集到的S1、S2信号分别与激励信号相乘
- 通过低通滤波器提取直流分量
- 计算arctan(S2/S1)得到角度
FPGA实现时,我们采用CORDIC算法进行实时反正切计算。以下是简化版的Verilog实现:
verilog复制module cordic(
input clk,
input [15:0] x, y,
output reg [15:0] angle
);
// 预旋转至第一象限
wire [15:0] abs_x = x[15] ? -x : x;
wire [15:0] abs_y = y[15] ? -y : y;
// CORDIC迭代计算
reg [15:0] x_reg, y_reg;
reg [15:0] angle_acc;
integer i;
always @(posedge clk) begin
x_reg <= abs_x;
y_reg <= abs_y;
angle_acc <= 0;
for(i=0; i<16; i=i+1) begin
if(y_reg[15]) begin
x_reg <= x_reg + (y_reg >>> i);
y_reg <= y_reg - (x_reg >>> i);
angle_acc <= angle_acc - cordic_angle_table[i];
end else begin
x_reg <= x_reg - (y_reg >>> i);
y_reg <= y_reg + (x_reg >>> i);
angle_acc <= angle_acc + cordic_angle_table[i];
end
end
// 根据原始象限修正角度
angle <= (x[15]^y[15]) ? (PI - angle_acc) : angle_acc;
end
endmodule
4.2 误差补偿技术
实际系统中存在多种误差源,需要通过校准补偿:
-
幅值不平衡补偿:
- 采集旋变静止时的S1/S2最大值
- 计算补偿系数:k = max(S1)/max(S2)
- 在解算前对S2进行增益校正
-
正交误差补偿:
- 通过最小二乘法拟合椭圆参数
- 采用如下变换矩阵校正:
code复制[S1'] [1 -sinφ] [S1] [S2'] = [0 cosφ ] [S2]其中φ是正交偏差角
-
延迟补偿:
- 测量从激励输出到ADC采样的固定延迟τ
- 角度补偿量:Δθ = 2π×f×τ
我们在电机装配线上开发了自动校准程序,整个过程不超过30秒,可将系统误差控制在±0.1°以内。
5. 闭环控制实现与性能优化
5.1 位置速度双闭环设计
基于旋变反馈的电机控制通常采用级联闭环结构:
code复制位置环PID → 速度环PID → 电流环 → PWM输出
↑
旋变角度 → 速度观测器
FPGA实现时的关键参数:
- 位置环周期:100μs-1ms(取决于机械系统带宽)
- 速度观测器:采用M/T法测速,在1ms窗口内测量脉冲数和周期
- 电流环周期:与PWM频率同步(通常10-20kHz)
5.2 实时性保障技巧
为确保控制环路定时执行,我们采用FPGA硬件定时器触发:
verilog复制// 1kHz位置环定时器
reg [15:0] pll_counter;
always @(posedge clk_100m) begin
if(pll_counter >= 99_999) begin
pll_counter <= 0;
position_loop_trigger <= 1;
end else begin
pll_counter <= pll_counter + 1;
position_loop_trigger <= 0;
end
end
5.3 抗干扰措施
工业现场常见的干扰问题及解决方案:
-
电缆串扰:
- 使用双绞屏蔽线传输旋变信号
- 在FPGA端添加数字滤波器:
verilog复制// 移动平均滤波器 always @(posedge clk) begin s1_history <= {s1_history[14:0], adc_s1}; s1_filtered <= (s1_history + s1_history>>1 + s1_history>>2) / 3; end -
电源噪声:
- 为旋变激励电路单独供电
- 在FPGA电源引脚添加π型滤波器
-
温度漂移:
- 选用低温漂电阻(<50ppm/℃)
- 定期执行零位校准(每4小时一次)
6. 实测性能与典型问题排查
6.1 测试平台配置
我们在以下环境验证系统性能:
- 电机型号:EC60-400W,5对极
- 旋变型号:Tamagawa TS2620N21E11
- FPGA平台:Xilinx Artix-7 XC7A35T
- 控制周期:位置环1kHz,电流环10kHz
6.2 性能指标
| 测试项目 | 指标要求 | 实测结果 |
|---|---|---|
| 角度分辨率 | ≤0.1° | 0.05°(12bit有效) |
| 动态延迟 | ≤10μs | 4.7μs |
| 静态误差 | ±0.2° | ±0.08° |
| 转速范围 | 1-3000rpm | 0.5-3500rpm |
6.3 常见问题速查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 角度跳变 | 1. 信号幅值不足 2. ADC参考电压不稳 |
1. 检查激励电路输出 2. 添加参考电压缓冲 |
| 低速抖动 | 1. 速度观测器噪声大 2. 机械共振 |
1. 增加观测器窗口时间 2. 添加陷波滤波器 |
| 高温漂移 | 1. 电阻温漂大 2. 旋变安装应力 |
1. 更换低温漂元件 2. 检查机械配合 |
| 通信中断 | 1. 地环路干扰 2. 电源跌落 |
1. 改用隔离通信 2. 增加储能电容 |
在最近的一个机器人关节项目中,我们遇到旋变信号在电机启动时偶尔失锁的问题。经过示波器捕获发现,是电机加速瞬间的电源跌落导致激励信号幅值下降。最终通过以下措施解决:
- 为激励电路增加大容量钽电容(220μF)
- 在FPGA中添加幅值监测逻辑,异常时自动增大DAC输出
- 修改电源时序,确保激励稳定后再启动电机
这个案例让我深刻体会到,好的FPGA设计不仅要考虑数字逻辑的正确性,还需要对模拟信号链有充分的理解和防护措施。