m FPGA ベースの FOC コントローラー Verilog 実装 (CLARK、PARK、PID、および SVPWM を含む) (テストベンチを含む)

目次

1.アルゴリズムシミュレーション効果

2. アルゴリズムには、理論的知識の概要が含まれます

3. MATLAB コア プログラム

4. 完全なアルゴリズム コード ファイル


1.アルゴリズムシミュレーション効果

Quartus II 12.1 (64 ビット)

ModelSim-Altera 6.6d スターター エディション

シミュレーション結果は次のとおりです。

2. アルゴリズムには、理論的知識の概要が含まれます

システム全体の構成は次のとおりです。

1.二相電流を集める

2. クラーク変換後、2 軸直交電流が得られ、

3. 回転変換後の直交電流量 Id と Iq を求めます。ここで、Iq はトルクに関係し、Id は磁束に関係します。実際の制御では、Id は 0 に設定されることがよくあります。得られた 2 つの量は時変ではないため、DC フロー制御と同様に、これら 2 つの量を個別に制御できます。三相モーターに与えられる特定の電圧を知る必要はありません。

4. 3 番目のステップで取得した Iq および Id の量をそれぞれ PI レギュレーターに送信して、対応する出力 Vq および Vd を取得します。

5. センサーからモーターの回転角度を取得します。

6. 逆パーク変換を実行して、2 軸電流を取得します。

7. 手順 6 で Va と Vb を逆クラーク変換して、実際に必要な三相電圧を求め、それをインバータ ブリッジに入力してモータを回転駆動します。

       FOC が実際に制御するのは、モーターの電磁場の方向です。回転子の回転子トルクは、固定子磁界ベクトルと回転子磁界ベクトルのベクトル積に比例します。ベクトルの関係から、モータのトルクが常に最大に保たれていれば、固定子磁界ベクトルと回転子磁界ベクトルは直交するはずであることがわかります。また、磁場の大きさと方向は電流の大きさと方向に直接関係するため、FOC 制御アルゴリズムで BLDC を制御する鍵は、3 相入力電流の大きさと方向を制御することです。電流を制御して、回転子の磁場に垂直な固定子の磁場を生成するための鍵は、安定した三相入力電圧とその電流ベクトルを制御することであり、回転子のリアルタイムの位置を知る必要があります。

       入力電流の方向制御、FOC は空間電流ベクトルの概念を与えます。その本質は、三相電流ベクトルを結合し、ロータ磁石軸方向に垂直と平行の 2 つの成分、つまり dq 構造に分解することです。垂直方向の電流成分によって生成される磁場は、回転子の磁場に対して垂直であり、回転トルクを生成します。しかし、ロータ磁軸に平行な電流成分は、ロータ磁界と一致する磁界を発生し、トルクは発生しません。さらに、適切な制御アルゴリズムでは、ロータの磁気軸に平行な電流成分を最小限に抑える必要があります。これは、この電流成分がモーターに過剰な熱を引き起こし、ベアリングの摩耗を悪化させるだけだからです。ロータ磁軸に垂直な方向の電流成分が最大になるようにコイル電流を制御する必要があります。結果として得られるモーター トルクは、この電流成分の大きさに比例します。

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. 完全なアルゴリズム コード ファイル

おすすめ

転載: blog.csdn.net/hlayumi1234567/article/details/130414748