----------应用于MAX197数据采样与BDCM<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
A部分:控制命令系统与MAX197的接口
(一)具体要求:
1).max197能工作在默认状态下
2).要求电压幅度和通道可调
3).要求直接通过控制面板调节电压输入幅度和完成通道选择
4).在原版本的MAX197数据采样状态机上调整SLWR,使其能够在与有效采样数据同步;即在原版本的基础上剔除FF无效状态,要求数据只包含高字节,低字节和状态命令信息
(二)实现方法
通过改变max197内部寄存器control_byte[7:0]来实现电压幅度和通道的调节,68013的PE[5:0](电压幅度)PE[7:5](通道选通)作为控制信号,CPLD则起译码作用
(一)CPLD部分
CTROUT <= "010" & RANIN & PE7_5;
PE[7:5] 通道选通信号
RANGE[1:0] 由PE[5:0]编码产生的Y[2]和Y[3]控制,作为电压幅度输入范围调节信号
Y[1] 由PE[5:0]编码产生,作为通道选择以及电压幅度调节输入使能,即Y[1]=0 时,电压幅度和通道可调;=0时,若Y[1]=0则,max197工作在默认模式下;若Y[0]=1则不工作
Y[0] 直接控制max197,=0则MAX197工作;=1则停止
PE[5:0]与MAX197对应的控制字Y[3:0]
WHEN "00000" "1110" 默认模式,控制字为0x40
WHEN "00001" "0000" 0 TO 5V
WHEN "00010" "0100" 0 TO 10V
WHEN "00011" "1000" -5V TO +5V
WHEN "00100" "1100" -10V TO +10V
具体CPLD部分配置框图与部分代码:
图1. Max197采样模块
总框图包含与控制系统的接口(SEL)和采样状态机(MAX197TEST)与双向口数据传输(BIRDIO)三个模块,
SEL:连接控制字节COMMANDBYTE模块和MAX197TEST模块
PE[7:5] 通道选通信号
RANGE[1:0] 由PE[5:0]编码产生的Y[2]和Y[3]控制,作为电压幅度输入范围调节信号
OE 使能信号,即Y[1]
MAX197采样时序图:
根据采样时序可以分析出,SLWR上升沿时钟应该在st1~st2;st4~st5;st6~st7时出现,考虑到SLWR必须与双向口模块同步问题(数据在双向口模块里有一个缓冲过程),这里取后一个状态SLWR为1,即st2,st5,st7出现上升沿。
MAX197采样状态机MAX197TEST:核心部分代码及分析
comb:process(state) --规定各状态转换方式
begin
case state is
when st0=>cs<='1';wr <= '1';rd <= '1';hben <= '0';slwr <= '0';
when st1=>cs<='0';wr <= '0';rd <= '1';hben <= '0';slwr <= '0';
when st2=>cs<='1';wr <= '1';rd <= '1';hben <= '0';slwr <= '1';
when st3=>cs<='1';wr <= '1';rd <= '1';hben <= '0';slwr <= '0';
when st4=>cs<='0';wr <= '1';rd<= '0';hben <= '0';slwr <= '0';
when st5=>cs<='0';wr <= '1';rd<= '0';hben <= '0';slwr <= '1';
when st6=>cs<='0';wr <= '1';rd<= '0';hben <= '1'; slwr <= '0';
when st7=>cs<='1';wr <= '1';rd<= '1';hben <= '0'; slwr <= '1';
when others => cs<='0';wr <= '1';rd <= '1';hben <= '1';slwr <= '0';
end case;
end process comb;
comc:process(clk,pd0,int) --状态转移条件
begin
if(pd0='0') then state<=st0;
elsif(clk'event and clk = '1') then
case state is
when st0=>state <= st1;
when st1=>st1cnt<= st1cnt+1;
if(st1cnt=2) then st1cnt<=0;state <= st2;
else state <= st1;end if;
when st2=>state <= st3;
if( int = '0') then state <= st3;
else state <= st2;end if;
when st3=>state <= st4;
when st4=>state <= st5;
if( int = '1') then state <= st5;
else state <= st4;end if;
when st5=>state <= st6;
when st6=>st6cnt<= st6cnt+1;
if(st6cnt=3) then st6cnt<=0;state <= st7;
else state <= st6;end if;
when st7=>state <= st0;
end case;
end if;
end process comc;
图二.max197与控制字节的接口配置图
SEL_WITH_PE为PE[5:0]编码部分,编出来的信号直接控制器件单元
可以看出Y[0],Y[1],Y[3]和Y[4]就是由它编出来直接控制MAX197模块的
(二)68013部分
68013部分核心代码如下:
#define VX_11 0x11 //MAX197工作在默认模式下
#define VX_12 0x12 //调节电压幅度和选择通道
switch( SETUPDAT[ 1 ] )
{
case VX_11:
{
IOE = 0x00; //默认模式下的max197数据采样
SYNCDELAY;
EP0BCH = 0;
EP0BCL = 1; // Arm endpoint with # bytes to transfer
EP0CS |= bmHSNAK; // Acknowledge handshake phase of device request
*EP0BUF = VX_11;
break;
}
case VX_12:
{ //
IOE = 0x00; //默认模式下的max197数据采样
SYNCDELAY;
#pragma asm
MOV DPTR,#0E6BAH
MOVX A,@DPTR
MOV IOE,A
NOP
#pragma endasm
EP0BCH = 0;
EP0BCL = 1; // Arm endpoint with # bytes to transfer
EP0CS |= bmHSNAK; // Acknowledge handshake phase of device request
*EP0BUF = VX_12;
break;
}
如上我们可以看出,VX_11命令下,MAX197工作在默认模式下,通过观察传输进来的数据,可以看出其内部寄存器为0x85;VX_12命令下,我们通过SETUPDAT[2]来调节电压幅度和选择通道。
(三).实验结果
(IOE = SETUPDAT[2])
此时,通过公式CTROUT <= "010" & RANIN & PE7_5,得出CTROUT=5F,观察数据
可以看出与设想结果完全相同
而且通过调节控制面板里的SETUPDAT[2]确实可以达到目的,以下是一些数据,由于时间原因,SETUPDAT[2]未被截图:
通过测试slwr写频率,速率大概在200K左右,也就是说每秒钟采样200K个点,然后每个点由三个字节来表示(高,低,状态字节),大概数据流速度为600K/S,虽讲速度较低,但是能够满足传感器数据要求;同时有了此次状态机实验经验,以后可以通过状态机来实现更高速的A/D数据采集。
B部分:BDCM部分与控制系统接口
(一)BDCM部分
图三.BDCM直流电机模块
如图:
DECD模块:产生比较数据的上限,此上限数据由PE[7:5]输入,EN是使能信号;
CNT5模块:计数模块,从000~111;
EITHTDEV模块:时钟分频模块,输出时钟为CLK的128分频;
CMP模块:比较计数模块与上限数据,小于则Q为0,大于Q为1;
DRCTR模块:方向控制机,由ZFIN[2:0]控制,Z/F中的哪一个与QIN联通
“110” Z=QIN;F=0; //正向
"101" Z<=0;F<=QIN; //反向
"011" Z<=0;F<=0; //STOP
OTHERS Z<=0;F<=0; //STOP
(二)BDCM与COMMANDBYTE接口配置
1.CPLD部分:
由BDCM可以得出,通过控制EN,ZFIN[2:0]和更改PE[7:5]即可控制电机,因此接口部分也围绕着这三个部分做工作:
EN:由Y[5]控制
ZFIN[2:0]:由Y[8:6]控制
SEL_WITH_PE部分Y[8:5]编码设置:
WHEN "00101"=>Y<="11111111111111111111111111011111";--速度调节Y[5]
WHEN "00110"=>Y<="11111111111111111111111110011111";--Y[6],Y[7],Y[8]用于调节电机转动方向Y[6]=0 正向
WHEN "00111"=>Y<="11111111111111111111111101011111";--反向
WHEN "01000"=>Y<="11111111111111111111111011111111";--停止
--THE ABOVE ARE FOR BDCM MODEL
另外PE[7:5]直接参与电机速度控制
2.68013部分:
68013部分主要围绕PE[7:0]输出端口而展开,通过以上的CPLD部分编码来相应设置PE[7:0]是这部分工作的核心,主要代码如下:
#define VX_42 0x42 //use as motor test runming
#define VX_43 0x43 //use as motor test runming
case VX_42: //MOTOR RUN WITH SETIPDAT[2] CONTROLING
{
IOE = 0x06; //默认模式
SYNCDELAY;
#pragma asm
MOV DPTR,#0E6BAH
MOVX A,@DPTR
MOV IOE,A
NOP
#pragma endasm
EP0BCH = 0;
EP0BCL = 1; // Arm endpoint with # bytes to transfer
EP0CS |= bmHSNAK; // Acknowledge handshake phase of device request
*EP0BUF = VX_42;
break;
}
case VX_43:
{ //
IOE = 0x08; //MOTOR STOP
SYNCDELAY;
EP0BCH = 0;
EP0BCL = 1; // Arm endpoint with # bytes to transfer
EP0CS |= bmHSNAK; // Acknowledge handshake phase of device request
*EP0BUF = VX_43;
break;
}
在VX_42命令下,电机速度和转向可直接通过控制面板的SETUPDAT[2]调节,在此命令下,SETUPDAT只允许输入 XXX00110 //正向转动,速度可调
XXX00111 //反向转动,速度可调
其他 //电机停止转动
在VX_43命令下,电机停止转动;
通过实验可以得出此方案完全可行。
文章评论(0条评论)
登录后参与讨论