m基于FPGA的FOC控制器verilog实现,包括CLARK,PARK,PID及SVPWM,含testbench

这篇具有很好参考价值的文章主要介绍了m基于FPGA的FOC控制器verilog实现,包括CLARK,PARK,PID及SVPWM,含testbench。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.算法仿真效果

2.算法涉及理论知识概要

3.MATLAB核心程序

4.完整算法代码文件


1.算法仿真效果

Quartus II 12.1(64-Bit)

ModelSim-Altera 6.6d Starter Edition

仿真结果如下:

fpga实现svpwm,Simulink控制器,FPGA通信和信号处理,FPGA,FOC控制器,CLARK变换,PARK变换,SVPWM

fpga实现svpwm,Simulink控制器,FPGA通信和信号处理,FPGA,FOC控制器,CLARK变换,PARK变换,SVPWM

2.算法涉及理论知识概要

整个系统的结构如下所示:

fpga实现svpwm,Simulink控制器,FPGA通信和信号处理,FPGA,FOC控制器,CLARK变换,PARK变换,SVPWM

1、采集到两相电流

2、经过clarke变换后得到两轴正交电流量,

3、经过旋转变换后得到正交的电流量 Id、Iq,其中Iq与转矩有关,Id与磁通有关。在实际控制中,常将Id置为0。得到的这两个量不是时变的,因此可以单独的对这两个量进行控制,类似直流量控制一样。而不需要知道具体要给电机三相具体的电压为多少。

4、将第3步中得到的Iq与Id量分别送进PI调节器,得到对应的输出Vq和Vd;

5、通过传感器得到电机转过的角度。

6、进行逆park变换,得到二轴电流量。

7、对第6步中的Va,Vb进行逆clarke变换,得到实际需要的三相电压输入给逆变电桥,驱动电机转动。

       FOC控制的其实是电机的电磁场方向。转子的转子力矩正比于定子的磁场向量与转子磁场矢量的矢量积。由矢量的关系可知,若使电机的转矩时刻保持最大,则定子磁场向量应与转子磁场向量相互垂直。又因为磁场的大小与方向与电流的大小与方向有着直接的关系,所以在用FOC控制算法控制BLDC时的关键就是控制三相输入的电流大小与方向。而控制电流产生定子磁场与转子磁场垂直的关键在:控制稳定的三相输入电压及其电流向量,并且我们得知道转子的实时位置。

       输入电流的方向控制,FOC给出了空间电流矢量的概念。其实质是将三相的电流矢量结合,再分解为垂直和平行于转子磁体轴方向的两个分量即d-q结构。垂直方向的电流分量所产生磁场正交于转子的磁场,这就产生了旋转力矩。而平行于转子磁轴方向的电流分量,所产生的磁场与转子磁场一致,就不会产生任何的力矩。另外,一个好的控制算法就需要使这个平行于转子磁轴方向的电流分量尽量最小化,因为,这个电流分量只会使电机产生多余的热量,并加剧轴承的磨损。我们需要控制线圈的电流,以使垂直于转子磁轴方向的电流分量达到最大。由此而得到的电机力矩和这个电流分量的大小成比例。

3.Verilog核心程序

