作者chongming ()
看板Electronics
标题Re: [讨论]VHDL控制器设计(简单PID)
时间Wed Sep 13 15:04:39 2006
※ 引述《chongming ()》之铭言:
: 大家好 小弟有一些问题 想跟高手们请教
: 以是我的想法:
: 假若数位控制器 (0.001082*z^2 - 15.45*z + 15.45)/ (z^2 - 0.1137*z + 0.003233)
: DIF为输入讯号 DIF_CN为输出讯号 DIFP为上一次输入讯号 DIFPP为上上次输入讯号
: DIF_CP为上一次输出讯号 DIF_CPP为上上次输出讯号 则我用shift左移一位为乘於二的
: 想法 右移为除想法 实现数位控制器 但问题是 算出来的结果经比例缩小後提供给PWM
: 比较 输出PWM High Low的值 理因会因 data_read_possense改变而改变 但结果并非我的
: 预期 想跟高手请教可能是什麽问题 因为我对这方面没有经验(连下手都不知道怎下手)
: 感激各位...
: 则我想法如下:
: if (reset = '1') then
: DIFN <= (others => '0');
: DIFP <= (others => '0');
: DIFPP <= (others => '0');
: DIF_CN <= (others => '0');
: DIF_CP <= (others => '0');
: DIF_CPP <= (others => '0');
: zero_command <= "010100101111000110101001"; --1.62V 平衡点位置
: elsif rising_edge(clkin) then
: DIF <= data_read_possense;
: DIFN <= ( DIF(23)) & DIF(22 downto 0);
: Kin1_R1 <= DIFN(23) & DIFN(13 downto 0) & "000000000"; --512倍
: Kin1_R2 <= DIFN(23) & DIFN(14 downto 0) & "00000000"; --256倍
: Kin1_R3 <= DIFN(23) & DIFN(15 downto 0) & "0000000"; --128倍
: Kin1_R4 <= DIFN(23) & DIFN(16 downto 0) & "000000"; --64倍
: Kin1_R5 <= DIFN(23) & DIFN(17 downto 0) & "00000"; --32倍
: Kin1_R6 <= DIFN(23) & DIFN(18 downto 0) & "0000"; --16倍
: Kin1_R7 <= DIFN(23) & DIFN(19 downto 0) & "000"; --8倍
: Kin1_R8 <= DIFN(23) & DIFN(20 downto 0) & "00"; --4倍
: Kin1_R9 <= DIFN(23) & DIFN(21 downto 0) & "0"; --2倍
: Kin1_R10 <= DIFN(23) & DIFN(22 downto 0); --1倍
: Kin1_R11 <= DIFN(23) & "0" & DIFN(22 downto 1); --0.5倍
: Kin1_R12 <= DIFN(23) & "00" & DIFN(22 downto 2); --0.25倍
: Kin1_R13 <= DIFN(23) & "000" & DIFN(22 downto 3); --0.125倍
: KIn1_R14 <= DIFN(23) & "0000" & DIFN(22 downto 4); --0.0625倍
: Kin1_R15 <= DIFN(23) & "00000" & DIFN(22 downto 5); --0.03125倍
: Kin1_R16 <= DIFN(23) & "000000" & DIFN(22 downto 6); --0.015625倍
: Kin1_R17 <= DIFN(23) & "0000000" & DIFN(22 downto 7); --0.0078125倍
: Kin1_R18 <= DIFN(23) & "00000000" & DIFN(22 downto 8); --0.00390625倍
: Kin1_R19 <= DIFN(23) & "000000000" & DIFN(22 downto 9); --0.0019531250 倍
: Kin1_R20 <= DIFN(23) & "0000000000" & DIFN(22 downto 10); --0.0009765625 倍
: Kin1_R21 <= DIFN(23) & "00000000000" & DIFN(22 downto 11); --0.0004882813倍
: Kin1_R22 <= DIFN(23) & "000000000000" & DIFN(22 downto 12); --0.00024414063倍
: Kin1_R23 <= DIFN(23) & "0000000000000" & DIFN(22 downto 13); --0.0001220703 倍
: Kin1_R24 <= DIFN(23) & "00000000000000" & DIFN(22 downto 14); --0.0000610352 倍
: Kin1_R25 <= DIFN(23) & "000000000000000" & DIFN(22 downto 15); --0.0000305176 倍
: Kin1_R26 <= DIFN(23) & "0000000000000000" & DIFN(22 downto 16); --0.0000152588 倍
: Kin1_R27 <= DIFN(23) & "00000000000000000" & DIFN(22 downto 17); --0.0001220703 倍
: Kin1_R28 <= DIFN(23) & "000000000000000000" & DIFN(22 downto 18); --0.0000610352 倍
: Kin1_R29 <= DIFN(23) & "0000000000000000000" & DIFN(22 downto 19); --0.0000305176 倍
: Kin1_R30 <= DIFN(23) & "00000000000000000000" & DIFN(22 downto 20); --0.0000152588 倍
: Kin1_R31 <= DIFN(23) & "000000000000000000000" & DIFN(22 downto 21); --0.0000152588 倍
: Kin1_R32 <= DIFN(23) & "0000000000000000000000" & DIFN(22); --0.0000152588 倍
: Kin2_R1 <= DIFP(23) & DIFP(13 downto 0) & "000000000"; --512倍
: Kin2_R2 <= DIFP(23) & DIFP(14 downto 0) & "00000000"; --256倍
: Kin2_R3 <= DIFP(23) & DIFP(15 downto 0) & "0000000"; --128倍
: Kin2_R4 <= DIFP(23) & DIFP(16 downto 0) & "000000"; --64倍
: Kin2_R5 <= DIFP(23) & DIFP(17 downto 0) & "00000"; --32倍
: Kin2_R6 <= DIFP(23) & DIFP(18 downto 0) & "0000"; --16倍
: Kin2_R7 <= DIFP(23) & DIFP(19 downto 0) & "000"; --8倍
: Kin2_R8 <= DIFP(23) & DIFP(20 downto 0) & "00"; --4倍
: Kin2_R9 <= DIFP(23) & DIFP(21 downto 0) & "0"; --2倍
: Kin2_R10 <= DIFP(23) & DIFP(22 downto 0); --1倍
: Kin2_R11 <= DIFP(23) & "0" & DIFP(22 downto 1); --0.5倍
: Kin2_R12 <= DIFP(23) & "00" & DIFP(22 downto 2); --0.25倍
: Kin2_R13 <= DIFP(23) & "000" & DIFP(22 downto 3); --0.125倍
: Kin2_R14 <= DIFP(23) & "0000" & DIFP(22 downto 4); --0.0625倍
: Kin2_R15 <= DIFP(23) & "00000" & DIFP(22 downto 5); --0.03125倍
: Kin2_R16 <= DIFP(23) & "000000" & DIFP(22 downto 6); --0.015625倍
: Kin2_R17 <= DIFP(23) & "0000000" & DIFP(22 downto 7); --0.0078125倍
: Kin2_R18 <= DIFP(23) & "00000000" & DIFP(22 downto 8); --0.00390625倍
: Kin2_R19 <= DIFP(23) & "000000000" & DIFP(22 downto 9); --0.0019531250 倍
: Kin2_R20 <= DIFP(23) & "0000000000" & DIFP(22 downto 10); --0.0009765625 倍
: Kin2_R21 <= DIFP(23) & "00000000000" & DIFP(22 downto 11); --0.0004882813倍
: Kin2_R22 <= DIFP(23) & "000000000000" & DIFP(22 downto 12); --0.00024414063倍
: Kin2_R23 <= DIFP(23) & "0000000000000" & DIFP(22 downto 13); --0.0001220703 倍
: Kin2_R24 <= DIFP(23) & "00000000000000" & DIFP(22 downto 14); --0.0000610352 倍
: Kin2_R25 <= DIFP(23) & "000000000000000" & DIFP(22 downto 15); --0.0000305176 倍
: Kin2_R26 <= DIFP(23) & "0000000000000000" & DIFP(22 downto 16); --0.0000152588 倍
: Kin6_R1 <= DIFPP(23) & DIFPP(13 downto 0) & "000000000"; --512倍
: Kin6_R2 <= DIFPP(23) & DIFPP(14 downto 0) & "00000000"; --256倍
: Kin6_R3 <= DIFPP(23) & DIFPP(15 downto 0) & "0000000"; --128倍
: Kin6_R4 <= DIFPP(23) & DIFPP(16 downto 0) & "000000"; --64倍
: Kin6_R5 <= DIFPP(23) & DIFPP(17 downto 0) & "00000"; --32倍
: Kin6_R6 <= DIFPP(23) & DIFPP(18 downto 0) & "0000"; --16倍
: Kin6_R7 <= DIFPP(23) & DIFPP(19 downto 0) & "000"; --8倍
: Kin6_R8 <= DIFPP(23) & DIFPP(20 downto 0) & "00"; --4倍
: Kin6_R9 <= DIFPP(23) & DIFPP(21 downto 0) & "0"; --2倍
: Kin6_R10 <= DIFPP(23) & DIFPP(22 downto 0); --1倍
: Kin6_R11 <= DIFPP(23) & "0" & DIFPP(22 downto 1); --0.5倍
: Kin6_R12 <= DIFPP(23) & "00" & DIFPP(22 downto 2); --0.25倍
: Kin6_R13 <= DIFPP(23) & "000" & DIFPP(22 downto 3); --0.125倍
: Kin6_R14 <= DIFPP(23) & "0000" & DIFPP(22 downto 4); --0.0625倍
: Kin6_R15 <= DIFPP(23) & "00000" & DIFPP(22 downto 5); --0.03125倍
: Kin6_R16 <= DIFPP(23) & "000000" & DIFPP(22 downto 6); --0.015625倍
: Kin6_R17 <= DIFPP(23) & "0000000" & DIFPP(22 downto 7); --0.0078125倍
: Kin6_R18 <= DIFPP(23) & "00000000" & DIFPP(22 downto 8); --0.00390625倍
: Kin6_R19 <= DIFPP(23) & "000000000" & DIFPP(22 downto 9); --0.0019531250 倍
: Kin6_R20 <= DIFPP(23) & "0000000000" & DIFPP(22 downto 10); --0.0009765625 倍
: Kin6_R21 <= DIFPP(23) & "00000000000" & DIFPP(22 downto 11); --0.0004882813倍
: Kin6_R22 <= DIFPP(23) & "000000000000" & DIFPP(22 downto 12); --0.00024414063倍
: Kin6_R23 <= DIFPP(23) & "0000000000000" & DIFPP(22 downto 13); --0.0001220703 倍
: Kin6_R24 <= DIFPP(23) & "00000000000000" & DIFPP(22 downto 14); --0.0000610352 倍
: Kin6_R25 <= DIFPP(23) & "000000000000000" & DIFPP(22 downto 15); --0.0000305176 倍
: Kin6_R26 <= DIFPP(23) & "0000000000000000" & DIFPP(22 downto 16); --0.0000152588 倍
: Kout2_R1 <= DIF_CP(23) & DIF_CP(13 downto 0) & "000000000"; --512倍
: Kout2_R2 <= DIF_CP(23) & DIF_CP(14 downto 0) & "00000000"; --256倍
: Kout2_R3 <= DIF_CP(23) & DIF_CP(15 downto 0) & "0000000"; --128倍
: Kout2_R4 <= DIF_CP(23) & DIF_CP(16 downto 0) & "000000"; --64倍
: Kout2_R5 <= DIF_CP(23) & DIF_CP(17 downto 0) & "00000"; --32倍
: Kout2_R6 <= DIF_CP(23) & DIF_CP(18 downto 0) & "0000"; --16倍
: Kout2_R7 <= DIF_CP(23) & DIF_CP(19 downto 0) & "000"; --8倍
: Kout2_R8 <= DIF_CP(23) & DIF_CP(20 downto 0) & "00"; --4倍
: Kout2_R9 <= DIF_CP(23) & DIF_CP(21 downto 0) & "0"; --2倍
: Kout2_R10 <= DIF_CP(23) & DIF_CP(22 downto 0); --1倍
: Kout2_R11 <= DIF_CP(23) & "0" & DIF_CP(22 downto 1); --0.5倍
: Kout2_R12 <= DIF_CP(23) & "00" & DIF_CP(22 downto 2); --0.25倍
: Kout2_R13 <= DIF_CP(23) & "000" & DIF_CP(22 downto 3); --0.125倍
: Kout2_R14 <= DIF_CP(23) & "0000" & DIF_CP(22 downto 4); --0.0625倍
: Kout2_R15 <= DIF_CP(23) & "00000" & DIF_CP(22 downto 5); --0.03125倍
: Kout2_R16 <= DIF_CP(23) & "000000" & DIF_CP(22 downto 6); --0.015625倍
: Kout2_R17 <= DIF_CP(23) & "0000000" & DIF_CP(22 downto 7); --0.0078125倍
: Kout2_R18 <= DIF_CP(23) & "00000000" & DIF_CP(22 downto 8); --0.00390625倍
: Kout2_R19 <= DIF_CP(23) & "000000000" & DIF_CP(22 downto 9); --0.0019531250 倍
: Kout2_R20 <= DIF_CP(23) & "0000000000" & DIF_CP(22 downto 10); --0.0009765625 倍
: Kout2_R21 <= DIF_CP(23) & "00000000000" & DIF_CP(22 downto 11); --0.0004882813倍
: Kout2_R22 <= DIF_CP(23) & "000000000000" & DIF_CP(22 downto 12); --0.00024414063倍
: Kout2_R23 <= DIF_CP(23) & "0000000000000" & DIF_CP(22 downto 13); --0.0001220703 倍
: Kout2_R24 <= DIF_CP(23) & "00000000000000" & DIF_CP(22 downto 14); --0.0000610352 倍
: Kout2_R25 <= DIF_CP(23) & "000000000000000" & DIF_CP(22 downto 15); --0.0000305176 倍
: Kout2_R26 <= DIF_CP(23) & "0000000000000000" & DIF_CP(22 downto 16); --0.0000152588 倍
: Kout2_R27 <= DIF_CP(23) & "00000000000000000" & DIF_CP(22 downto 17); --0.0019531250 倍
: Kout2_R28 <= DIF_CP(23) & "000000000000000000" & DIF_CP(22 downto 18); --0.0009765625 倍
: Kout2_R29 <= DIF_CP(23) & "0000000000000000000" & DIF_CP(22 downto 19); --0.0004882813倍
: Kout6_R1 <= DIF_CPP(23) & DIF_CPP(13 downto 0) & "000000000"; --512倍
: Kout6_R2 <= DIF_CPP(23) & DIF_CPP(14 downto 0) & "00000000"; --256倍
: Kout6_R3 <= DIF_CPP(23) & DIF_CPP(15 downto 0) & "0000000"; --128倍
: Kout6_R4 <= DIF_CPP(23) & DIF_CPP(16 downto 0) & "000000"; --64倍
: Kout6_R5 <= DIF_CPP(23) & DIF_CPP(17 downto 0) & "00000"; --32倍
: Kout6_R6 <= DIF_CPP(23) & DIF_CPP(18 downto 0) & "0000"; --16倍
: Kout6_R7 <= DIF_CPP(23) & DIF_CPP(19 downto 0) & "000"; --8倍
: Kout6_R8 <= DIF_CPP(23) & DIF_CPP(20 downto 0) & "00"; --4倍
: Kout6_R9 <= DIF_CPP(23) & DIF_CPP(21 downto 0) & "0"; --2倍
: Kout6_R10 <= DIF_CPP(23) & DIF_CPP(22 downto 0); --1倍
: Kout6_R11 <= DIF_CPP(23) & "0" & DIF_CPP(22 downto 1); --0.5倍
: Kout6_R12 <= DIF_CPP(23) & "00" & DIF_CPP(22 downto 2); --0.25倍
: Kout6_R13 <= DIF_CPP(23) & "000" & DIF_CPP(22 downto 3); --0.125倍
: Kout6_R14 <= DIF_CPP(23) & "0000" & DIF_CPP(22 downto 4); --0.0625倍
: Kout6_R15 <= DIF_CPP(23) & "00000" & DIF_CPP(22 downto 5); --0.03125倍
: Kout6_R16 <= DIF_CPP(23) & "000000" & DIF_CPP(22 downto 6); --0.015625倍
: Kout6_R17 <= DIF_CPP(23) & "0000000" & DIF_CPP(22 downto 7); --0.0078125倍
: Kout6_R18 <= DIF_CPP(23) & "00000000" & DIF_CPP(22 downto 8); --0.00390625倍
: Kout6_R19 <= DIF_CPP(23) & "000000000" & DIF_CPP(22 downto 9); --0.0019531250 倍
: Kout6_R20 <= DIF_CPP(23) & "0000000000" & DIF_CPP(22 downto 10); --0.0009765625 倍
: Kout6_R21 <= DIF_CPP(23) & "00000000000" & DIF_CPP(22 downto 11); --0.0004882813倍
: Kout6_R22 <= DIF_CPP(23) & "000000000000" & DIF_CPP(22 downto 12); --0.00024414063倍
: Kout6_R23 <= DIF_CPP(23) & "0000000000000" & DIF_CPP(22 downto 13); --0.0001220703 倍
: Kout6_R24 <= DIF_CPP(23) & "00000000000000" & DIF_CPP(22 downto 14); --0.0000610352 倍
: Kout6_R25 <= DIF_CPP(23) & "000000000000000" & DIF_CPP(22 downto 15); --0.0000305176 倍
: Kout6_R26 <= DIF_CPP(23) & "0000000000000000" & DIF_CPP(22 downto 16); --0.0000152588 倍
: Kout6_R27 <= DIF_CPP(23) & "00000000000000000" & DIF_CPP(22 downto 17); --0.0019531250 倍
: Kout6_R28 <= DIF_CPP(23) & "000000000000000000" & DIF_CPP(22 downto 18); --0.0009765625 倍
: Kout6_R29 <= DIF_CPP(23) & "0000000000000000000" & DIF_CPP(22 downto 19); --0.0004882813倍
: DIF_CN <= (Kin6_R7 + Kin6_R8 + Kin6_R9 + Kin6_R10 + Kin6_R12 + Kin6_R13 + Kin6_R14 + Kin6_R17 + Kin6_R18 + Kin6_R21 + Kin6_R22)
: -(Kin2_R7 + Kin2_R8 + Kin2_R9 + Kin2_R10 + Kin2_R12 + Kin2_R13 + Kin2_R14 + Kin2_R17 + Kin2_R18 + Kin2_R21 + Kin2_R22)
: +(Kout2_R14 + Kout2_R15 + Kout2_R16 + Kout2_R18 + Kout2_R22 + Kout2_R23 + Kout2_R25 + Kout2_R26 + Kout2_R27)
: -(Kin1_R20 + Kin1_R24 + Kin1_R25 + Kin1_R27 + Kin1_R28 + Kin1_R29 + Kin1_R31 + Kin1_R32)
: -(Kout6_R19 + Kout6_R20 + Kout6_R22 + Kout6_R25 + Kout6_R26 + Kout2_R27 + Kout2_R28 + Kout2_R29);
: DIF_CPP <= DIF_CP;
: DIF_CP <= DIF_CN;
: DIFPP <= DIFP;
: DIFP <= DIFN;
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.113.156.79