zoukankan      html  css  js  c++  java
  • AVR+FPGA实现六路闭环电流控制程序

    --2011.7.7凌晨版本
    --加入闭环控制
    --原有程序大幅改写,去掉了部分编译警告
    
    
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.std_logic_arith.all;
    use ieee.std_logic_unsigned.all;
    
    entity XTKZQ is
    port(
        rst,clk        :    in        std_logic;    --时钟和复位信号,复位信号由AVR初始化手动给出
        --avr 读写相关信号线
        ale,rd,wr    :    in         std_logic;    --地址锁存、读、写信号
        ad            :    inout    std_logic_vector(7 downto 0);    --地址数据复用信号线
        
        --LED指示灯
        led1,led2    :    out        std_logic;
        
        --pwm
        pwm1,pwm2,pwm3,pwm4,pwm5,pwm6    :    out        std_logic;
        
        --ad8364信号线
        adc_d:                          in    std_logic_vector(15 downto 0);
        adc_a0,adc_a1,adc_a2:              out   std_logic;
        adc_reset:                       out   std_logic;
        adc_cs:                          out   std_logic;
        adc_wr:                          out   std_logic;
        adc_rd:                          out   std_logic;
        adc_holda,adc_holdb,adc_holdc:    out    std_logic;
        adc_eoc:                         in    std_logic; 
        adcclk_out:                         out   std_logic;
        --放大增益控制,此处每一路AD设置了两级放大增益
        sw11:        out        std_logic;--控制模拟开关,调节放大增益
        sw12:        out        std_logic;
        sw21:        out        std_logic;
        sw22:        out        std_logic;
        sw31:        out        std_logic;
        sw32:        out        std_logic;
        sw41:        out        std_logic;
        sw42:        out        std_logic;
        sw51:        out        std_logic;
        sw52:        out        std_logic;
        sw61:        out        std_logic;
        sw62:        out        std_logic
        );
    end XTKZQ;
    
    architecture art of  XTKZQ is
    ------------------------------------------------全局信号定义-------------------------------------------------------------------    
    --avr访问操作相关信号
    signal adr            :   std_logic_vector(7 downto 0);  --地址寄存器
    signal data_buf        :   std_logic_vector(7 downto 0);
    signal data_outctl    :     std_logic;
    --pwm控制部分有三组变量,第一组是由avr写入,控制相应的占空比,这个是供调试使用
    --第二组是自动pid控制使用的
    --第三组是pwm计数使用的,根据pid_sw开关的设置决定读入第一组还是第二组的值
    --pwm部分相关寄存器定义 寄存器暂时定义为8位
    signal pwmfreq_reg    :    std_logic_vector(7 downto 0);
    signal pwmocr1_reg    :    std_logic_vector(7 downto 0);
    signal pwmocr2_reg    :    std_logic_vector(7 downto 0);
    signal pwmocr3_reg    :    std_logic_vector(7 downto 0);
    signal pwmocr4_reg    :    std_logic_vector(7 downto 0);
    signal pwmocr5_reg    :    std_logic_vector(7 downto 0);
    signal pwmocr6_reg    :    std_logic_vector(7 downto 0);
    
    --pwm部分PID调节中用到的相关变量
    signal pwmfreq_pid    :    std_logic_vector(7 downto 0);
    signal pwmocr1_pid    :    std_logic_vector(7 downto 0);
    signal pwmocr2_pid    :    std_logic_vector(7 downto 0);
    signal pwmocr3_pid    :    std_logic_vector(7 downto 0);
    signal pwmocr4_pid    :    std_logic_vector(7 downto 0);
    signal pwmocr5_pid    :    std_logic_vector(7 downto 0);
    signal pwmocr6_pid    :    std_logic_vector(7 downto 0);
    
    --PWM计数用到的相关变量,这里定义为8位
    signal pwm_cnt        :    std_logic_vector(7 downto 0);
    signal pwmfreq        :    std_logic_vector(7 downto 0);
    signal pwmocr1        :    std_logic_vector(7 downto 0);
    signal pwmocr2        :    std_logic_vector(7 downto 0);
    signal pwmocr3        :    std_logic_vector(7 downto 0);
    signal pwmocr4        :    std_logic_vector(7 downto 0);
    signal pwmocr5        :    std_logic_vector(7 downto 0);
    signal pwmocr6        :    std_logic_vector(7 downto 0);
    
    
    --自动闭环控制相关寄存器定义
    signal pid_sw        :    std_logic_vector(7 downto 0); --闭环控制开关,此寄存器为0x01时开启自动闭环控制
    
    --六个AD寄存器位,用于存放设定的AD值
    signal adcset1h_reg,adcset1l_reg,adcset2h_reg,adcset2l_reg        :    std_logic_vector(7 downto 0);
    signal adcset3h_reg,adcset3l_reg,adcset4h_reg,adcset4l_reg        :    std_logic_vector(7 downto 0);
    signal adcset5h_reg,adcset5l_reg,adcset6h_reg,adcset6l_reg        :    std_logic_vector(7 downto 0);
    --时钟分频相关变量
    signal clkcnt        :    std_logic_vector(16 downto 0);
    signal adc_clk        :    std_logic;    --adc时钟信号
    signal pwm_clk        :    std_logic;    --pwm时钟信号
    signal pid_clk        :    std_logic;    --pid时钟信号,用于调节pid的反应速度
    
    
    --led指示相关变量
    signal led_clk        :    std_logic;    --led时钟信
    signal led1_cnt        :    std_logic_vector(7 downto 0);
    signal led2_cnt        :     std_logic_vector(7 downto 0);
    signal led1s        :    std_logic;
    signal led2s        :    std_logic;
    
    --ads8364信号
    signal adcdata1h_reg,adcdata1l_reg,adcdata2h_reg,adcdata2l_reg    :    std_logic_vector(7 downto 0);
    signal adcdata3h_reg,adcdata3l_reg,adcdata4h_reg,adcdata4l_reg    :    std_logic_vector(7 downto 0);
    signal adcdata5h_reg,adcdata5l_reg,adcdata6h_reg,adcdata6l_reg    :    std_logic_vector(7 downto 0);
    signal adc_data_buf :    std_logic_vector(15 downto 0);
    
    --定义读取过程的各个状态
    --13位控制分别为 hold adc_a rd 状态机状态5位     hhhabcr
    ---------------------------------------------------98365
    constant st0    :std_logic_vector(11 downto 0):="000000100000";--启动转换
    constant st1    :std_logic_vector(11 downto 0):="111000100001";--进入17个周期等待转换结束,不检测EOC
    constant st2    :std_logic_vector(11 downto 0):="111000100010";
    constant st3    :std_logic_vector(11 downto 0):="111000100011";
    constant st4    :std_logic_vector(11 downto 0):="111000100100";
    constant st5    :std_logic_vector(11 downto 0):="111000100101";
    constant st6    :std_logic_vector(11 downto 0):="111000100110";
    constant st7    :std_logic_vector(11 downto 0):="111000100111";
    constant st8    :std_logic_vector(11 downto 0):="111000101000";
    constant st9    :std_logic_vector(11 downto 0):="111000101001";
    constant st10    :std_logic_vector(11 downto 0):="111000101010";
    constant st11    :std_logic_vector(11 downto 0):="111000101011";
    constant st12    :std_logic_vector(11 downto 0):="111000101100";
    constant st13    :std_logic_vector(11 downto 0):="111000101101";
    constant st14    :std_logic_vector(11 downto 0):="111000101110";
    constant st15    :std_logic_vector(11 downto 0):="111000101111";
    constant st16    :std_logic_vector(11 downto 0):="111000110000";
    constant st17    :std_logic_vector(11 downto 0):="111000110001";
    constant st18    :std_logic_vector(11 downto 0):="111000110010";
    constant st19    :std_logic_vector(11 downto 0):="111000010011";--读ch1数据
    constant st20    :std_logic_vector(11 downto 0):="111001110100";
    constant st21    :std_logic_vector(11 downto 0):="111001010101";--读ch2数据
    constant st22    :std_logic_vector(11 downto 0):="111010110110";
    constant st23    :std_logic_vector(11 downto 0):="111010010111";--读ch3数据
    constant st24    :std_logic_vector(11 downto 0):="111011111000";
    constant st25    :std_logic_vector(11 downto 0):="111011011001";--读ch4数据
    constant st26    :std_logic_vector(11 downto 0):="111100111010";
    constant st27    :std_logic_vector(11 downto 0):="111100011011";--读ch5数据
    constant st28    :std_logic_vector(11 downto 0):="111101111100";
    constant st29    :std_logic_vector(11 downto 0):="111101011101";--读ch6数据
    constant st30    :std_logic_vector(11 downto 0):="111000111110";
    
    signal adc1_datasum    :std_logic_vector(22 downto 0);--对采样数据进行累加存储
    signal adc2_datasum    :std_logic_vector(22 downto 0);
    signal adc3_datasum    :std_logic_vector(22 downto 0);
    signal adc4_datasum    :std_logic_vector(22 downto 0);
    signal adc5_datasum    :std_logic_vector(22 downto 0);
    signal adc6_datasum    :std_logic_vector(22 downto 0);
    
    signal adcadd_cnt    :std_logic_vector(7 downto 0);--累加次数统计
    signal state        :std_logic_vector(11 downto 0);--用于状态跳转
    signal readst        :std_logic_vector(3 downto 0);--adc_a,在另一个进程中根据此信号 选择输出的数据
        
    begin
    
    ------------------------------------------------时钟分频-------------------------------------------------------------------    
    process(rst,clk) is
    begin
        if rst='0' then
            clkcnt <= "00000000000000000";
        elsif(clk'event and clk = '1') then
            if(clkcnt = "11111111111111111") then
                clkcnt<= "00000000000000000";
            else
                clkcnt <= clkcnt+1;
            end if;            
        end if;
    end process;
    
    pwm_clk <= clkcnt(2);    --2  8分频,8位计数的话PWM波频率为12KHZ
    led_clk <= clkcnt(15);    --15  分频led时钟
    adc_clk <= clkcnt(2);
    pid_clk <= clkcnt(13);  --13  2^14=16384,频率为1525hz
    adcclk_out <= clkcnt(2);--2  8分频,ADC时钟速率为3.125MHz,22个ADC时钟采样一次数据则采样速度为142K
    
    ------------------------------------------------avr访问操作----------------------------------------------------------------
    data_outctl <= (not ale) and (not rd) and (wr);
    ad <=  data_buf when (data_outctl='1') else "ZZZZZZZZ";
    
    --锁存avr地址数据
    process(rst,ale) is
    begin
        if rst='0' then 
            adr <= "00000000";
        elsif(ale'event and ale='0') then    --在ale信号的下降沿锁存地址数据
            adr <= ad;
        end if;
    end process;
    
    -------------------------------------avr写数据-----------------------------------
    process(rst,wr,ale) is
    begin
        if rst='0' then    --对各寄存器给定初值
            pwmfreq_reg    <=    "11111111";
            pwmocr1_reg    <=    "00000000";
            pwmocr2_reg    <=    "00000000";
            pwmocr3_reg    <=    "00000000";
            pwmocr4_reg    <=    "00000000";
            pwmocr5_reg    <=    "00000000";
            pwmocr6_reg    <=    "00000000";
            --自动控制设定寄存器初值
            adcset1h_reg <= "10000000";-----------------------------------fangz
            adcset1l_reg <= "00000000";
            adcset2h_reg <= "00000000";
            adcset2l_reg <= "00000000";
            adcset3h_reg <= "00000000";
            adcset3l_reg <= "00000000";
            adcset4h_reg <= "00000000";
            adcset4l_reg <= "00000000";
            adcset5h_reg <= "00000000";
            adcset5l_reg <= "00000000";
            adcset6h_reg <= "00000000";
            adcset6l_reg <= "00000000";
            
            pid_sw        <= "00000000";
            
        elsif (wr='1' and wr'event) then     --在wr信号上升沿进行写操作
            if ale = '0' then 
                case adr is
                when "00010000" =>    pwmfreq_reg        <=    ad;--10
                when "00010001" =>    pwmocr1_reg        <=    ad;--11
                when "00010010" =>    pwmocr2_reg        <=    ad;
                when "00010011" =>    pwmocr3_reg        <=    ad;
                when "00010100" =>    pwmocr4_reg        <=    ad;
                when "00010101" =>    pwmocr5_reg        <=    ad;
                when "00010110" =>    pwmocr6_reg        <=    ad;--16    
                
                when "00100001" =>    adcset1h_reg     <=    ad;--21                                
                when "00100010" =>    adcset1l_reg     <=    ad;
                when "00100011" =>    adcset2h_reg    <=    ad;
                when "00100100" =>    adcset2l_reg    <=    ad;
                when "00100101" =>    adcset3h_reg    <=    ad;
                when "00100110" =>    adcset3l_reg    <=    ad;--26    
                when "00100111" =>    adcset4h_reg     <=    ad;--27
                when "00101000" =>    adcset4l_reg     <=    ad;
                when "00101001" =>    adcset5h_reg    <=    ad;
                when "00101010" =>    adcset5l_reg    <=    ad;
                when "00101011" =>    adcset6h_reg    <=    ad;
                when "00101100" =>    adcset6l_reg    <=    ad;--2C    
                
                when "00101101" =>    pid_sw            <=  ad;--2D
                        
                when others =>
                    pwmfreq_reg <= pwmfreq_reg;
                    pwmocr1_reg <= pwmocr1_reg;
                    pwmocr2_reg <= pwmocr2_reg;
                    pwmocr3_reg <= pwmocr3_reg;
                    pwmocr4_reg <= pwmocr4_reg;
                    pwmocr5_reg <= pwmocr5_reg;
                    pwmocr6_reg <= pwmocr6_reg;
                    
                    adcset1h_reg<= adcset1h_reg;
                    adcset1l_reg<= adcset1l_reg;
                    adcset2h_reg<= adcset2h_reg;
                    adcset2l_reg<= adcset2l_reg;
                    adcset3h_reg<= adcset3h_reg;
                    adcset3l_reg<= adcset3l_reg;
                    adcset4h_reg<= adcset4h_reg;
                    adcset4l_reg<= adcset4l_reg;
                    adcset5h_reg<= adcset5h_reg;
                    adcset5l_reg<= adcset5l_reg;
                    adcset6h_reg<= adcset6h_reg;
                    adcset6l_reg<= adcset6l_reg;
                    pid_sw        <= pid_sw;
                end case;
            end if;
        end if;
    end process;
       
    ------------------------------------avr读数据-------------------------------------
    process(rst,rd,ale) is
    begin
        if rst='0' then
            data_buf<="00000000";
        elsif (rd='0'and rd'event) then
                case adr is
                when "00000001" => data_buf <=    adcdata1h_reg;--1
                when "00000010" => data_buf <=    adcdata1l_reg;--2
                when "00000011" => data_buf <=    adcdata2h_reg;--3
                when "00000100" => data_buf <=    adcdata2l_reg;--4
                when "00000101" => data_buf <=    adcdata3h_reg;--5
                when "00000110" => data_buf <=    adcdata3l_reg;--6
                when "00000111" => data_buf <=    adcdata4h_reg;--7
                when "00001000" => data_buf <=    adcdata4l_reg;--8
                when "00001001" => data_buf <=    adcdata5h_reg;--9
                when "00001010" => data_buf <=    adcdata5l_reg;--A
                when "00001011" => data_buf <=    adcdata6h_reg;--B
                when "00001100" => data_buf <=    adcdata6l_reg;--C
                
                when "00010000" => data_buf <=  adcset1h_reg;
                when "00010001" => data_buf <=  adcset1l_reg;
                when others => 
                                    data_buf <= "ZZZZZZZZ";
                end case;
        end if;
    end process;
    ------------------------------------led指示-------------------------------------
    process(led_clk)is
    begin
        if(led_clk'event and led_clk='1') then
            led1_cnt <= led1_cnt+1;
            if (led1_cnt >=    pwmocr1) then
                led1s <= not led1s; 
                led1_cnt <="00000000";
            end if;
        end if;
    end process;
    led1<=led1s;
    process(led_clk)is
    begin
        if(led_clk'event and led_clk='1') then
            led2_cnt <= led2_cnt+1;
            if (led2_cnt >=    pwmocr2) then
                led2s <= not led2s; 
                led2_cnt <="00000000";
            end if;
        end if;
    end process;
    led2<=led2s;
    
    --------------------------------------pwm---------------------------------------
    process(pwm_clk,rst) is
    begin
        if rst='0' then             
            pwm_cnt<="00000000";
            sw11<= '0';
            sw12<= '0';
            sw21<= '0';
            sw22<= '0';
            sw31<= '0';
            sw32<= '0';
            sw41<= '0';
            sw42<= '0';
            sw51<= '0';
            sw52<= '0';
            sw61<= '0';
            sw62<= '0';
        elsif(pwm_clk'event and pwm_clk='1') then
            if(pid_sw="00000001") then--如果pid控制寄存器开启,则pwm计数使用pid的调节量
                pwmocr1<=pwmocr1_pid;
                pwmocr2<=pwmocr2_pid;
                pwmocr3<=pwmocr3_pid;
                pwmocr4<=pwmocr4_pid;
                pwmocr5<=pwmocr5_pid;
                pwmocr6<=pwmocr6_pid;
            else--否则使用外部给定的量
                pwmocr1<=pwmocr1_reg;
                pwmocr2<=pwmocr2_reg;
                pwmocr3<=pwmocr3_reg;
                pwmocr4<=pwmocr4_reg;
                pwmocr5<=pwmocr5_reg;
                pwmocr6<=pwmocr6_reg;
            end if;
            
            if(pwm_cnt >=pwmfreq_reg) then
                pwm_cnt <= "00000000";
            else  
                pwm_cnt<=pwm_cnt+1;
            end if;
            
            --数据比较模块 这里设计的所有通道频率一致
            --第一通道
            if(pwm_cnt>= pwmocr1) then  
                pwm1<= '1';
            else 
                pwm1<= '0';
            end if;
            --第二通道
            if(pwm_cnt>= pwmocr2) then  
                pwm2<= '1';
            else 
                pwm2<= '0';        
            end if;
            --第三通道
            if(pwm_cnt>= pwmocr3) then  
                pwm3<= '1';
            else 
                pwm3<= '0';
            end if;
            --第四通道
            if(pwm_cnt>= pwmocr4) then  
                pwm4<= '1';
            else 
                pwm4<= '0';        
            end if;
            --第五通道
            if(pwm_cnt>= pwmocr5) then  
                pwm5<= '1';
            else 
                pwm5<= '0';
            end if;
            --第六通道
            if(pwm_cnt>= pwmocr6) then  
                pwm6<= '1';
            else 
                pwm6<= '0';        
            end if;
            --可编程增益放大
            --此处是根据占空比自动调节放大增益,可以根据实际测量参数改变临界点的值
            sw11<= '1';
            sw12<= '0';
            sw21<= '1';
            sw22<= '0';
            sw31<= '1';
            sw32<= '0';
            sw41<= '1';
            sw42<= '0';
            sw51<= '1';
            sw52<= '0';
            sw61<= '1';
            sw62<= '0';
        end if;
    end process;
    --------------------------------------ads8364------------------------------------
    --ads8364控制,默认byte=0,add=0
    adc_cs <= '0'; --片选一直选中
    adc_wr <= '1'; 
    --ads状态转移
    process(adc_clk,rst,state)
    begin
        if(rst='0') then
            state<=st0;
            adc_reset<='0';
            adc_holda<='1';
            adc_holdb<='1';
            adc_holdc<='1';
        elsif(adc_clk'event and adc_clk='1') then
        adc_reset<='1';
        case state is
            when st0=> state<=st1;
            when st1=> state<=st2;
            when st2=> state<=st3;
            when st3=> state<=st4;
            when st4=> state<=st5;
            when st5=> state<=st6;
            when st6=> state<=st7;
            when st7=> state<=st8;
            when st8=> state<=st9;
            when st9=> state<=st10;
            when st10=> state<=st11;
            when st11=> state<=st12;
            when st12=> state<=st13;
            when st13=> state<=st14;
            when st14=> state<=st15;
            when st15=> state<=st16;
            when st16=> state<=st17;
            when st17=> state<=st18;
            when st18=> state<=st19;
            when st19=> state<=st20;
            when st20=> state<=st21;
            when st21=> state<=st22;
            when st22=> state<=st23;
            when st23=> state<=st24;
            when st24=> state<=st25;
            when st25=> state<=st26;
            when st26=> state<=st27;
            when st27=> state<=st28;
            when st28=> state<=st29;
            when st29=> state<=st30;
            when st30=> state<=st0;
            when others=> state<=st0;
        end case;
        end if;
        readst<=state(8 downto 5);
        adc_holdc<=state(11);
        adc_holdb<=state(10);
        adc_holda<=state(9);
        adc_a2<=state(8);
        adc_a1<=state(7);
        adc_a0<=state(6);
        adc_rd<=state(5);
    end process;
    adc_data_buf(14 downto 0) <= adc_d(14 downto 0);--ADC输出为补码形式,转换为单端输入的原码
    adc_data_buf(15) <= not adc_d(15); 
    --------------------------------------求平均------------------------------------
    process(rst,adc_clk,pwm_clk,adc_d,pwm_cnt)
    begin
        if(rst='0')then
            adc1_datasum<="00000000000000000000000";
            adc2_datasum<="00000000000000000000000";
            adc3_datasum<="00000000000000000000000";
            adc4_datasum<="00000000000000000000000";
            adc5_datasum<="00000000000000000000000";
            adc6_datasum<="00000000000000000000000";
            adcadd_cnt<="00000000";
        elsif(adc_clk'event and adc_clk='0')then
            if readst="0000" then
                adc1_datasum <= adc1_datasum + adc_data_buf;
                adcadd_cnt <= adcadd_cnt + '1';--一次读取状态只需要计数一次
            elsif readst="0010" then
                adc2_datasum <= adc2_datasum + adc_data_buf;
            elsif readst="0100" then
                adc3_datasum <= adc3_datasum + adc_data_buf;
            elsif readst="0110" then
                adc4_datasum <= adc4_datasum + adc_data_buf;
            elsif readst="1000" then
                adc5_datasum <= adc5_datasum + adc_data_buf;
            elsif readst="1010" then
                adc6_datasum <= adc6_datasum + adc_data_buf;
            end if;    
            if(adcadd_cnt >= "01111111") then
    
                adcdata1h_reg <= adc1_datasum(22 downto 15);
                adcdata1l_reg <= adc1_datasum(14 downto 7); 
                adcdata2h_reg <= adc2_datasum(22 downto 15);
                adcdata2l_reg <= adc2_datasum(14 downto 7); 
                
                adcdata3h_reg <= adc3_datasum(22 downto 15);
                adcdata3l_reg <= adc3_datasum(14 downto 7); 
                adcdata4h_reg <= adc4_datasum(22 downto 15);
                adcdata4l_reg <= adc4_datasum(14 downto 7);
    
                adcdata5h_reg <= adc5_datasum(22 downto 15);
                adcdata5l_reg <= adc5_datasum(14 downto 7); 
                adcdata6h_reg <= adc6_datasum(22 downto 15);
                adcdata6l_reg <= adc6_datasum(14 downto 7);             
                
                adc1_datasum<="00000000000000000000000";
                adc2_datasum<="00000000000000000000000";
                adc3_datasum<="00000000000000000000000";
                adc4_datasum<="00000000000000000000000";
                adc5_datasum<="00000000000000000000000";
                adc6_datasum<="00000000000000000000000";
                adcadd_cnt <= "00000000";
            end if;
        end if;
    end process;
    --------------------------------------闭环控制------------------------------------
    process(rst,pid_clk,pid_sw,adcset1h_reg,adcset1l_reg,adcset2h_reg,adcset2l_reg,adcset3h_reg,adcset3l_reg,
            adcset4h_reg,adcset4l_reg,adcset5h_reg,adcset5l_reg,adcset6h_reg,adcset6l_reg)
    begin
        if(rst='0')then
            pwmocr1_pid<="00000000";
            pwmocr2_pid<="00000000";
            pwmocr3_pid<="00000000";
            pwmocr4_pid<="00000000";
            pwmocr5_pid<="00000000";
            pwmocr6_pid<="00000000";
        elsif(pid_clk'event and pid_clk='0')then
            if(pid_sw="00000001")then--如果PID自动控制标志位开启
                --第1通道闭环控制
                if(adcset1h_reg>adcdata1h_reg) then --这里只比较高八位,留有一定的死区,避免频繁调节
                    pwmocr1_pid <= pwmocr1_pid + '1'; --采样值小于设定值,增加占空比
                elsif(adcset1h_reg<adcdata1h_reg) then
                    pwmocr1_pid <= pwmocr1_pid - '1'; --否则减小占空比
                end if;
                --第2通道闭环控制
                if(adcset2h_reg>adcdata2h_reg) then 
                    pwmocr2_pid <= pwmocr2_pid + '1'; 
                elsif(adcset2h_reg<adcdata2h_reg) then
                    pwmocr2_pid <= pwmocr2_pid - '1'; 
                end if;
                --第3通道闭环控制
                if(adcset3h_reg>adcdata3h_reg) then 
                    pwmocr3_pid <= pwmocr3_pid + '1'; 
                elsif(adcset3h_reg<adcdata3h_reg) then
                    pwmocr3_pid <= pwmocr3_pid - '1'; 
                end if;
                --第4通道闭环控制
                if(adcset4h_reg>adcdata4h_reg) then 
                    pwmocr4_pid <= pwmocr4_pid + '1'; 
                elsif(adcset4h_reg<adcdata4h_reg) then
                    pwmocr4_pid <= pwmocr4_pid - '1'; 
                end if;
                --第5通道闭环控制
                if(adcset5h_reg>adcdata5h_reg) then 
                    pwmocr5_pid <= pwmocr5_pid + '1'; 
                elsif(adcset5h_reg<adcdata5h_reg) then
                    pwmocr5_pid <= pwmocr5_pid - '1'; 
                end if;
                --第6通道闭环控制
                if(adcset6h_reg>adcdata6h_reg) then 
                    pwmocr6_pid <= pwmocr6_pid + '1'; 
                elsif(adcset6h_reg<adcdata6h_reg) then
                    pwmocr6_pid <= pwmocr6_pid - '1'; 
                end if;
                
                --加入一个比较,防止在自动调整的时候数据溢出        
                if(pwmocr1_pid>"11111110") then
                    pwmocr1_pid <="11111110";
                elsif(pwmocr1_pid<"00000001") then
                    pwmocr1_pid <="00000001";
                end if;
                
                if(pwmocr2_pid>"11111110") then
                    pwmocr2_pid <="11111110";
                elsif(pwmocr2_pid<"00000001") then
                    pwmocr2_pid <="00000001";
                end if;
                
                if(pwmocr3_pid>"11111110") then
                    pwmocr3_pid <="11111110";
                elsif(pwmocr3_pid<"00000001") then
                    pwmocr3_pid <="00000001";
                end if;
                
                if(pwmocr4_pid>"11111110") then
                    pwmocr4_pid <="11111110";
                elsif(pwmocr4_pid<"00000001") then
                    pwmocr4_pid <="00000001";
                end if;
                
                if(pwmocr5_pid>"11111110") then
                    pwmocr5_pid <="11111110";
                elsif(pwmocr5_pid<"00000001") then
                    pwmocr5_pid <="00000001";
                end if;
                
                if(pwmocr6_pid>"11111110") then
                    pwmocr6_pid <="11111110";
                elsif(pwmocr6_pid<"00000001") then
                    pwmocr6_pid <="00000001";
                end if;
                            
            end if;
        end if;
    end process;
    
    end;
    
        
    ★emouse 思·睿博客文章★ 原创文章转载请注明:http://emouse.cnblogs.com
  • 相关阅读:
    [YNOI2017][bzoj4811][luogu3613] 由乃的OJ/睡觉困难综合症 [压位+树链剖分+线段树]
    [bzoj3270] 博物馆 [期望+高斯消元]
    [bzoj4372] 烁烁的游戏 [动态点分治+线段树+容斥原理]
    [Codeforces438E][bzoj3625] 小朋友和二叉树 [多项式求逆+多项式开根]
    [bzoj3813] 奇数国 [线段树+欧拉函数]
    [BZOJ4205][FJ2015集训] 卡牌配对 [建图+最大流]
    Git常见问题解决办法
    电脑常用快捷键
    egret.Shape渲染集合图形
    TypeScript语法学习--变量的声明
  • 原文地址:https://www.cnblogs.com/emouse/p/2198139.html
Copyright © 2011-2022 走看看