...................................................................
PID_tops PID_tops_u(
                .i_clk   (i_clk),
					 .i_rst   (i_rst),
					 .i_kp    (16'b0001_1111_1111_1111),
					 .i_ki    (16'b0000_0000_0010_0011),
					 .i_kd    (16'b0000_0000_0000_0001),
					 .i_din   (err1),
					 .o_dout  (o_pid_dout),
					 //test port
					 .o_doutp (),
					 .o_douti (),
					 .o_doutd ()
               );
	
wire signed[15:0]o_Id;
wire signed[15:0]o_Iq;
wire signed[15:0]err11;	
wire signed[15:0]err12;	

assign err11 = o_pid_dout-o_Id;
assign err12 = 0-o_Iq;


wire signed[15:0]o_pid_dout1;
wire signed[15:0]o_pid_dout2;							

PID_tops PID_tops_u1(
                .i_clk   (i_clk),
					 .i_rst   (i_rst),
					 .i_kp    (16'b0001_1111_1111_1111),
					 .i_ki    (16'b0000_0000_0010_0011),
					 .i_kd    (16'b0000_0000_0000_0001),
					 .i_din   (err11),
					 .o_dout  (o_pid_dout1),
					 //test port
					 .o_doutp (),
					 .o_douti (),
					 .o_doutd ()
               );	
	
	
PID_tops PID_tops_u2(
                .i_clk   (i_clk),
					 .i_rst   (i_rst),
					 .i_kp    (16'b0001_1111_1111_1111),
					 .i_ki    (16'b0000_0000_0010_0011),
					 .i_kd    (16'b0000_0000_0000_0001),
					 .i_din   (err12),
					 .o_dout  (o_pid_dout2),
					 //test port
					 .o_doutp (),
					 .o_douti (),
					 .o_doutd ()
               );

//
//INV PARK					
wire signed[15:0]o_Uaref;				
wire signed[15:0]o_Ubref;
INVPARK INVPARK_u(
               .i_clk   (i_clk),
					.i_rst   (i_rst),
					.i_D     (o_pid_dout1),
					.i_Q     (o_pid_dout2),
					.i_theta (o_theta),
					.o_alpha (o_Uaref),
					.o_beta  (o_Ubref)
              );					
					
//
//SVPWM
wire w_PWM1;
wire w_PWM2;
wire w_PWM3;
wire w_PWM4;
wire w_PWM5;
wire w_PWM6;

SVPWM SVPWM_u(
            .i_clk  (i_clk),
				.i_rst  (i_rst),
				.i_Uaref(o_Uaref),
				.i_Ubref(o_Ubref),
				.o_PWM1 (w_PWM1),
				.o_PWM2 (w_PWM2),
				.o_PWM3 (w_PWM3),
				.o_PWM4 (w_PWM4),
				.o_PWM5 (w_PWM5),
				.o_PWM6 (w_PWM6)
            );

//
//IGBT+PMSM
IGBT_PMSM_simple IGBT_PMSM_simple_u(
                       .i_clk  (i_clk),
							  .i_rst  (i_rst),
							  .i_PWM1 (w_PWM1),
							  .i_PWM2 (w_PWM2),
							  .i_PWM3 (w_PWM3),
							  .i_PWM4 (w_PWM4),
							  .i_PWM5 (w_PWM5),
							  .i_PWM6 (w_PWM6),
							  .i_pid  (o_pid_dout),
							  .i_Te   (16'd100),
							  .o_Ia   (o_Ia),
							  .o_Ib   (o_Ib),
							  .o_Ic   (o_Ic),
							  .o_Te   (o_Te),
							  .o_Wm   (o_Wm),
							  .o_theta(o_theta)
                       );

//
//CLARK
CLARK CLARK_u(
             .i_clk (i_clk),
				 .i_rst (i_rst),
				 .i_Ia  (o_Ia),
				 .i_Ib  (o_Ib),
				 .o_Id  (o_Ialpha),
				 .o_Iq  (o_Ibeta)
            );

//
//PARK	
PARK PARK_u(
               .i_clk   (i_clk),
					.i_rst   (i_rst),
					.i_d     (o_Ialpha),
					.i_q     (o_Ibeta),
					.i_theta (o_theta),
					.o_ID    (o_Id),
					.o_IQ    (o_Iq)
              );
 
endmodule 
08_060_m		  

4.完整算法代码文件

V文章来源地址https://www.toymoban.com/news/detail-612268.html

到了这里,关于m基于FPGA的FOC控制器verilog实现,包括CLARK,PARK,PID及SVPWM,含testbench的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【DDR】基于Verilog的DDR控制器的简单实现(一)——初始化

    在FPGA中,大规模数据的存储常常会用到DDR。为了方便用户使用,Xilinx提供了DDR MIG IP核,用户能够通过AXI接口进行DDR的读写访问,然而MIG内部自动实现了许多环节,不利于用户深入理解DDR的底层逻辑。 本文以美光(Micron)公司生产的DDR3芯片MT41J512M8RH-093为例,说明DDR芯片的操作

    2024年02月02日
    浏览(51)
  • FPGA实现PID控制器——基于Quartus prime 18.0

    目录  1. PID控制器和离散化PID控制器 1.1 PID控制器 1.1.1 P控制器 1.1.2 稳态误差和I控制器 1.1.3 超调和D控制器 1.2 离散式PID控制器——位置式PID控制器 2.PID控制系统Simulink仿真 3.Verilog代码编写和Modelsim仿真 3.1 误差计算模块和PID算法模块编写 3.1.1 误差计算模块 3.1.2 PID算法模块 3

    2024年02月03日
    浏览(44)
  • 基于AHB协议的SRAM控制器的Verilog实现(详解代码)(一)——sram_core的实现

    目录  一、sramc(sram_controller)的总框架和模块划分 Features of sramc 结构框图和信号描述 二、sram_core的Verilog实现 动手开敲前的构思 Verilog代码和代码分析 三、sram_core的仿真验证 下载链接 sram因为其高读写速度常常作为CPU和嵌入式IC的缓存,是一个数字系统中必不可少的存在,因此

    2024年01月16日
    浏览(49)
  • 基于FPGA的16QAM调制器verilog实现,包括testbench,并通过MATLAB显示FPGA输出信号的星座图

    目录 1.算法仿真效果 2.verilog核心程序 3.算法涉及理论知识概要 4.完整verilog matlab2022a/vivado2019.2仿真结果如下:  将FPGA仿真的数据导出,然后在matlab中将数据通过噪声之后,可以得到如下的星座图效果。 fpga工程版本信息:       16QAM全称正交幅度调制是英文Quadrature Amplitude

    2024年02月07日
    浏览(44)
  • 【毕业设计】42基于FPGA的LCD1602控制器设计仿真与实现(原理图+仿真+源代码+论文)

    包含此题目毕业设计全套资料: 原理图工程文件 仿真工程文件 源代码 仿真截图 低重复率论文,字数:19964 基于altera 公司cyclone4代芯片的fpga以及quartusII软件设计一款屏幕显示系统,显示装置可以选择点阵或字符型液晶,最终实现滚动显示、可控制滚动方向、暂停、清屏等功能

    2024年02月04日
    浏览(94)
  • 基于FPGA 的SDRAM控制器

    4X16X4=256(Mbit),注意不是MByte sdram包含两个部分:sdram_ctrl、fifo_ctrl。 sdram_ctrl:其顶层为SDRAM的控制模块内部实例化了5个模块,有初始化、自刷新、写和读模块,还有一个仲裁模块对这四个不同操作进行分配; fifo_ctrl:其顶层为SDRAM的数据输入输出,内部实例化了两个用于连

    2024年02月08日
    浏览(64)
  • 【进口控制器替代】基于Zynq-7020 FPGA的NI 8槽CompactRIO控制器

    667 MHz双核CPU,512 MB DRAM,1 GB存储容量,Zynq-7020 FPGA,更宽工作温度范围,8槽CompactRIO控制器 cRIO-9068是一款坚固耐用的无风扇嵌入式控制器,可用于高级控制和监测应用。这款软件设计控制器搭载FPGA、运行NI Linux Real-Time操作系统的实时处理器以及嵌入式用户界面功能。cRIO-906

    2024年01月25日
    浏览(62)
  • 基于FPGA的PID控制器设计

    PID控制应该算是应用非常广泛的控制算法了。常见的比如控制环境温度,控制无人机飞行高度速度等。PID我们将其分成三个参数,如下: P-比例控制,基本作用就是控制对象以线性的方式增加,在一个常量比例下,动态输出,缺点是会产生一个稳态误差。 I-积分控制,基本作

    2024年02月03日
    浏览(59)
  • TMC4671-LA完全集成伺服控制器电机驱动芯片带FOC控制

    TMC4671是一个完全集成的伺服控制器,为BLDC/PMSM和2相步进电机以及直流电机和语音线圈提供现场定向控制。   应用 •机器人 • 拾取和放置机器 • 工厂自动化 • 电动汽车 • 实验室自动化 •鼓风机 •泵 • 带磁场定向控制(FOC)的伺服控制器 – 扭矩(和磁通)控制模式

    2024年02月12日
    浏览(36)
  • 基于 STM32+FPGA 的多轴运动控制器的设计

    运动控制器是数控机床 、 高端机器人等自动化设备控制系统的核心 。 为保证控制器的实用性 、 实时性和稳定 性, 提出一种以 STM32 为主控制器 、 FPGA 为辅助控制器的多轴运动控制器设计方案 。 给出了运动控制器的硬件电路设计 , 将 S 形加减速算法融入运动控制器 ,

    2024年01月17日
    浏览(77)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包