⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpld源程序注释.txt

📁 控制三相步进电机及光电编码器的采集,当电机停止时,保证三相里面只有一相相通,防止停止时电流过大.
💻 TXT
字号:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE IEEE.STD_LOGIC_ARITH.ALL; 
USE IEEE.STD_LOGIC_UNSIGNED.ALL; 
LIBRARY lpm;
USE lpm.lpm_components.all;

ENTITY GDB IS

	PORT
	(	
        clk                 : IN       STD_LOGIC;

        INT0                : OUT      STD_LOGIC;
        INT1                : OUT       STD_LOGIC;
        GATE                : IN       STD_LOGIC;
        FORTH               : IN       STD_LOGIC;
        GATEV               : IN       STD_LOGIC;
				READY0			 				: OUT 	   STD_LOGIC;
        BD                  : IN	   STD_LOGIC_VECTOR (7 downto 0);
        ADDR                : IN       STD_LOGIC_VECTOR (15 downto 0);
				AB									: IN       STD_LOGIC_VECTOR (1 downto 0);
        DJA                 : OUT      STD_LOGIC;
        DJB                 : OUT      STD_LOGIC;
        DJC                 : OUT      STD_LOGIC;
        GATEDJ              : OUT      STD_LOGIC;
        VIODE_A             : OUT      STD_LOGIC;
        VIODE_B             : OUT      STD_LOGIC;
        WR                  : IN       STD_LOGIC;
        RD                  : OUT       STD_LOGIC;
				RESET								: IN       STD_LOGIC

	);
	
END GDB;

ARCHITECTURE deal OF GDB IS
	SIGNAL	CS0				: STD_LOGIC;
	SIGNAL  TIMECOUNT600    : STD_LOGIC_VECTOR (10 downto 0);
	SIGNAL  DJCOUNT0        : STD_LOGIC_VECTOR (7 downto 0);
	SIGNAL  DJCOUNT1        : STD_LOGIC_VECTOR (9 downto 0);
	SIGNAL  DJCOUNT2        : STD_LOGIC_VECTOR (9 downto 0);
	SIGNAL  DJCOUNT3        : STD_LOGIC_VECTOR (11 downto 0);
	SIGNAL  TIMECOUNTDJ0    : STD_LOGIC;
	SIGNAL  TIMECOUNTDJ1    : STD_LOGIC;
  SIGNAL  DD              : STD_LOGIC_VECTOR (7 downto 0);
	SIGNAL  VIODE           : STD_LOGIC;
	SIGNAL  COUNT           : STD_LOGIC_VECTOR (4 downto 0);
	SIGNAL ABCOUNT          : STD_LOGIC_VECTOR (1 downto 0);
	SIGNAL ABDATA           : STD_LOGIC_VECTOR (1 downto 0);
	SIGNAL  AOUT,BOUT       : STD_LOGIC;
	SIGNAL  JSQ0,JSQ1 ,JSQ2       :INTEGER RANGE 0 TO 10; 
	SIGNAL  DJA1,DJB1,DJC1,GATEDJ1  : STD_LOGIC;
	SIGNAL DA1,DA2,DA3,DA4,QA2,QA4,AR,AS,AQR,AQS :STD_LOGIC;

