论坛徽章: 0
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];
}
结果一运行程序 , 系统就重启.把转台的电源关了也一样
我来回答