我想使用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(这在另一个文件中完成)。开环工作得很好,闭环很糟糕。我强烈怀疑我处理整数的方式有问题,因为测试平台工作正常,但物理实现根本不正确。
答案 0 :(得分:2)
只要您使用所有这些算术库,几乎不可能知道发生了什么。
最佳方法:摆脱std_logic_signed
,std_logic_arith
,并从numeric_std创建signed
或unsigned
端口。来自numeric_std库的conv_integer
替换了to_integer
。
如果您无法更改端口,请在整个内部使用(例如)signed
,并仅在输入/输出端口转换为/ std_logic_vector
。
我认为你在模拟这个循环?