[应用相关] 步进电机细分用的正弦表和余弦表怎么得来的呢?

[复制链接]
1426|15
 楼主| heweibig 发表于 2020-8-15 11:22 | 显示全部楼层 |阅读模式
步进电机细分用的正弦表和余弦表怎么得来的呢?
jlyuan 发表于 2020-8-15 11:26 | 显示全部楼层
比较简单的办法, 使用软件生产(比如 EXCEL)后, 直接放在 FLASH 中.
 楼主| heweibig 发表于 2020-8-15 11:29 | 显示全部楼层
其实我想知道具体的一些参数是怎么得来的
dengdc 发表于 2020-8-15 11:35 | 显示全部楼层
什么意思?不是很明白你说的什么,能再解释一下吗
 楼主| heweibig 发表于 2020-8-15 11:39 | 显示全部楼层

比如下面程序里的细分参数的最大值 2048。最近在看步进电机的细分控制,我想不明白怎么能做到在很大的速度范围内使用这个细分表。细分表调节的是CCRx,而步进电机速度变化靠的是调节ARR,ARR变化那么大,CCRx还是按照这个表,这样可行吗?

//两相细分,两个波形相位相差90度
//波形周期:4
//细分参数最大值:2048
//倍数:1.00
//细分数:64
//////////////////////////正弦表///////////////////////
const unsigned short int SubSinTable[]=
{
0,50,100,150,200,250,300,350,399,448,497,546,594,642,689,737,783,829,875,920,
965,1009,1052,1095,1137,1179,1219,1259,1299,1337,1375,1412,1448,1483,1517,1550,1583,1614,1644,1674,
1702,1730,1756,1781,1806,1829,1851,1872,1892,1910,1928,1944,1959,1973,1986,1998,2008,2017,2025,2032,
2038,2042,2045,2047,/*64-->*/2047,2045,2042,2038,2032,2025,2017,2008,1998,1986,1973,1959,1944,1928,1910,1892,
1872,1851,1829,1806,1781,1756,1730,1702,1674,1644,1614,1583,1550,1517,1483,1448,1412,1375,1337,1299,
1259,1219,1179,1137,1095,1052,1009,965,920,875,829,783,737,689,642,594,546,497,448,399,
350,300,250,200,150,100,50,0,/*128-->*/0,50,100,150,200,250,300,350,399,448,497,546,
594,642,689,737,783,829,875,920,965,1009,1052,1095,1137,1179,1219,1259,1299,1337,1375,1412,
1448,1483,1517,1550,1583,1614,1644,1674,1702,1730,1756,1781,1806,1829,1851,1872,1892,1910,1928,1944,
1959,1973,1986,1998,2008,2017,2025,2032,2038,2042,2045,2047,/*192-->*/2047,2045,2042,2038,2032,2025,2017,2008,
1998,1986,1973,1959,1944,1928,1910,1892,1872,1851,1829,1806,1781,1756,1730,1702,1674,1644,1614,1583,
1550,1517,1483,1448,1412,1375,1337,1299,1259,1219,1179,1137,1095,1052,1009,965,920,875,829,783,
737,689,642,594,546,497,448,399,350,300,250,200,150,100,50,0,/*256-->*/
};
lizye 发表于 2020-8-15 11:43 | 显示全部楼层
用C语言写个小软件自动生成也是可以的。
lizye 发表于 2020-8-15 11:46 | 显示全部楼层
不会的, 应该是 ARR * 查表的数据/2048 为 CCRx
jiaxw 发表于 2020-8-15 11:52 | 显示全部楼层
不过事实上, 这种电压方式的细分控制, 效果并不好的
 楼主| heweibig 发表于 2020-8-15 11:55 | 显示全部楼层
推荐一种细分方式吧,我想用DRV8841或者L6219来做
huangchui 发表于 2020-8-15 11:58 | 显示全部楼层
是不行的;ARR的调节直接影响CCRX;每个细分度都是一个表;要有个逻辑把这些串在一起
zhenykun 发表于 2020-8-15 12:01 | 显示全部楼层
根据实际情况,用查表法。也可以实际计算这些值,不过数据小的话,还是查表法好用
jlyuan 发表于 2020-8-15 12:05 | 显示全部楼层
电压细分控制
wangzsa 发表于 2020-8-15 12:12 | 显示全部楼层
生成之后用查表的方式
chuxh 发表于 2020-8-15 12:16 | 显示全部楼层
算好之后自己做表查询
 楼主| heweibig 发表于 2020-8-15 12:20 | 显示全部楼层
