1 Star 0 Fork 16

kris gao / FpOC

forked from 卖菇凉小蘑菇 / FpOC 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

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 有符号整数进行计算,降低了资源消耗,考虑到传感器为 12bit,16bit 计算是够用的。

运行示例

图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/DRV8301),4根线: 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 中添加外环(速度环、位置环等)进一步实现各种电机应用。

参考资料

空文件

简介

FPGA-based Field Oriented Control (FOC) for driving PMSM motor. 展开 收起
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/kris-gao/FpOC.git
git@gitee.com:kris-gao/FpOC.git
kris-gao
FpOC
FpOC
main

搜索帮助