1
0
mirror of https://github.com/WangXuan95/FpOC.git synced 2025-01-28 23:52:53 +08:00
2021-02-23 11:07:22 +08:00
2021-02-22 14:17:59 +08:00
2021-02-22 14:17:59 +08:00
2021-02-22 14:17:59 +08:00
2021-02-23 11:07:22 +08:00
2021-02-22 14:17:59 +08:00

test docs

FpOC

基于 FPGA磁场定向控制 (FOC),用于驱动永磁同步电机 (PMSM)

简介

FOC控制算法传感器采样速率处理器算力提出了一定的要求,使用 FPGA 实现的 FOC 可以获得更好的实时性和零延迟抖动,并且更方便进行多路扩展

本库实现了基于角度传感器(例如磁编码器)的有感 FOC(一个完整的电流反馈环),可以进行扭矩控制。借助本库,可以进一步使用 FPGA软核 MCU外置 MCU 实现更复杂的电机应用。

diagram
图1系统框图

该项目代码有详细的注释,结合其它科普资料(见[6][8][9]),可以用来快速地熟悉 FOC

特点

  • 平台无关 :纯 RTL 编写,可以在 Altera 和 Xilinx 等各种 FPGA 上运行。
  • 支持 12bit 分辨率角度传感器相电流采样ADC,对于>12bit的传感器需要进行低位截断。对于<12bit的传感器需要进行低位补0。
  • 支持 3路PWM + 1路EN PWM=1 时上半桥导通PWM=0 时下半桥导通。 EN=0 时所有 MOS 关断。
  • 使用 16bit 有符号整数进行计算,降低了资源消耗,考虑到传感器为 12bit16bit 计算是够用的。

运行示例

图1 是本库的系统框图,实现了一个简单的行为——控制电机的电流(扭矩)按顺时针,逆时针交替运行。同时,使用 UART 打印电流的控制目标值实际值,以便观察控制的质量。

该示例的所有代码都在 ./RTL 目录下。工程在 ./FPGA 目录下,需要用 Quartus 软件打开。

准备硬件

需要准备以下硬件:

  • PMSM 电机
  • FPGA 开发板
  • 磁编码器 AS5600安装在电机上用于获取角度
  • AD7928 ADC 模块,用于进行相电流采样(好像没有现成卖的,需要自己画模块)
  • 电机驱动板要支持3相 EN+PWM 输入信号,并且使用低侧电阻采样法+放大器对3相电流进行放大。

可以直接使用我画的 电机驱动板自带AD7928立创EDA工程在此,只需要把它接一个 FPGA 开发板即可。

硬件连接与引脚分配

见该工程的顶层文件 top.sv 的注释,以下外设需要连到 FPGA 的引脚上普通IO引脚即可

  • 晶振 50MHz 时钟,连接在 clk_50m 信号上。
  • 角度传感器 AS5600 , I2C 接口, 2根线: i2c_scl, i2c_sda
  • ADC AD7928 , SPI接口4根线: spi_ss, spi_sck, spi_mosi, spi_miso
  • 3相PWM输出信号通常接在Gate Driver上例如MP6540/DRV83014根线: pwm_en, pwm_a, pwm_b, pwm_c

另外还有一个 UART 发送信号 (uart_tx) 是可选的,可以把它连接在 UART 转 USB 模块上,通过 UART 来监测电流环的跟随曲线。

连接好后别忘了使用 Quartus (或者手动修改./FPGA/foc.qsf)根据实际情况修改FPGA芯片型号修改引脚约束

调参

foc_top.sv 中有一些参数可以调整,例如电机的极对数PID参数等,每个参数的含义详见 foc_top.sv 。可以通过修改 top.sv 的 97~103 行来修改这些参数。

运行示例

综合并烧录到 FPGA 后,可以看到电机正反交替运行。

监视串口

把 uart_tx 信号通过 UART 转 USB 模块 例如CP2102模块 连接到电脑上,就可以用串口助手Putty等软件来监测电流环的跟随效果。

注: UART 的格式是 115200,8,n,1

以下是串口打印的部分信息。其中第1~4列分别为d轴电流的实际值d轴电流的目标值q轴电流的实际值q轴电流的目标值。可以看到,即使目标值从+200突变到-200实际值能跟着目标值走说明电流环的 PID 控制是有效的。

 -5       0     206     200 