唉,还是没有什么结果,算了,多谢大家啦
腾腾 发表于 2020-9-14 11:47 | 显示全部楼层
/***************生成DA转换产生正弦波的数据*******************/
#include<stdio.h>
#include<math.h>
#include<string.h>

unsigned int data_num;                                /*取点数*/
char filename[]="sinedat";                        /*文件名*/
char str[10];                                                /*取点数转变为字符串*/
char txt[]=".txt";                                        /* 文件后缀名*/

unsigned char error=0;

/*void numtochar(unsigned int);*/
/*******数字变为字符串************/
void numtochar(unsigned int a)
{
        unsigned char ge,shi,bai,qian,wan;
        ge=a%10;
        a/=10;
        shi=a%10;
        a/=10;
        bai=a%10;
        a/=10;
        qian=a%10;
        a/=10;
        wan=a%10;
       
        if(wan!=0)                                                /*万位不为0*/
                {
                        str[0]=wan+48;
                        str[1]=qian+48;
                        str[2]=bai+48;
                        str[3]=shi+48;
                        str[4]=ge+48;                                       
                }else if(qian!=0)                        /*千位为0*/
                        {
                                str[0]=qian+48;
                                str[1]=bai+48;
                                str[2]=shi+48;
                                str[3]=ge+48;                                
                        }else if(bai!=0)
                                {
                                        str[0]=bai+48;
                                        str[1]=shi+48;
                                        str[2]=ge+48;                                                 
                                }else if(shi!=0)
                                        {
                                                str[0]=shi+48;
                                                str[1]=ge+48;                                                       
                                        }else if(ge!=0)
                                                {
                                                        str[0]=ge+48;                                                                        
                                                }       
}       


main()
{
int i;
int a;
FILE *fp;
putdata:
        /*clrscr();*/
        printf("\n===========================================\nSinewave Data Produce Source\nDesigned By Huangchayong \n===========================================\nPlease Enter The Number of The Wave Data:");       
        if(error==1)
        {         
                error=0;       
                printf("\n\n  Error!! The number you enter is too large,it must be 0~32767 !\n  Please Enter Again:" );
        }
        scanf("%d",&data_num);                                                                /*输入取点数*/
        if(data_num>32767)
                {
                                error=1;
                                goto putdata;
                }               
        numtochar(data_num);                                                                /*将取点数转化为字符串,存入str[]中*/
        strcpy(filename,str);                                                                /*将str中串复制到filename中*/
        strcat(filename,txt);                                                                /* 文件名加后缀.txt */
        fp=fopen(filename,"w");                                                                /*产生的数据放置的位置,文件名*/
        fprintf(fp,"/********正弦波数据表,取点数:");                /*数据表注释*/
        fprintf(fp,str);                                                                        /*数据表注释*//* 在这写出取点数 */
        fprintf(fp,",设计者:黄茶勇 2006-09-02********/\n");        /*数据表注释*/
        fprintf(fp,"unsigned char code SineWaveTable[]={\n");/*数据表表头*/
                 for(i=0;i<data_num;i++)                                                                /*数据表数据*/
          {
            a=128*sin(i*6.28/data_num)+128;                                                /*获取数据*/
            fprintf(fp,"0x");                                                                        /*在数据前加0x */
           /* if(a<16)fprintf(fp,"0");  */
            fprintf(fp,"%02x",a);                                                                /* 十六进制输出,空2格*/
            fprintf(fp,"," );                                                                        /* 数据后加"," */
            if((i+1)%10==0) fprintf(fp,"\n");                                         /*每10个数据一行*/
          }
        fprintf(fp,"};\n");                                                                        /*数据表尾*/
        printf("completed.\n");
        fclose(fp);                                                                                        /*关闭文件*/

}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

869

主题

13089

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部