作者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