|
/*************************************************************************
适用于:步进电机细分驱动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=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
//**************************************************************/
/*************************************************************************
支持开源活动(有专利和商业性目的除外)
百度HI群号:1165496 单片机编程技术交流
腾讯QQ群号:60893314 单片机编程技术交流
我们的口号是:三人行,必有我师。希望大家多交流,不保留。
同一个世界,同一个梦,为富民中国。
**************************************************************************/ |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|