BEGIN	
------------------WARN  600HZ方波-----------------
PROCESS (clk,TIMECOUNT600)
	BEGIN
	  IF (clk'EVENT AND clk = '1') THEN
		IF (TIMECOUNT600 = "11010000010")THEN --1666  
			 TIMECOUNT600 <= "00000000000";
			ELSE
			 TIMECOUNT600 <= TIMECOUNT600 + 1;
		END IF;	
	  END IF;	
END PROCESS;

PROCESS(TIMECOUNT600,CLK)
	BEGIN
		IF(CLK'EVENT AND CLK = '1')THEN
			IF(TIMECOUNT600 <= "1101000001")THEN  --833 
				VIODE <= '1';
			ELSE
				VIODE <= '0';
			END IF;
		END IF;
END PROCESS;
	
PROCESS(VIODE,GATEV)
	BEGIN
		IF (GATEV = '0')THEN
			IF( VIODE = '1')THEN
			VIODE_A <= '0';
			VIODE_B <= 'Z';
			ELSIF( VIODE = '0')THEN
			VIODE_A <= 'Z';
			VIODE_B <= '0';
			END IF;
		ELSE
		VIODE_A <= 'Z';
		VIODE_B <= 'Z';
		END IF;
END PROCESS;
----------------------------------------------------------------------------
电机三相六步,TIMECOUNTDJ0同步其他三相的脉冲,
可调占空比改变电机静态电流的大小,同时电机停止能抱死.
PROCESS(CLK)
	BEGIN
		IF(CLK'EVENT AND CLK = '1')THEN
			IF(DJCOUNT0 = "11001000")THEN --200
				DJCOUNT0 <= "00000000";
			ELSE
				DJCOUNT0 <= DJCOUNT0 +1;
			END IF;
		END IF;
END PROCESS;
PROCESS(CLK,DJCOUNT0)
	BEGIN
		IF(CLK'EVENT AND CLK ='1')THEN
			IF(DJCOUNT0 <="1011010")THEN	--90 
				TIMECOUNTDJ0 <= '0';
			ELSE
				TIMECOUNTDJ0 <= '1';
			END IF;
		END IF;
END PROCESS;

PROCESS(CLK,TIMECOUNTDJ0,RESET)
	BEGIN
		IF(CLK'EVENT AND CLK = '1')THEN
			IF(GATE = '1')THEN
				IF(RESET = '0' AND TIMECOUNTDJ0 = '1')THEN
					GATEDJ1 <= '0';
				ELSE
					GATEDJ1 <= 'Z';
				END IF;
			ELSE
				IF(RESET = '0' AND TIMECOUNTDJ0 = '1')THEN
					GATEDJ1 <= 'Z';
				ELSE
					GATEDJ1 <= '0';
				END IF;
			END IF;
		END IF;
END PROCESS;

----------------------- 3 XIANG 6 BU --------------------
PROCESS(ADDR,WR)
BEGIN
	IF(ADDR(15 DOWNTO 0) = X"e000")THEN
		IF (WR 'event and WR = '1') THEN
			DD <= BD;
		END IF;
	END IF;
END PROCESS;
这里设置了三种速度,由单片机发送数据来切换
PROCESS(CLK,DD,DJCOUNT1,DJCOUNT2,DJCOUNT3)
	BEGIN
		IF(CLK'EVENT AND CLK = '1')THEN
			IF(DD = "00000110")THEN  --6
				IF(DJCOUNT2 = "1001011000")THEN --600  最快,1秒钟转7圈
					DJCOUNT2 <= "0000000000";
				ELSE
					DJCOUNT2 <= DJCOUNT2 +1;
				END IF;
			ELSIF(DD = "00000001")THEN	--1
				IF(DJCOUNT3 = "1000100110000")THEN --4400  最慢,1秒钟转1圈
					DJCOUNT3 <= "0000000000000";
				ELSE
					DJCOUNT3 <= DJCOUNT3 +1;
				END IF;
			ELSE  --3
				IF(DJCOUNT1 = "1111101000")THEN --1000		
					DJCOUNT1 <= "0000000000";
				ELSE
					DJCOUNT1 <= DJCOUNT1 +1;
				END IF;
			END IF;
		END IF;
END PROCESS;

PROCESS(CLK,DJCOUNT1,DJCOUNT2,DD,DJCOUNT3)
	BEGIN
		IF(CLK'EVENT AND CLK ='1')THEN
			IF(DD = "00000110")THEN
				IF(DJCOUNT2 <="100101100")THEN	--300
					TIMECOUNTDJ1 <= '0';
				ELSE
					TIMECOUNTDJ1 <= '1';
				END IF;
			ELSIF(DD = "00000001")THEN
				IF(DJCOUNT3 <="100010011000")THEN	--2200
					TIMECOUNTDJ1 <= '0';
				ELSE
					TIMECOUNTDJ1 <= '1';
				END IF;
			ELSE
				IF(DJCOUNT1 <="111110100")THEN	--500
					TIMECOUNTDJ1 <= '0';
				ELSE
					TIMECOUNTDJ1 <= '1';
				END IF;
			END IF;
		END IF;
END PROCESS;
------------------------------------------------------------------

当电机停止时三相中只有一相导通
PROCESS(COUNT,TIMECOUNTDJ1,GATE,FORTH)
BEGIN
	IF(TIMECOUNTDJ1'EVENT AND TIMECOUNTDJ1 = '1')THEN	
			IF(GATE = '1')THEN
				IF(FORTH = '1')THEN
					IF(COUNT = "01011")THEN
						COUNT <= "00000";
					ELSE	
						COUNT <= COUNT + 1;
					END IF;
				ELSE
					IF(COUNT = "00000")THEN
						COUNT <= "01011";
					ELSE
						COUNT <= COUNT - 1;
					END IF;	
				END IF;
			ELSE
					CASE COUNT IS
					WHEN "00001" => COUNT <= COUNT - 1; --1
					WHEN "00010" => COUNT <= COUNT - 1; --2
					WHEN "00011" => COUNT <= COUNT + 1; --3
					
					WHEN "00101" => COUNT <= COUNT - 1; --5
					WHEN "00110" => COUNT <= COUNT - 1; --6
					WHEN "00111" => COUNT <= COUNT + 1; --7
					
					WHEN "01001" => COUNT <= COUNT - 1; --9
					WHEN "01010" => COUNT <= COUNT - 1; --10
					WHEN "01011" => COUNT <= "00000";    --11
					WHEN OTHERS =>  COUNT <= COUNT ;
					END CASE; 			
			END IF;
	END IF;	
END PROCESS;

PROCESS(COUNT,TIMECOUNTDJ1,GATE,RESET,FORTH)
	BEGIN
		IF(TIMECOUNTDJ1'EVENT AND TIMECOUNTDJ1 = '1')THEN	
			IF(GATE = '1' AND RESET = '0' )THEN
					CASE COUNT IS
					WHEN "00000" => DJA1 <= '0';DJB1 <= 'Z';DJC1 <= 'Z';  	--0				
					WHEN "00010" => DJA1 <= '0';DJB1 <= '0';DJC1 <= 'Z';    --2
					WHEN "00100" => DJA1 <= 'Z';DJB1 <= '0';DJC1 <= 'Z';  	--4				
					WHEN "00110" => DJA1 <= 'Z';DJB1 <= '0';DJC1 <= '0';    --6
					WHEN "01000" => DJA1 <= 'Z';DJB1 <= 'Z';DJC1 <= '0';    --8 
					WHEN "01010" => DJA1 <= '0';DJB1 <= 'Z';DJC1 <= '0';    --10
					WHEN OTHERS =>  DJB1 <= DJB1;DJA1 <= DJA1;DJC1 <= DJC1;
--					WHEN OTHERS => DJB1 <= 'Z';DJA1 <= 'Z';DJC1 <= 'Z';
					END CASE; 
			ELSIF(RESET = '1')THEN
				DJB1 <= 'Z';
				DJA1 <= '0';
				DJC1 <= 'Z';
			ELSIF(GATE ='0')THEN		
					CASE COUNT IS
					WHEN "00000" => DJA1 <= '0';DJB1 <= 'Z';DJC1 <= 'Z';  					
					WHEN "00010" => DJA1 <= '0';DJB1 <= '0';DJC1 <= 'Z';   
					WHEN "00100" => DJA1 <= 'Z';DJB1 <= '0';DJC1 <= 'Z';  					
					WHEN "00110" => DJA1 <= 'Z';DJB1 <= '0';DJC1 <= '0';    
					WHEN "01000" => DJA1 <= 'Z';DJB1 <= 'Z';DJC1 <= '0';    
					WHEN "01010" => DJA1 <= '0';DJB1 <= 'Z';DJC1 <= '0';   
					WHEN OTHERS =>  DJB1 <= DJB1;DJA1 <= DJA1;DJC1 <= DJC1;
					END CASE; 
				
			END IF;
		END IF;	
END PROCESS;

DJA <= DJA1;
DJB <= DJB1;
DJC <= DJC1;
GATEDJ <= GATEDJ1;
------------------ Encoder -------------------

编码器有AB两个脉冲,A脉冲进单片机中断,B脉冲来表示方向

对B脉冲滤波延时滤波
PROCESS(VIODE,AB)
	BEGIN
		IF(VIODE'EVENT AND VIODE= '1')THEN
			IF(AB(1) = '1')THEN
				JSQ2 <= 0;
				IF(JSQ1 = 10)THEN
					JSQ1 <= JSQ1;
				ELSE
					JSQ1<= JSQ1 +1;
				END IF;
				IF(JSQ1 >3)THEN
					BOUT <= '1';
				ELSE
					BOUT <= '0';
				END IF;
			ELSE
				JSQ1 <= 0;
				IF(JSQ2 = 10)THEN
					JSQ1 <= JSQ1;
				ELSE
					JSQ2<= JSQ2 +1;
				END IF;
				IF(JSQ2 >3)THEN
					BOUT <= '0';
				ELSE
					BOUT <= '1';
				END IF;
			END IF;
		END IF;
END PROCESS;
------------------------------------------------------
对A脉冲用RS锁存器滤波
PROCESS(VIODE,QA2,DA2,AR,AS,AQR,DA4,QA4,AQS)
	BEGIN
		IF(VIODE'EVENT AND VIODE = '1')THEN
			DA1 <= AB(0);
			DA2 <= DA1;
			QA2 <= DA2;
			
			DA3 <= AQR;
			DA4 <= DA3;
			QA4 <= DA4;
		END IF;
		AR <= (NOT DA2) AND (NOT QA2);
		AS <=	DA2 AND QA2;
		AQR <= AR NOR AQS;
		AQS <= AS NOR AQR;
		AOUT <= DA4 AND (NOT QA4) ;	
END PROCESS;
INT0 <= AOUT;
INT1 <= BOUT;
----------------------------------------------------
READY0 <= 'Z';
RD     <= 'Z';					

END deal;




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -