原创 福建师范大学卫星跟踪系统动中通

2006-11-28 13:44 3218 3 3 分类: MCU/ 嵌入式

福建师范大学-卫星跟踪系统动中通



                       卫星跟踪系统动中通<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


                        福建师范大学  魏志伟 林奔程 陈家强


       摘要:在研究卫星通讯地面站的动中通设备时,要求天线系统在车载机上


能很好地跟踪指定的卫星。要求系统的跟踪具有距离、速度、加速度的跟踪能力。


自动控制系统中的自动跟踪系统采用直流电机来作为驱动动力。本系统采用EDA


术在MAXPLUSE II上进行软件设计、编译、仿真和下载。选用FPGA EP1K30TC1443


CPLD EPMP128SLC84-3来作为设计的目标器件。


       关键字:卫星跟踪系统  动中通  CPLD/FPGA  速度控制 速度检测及显示


加速度检测及显示


1、系统概述:


     在研究卫星通讯地面站的动中通设备时,要求天线系统在车载机上能很好地跟踪指定的卫星。要求系统的跟踪具有距离、速度、加速度的跟踪能力。自动控制系统中的自动跟踪系统采用直流电机来作为驱动动力。本系统采用电动车的无刷直流调速电动机来作为驱动动力,它具有驱动动力大易于控制,无电火花干扰等的优点,而且可利用其位置传感器来代替传统自动控制系统中的测速电机的功能,实现数字化控制,克服直流控制工作点易于漂移的缺点。


控制电路采用EDA技术在MAXPLUSE II上进行软件设计、编译、仿真和下载。


选用ALTERA 公司的FPGA(现场可编程门阵列)EP1K30TC1443CPLD复杂可编程逻辑器件)EPMP128SLC84-3来作为设计的目标器件。采用CPLD/FPGA进行设计可缩短开发生产周期,而且现场灵活性好,它不但包括了MCU这一特点,而且可触及硅片电路的物理界限,并兼有串、并行工作方式,高速、高可靠性以及宽口径适用性等诸多方面的特点。不但如此,随着 EDA技术的发展和CPLD/FPGA在深亚微米领域的应用,它们与MCUMPUDSPA/DD/ARAMROM等器件间物理与功能界限已日益模糊,因此我们选用它作为设计的目标器件。


系统框图如下:


 



 


 

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />


2、电机控制系统原理及软硬件设计:


 


  21换向原理及设计


211无刷直流电机的工作原理:


 


 


 


 


 


<?xml:namespace prefix = w ns = "urn:schemas-microsoft-com:office:word" />如图1所示,在永久磁铁的磁场内,通电的线圈将产生旋转力矩,可以看出当线圈在图1上位置时旋转力矩最大,即当线圈的面平行于磁力线时,力臂最大,力矩也最大。而线圈的面垂直于磁力线时,力臂最小力矩也最小。为了获得较均匀的旋转力矩,采用了相互按120°相位差YGB三绕组组成的线圈。同时也埋设了ygb三只相互按120°相位差的位置传感器。这三只位置传感器在磁场中,每只具有+5V、地和输出三个引出端。如图2所示,在旋转中,以垂直中心分界线为界,每个传感器在N极一边时,传感器输出端为高电平,在S极一边时传感器输出端为低电平。此电机结构上与传统电机的定转子相反,中间部分是带位置传感器三绕组线圈是固定的,而永久磁铁外壳是转动的。由于绕组在中间是固定的,电源就可以不用滑环直接与控制器相联,采用电路来切换,以改变三绕组的通电方向,达到三绕组电流换向的目的。从而去掉传统直流电机的换向电刷。解除了直流电机电火花的干扰源,消除了电刷摩擦噪声。




 


 


 


 


 


在图2中将360°分成Ⅰ、Ⅱ、Ⅲ、Ⅳ四个部分,Ⅰ、Ⅲ部分所在的两个60°角度范围为绕组电流关断区,而Ⅱ部分所在的120°角度范围为绕组电流流进区,Ⅳ部分所在的120°角度范围为绕组电流流出区。控制器切换是根据ygb位置传感器给出的位置状态来进行控制的,控制器切换电路使电流要按图2中Ⅰ、Ⅱ、Ⅲ、Ⅳ的要求进行。为了便于理解,中间线圈及传感器部分用箭头标志了运动方向。但事实上,中间部分是固定的,而磁体外壳转动的。磁体外壳进行与中间标志箭头相反方向的相对运动。另外真实电机的外壳是采用多NS磁极组成的。


 


212换向工作原理



 



 


 


 


3的时序图给出了传感器与控制波型的时间关系。位置传感器gby输出按图4的电原理图所示分别接入CONTROL GBY[2..0]口。根据图3的波形图,将每周期分为16的六个位置状态,在第一状态时g为高、b为低、y为高。同理根据图3的波形图,可知其它状态的高低电平。


在第一状态时,从图4可以看出CONTROLG8050口输出低电平,其低电平经R6BG2的发射极,由于BG2基极接+5V电压,BG2be电流经R6到地。在BG2产生放大的集电极电流,该电流经R2形成电压降VGS送给BG6BG6P沟道绝缘栅型场效应开关管。VGS开启BG6。但Y8050B8050分别为高电平,BG1BG3Vbe=0而截止,使P沟道绝缘栅型场效应开关管BG4BG8VGS=0而截止。GIRF630YIRF630输出低电平使N沟道绝缘栅型场效应开关管BG5BG7关断截止,只有BG9BIRF630口输出的定周期可调宽正脉冲的控制而导通。在定宽的开启时间里,驱动电流从+36伏电源,经BG6SD,经G绕组,经B绕组,经BG9DS,流到地。


如图2所示,按其运转方向转动60°后,进入第二位置状态。图中的B绕组从Ⅳ区进入Ⅰ区。Y绕组从Ⅲ区进入Ⅳ区。y传感器越过NS中性线,从高电平变为低电平。同理第二状态时,在定宽的开启时间里,电流从+36伏,经BG6SD,经G绕组,经Y绕组,经BG5DS,流到地。同理经后4个状态控制向前转动。再进行下周期的6状态。


 


 

    


                       4,控制系统结构原理图


 


213 换向控制的VHDL描述:


LIBRARY IEEE;


USE IEEE.STD_LOGIC_1164.ALL;


ENTITY MOTOR IS


   PORT ( CLK : IN STD_LOGIC;


         GBY : IN STD_LOGIC_VECTOR(2 DOWNTO 0);  -- 三个传感器输入信号端口


         TURNING : IN STD_LOGIC;   -- 电机旋转方向转换控制信号输入端口


         GYB8050,GYBIRF630 :OUT STD_LOGIC_VECTOR(2 DOWNTO 0) ) ;


END;


ARCHITECTURE ONE OF MOTOR IS


BEGIN


