打印
[应用相关]

步进电机细分用的正弦表和余弦表怎么得来的呢?

[复制链接]
1067|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 | 只看该作者
什么意思?不是很明白你说的什么,能再解释一下吗

使用特权

评论回复
5
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-->*/
};

使用特权

评论回复
6
lizye| | 2020-8-15 11:43 | 只看该作者
用C语言写个小软件自动生成也是可以的。

使用特权

评论回复
7
lizye| | 2020-8-15 11:46 | 只看该作者
不会的, 应该是 ARR * 查表的数据/2048 为 CCRx

使用特权

评论回复
8
jiaxw| | 2020-8-15 11:52 | 只看该作者
不过事实上, 这种电压方式的细分控制, 效果并不好的

使用特权

评论回复
9
heweibig|  楼主 | 2020-8-15 11:55 | 只看该作者
推荐一种细分方式吧,我想用DRV8841或者L6219来做

使用特权

评论回复
10
huangchui| | 2020-8-15 11:58 | 只看该作者
是不行的;ARR的调节直接影响CCRX;每个细分度都是一个表;要有个逻辑把这些串在一起

使用特权

评论回复
11
zhenykun| | 2020-8-15 12:01 | 只看该作者
根据实际情况,用查表法。也可以实际计算这些值,不过数据小的话,还是查表法好用

使用特权

评论回复
12
jlyuan| | 2020-8-15 12:05 | 只看该作者
电压细分控制

使用特权

评论回复
13
wangzsa| | 2020-8-15 12:12 | 只看该作者
生成之后用查表的方式

使用特权

评论回复
14
chuxh| | 2020-8-15 12:16 | 只看该作者
算好之后自己做表查询

使用特权

评论回复
15
heweibig|  楼主 | 2020-8-15 12:20 | 只看该作者
唉,还是没有什么结果,算了,多谢大家啦

使用特权

评论回复
16
腾腾| | 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

粉丝