原创 模块综合中(与CPLD部分相连的器件调试)

2009-4-8 14:55 3096 10 8 分类: FPGA/CPLD

           ----------应用于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命令下,电机停止转动;


通过实验可以得出此方案完全可行。  

PARTNER CONTENT

文章评论0条评论)

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