REG : PROCESS(CLK)  


   BEGIN


   IF (CLK'EVENT AND  CLK='1') THEN         -- 边沿触发


     CASE GBY IS


  WHEN  "101" => IF TURNING='0' THEN GYB8050 <= "011"; GYBIRF630 <= "001";


                          ELSE GYB8050 <= "101"; GYBIRF630 <= "001"; END IF;                                            


  WHEN  "100" => IF TURNING='0' THEN GYB8050 <= "011"; GYBIRF630 <= "010";


                          ELSE GYB8050 <= "101"; GYBIRF630 <= "100"; END IF;


  WHEN  "110" => IF TURNING='0' THEN GYB8050 <= "110"; GYBIRF630 <= "010";


                          ELSE GYB8050 <= "110"; GYBIRF630 <= "100"; END IF;


  WHEN  "010" => IF TURNING='0' THEN GYB8050 <= "110"; GYBIRF630 <= "100";


                          ELSE GYB8050 <= "110"; GYBIRF630 <= "010"; END IF;                                  


  WHEN  "011" => IF TURNING='0' THEN GYB8050 <= "101"; GYBIRF630 <= "100";


                          ELSE GYB8050 <= "011"; GYBIRF630 <= "010"; END IF;


  WHEN  "001" => IF TURNING='0' THEN GYB8050 <= "101"; GYBIRF630 <= "001";


                          ELSE GYB8050 <= "011"; GYBIRF630 <= "001"; END IF;


  WHEN  OTHERS => GYB8050 <= "101"; GYBIRF630 <= "001";-- 非法状态自启动


    END CASE;


 END IF;


END PROCESS REG;


END ARCHITECTURE ONE;


 


LIBRARY IEEE;


USE IEEE.STD_LOGIC_1164.ALL;


ENTITY MOTOR IS


   PORT ( CLK : IN STD_LOGIC;


         GBY : IN STD_LOGIC_VECTOR(2 DOWNTO 0);  -- 三个传感器输入信号端口


         TURNING : IN STD_LOGIC;   -- 电机旋转方向转换控制信号输入端口


         GYB8050,GYBIRF630 :OUT STD_LOGIC_VECTOR(2 DOWNTO 0) ) ;


END;


ARCHITECTURE ONE OF MOTOR IS


BEGIN


REG : PROCESS(CLK)  


   BEGIN


   IF (CLK'EVENT AND  CLK='1') THEN         -- 边沿触发


     CASE GBY IS


  WHEN  "101" => IF TURNING='0' THEN GYB8050 <= "011"; GYBIRF630 <= "001";


                          ELSE GYB8050 <= "101"; GYBIRF630 <= "001"; END IF;                                            


  WHEN  "100" => IF TURNING='0' THEN GYB8050 <= "011"; GYBIRF630 <= "010";


                          ELSE GYB8050 <= "101"; GYBIRF630 <= "100"; END IF;


  WHEN  "110" => IF TURNING='0' THEN GYB8050 <= "110"; GYBIRF630 <= "010";


                          ELSE GYB8050 <= "110"; GYBIRF630 <= "100"; END IF;


  WHEN  "010" => IF TURNING='0' THEN GYB8050 <= "110"; GYBIRF630 <= "100";


                          ELSE GYB8050 <= "110"; GYBIRF630 <= "010"; END IF;                                  


  WHEN  "011" => IF TURNING='0' THEN GYB8050 <= "101"; GYBIRF630 <= "100";


                          ELSE GYB8050 <= "011"; GYBIRF630 <= "010"; END IF;


  WHEN  "001" => IF TURNING='0' THEN GYB8050 <= "101"; GYBIRF630 <= "001";


                          ELSE GYB8050 <= "011"; GYBIRF630 <= "001"; END IF;


  WHEN  OTHERS => GYB8050 <= "101"; GYBIRF630 <= "001";-- 非法状态自启动


  END CASE;


END IF;


END PROCESS REG;


END ARCHITECTURE ONE;


                    


22调速控制原理及设计


      本系统通过输入不同占空比的脉冲控制电机的转速,当占空比大时,平均电流大,


电机速度就快,即电机的转速与脉冲的占空比成正比。


 


221可根据不同的输入产生不同占空比脉冲的实现:


利用MAXPLUS II软件来设计基于FPGA/CPLD的“可根据不同的输入产生不同占空比脉冲”的实现方法。设计原理图如图5



 


 



 


 


                       5  “产生不同占空比脉冲”原理图


 


它由三部分构成:1、状态机STATE  2、状态转换指示器COUNT  3、外部输入计数器PULSEZZZ_CON


1、        状态机STATE:有三个状态分别用来(1ST0:电机启动时进入ST0状态,使count装入由pulse_con送来的外界的控制脉冲占空比的数值,同时在下一个时钟脉冲到来时进入ST1状态;(2 ST1:使EEN0进入输出高电平状态,当FLAG为‘1’时表示继续保持状态‘1’输出高电平;当FLAG为‘0‘时进入状态ST2   3ST2:状态ST2时输出低电平保持一个时钟周期后进入ST0循环执行。


2、        状态转换指示器COUNT:通过接收pulse_con送来的占空比的值来设定高电平维持的时钟周期数,通过Q(flag)来指示状态机state的状态1到状态2的转换,即输出脉冲高电平到低电平的转换。


3、       外部输入计数器PULSEZZZ_CON:通过外部的按键输入控制脉冲的占空比。在ST0时置入状态转换指示器COUNTCOUNT[4..0]


 


222  MAXPLUS II仿真波形如下:                   



 



 


 


CLK:为<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />6M的时钟


START:电机启动时给START 一个高电平。


LT:为加减速切换开关,当LT0时按ADDSB 增加占空比;当LT1时按ADDSB


减小占空比


ADDSB:控制占空比输入 设原来占空比为X 1 按一下则为X+11


DOUT :脉冲输出端口


如图所示:电机启动时,初始化输出11占空比的脉冲,当LT为‘0’时通过按键输入6个脉冲,使输出脉冲为71即加速;当LT为‘1’时通过按键输入5个脉冲使输出脉冲占空比为21即减速。


 


223  各部分VHDL描述如下:


状态机STATE


LIBRARY IEEE;


USE IEEE.STD_LOGIC_1164.ALL;


ENTITY  STATE  IS


  PORT(CLK         :IN STD_LOGIC;


       FLAG        :IN STD_LOGIC;                        --定时指示,1表示定时未到,0表示定进到


       START       :IN STD_LOGIC;                        --启动状态机 电机启动时产生一个脉冲


       EEN         :OUT STD_LOGIC;                       --启动定时信号


       DOUT        :OUT STD_LOGIC);                      --输出脉冲,控制电机的速度。


 ENDENTITYSTATE;


 


ARCHITECTURE  BEHAV  OF  STATE IS


 TYPE STATES IS (ST0,ST1,ST2);


 SIGNAL CURRENT_STATE :STATES; 


 BEGIN                           


 REG: PROCESS(CLK,START)                            --决定转换状态进一步程


         BEGIN


            IF START='1' THEN CURRENT_STATE<=ST0;      --启动/初始化状态机


            ELSIF CLK'EVENT AND CLK='1' THEN


               CASE CURRENT_STATE IS


               WHEN ST0=>  CURRENT_STATE<=ST1;  --ST0状态执行启动计数器准备定时,同时状态转到ST1


               WHEN ST1=> IF FLAG='1' THEN CURRENT_STATE<=ST1;ELSE CURRENT_STATE<=ST2; END IF;


               WHEN ST2=> CURRENT_STATE<=ST0;            


               END CASE;


            END IF;


 END PROCESS REG;


 COM: PROCESS (CLK,CURRENT_STATE)                 --输出控制信号进程


         BEGIN


            CASE CURRENT_STATE IS


            WHEN ST0=> EEN<='1';                         --EEN1时使用


            WHEN ST1=> EEN<='0'; DOUT<='1';


            WHEN ST2=> DOUT<='0';


            END CASE;


 END PROCESS COM;


 END ARCHITECTURE BEHAV;


状态转换指示器:COUNT


LIBRARY IEEE;


USE IEEE.STD_LOGIC_1164.ALL;


USE IEEE.STD_LOGIC_UNSIGNED.ALL;


ENTITY  COUNT  IS


  PORT(CLK         :IN STD_LOGIC;


       COUNT       :IN STD_LOGIC_VECTOR(4 DOWNTO 0);  --接收来自pulse_con的输出的占空比的值


       EN2         :IN STD_LOGIC;


       Q           :OUT STD_LOGIC);                      --输出状态转换指示        


 END ENTITY COUNT;


 


ARCHITECTURE  BEHAV  OF  COUNT IS


 SIGNAL   DIN: STD_LOGIC_VECTOR(4 DOWNTO 0);


 BEGIN


 PROCESS(CLK,EN2)


         BEGIN


            IF EN2='1' THEN DIN<=COUNT;Q<='1';        --当状态机为ST0状态时,使EN21


            ELSIF CLK'EVENT AND CLK='1' THEN


               IF DIN>"00001" THEN   DIN<=DIN-1;      --对输入的计数值减1


               ELSE Q<='0';                            --当减到0时输出Q=0


               END IF;


            END IF;


 END PROCESS;


 END ARCHITECTURE BEHAV;


 


外部输入计数器:PULSE_CON


LIBRARY IEEE;


USE IEEE.STD_LOGIC_1164.ALL;


USE IEEE.STD_LOGIC_UNSIGNED.ALL;


ENTITY  PULSE_CON  IS


  PORT(PRESS      :IN STD_LOGIC; --按键输出,实现对计数的加/减,按一下加/1


       LT          :IN STD_LOGIC;  --/减计数的的切换;为高电平时表示减数


       EN1         :IN STD_LOGIC;  --START输入,启动时装入初值


       LOAD1      :IN STD_LOGIC;  --把计数值输出给count控制信号


       PU_COUNT  :OUT STD_LOGIC_VECTOR(4 DOWNTO 0)); --计数值输出端口


 END ENTITY PULSE_CON;


ARCHITECTURE BEHAV OF PULSE_CON IS


 BEGIN


 PROCESS(PRESS,EN1,LOAD1,LT)


 VARIABLE  DIN: STD_LOGIC_VECTOR(4 DOWNTO 0);


        BEGIN


            IF EN1='1' THEN DIN:="00001";                    --置入初值


            ELSIF PRESS'EVENT AND PRESS='1' THEN   


               IF LT='0' THEN                                --LT为低电平时进行加计数


                   IF DIN<"11111" THEN DIN:=DIN+1;END IF;             


               ELSE  IF DIN>"00000" THEN DIN:=DIN-1;END IF;  --LT为高电平时进行减计数


               END IF;


            END IF;


            IF LOAD1='1' THEN PU_COUNT<=DIN;END IF;


 END PROCESS;


 END ARCHITECTURE BEHAV;


 


23速度检测及显示原理


231


      利用MAXPLUS II软件来设计基于FPGA/CPLD的“速度检测”的实现方法。设计原理图如图6



                 


 


 


 


 


  6:速度及加速度检测原理图


 


利用一个加计器对传感器的输出脉冲G的高电平内对基准时钟进行计数为SP_COUNT,设G的九个周期对应着电动机转一圈,便可算出电动机当前的速度。在设计中我们使用32位计数器COUNT来计数,也可根据速度检测的范围和精度改变计数器COUNT的位数。在G的高电平对其进行计数,当G下降沿时把计数值COUNT 赋给SP_COUNT,同时对内部的计数器COUNT 清零。把SP_COUNT 的数值作为预先设计好的并存入对应速度显示代码的ROM的地址,然后送LCD显示。


 


232  MAXPLUS II仿真波形如下:


           

 


 


 


G:为传感器的输出;它表示电机转动的速度快慢,G的电平保持时间越长,速度越慢,反之则越快。


CLK:为时钟脉冲。


SPEED[31..0]:为G高电平内对基准时钟进行计数的计数值。


如图所示:0000031DH为对第一个高电平的计数值,它在该高电平的下降沿赋给SP_COUNT。同理000005CF为第二个高电平的计数值。


233  速度检测VHDL描述:


LIBRARY IEEE;


USE IEEE.STD_LOGIC_1164.ALL;


USE IEEE.STD_LOGIC_UNSIGNED.ALL;


ENTITY  SPEED IS


     PORT(CLK     : IN STD_LOGIC;                         --基准时钟信号


             G     : IN STD_LOGIC;                         --传感器G的输出信号


        SP_COUNT : OUT STD_LOGIC_VECTOR(31 DOWNTO 0));   --基准时钟计数输出端口


END ENTITY SPEED;


 


ARCHITECTURE BEHAV OF SPEED IS


  SIGNAL COUNT :STD_LOGIC_VECTOR(31 DOWNTO 0);


  SIGNAL CLR   :STD_LOGIC;


  BEGIN


  PROCESS (CLK,G)


  BEGIN


    IF CLR='1' THEN COUNT<=(OTHERS=>'0'); 


    ELSIF(CLK'EVENT AND CLK='1' )THEN


      IF G='1' THEN COUNT<=COUNT+1;


      END IF;


    END IF;


  END PROCESS;


  PROCESS(G,CLK)


  BEGIN


    IF G='0' THEN CLR<='1';


       ELSIF CLK'EVENT AND CLK='1' THEN CLR<='0';


    END IF;


  END PROCESS;


  PROCESS(G)


  BEGIN


    IF G='0' THEN


     SP_COUNT<=COUNT;


    END IF;


  END PROCESS;


  END ARCHITECTURE BEHAV;


 


24加速度检测原理


241


利用MAXPLUS II软件来设计基于alter  cpld的“加速度检测”的实现方法。设计原理图图6



 


 


 


6:速度及加速度检测原理图


 


 


利用一个可预置初值的减计数器实现加速度的检测,在G的下降沿时把对速度检测的计数值SP_COUNT[31..0] 赋给减计数器的预置初值,在下一个G为高电平时对其进行减计数,即两个相邻周期G的高电平的计数个数相减,用ACOUNT[31..0]输出。CO为正负加速度指示,当CO为‘0时,即减计数器的值大于0,表示正加速度;当CO为负时,即减计数器的值小于0,表示负加速度。在G下降沿时把减计数器的值赋给ACOUNT并对其进行算出加速度的值。同样也把A_COUNT作为预先设计好的存入对应加速度值代码的ROM的地址,然后送LCD显示。


242   MAXPLUS II仿真波形如下:


                       

 


 


 


A[31..0]:为加速度计数值的输出


CO:为正负加速度指示


如图所示:FFFFFD4D第二个高电平减第一个高电平的计数值,即为0000031D-000005CF的计数值,这时CO的输出值为0表示负加速度。


 


243   加速度检测VHDL描述


LIBRARY IEEE;


USE IEEE.STD_LOGIC_1164.ALL;


USE IEEE.STD_LOGIC_UNSIGNED.ALL;


ENTITY A_COUNT IS


PORT(     D:IN STD_LOGIC_VECTOR(31 DOWNTO 0);


          G:IN STD_LOGIC;           


        CLK:IN STD_LOGIC;


    ACOUNT :OUT STD_LOGIC_VECTOR(31 DOWNTO 0);


         CO:OUT STD_LOGIC);


END ENTITY A_COUNT;


 


ARCHITECTURE BEHAV OF A_COUNT IS


  SIGNAL COUNT:STD_LOGIC_VECTOR(31 DOWNTO 0);


    BEGIN


    PROCESS(CLK,G)


    BEGIN


    --IF CLR='1' THEN QN<=(OTHERS =>'0');


    IF (CLK'EVENT AND CLK='1') THEN


       IF(G='0') THEN COUNT<=D;


       ELSIF (G='1') THEN


       COUNT<=COUNT-1;


       END IF;


    END IF;


    END PROCESS;


    PROCESS(COUNT,G)


    BEGIN


    IF(COUNT="00000000000000000000000000000000") THEN CO<='1';


    ELSIF G'EVENT AND G='0' THEN CO<='0';


    END IF;


    END PROCESS;


 


    PROCESS(G)


    BEGIN


        IF(G='0') THEN  ACOUNT<=COUNT;END IF;


    END PROCESS;


 END BEHAV;

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
3
关闭 站长推荐上一条 /3 下一条