1

Pコントローラー(および後でPID)を使用してモーターを制御したい。Pコントローラーに使用しているVHDLコードは次のとおりです。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
USE ieee.numeric_std.ALL;
USE ieee.STD_LOGIC_ARITH.ALL;
USE ieee.std_logic_signed.ALL;

entity P is
    Port ( e : in  STD_LOGIC_VECTOR (8 downto 0);
           PWM : out  STD_LOGIC_VECTOR (8 downto 0));
end P;

architecture Behavioral of P is

signal eInt : integer := 0;
signal PWMInt : integer := 0;

--min/max
signal borne : integer := 255;

--Gain
signal Ku : integer := 1;

--saturation
component saturation is
    Port ( entier : in  integer;
           borne : in  integer;
           sotie : out  STD_LOGIC_VECTOR (8 downto 0));
end component;

begin

    eInt <= conv_integer(e);
    PWMInt <= Ku*eInt;

    sat : saturation port map(PWMInt, borne, PWM);

end Behavioral;

ここで、飽和はPWMの量を「負担」に制限します(PWMがバイナリで最大255になるように)、eはエラーです(コマンド-測定)。

このブロックの出力は、モーターに直接送られるPWMです(これは別のファイルで行われます)。開ループは問題なく機能し、閉ループはひどいものです。テストベンチは正常に機能しているので、整数の処理方法に何か問題があるのではないかと強く思いますが、物理的な実装はまったく正しくありません。

4

1 に答える 1

2

これらすべての算術ライブラリを使用している限り、何が起こっているのかを知ることはほぼ不可能です。

最善のアプローチ: 、 を取り除きstd_logic_signedstd_logic_arithポートをsignedまたはunsignednumeric_std から作成します。numeric_std ライブラリのconv_integerに置き換えられます。to_integer

ポートを変更できない場合はsigned、内部全体で (eg) を使用しstd_logic_vector、入力/出力ポートでのみ変換します。

このループをシミュレートしていると思いますか?

于 2012-11-27T15:13:56.873 に答える