卫星跟踪系统动中通<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
福建师范大学 魏志伟 林奔程 陈家强
摘要:在研究卫星通讯地面站的动中通设备时,要求天线系统在车载机上
能很好地跟踪指定的卫星。要求系统的跟踪具有距离、速度、加速度的跟踪能力。
自动控制系统中的自动跟踪系统采用直流电机来作为驱动动力。本系统采用EDA技
术在MAXPLUSE II上进行软件设计、编译、仿真和下载。选用FPGA EP1K30TC144—3
或CPLD EPMP128SLC84-3来作为设计的目标器件。
关键字:卫星跟踪系统 动中通 CPLD/FPGA 速度控制 速度检测及显示
加速度检测及显示
1、系统概述:
在研究卫星通讯地面站的动中通设备时,要求天线系统在车载机上能很好地跟踪指定的卫星。要求系统的跟踪具有距离、速度、加速度的跟踪能力。自动控制系统中的自动跟踪系统采用直流电机来作为驱动动力。本系统采用电动车的无刷直流调速电动机来作为驱动动力,它具有驱动动力大易于控制,无电火花干扰等的优点,而且可利用其位置传感器来代替传统自动控制系统中的测速电机的功能,实现数字化控制,克服直流控制工作点易于漂移的缺点。
控制电路采用EDA技术在MAXPLUSE II上进行软件设计、编译、仿真和下载。
选用ALTERA 公司的FPGA(现场可编程门阵列)EP1K30TC144—3或CPLD(复杂可编程逻辑器件)EPMP128SLC84-3来作为设计的目标器件。采用CPLD/FPGA进行设计可缩短开发生产周期,而且现场灵活性好,它不但包括了MCU这一特点,而且可触及硅片电路的物理界限,并兼有串、并行工作方式,高速、高可靠性以及宽口径适用性等诸多方面的特点。不但如此,随着 EDA技术的发展和CPLD/FPGA在深亚微米领域的应用,它们与MCU、MPU、DSP、A/D、D/A、RAM及ROM等器件间物理与功能界限已日益模糊,因此我们选用它作为设计的目标器件。
系统框图如下:
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
2、电机控制系统原理及软硬件设计:
2、1换向原理及设计
2.1、1无刷直流电机的工作原理:
<?xml:namespace prefix = w ns = "urn:schemas-microsoft-com:office:word" />如图1所示,在永久磁铁的磁场内,通电的线圈将产生旋转力矩,可以看出当线圈在图1上位置时旋转力矩最大,即当线圈的面平行于磁力线时,力臂最大,力矩也最大。而线圈的面垂直于磁力线时,力臂最小力矩也最小。为了获得较均匀的旋转力矩,采用了相互按120°相位差Y、G、B三绕组组成的线圈。同时也埋设了y、g、b三只相互按120°相位差的位置传感器。这三只位置传感器在磁场中,每只具有+5V、地和输出三个引出端。如图2所示,在旋转中,以垂直中心分界线为界,每个传感器在N极一边时,传感器输出端为高电平,在S极一边时传感器输出端为低电平。此电机结构上与传统电机的定转子相反,中间部分是带位置传感器三绕组线圈是固定的,而永久磁铁外壳是转动的。由于绕组在中间是固定的,电源就可以不用滑环直接与控制器相联,采用电路来切换,以改变三绕组的通电方向,达到三绕组电流换向的目的。从而去掉传统直流电机的换向电刷。解除了直流电机电火花的干扰源,消除了电刷摩擦噪声。
在图2中将360°分成Ⅰ、Ⅱ、Ⅲ、Ⅳ四个部分,Ⅰ、Ⅲ部分所在的两个60°角度范围为绕组电流关断区,而Ⅱ部分所在的120°角度范围为绕组电流流进区,Ⅳ部分所在的120°角度范围为绕组电流流出区。控制器切换是根据y、g、b位置传感器给出的位置状态来进行控制的,控制器切换电路使电流要按图2中Ⅰ、Ⅱ、Ⅲ、Ⅳ的要求进行。为了便于理解,中间线圈及传感器部分用箭头标志了运动方向。但事实上,中间部分是固定的,而磁体外壳转动的。磁体外壳进行与中间标志箭头相反方向的相对运动。另外真实电机的外壳是采用多NS磁极组成的。
2.1、2换向工作原理
图3的时序图给出了传感器与控制波型的时间关系。位置传感器g、b、y输出按图4的电原理图所示分别接入CONTROL的 GBY[2..0]口。根据图3的波形图,将每周期分为1至6的六个位置状态,在第一状态时g为高、b为低、y为高。同理根据图3的波形图,可知其它状态的高低电平。
在第一状态时,从图4可以看出CONTROL的G8050口输出低电平,其低电平经R6给BG2的发射极,由于BG2基极接+5V电压,BG2的be电流经R6到地。在BG2产生放大的集电极电流,该电流经R2形成电压降VGS送给BG6,BG6是P沟道绝缘栅型场效应开关管。VGS开启BG6。但Y8050、B8050分别为高电平,BG1、BG3因Vbe=0而截止,使P沟道绝缘栅型场效应开关管BG4、BG8的VGS=0而截止。GIRF630、YIRF630输出低电平使N沟道绝缘栅型场效应开关管BG5、BG7关断截止,只有BG9被BIRF630口输出的定周期可调宽正脉冲的控制而导通。在定宽的开启时间里,驱动电流从+36伏电源,经BG6的SD,经G绕组,经B绕组,经BG9的DS,流到地。
如图2所示,按其运转方向转动60°后,进入第二位置状态。图中的B绕组从Ⅳ区进入Ⅰ区。Y绕组从Ⅲ区进入Ⅳ区。y传感器越过NS中性线,从高电平变为低电平。同理第二状态时,在定宽的开启时间里,电流从+36伏,经BG6的SD,经G绕组,经Y绕组,经BG5的DS,流到地。同理经后4个状态控制向前转动。再进行下周期的6状态。
图4,控制系统结构原理图
2.1.3 换向控制的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;
2.2调速控制原理及设计
本系统通过输入不同占空比的脉冲控制电机的转速,当占空比大时,平均电流大,
电机速度就快,即电机的转速与脉冲的占空比成正比。
2.2.1可根据不同的输入产生不同占空比脉冲的实现:
利用MAXPLUS II软件来设计基于FPGA/CPLD的“可根据不同的输入产生不同占空比脉冲”的实现方法。设计原理图如图5:
图5 “产生不同占空比脉冲”原理图
它由三部分构成:1、状态机STATE 2、状态转换指示器COUNT 3、外部输入计数器PULSEZZZ_CON。
1、 状态机STATE:有三个状态分别用来(1)ST0:电机启动时进入ST0状态,使count装入由pulse_con送来的外界的控制脉冲占空比的数值,同时在下一个时钟脉冲到来时进入ST1状态;(2) ST1:使EEN为0进入输出高电平状态,当FLAG为‘1’时表示继续保持状态‘1’输出高电平;当FLAG为‘0‘时进入状态ST2 (3)ST2:状态ST2时输出低电平保持一个时钟周期后进入ST0循环执行。
2、 状态转换指示器COUNT:通过接收pulse_con送来的占空比的值来设定高电平维持的时钟周期数,通过Q(flag)来指示状态机state的状态1到状态2的转换,即输出脉冲高电平到低电平的转换。
3、 外部输入计数器PULSEZZZ_CON:通过外部的按键输入控制脉冲的占空比。在ST0时置入状态转换指示器COUNT的COUNT[4..0]。
2.2.2 MAXPLUS II仿真波形如下:
CLK:为<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />6M的时钟
START:电机启动时给START 一个高电平。
LT:为加减速切换开关,当LT为0时按ADDSB 增加占空比;当LT为1时按ADDSB
减小占空比
ADDSB:控制占空比输入 设原来占空比为X :1 按一下则为X+1:1
DOUT :脉冲输出端口
如图所示:电机启动时,初始化输出1:1占空比的脉冲,当LT为‘0’时通过按键输入6个脉冲,使输出脉冲为7:1即加速;当LT为‘1’时通过按键输入5个脉冲使输出脉冲占空比为2:1即减速。
2.2.3 各部分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'; --当EEN为1时使用
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状态时,使EN2为1
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;
2.3速度检测及显示原理
2.3.1
利用MAXPLUS II软件来设计基于FPGA/CPLD的“速度检测”的实现方法。设计原理图如图6:
图6:速度及加速度检测原理图
利用一个加计器对传感器的输出脉冲G的高电平内对基准时钟进行计数为SP_COUNT,设G的九个周期对应着电动机转一圈,便可算出电动机当前的速度。在设计中我们使用32位计数器COUNT来计数,也可根据速度检测的范围和精度改变计数器COUNT的位数。在G的高电平对其进行计数,当G下降沿时把计数值COUNT 赋给SP_COUNT,同时对内部的计数器COUNT 清零。把SP_COUNT 的数值作为预先设计好的并存入对应速度显示代码的ROM的地址,然后送LCD显示。
2.3.2 MAXPLUS II仿真波形如下:
G:为传感器的输出;它表示电机转动的速度快慢,G的电平保持时间越长,速度越慢,反之则越快。
CLK:为时钟脉冲。
SPEED[31..0]:为G高电平内对基准时钟进行计数的计数值。
如图所示:0000031DH为对第一个高电平的计数值,它在该高电平的下降沿赋给SP_COUNT。同理000005CF为第二个高电平的计数值。
2.3.3 速度检测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;
2.4加速度检测原理
2.4.1
利用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显示。
2.4.2 MAXPLUS II仿真波形如下:
A[31..0]:为加速度计数值的输出
CO:为正负加速度指示
如图所示:FFFFFD4D第二个高电平减第一个高电平的计数值,即为0000031D-000005CF的计数值,这时CO的输出值为0表示负加速度。
2.4.3 加速度检测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;
文章评论(0条评论)
登录后参与讨论