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_signed, ,并使用 numeric_std或从 numeric_stdstd_logic_arith创建端口。从 numeric_std 库中替换为。signedunsignedconv_integerto_integer

如果您无法更改端口,请signed在整个内部使用(例如),并且仅std_logic_vector在输入/输出端口进行转换。

我想你正在模拟这个循环?

于 2012-11-27T15:13:56.873 回答