免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1610 | 回复: 4
打印 上一主题 下一主题

[复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-30 21:00 |只看该作者 |倒序浏览
20可用积分
我的pci插槽上有一张运动控制卡,用来驱动一个转台.我编程调用这个文件的函数
#define fpga_address     "/usr/rotator/configration_file/fpga_address"
#define fpga_zero_position     "/usr/rotator/configration_file/fpga_zero_position"

#define max_pulse  1073741824 /*max given pulse*/
#define max_position 1048575 /*max given position*/
#define min_velocity 0.0002
#define clock_frequency 48000000.0
#define code_number 131072.0  /*the code number when the motor run one circle*/
#define twopi  360.0

#define read_rate  4.0
#define rotator  80.0
#define basep   8388608.0

#define MAX_AXIS_NUMBER                  2

double value_zero_position[2];
/*---------------------------------------------------*/
struct axis_information{
             unsigned short send_position_address;
            unsigned  short pulse_address;
            unsigned short read_position_address;
           unsigned  short on_address;
            unsigned short sensor_address;
          long positive;
           long negative;
           long on;
           long off;
          long right_sensor;
          long left_sensor;
         
}axis[MAX_AXIS_NUMBER];

struct axis_coefficient{
                     double pulse;
                     double  send_p;
                    double  read_p;
}coefficient;

/*axis_information axis[MAX_AXIS_NUMBER];

axis_coefficient coefficient;  */

/*unsigned short P_Address=49152;*/
unsigned short get_FPGAData(void)
{
   FILE *fp;
    unsigned short P_FPGAData;
    if((fp=fopen(fpga_address,"r"))==NULL)
                {
                printf("No fpga_address file can open");
                }
        fread(&P_FPGAData,sizeof(P_FPGAData),1,fp);
        fclose(fp);
      return P_FPGAData;
}

void get_zero_position(void)
{
   FILE *fp;
   
   
    if((fp=fopen(fpga_zero_position,"r"))==NULL)
                {
                printf("No fpga_zero_position file can open");
                }
        fread(&value_zero_position[0],sizeof(value_zero_position[0]),1,fp);
        fread(&value_zero_position[1],sizeof(value_zero_position[1]),1,fp);
        fclose(fp);
      
}

void init_axis(void)
{
   coefficient.pulse = clock_frequency/2.0*twopi/code_number;
   coefficient.send_p= code_number/twopi;
   coefficient.read_p= read_rate*twopi/code_number/rotator;

            axis[0].send_position_address = 0x1<<2;
            axis[0].pulse_address         = 0x4<<2 ;
            axis[0].read_position_address =0x8<<2;
            axis[0].on_address           = 0x10<<2;
            axis[0].sensor_address       = 0x14<<2  ;
            axis[0].positive              =  0x6;
            axis[0].negative             = 0x4;
            axis[0].on                   = 0x4;
            axis[0].off                  = 0x3;
            axis[0].right_sensor          = 0x1;
            axis[0].left_sensor         = 0x2;

            axis[1].send_position_address = 0x21<<2;
            axis[1].pulse_address         = 0x24<<2 ;
            axis[1].read_position_address =0x28<<2;
            axis[1].on_address           = 0x30<<2;
            axis[1].sensor_address       = 0x14<<2  ;
            axis[1].positive              =  0x6;
            axis[1].negative             = 0x4;
            axis[1].on                   = 0x4;
            axis[1].off                  = 0x3;
            axis[1].right_sensor          = 0x4;
            axis[1].left_sensor         = 0x8;


            get_zero_position();
}

/*---------------------------------------------------*/
void delay(double time)
{
    struct timeval tv;
    double inteval;
    double start;
    double then;


  gettimeofday(&tv,NULL);
  
  start=(double)tv.tv_sec+(double)tv.tv_usec*0.000001;

  while(1)
{
   gettimeofday(&tv,NULL);
   then=(double)tv.tv_sec+(double)tv.tv_usec*0.000001;
   inteval=then-start;
   if(inteval>=time)
     return;
}
}


long get_sensor(int number,unsigned short P_FPGAData)
{
       inl( P_FPGAData+axis[number].sensor_address);
        outl(3,P_FPGAData+axis[number].sensor_address);
  return inl(P_FPGAData+axis[number].sensor_address);
}
void axis_on(int number,unsigned short P_FPGAData)
{   
       iopl(3);
      outl(axis[number].on , P_FPGAData+axis[number].on_address);
        outl(axis[number].on , P_FPGAData+axis[number].on_address);
        delay(0.1);
}


void axis_off(int number,unsigned short P_FPGAData)
{   

       outl(axis[number].off , P_FPGAData+axis[number].on_address);
        outl(axis[number].off , P_FPGAData+axis[number].on_address);


}


double read_position(int number, unsigned short P_FPGAData)
{
      long read_position0;
       double read_position1;
        inl(P_FPGAData+axis[number].read_position_address);
       outl(1,P_FPGAData+axis[number].read_position_address);
       read_position0=inl(P_FPGAData+axis[number].read_position_address);
       read_position1=(basep-(double)read_position0)*coefficient.read_p;
     return read_position1-value_zero_position[number];
}
结果一运行程序 , 系统就重启.把转台的电源关了也一样

论坛徽章:
0
2 [报告]
发表于 2009-07-30 21:01 |只看该作者
开始使用是正常的,后来就出现这种情况了

论坛徽章:
0
3 [报告]
发表于 2009-07-30 21:23 |只看该作者
这些函数调用都不会重启,但驱动不了转台,也读不到正确的位置信息

论坛徽章:
0
4 [报告]
发表于 2009-07-31 20:29 |只看该作者
那两个文件是不是损坏了?内容已经不正确了

论坛徽章:
0
5 [报告]
发表于 2009-08-02 09:54 |只看该作者
问题已解决,是底层代码的问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP