搜索
bottom↓
回复: 12

看看我做的步进电机细分,为何还有这么大的振动

[复制链接]

出0入0汤圆

发表于 2008-4-10 19:28:16 | 显示全部楼层 |阅读模式
57BYG251A的电机,3A,1.2mh,0.95欧。
细分电路采用:
MCU:STC54C12AD(频率22.13M,1T单片机;由单片机产生相序信号,并控制DA输出正弦VREF)
DAC:8BIT 双通道 DAC8229
电流控制:双L297(原设计用L6506,发现控制不了电流,因手头上L297比较多,所以临时用2块L297做成PWM限流电路)
桥电路:双L6203(快速衰减方式,L297的INH接在L6203的EN端上)
细分数:64

这个电路做了很多的测试,终于把相电流控制成正弦余弦波了,但是效果令人很不满意:在转速相同的情况下(2转/S),电机噪音的大小:64细分的效果与半步模式的驱动效果,几乎相同,只是振动和噪音稍微小了一些。实在是令人太费解了,难道细分的效果就是这样?
我把相电流的波形图截下来,大家帮我参考一下:
(12.8K的脉冲,转速1转/S。)

DAC的输出波形 (原文件名:DA输出.jpg)


L6203的采样电阻上的波形 (原文件名:采样电流.jpg)


串接在其中一相上的电阻上的波形 (原文件名:相电流.jpg)


因为最近在做试验,电路图都不是新的,没上传上来。

电机的相序采用半步驱动的相序。原来用整步时发现在换向的过程中,因为相电流不能为理想的0值,所以加入了一步,成了半步驱动的方式。所以实际走一步需要的脉冲数:64+1。

以下是源代码:

#include <absacc.h>
#include <stdio.h>
#include <intrins.h>
#include <math.h>
#include <string.h>
#include "STC12C5410AD.H"

//da端口定义
#define DA_PORT P1
#define DA_CS P3_5
#define DA_WR P3_4
#define DA_AB P3_7
//#define DA_EN P3_3

//L6506接口定义
#define PA1 P2_0
#define PA2 P2_1
#define PB1 P2_2
#define PB2 P2_3
#define PH_PORT P2

//对外接口引脚定义
#define ST_CLK P3_2
#define ST_STOP P3_3
#define ST_DIR P2_7

//逻辑定义
#define DF_XF 64        //细分数

//全局变量定义
unsigned char data mv_step;        //工作时序
unsigned char data xf_step;        //细分时序
unsigned char data mt_stop;        //停止
unsigned char data mt_dir;        //方向
unsigned char xdata arry_xf_sin[DF_XF];
unsigned char xdata arry_xf_cos[DF_XF];
unsigned char data arry_step[8];
bit sta;
bit wait;
//unsigned char data ph_sta;
unsigned char data ph_chopper;
unsigned char data reload_tl0;
unsigned char data reload_th0;
unsigned char data sys_sta;
#define SYS_STOP 0
#define SYS_WORKING 1

StopMt()
{
        EX0=0;sta=0;sys_sta=SYS_STOP;wait=1;
        PH_PORT=0xff;mt_stop=0;mv_step=0;xf_step=0;mt_dir=0;
        DA_PORT=0;
        DA_AB=0;DA_WR=0;_nop_();_nop_();
        DA_WR=1;
        DA_AB=1;DA_WR=0;_nop_();_nop_();
        DA_WR=1;
}

void delays(unsigned char dl)
{
        unsigned char i;
        for(;dl>0;dl--)
        {
                for(i=0;i<35;i++);       
        }
       
}
//IO定义
void InitTimer()
{
//        float data t;
        unsigned int data maxc=0;
        maxc=65485;//50  个脉冲周期
        reload_tl0=(unsigned char)(maxc&0x00ff);
        reload_th0=(unsigned char)((maxc&0xff00)>>8);
        T1x12=1;//不进行12分频
        TH1=reload_th0;
        TL1=reload_tl0;
        TMOD=TMOD|0x10;//T1方式1
        ET1=1;//开T1中断
        TR1=1;
        EA=1;
}
void main(void)
{
        unsigned char data i=0;
       
        mv_step=0;xf_step=0;mt_dir=0;
        WDT_CONTR=0X3D;//看门狗启动,2S超时
        //初始化各个IO寄存器状态
        DA_PORT=0;sta=0;
        ph_chopper=0xff;//不截波
        DA_CS=0;//开启DAC芯片
        sys_sta=SYS_STOP;
        StopMt();//停止步进电机


        //整步细分+半步修正 方式
        arry_step[0]=4;
        arry_step[1]=5;
        arry_step[2]=1;
        arry_step[3]=9;
        arry_step[4]=8;
        arry_step[5]=10;
        arry_step[6]=2;
        arry_step[7]=6;



        for(i=0;i<DF_XF-1;i++) //生成细分时序(sin90 内细分)
        {
                arry_xf_sin=(unsigned char)(255.0*sin((float)i*3.1415927/2.0/(DF_XF-1)));
                arry_xf_cos=(unsigned char)(255.0*cos((float)i*3.1415927/2.0/(DF_XF-1)));
        }
        arry_xf_sin=0xff;
        arry_xf_cos=0;

        //初始化中断
        EX0=1;        //开INT0中断
        PX0=1;        //INT0高优先级
        IT0=1;        //边沿方式触发
        EA=1;        //开放系统中断
        while(1)
        {
                WDT_CONTR=0X3D;//喂狗
                ST_STOP=1;
               
                switch(sys_sta)
                {
                        case SYS_STOP:
                                if(ST_STOP==0)
                                {
                                        StopMt();
                                        sys_sta=SYS_WORKING;
                                        PX0=1;        //INT0高优先级
                                        IT0=1;        //边沿方式触发
                                        EX0=1;EA=1;
                                }
                        break;
                        case SYS_WORKING:
                                if(ST_STOP==1)
                                {
                                        EX0=0;EA=0;StopMt();
                                        sys_sta=SYS_STOP;
                                }
                        break;
                }
        }
}//

void Int0Interupt(void) interrupt 0
{//CLK输入中断
        DA_CS=0;
        if(wait)
        {//插入半步等待状态
                DA_PORT=0xff;
                DA_AB=0;DA_WR=0;_nop_();
                DA_WR=1;//输出DA最大值
                sta=~sta;
                wait=0;//已完成换向修正
                xf_step=DF_XF-1;//进入换向
                PH_PORT=(arry_step[mv_step]|0xf0);
        }
        else
        {//正常细分状态
               
                if(sta)
                {
                        DA_PORT=arry_xf_sin[xf_step];
                        DA_AB=0;DA_WR=0;_nop_();
                        DA_WR=1;
                        DA_PORT=arry_xf_cos[xf_step];
                        DA_AB=1;DA_WR=0;_nop_();
                        DA_WR=1;
                }
                else
                {
                        DA_PORT=arry_xf_cos[xf_step];
                        DA_AB=0;DA_WR=0;_nop_();
                        DA_WR=1;
                        DA_PORT=arry_xf_sin[xf_step];
                        DA_AB=1;DA_WR=0;_nop_();
                        DA_WR=1;
                }
                xf_step++;
                if(xf_step>=DF_XF)
                {
                        xf_step=0;
                        mv_step++;
                        if(mv_step==8)
                                mv_step=0;
                        if(mv_step%2==0)
                        {
                                wait=1;//需要进行换向修正
                        }
                        sta=~sta;
                        PH_PORT=(arry_step[mv_step]|0xf0);
                }
        }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2008-4-10 19:44:52 | 显示全部楼层
不得不提的还是L6506,这个芯片真是不知道怎么用。
就像 小松工程 说的那样,不论采样电流如何,都会有个脉冲输出,导致电流不能控制。
当时试了好多方法,把L6506的频率调到了250K,把脉冲尽量减小了,电流控制效果好了一些,但根本达不到设计的目的。
没办法,还是要重新做了PWM的CHOPPER才行。

现在电流波形都没问题了,噪音还是没降多少,真是让人失望。

出0入0汤圆

发表于 2008-4-10 19:58:38 | 显示全部楼层
小小一个电机这么多学问想不到。有空研究下。

出0入0汤圆

 楼主| 发表于 2008-4-11 12:17:58 | 显示全部楼层
参考了A3955的细分方式,效果好了一些,但是噪音还是不小。
发现细分后的共振频率和没细分之前的差不多,郁闷Ing

出0入0汤圆

发表于 2008-4-11 12:41:26 | 显示全部楼层
mark

出0入0汤圆

发表于 2008-4-15 00:04:09 | 显示全部楼层
我没做过步进电机细分,准备关注中,
问一下 一个很菜的问题,细分时候是不是一定有驱动器件有工作在放大区的,
就是说在dac控制的电流驱动工作在放大区,以输出正弦波啊,
如果一定这样那不是牺牲效率(从电能上)来换取精度啦吗

出0入0汤圆

 楼主| 发表于 2008-4-15 08:13:33 | 显示全部楼层
也可以说是,也可以说不是。
dac控制的电流方式,并不是传统的晶体管的方式,而是通过PWM方式控制开关管的方式控制。
因为PWM的频率快,在开关管通断的瞬间损耗较大,所以造成了不少的电能损失在其上,但远不如晶体管耗散那么多的功率。

这两天用几块基本的门电路搭建了一个新的PWM斩波器,实现了50%的快衰和慢衰,噪音又小了些。

出0入0汤圆

发表于 2008-4-16 19:33:07 | 显示全部楼层
关注一下!

出0入0汤圆

发表于 2008-5-9 12:27:07 | 显示全部楼层
楼主,我现在也在弄这个细分电路,能不能把你的原理图发我一份参考下!
linwei_063@163.com

出0入0汤圆

发表于 2008-5-10 13:50:03 | 显示全部楼层
最近也用上了STC单片机,准备搞个步进电机驱动板来玩一下,希望huang_yu 兄有空能指点一下

出0入0汤圆

发表于 2008-5-10 14:04:12 | 显示全部楼层
最近也拆了不少成品的驱动器。国内的就雷赛的做得比较好,测它的带载波形都非常漂亮,一点干扰都杂波都没有,MOS管也没加保护管。感觉就一个字,牛!

出0入0汤圆

发表于 2008-5-12 08:58:57 | 显示全部楼层
忽然想到一个问题,楼主加大细分时有没有试升高工作频率来测试。就是细分越大,工作频率也相应升高。这样电机的工作噪音才会有明显的区别

出0入0汤圆

发表于 2008-5-18 08:36:21 | 显示全部楼层
成品驱动器是有加速度控制的
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 03:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表