-16       0     202     200 
 16       0     192     200 
 15       0     201     200 
  1       0     197     200 
 17       0    -211    -200 
 -6       0    -199    -200 
-10       0    -210    -200 
 -3       0    -207    -200 
  0       0    -202    -200 
-15       0    -211    -200 

另外,你可以借用 Arduino IDE串口绘图器来实时显示电流跟随曲线。前往该网站下载 Arduino IDE,安装后打开,在“工具→端口”中选择正确的COM口然后点击“工具→串口绘图器”,串口绘图器会自动接收串口并使用上述4列数据画实时曲线图。

图2 是我这里绘制出的电流跟随曲线。蓝色曲线是第1列数据d轴电流的实际值红色曲线是第2列数据d轴电流的目标值绿色曲线是第3列数据q轴电流的实际值土黄色曲线是第4列数据q轴电流的目标值。可以看到实际值能跟着目标值走。

wave
图2电流跟随曲线

代码详解

下表罗列了该工程使用的所有 (System-)Verilog 代码文件,这些文件都在 ./RTL 目录下。,结合图1就能看出每个模块的作用。

文件名 功能 备注
top.sv FPGA工程的顶层模块
pll.v 使用 50MHz 时钟生成 36.864MHz 时钟 只支持 Altera Cyclone IV其它型号的 FPGA 需要用相应的IP核或原语代替
uart_monitor.sv UART 发送器,用于数据监测 不需要的话可以删除
uart_tx.sv UART 发送控制器,被 uart_monitor.sv 调用 不需要的话可以删除
itoa.sv 数字转十进制字符串,被 uart_monitor.sv 调用 不需要的话可以删除
as5600_read.sv AS5600 磁编码器读取器
i2c_register_read.sv I2C 读取器,被 as5600_read.sv 调用
adc_ad7928.sv AD7928 读取器
foc_top.sv FOC+SVPWM (即图1中的青色部分) 固定算法,一般不需要改动
clark_tr.sv Clark 变换 固定算法,一般不需要改动
park_tr.sv Park 变换 固定算法,一般不需要改动
sincos.sv 正弦/余弦计算器,被 park_tr.sv 调用 固定算法,一般不需要改动
pi_controller.sv PID 控制器只有P和I 固定算法,一般不需要改动
cartesian2polar.sv 直角坐标系转极坐标系 固定算法,一般不需要改动
svpwm.sv SVPWM 调制器 固定算法,一般不需要改动
hold_detect.sv 监测3个下桥臂都导通时延迟一段时间后触发 sn_adc 信号指示ADC可以开始采样 固定算法,一般不需要改动
diagram
图1系统框图

图1中:

  • 淡橙色部分是FPGA外部的硬件包括Gate Driver、3相半桥(6个MOSFET)、采样电阻、放大器、ADC芯片、角度传感器等部件取决于电路使用什么方案。例如有些集成度很高的芯片例如MP6540可以把Gate Driver、3相半桥、采样电阻、放大器集成在同一个芯片里。
  • 粉色部分是FPGA中的硬件相关逻辑,即传感器控制器,如果角度传感器和 ADC 型号变了,这部分代码需要重写。
  • 青色部分是FPGA中的 FOC 的固定算法,属于硬件无关逻辑,一般不需要改变。
  • 黄色部分是用户自定逻辑,用户可以修改 user behavior 来实现各种电机应用。或者修改 uart_monitor 来监测其它变量。

另外,除了 pll.v 外,该库的所有代码都使用纯 RTL 编写可以轻易地移植到其它厂商Xilinx、Lattice等的 FPGA 上。 pll.v 只是用来把 50MHz 时钟变成 36.864MHz 时钟的,只适用于 Altera Cyclone IV FPGA当使用其它厂商或系列的FPGA时需要使用它们各自的 IP 核或原语例如Xilinx的clock wizard来代替。

top.svfoc_top.sv 注有详细的注释。如果你了解 FOC 算法,可以直接读懂。如果刚入门 FOC可以结合参考资料[6][8][9]去阅读。

可扩展功能

  • 使用自己编写的模块来代替 as5600_read.sv,以适配其它型号的角度传感器。
  • 使用自己编写的模块来代替 adc_ad7928.sv,以适配其它型号的 ADC。
  • top.sv 中添加外环(速度环、位置环等)进一步实现各种电机应用。

参考资料

Languages
Verilog 99.9%
Batchfile 0.1%