/************************************************************************* 适用于:步进电机细分驱动SIN值计算 MOTOR_SIN 7226+6219 39610+3771 等 设计制作:DJ.y 编译环境:C-FREE 3.5 *************************************************************************/
#include <stdio.h>
int count_n=0,count_ph=0; //**************R的N次方*************************************************************** float RN(float r,long n) //去掉R的0和1次方 需要见另一个完整功能函数 { long i; float j=r; for(i=1;i<n;i++) j=j*r; return j; } //***********N的阶乘****************************************************************** long fact(long n) //浮点运算见另外一个函数 { long i,j=1; for(i=1;i<=n;i++) { j=j*i; } return j; } /***********************SIN()*******************************************************/ float sin(float x) //设x== 0-180 {float y; //y为弧度 增大为10000倍 double y ;//双精度64位 单精度float 32位 float goal,PI=3.1415926; y = x*PI/180; //printf("%f",y); printf("\n"); ?test OK //6=3的阶乘 120=5的阶乘 750=7的阶乘 ---根据SINX 幂级数公式得 取前3级 //goal =(y-y*y*y/6+y*y*y*y*y/120);//-y*y*y*y*y*y*y/720+y*y*y*y*y*y*y*y*y/5040 goal =y-RN(y,3)/fact(3)+RN(y,5)/fact(5)-RN(y,7)/fact(7)+RN(y,9)/fact(9)-RN(y,11)/fact(11); return goal; } //**************步进电机A相电流取样值****************************** int data_vref1(int step,int max_value_current) { //char step=8; //默认为8个细分每步 int value_current; float angle; //每个细分步的角度 int DATA_PH1[step*4],DATA_PH2[step*4]; int DATA_VREF1[step*4],DATA_VREF2[step*4]; //最大128细分*4拍==512 int i_bat_1,i_bat_2,i_bat_3,i_bat_4,j=0; FILE *fp; int *ptr1,*ptr2,*ptr3,*ptr4;
ptr1 =& DATA_VREF1[step*0]; //指针地址 ptr2 =& DATA_VREF1[step*1]; //指针地址 ptr3 =& DATA_VREF1[step*2]; //指针地址 ptr4 =& DATA_VREF1[step*3]; //指针地址
angle=90.000000/step; //每步角度计算 for (i_bat_1=0;i_bat_1<step;i_bat_1++) { //value_current=max_value_current*sin(angle*i_bat_1)+128; //适用于NJU39610 max_value_current=120 value_current=max_value_current*sin(angle*i_bat_1); //适用于TCL7226 max_value_current=256
DATA_PH1[i_bat_1]=1; DATA_PH1[step+i_bat_1]=1; DATA_PH1[step*2+i_bat_1]=0;DATA_PH1[step*3+i_bat_1]=0; DATA_PH2[i_bat_1]=0; DATA_PH2[step+i_bat_1]=1; DATA_PH2[step*2+i_bat_1]=1;DATA_PH2[step*3+i_bat_1]=0; DATA_VREF1[i_bat_1] =value_current; DATA_VREF1[step*2-1-i_bat_1]=value_current; DATA_VREF1[step*2+i_bat_1] =value_current; DATA_VREF1[step*4-1-i_bat_1]=value_current; DATA_VREF2[step-1-i_bat_1] =value_current; DATA_VREF2[step+i_bat_1] =value_current; DATA_VREF2[step*3+i_bat_1] =value_current; DATA_VREF2[step*3-1-i_bat_1]=value_current; *ptr1 = value_current; //----------------------------------------------------- ptr1++; } //*******************TO TXT********************************************** for (i_bat_2=0;i_bat_2<step*4;i_bat_2++) { //------------to txt------------------------------------ // fp=fopen("C:\\data.txt","a"); //程序指针指向文件地址 w表示清0或新建 fprintf(fp,"%d,",DATA_VREF1[i_bat_2]); if(count_n>=20-1){ count_n=0; fprintf(fp,"\n");} else count_n++; //回车换行
} fprintf(fp,"\n"); for (i_bat_2=0;i_bat_2<step*4;i_bat_2++) { //------------to txt------------------------------------ // fp=fopen("C:\\data.txt","a"); //程序指针指向文件地址 w表示清0或新建 fprintf(fp,"%d,",DATA_VREF2[i_bat_2]); if(count_n>=20-1){ count_n=0; fprintf(fp,"\n");} else count_n++; //回车换行
} fprintf(fp,"\n");
}
//****************************************************************************** int main() { FILE *fp; //n! N的阶乘 int i,j=1;
int step,max_value_current; //int data[n] ; //ptr =& data[0]; //-------------输入细分步数---------------------------------------------- printf("INT STEP为整型数据0-65536,细分电流最大值为M,步进电机细分微步数N."); printf("\n"); printf("生成文件目录==>C:\\data.txt (0<M<255)(0<N<255)请输入M的值和N的值:(M,N)"); printf("\n"); printf("注意:先输入M的值,再回车后输入N的值,不能输入带小数的值"); printf("\n"); printf("M: N:"); scanf("%d",&max_value_current); //输入函数 scanf("%d",&step);
fp=fopen("C:\\data.txt","a"); //程序指针指向文件地址 w表示清0或新建 fprintf(fp,"步进电机微步细分最大电流值为:%d。 ",max_value_current); fprintf(fp,"步进电机%d微步细分电流值为:",step); fprintf(fp,"\n"); data_vref1(step,max_value_current); fclose(fp); /* for(i=1;i<n;i++) { j=j*i; data[i]=j; //将值存入数据表中
printf("%d",j); printf("\n"); } */ }
/*********************TEST************************************* float x=9,y,goal; y = x*3.1416/180; goal =(y-y*y*y/6+y*y*y*y*y/120); printf("\n"); printf("%f",goal); //ok //**************************************************************/ /************************************************************************* |