amobbs.com 阿莫电子技术论坛

标题: 做舞台灯光的或驱动步进电机的有福了(有图) [打印本页]

作者: chenyuqiu    时间: 2011-5-19 19:49
标题: 做舞台灯光的或驱动步进电机的有福了(有图)
本来一直都不敢发表什么,也不敢回复什么,怕误人子弟,但是最近有很多网友与我共同讨论步进电机的驱动问题。其实我对电机的了解也是很有限的,由于在舞台灯光行业工作,所以会接触到驱动步进电机方面。以下是我最近的最新作品:

(原文件名:这个是一个大摇头灯,头部是铸铝的,很重。驱动是用L6205,57电机,跑起来很静音。基本上听不到有声音,低速时很平稳,128细分。这款是我最得意的作品.jpg)


(原文件名:这款是最近舞台灯光行业比较火的一个产品,驱动是用A3992,效果还不错.jpg)
作者: chenyuqiu    时间: 2011-5-19 19:55

(原文件名:L6205驱动电路.jpg)


(原文件名:A3992驱动电路.jpg)
作者: czhaii    时间: 2011-5-19 20:13
欣赏
作者: liss    时间: 2011-5-19 20:25
mark
作者: flyhouse    时间: 2011-5-19 20:30
1、神马福?L6203、L6205,都是集成电机驱动芯片吧
作者: amazing030    时间: 2011-5-19 20:44
我用L6219做高速球,和这个差不多吧……一毕业就是做这个
作者: chenyuqiu    时间: 2011-5-19 20:57
回复【4楼】flyhouse 丷_丷
1、神马福?l6203、l6205,都是集成电机驱动芯片吧
-----------------------------------------------------------------------

难道现在用驱动电机还想自己用元器件搭起来用啊?那样你觉得性能会很好吗?
作者: newhz    时间: 2011-5-19 21:05
楼主有步进电机加速算法吗?
作者: chenyuqiu    时间: 2011-5-19 21:12
回复【7楼】newhz
楼主有步进电机加速算法吗?
-----------------------------------------------------------------------
加减速算法肯定有的啦,整个产品的软件都是我弄的,电机部分最难搞
作者: ywl0409    时间: 2011-5-19 21:14
电机是哪家的?
作者: chenyuqiu    时间: 2011-5-19 21:16
回复【5楼】amazing030
我用l6219做高速球,和这个差不多吧……一毕业就是做这个
-----------------------------------------------------------------------

其实驱动电机并不难,难的是运用到产品上时细节上处理好才是关键,比如电机噪音很大,很响,运行时抖动,低速时不平滑,启动加速和刹车减速算法不合理等等这些细节上的技术处理才是驱动步进电机的难点,也是重要要点。
作者: chenyuqiu    时间: 2011-5-19 21:18
回复【9楼】ywl0409 老黄牛
电机是哪家的?
-----------------------------------------------------------------------

电机是用小厂家的,我用过比较好的是上海鸣志的,其次是宁波飞宏的。
作者: newhz    时间: 2011-5-19 21:21
刚开始玩电机,以后多向楼主请教。
作者: chenyuqiu    时间: 2011-5-19 21:22
回复【12楼】newhz
刚开始玩电机,以后多向楼主请教。

-----------------------------------------------------------------------

大家相互学习,共同进步!!!
作者: ylei12    时间: 2011-5-19 21:49
这两款芯片能驱动多大的电机
作者: chenyuqiu    时间: 2011-5-19 22:25
L6205最大的相电流输出是5.6A,PWM驱动细分,我做的是128细分。
A3992最大的相电流输出是1.5A,64细分
作者: dmxfeng    时间: 2011-5-20 00:11
记号!
作者: sunicecream    时间: 2011-5-20 00:19
记号一下,看不到图了
作者: wkman    时间: 2011-5-20 01:51
回复【6楼】chenyuqiu 小陈
-----------------------------------------------------------------------

光一个厂家pdf里面都有的图纸,能说明什么???
作者: chenyuqiu    时间: 2011-5-20 08:03
回复【18楼】wkman 鱼片
回复【6楼】chenyuqiu 小陈
-----------------------------------------------------------------------
光一个厂家pdf里面都有的图纸,能说明什么???
-----------------------------------------------------------------------

别急,猛料还在后头呢!!
作者: chenyuqiu    时间: 2011-5-20 08:17
什么都不说,先上料。A3992的底层驱动程序:

// 头文件////////////////////////////////////////////////////////////////////////////////////////////
#ifndef __MOTOR_H__
#define __MOTOR_H__



#include "StepMotor.h"
#include "Pan.h"
#include "Tilt.h"
#include "PanTiltEncode.h"

#define EFFECT_LEFT_ROTATION                    0
#define EFFECT_RIGHT_ROTATION                   1
#define EFFECT_LOCATION                         2




#define DRIVE_LOW_CURRENT                     0
#define DRIVE_HIGH_CURRENT                    !DRIVE_LOW_CURRENT

// A3972
#define PinA3972Latch_0                       3
#define PORTpinA3972Latch_0                   PORTC
#define DDRpinA3972Latch_0                    DDRC
#define PinA3972Latch_1                       2
#define PORTpinA3972Latch_1                   PORTC
#define DDRpinA3972Latch_1                    DDRC




typedef struct _MOTRO
{
        unsigned char
                cDmxValue,
                cEffect,
                cDrivePosition,
                cSpeed,
                cResetState,
                bDirection,
                cDecreaseSpeedCount;
        unsigned int
                wPosition;
} MOTOR, *P_MOTOR;

extern MOTOR Motor;

void MotorReset(void);
void MotorProcStep(void);
void MotorProcDmxValue(unsigned char cValue);





void A3972Initial(void); // (A3972)接口初始化 :SPI / PinA3972Latch
void A3972Drive_0(DOUBLE_BYTE wDriveValue); // 向(A3972)驱动缓冲区写入数值
void A3972WriteMode_0(void); // 设置(A3972)工作模式
void A3972WriteValue_0(unsigned char cCurrent); // 把驱动缓冲区的数值写入(A3972)
void A3972Drive_1(DOUBLE_BYTE wDriveValue);
void A3972WriteMode_1(void);
void A3972WriteValue_1(unsigned char cCurrent);

void MotorDrive(void);
void MotorProcPositionValue(void);


#endif

//驱动源代码//////////////////////////////////////////////////////////////////////////////////////////
#include "Main.h"
#include "motor.h"


       
MOTOR Motor;



#define ClearPinA3972Strobe_0()             PORTpinA3972Latch_0 &= ~(1 << PinA3972Latch_0)
#define SetPinA3972Strobe_0()               PORTpinA3972Latch_0 |= (1 << PinA3972Latch_0)

#define ClearPinA3972Strobe_1()             PORTpinA3972Latch_1 &= ~(1 << PinA3972Latch_1)
#define SetPinA3972Strobe_1()               PORTpinA3972Latch_1 |= (1 << PinA3972Latch_1)

unsigned char code cTbDriveCurrent0[] = // CP2(62:103) CP3(153:236)
{  
     0,   1,   3,   4,   6,   7,   9,  11,  12,  13,  15,  16,  18,  19,  21,  22,
     23,  24,  26,  28,  29,  30,  31,  32,  34,  35,  36,  37,  38,  39,  41,  42,
     43,  44,  45,  45,  46,  47,  48,  49,  50,  51,  52,  53,  53,  54,  55,  55,
     56,  57,  58,  58,  59,  59,  60,  60,  61,  61,  61,  62,  62,  63,  63,  63,

};

unsigned char code cTbDriveCurrent1[] = // CP2(46:80) CP3(139:213)
{
      0,   0,   1,   2,   3,   4,   4,   5,   6,   6,   7,   8,   9,  10,  10,  11,
     12,  12,  13,  14,  14,  15,  16,  16,  17,  17,  18,  19,  19,  20,  20,  21,
     22,  22,  23,  23,  23,  24,  24,  25,  25,  26,  26,  27,  27,  28,  28,  28,
     29,  29,  29,  29,  30,  30,  30,  31,  31,  31,  31,  32,  32,  32,  32,  32,

      0,   0,   1,   1,   2,   3,   3,   4,   4,   5,   5,   6,   7,   7,   7,   8,
      9,   9,   9,  10,  11,  11,  11,  12,  12,  13,  13,  14,  14,  14,  15,  15,
     16,  16,  16,  17,  17,  17,  18,  18,  18,  19,  19,  19,  20,  20,  20,  20,
     21,  21,  21,  22,  22,  22,  22,  23,  23,  23,  23,  23,  24,  24,  24,  24,
};

unsigned char code cTbDriveLowCurrent[] = // CP2(46:80) CP3(139:213)
{
      0,   0,   1,   2,   3,   4,   4,   5,   6,   6,   7,   8,   9,  10,  10,  11,
     12,  12,  13,  14,  14,  15,  16,  16,  17,  17,  18,  19,  19,  20,  20,  21,
     22,  22,  23,  23,  23,  24,  24,  25,  25,  26,  26,  27,  27,  28,  28,  28,
     29,  29,  29,  29,  30,  30,  30,  31,  31,  31,  31,  32,  32,  32,  32,  32,
};

struct
{
        unsigned char
                cDriveValue[3];
} A3972[2];


void A3972Initial(void)
{
        DDRB |= (1 << PinSpiSck) | (1 << PinSpiMosi) | (1 << PinSpiSs);
        SPCR = (1 << SPE) | (1 << MSTR);
        SPSR = (1 << SPI2X);
       
        DDRpinA3972Latch_0 |= (1 << PinA3972Latch_0);
        SetPinA3972Strobe_0();
       
        DDRpinA3972Latch_1 |= (1 << PinA3972Latch_1);
        SetPinA3972Strobe_1();
}


void A3972Drive_0(DOUBLE_BYTE i)
{
        unsigned char c;

        c = i.dByte[0];
        i.dByte[0] &= 0x07f;
        if (i.dByte[0] < 64)
        {
                i.dByte[1] = 63 - i.dByte[0];
        }
        else
        {
                i.dByte[1] = i.dByte[0] - 64;
                i.dByte[0] = 127 - i.dByte[0];
        }
       
        //if (Pan.StepMotor.wNowSpeed < 250)
        {
                i.dByte[0] = pgm_read_byte(cTbDriveCurrent0 + i.dByte[0]);
                i.dByte[1] = pgm_read_byte(cTbDriveCurrent0 + i.dByte[1]);          
        }
        //else
        {
                //i.dByte[0] = pgm_read_byte(cTbDriveLowCurrent + i.dByte[0]);
                //i.dByte[1] = pgm_read_byte(cTbDriveLowCurrent + i.dByte[1]);          
        }

       
        i.dByte[0] <<= 1;
        if (i.dByte[1] & 0x01)
        {
                i.dByte[0] |= 0x80;
        }
        A3972[0].cDriveValue[2] = i.dByte[0];

        i.dByte[1] >>= 1;

        if (c & 0x80)               
        {
                i.dByte[1] |= 0x20;                     // 马达控制方向
               
                if (c & 0x40)
                {
                        i.dByte[1] &= 0xbf;
                }
                else
                {
                        i.dByte[1] |= 0x40;
                }
        }
        else
        {
                i.dByte[1] &= 0xdf;                     // 马达控制方向
               
                if (c & 0x40)
                {
                        i.dByte[1] |= 0x40;
                }
                else
                {
                        i.dByte[1] &= 0xbf;
                }
        }
       
        A3972[0].cDriveValue[1] = i.dByte[1];
        A3972[0].cDriveValue[0] = 0x04;
}


#define FAST_DECAY_TIME_0   0x04 // 0x01 - 0x0f
#define FIXED_OFF_TIME_0    0x03 // 0x01 - 0x1f
#define BLABK_TIME_0        0x03 // 0x01 - 0x03

void A3972WriteMode_0(void)
{
        Disable();
        ClearPinA3972Strobe_0();
        SPDR = 0x04;
        Delay(1);
        SPDR = FAST_DECAY_TIME_0;
        Delay(1);
        SPDR = (FIXED_OFF_TIME_0 << 3) | (BLABK_TIME_0 << 1) | 1;
        Delay(1);
        SetPinA3972Strobe_0();
        Enable();
}

void A3972WriteValue_0(unsigned char bCurrent)
{
        unsigned char c;
       
        c = A3972[0].cDriveValue[0];
        if (bCurrent == DRIVE_LOW_CURRENT)
        {
                c &= 0xfb;
        }
        else
        {
                c |= 0x04;
        }
        Disable();
        ClearPinA3972Strobe_0();
        SPDR = c;
        Delay(1);
        SPDR = A3972[0].cDriveValue[1];
        Delay(1);
        SPDR = A3972[0].cDriveValue[2];
        Delay(1);
        SetPinA3972Strobe_0();
        Enable();
}




void A3972Drive_1(DOUBLE_BYTE i)
{
        unsigned char c;

        c = i.dByte[0];
        i.dByte[0] &= 0x07f;
        if (i.dByte[0] < 64)
        {
                i.dByte[1] = 63 - i.dByte[0];
        }
        else
        {
                i.dByte[1] = i.dByte[0] - 64;
                i.dByte[0] = 127 - i.dByte[0];
        }
       
        i.dByte[0] = pgm_read_byte(cTbDriveCurrent1 + i.dByte[0]);
        i.dByte[1] = pgm_read_byte(cTbDriveCurrent1 + i.dByte[1]);
       
        i.dByte[0] <<= 1;
        if (i.dByte[1] & 0x01)
        {
                i.dByte[0] |= 0x80;
        }
        A3972[1].cDriveValue[2] = i.dByte[0];

        i.dByte[1] >>= 1;

        if (c & 0x80)               
        {
                i.dByte[1] |= 0x20;                     // 马达控制方向
               
                if (c & 0x40)
                {
                        i.dByte[1] &= 0xbf;
                }
                else
                {
                        i.dByte[1] |= 0x40;
                }
        }
        else
        {
                i.dByte[1] &= 0xdf;                     // 马达控制方向
               
                if (c & 0x40)
                {
                        i.dByte[1] |= 0x40;
                }
                else
                {
                        i.dByte[1] &= 0xbf;
                }
        }
       
        A3972[1].cDriveValue[1] = i.dByte[1];
        A3972[1].cDriveValue[0] = 0x04;
}


#define FAST_DECAY_TIME_1   0x03 // 0x01 - 0x0f
#define FIXED_OFF_TIME_1    0x02 // 0x01 - 0x1f
#define BLABK_TIME_1        0x03 // 0x01 - 0x03

void A3972WriteMode_1(void)
{
        Disable();
        ClearPinA3972Strobe_1();
        SPDR = 0x04;
        Delay(1);
        SPDR = FAST_DECAY_TIME_1;
        Delay(1);
        SPDR = (FIXED_OFF_TIME_1 << 3) | (BLABK_TIME_1 << 1) | 1;
        Delay(1);
        SetPinA3972Strobe_1();
        Enable();
}

void A3972WriteValue_1(unsigned char bCurrent)
{
        unsigned char c;
       
        c = A3972[1].cDriveValue[0];
        if (bCurrent == DRIVE_LOW_CURRENT)
        {
                c &= 0xfb;
        }
        else
        {
                c |= 0x04;
        }
        Disable();
        ClearPinA3972Strobe_1();
        SPDR = c;
        Delay(1);
        SPDR = A3972[1].cDriveValue[1];
        Delay(1);
        SPDR = A3972[1].cDriveValue[2];
        Delay(1);
        SetPinA3972Strobe_1();
        Enable();
}

void MotorReset(void)
{
    PanReset();
    TiltReset();
}
void MotorProcStep(void)
{
        PanProcStep();
        TiltProcStep();
}

void MotorProcPositionValue(void)
{
        if (Pan.cPositionDmxValue != Pan.cDriveValue)
        {
                PanProcPositionDmxValue(Pan.cDriveValue);
        }
        if (Pan.cSpeedTempValue != Pan.cSpeedDmxValue)
        {
        PanProcSpeedDmxValue(Pan.cSpeedDmxValue);
    }

        if (Tilt.cPositionDmxValue != Tilt.cDriveValue)
        {
                TiltProcPositionDmxValue(Tilt.cDriveValue);
        }
        if (Tilt.cSpeedTempValue != Tilt.cSpeedDmxValue)
        {
        TiltProcSpeedDmxValue(Tilt.cSpeedDmxValue);
    }       
}
作者: qfmcu    时间: 2011-5-20 08:26
看不到图。
作者: xintrone    时间: 2011-5-20 09:05
回复【20楼】chenyuqiu 小陈
-----------------------------------------------------------------------

看不到图啊
作者: chenyuqiu    时间: 2011-5-20 09:11
回复【22楼】xintrone
回复【20楼】chenyuqiu 小陈
-----------------------------------------------------------------------
看不到图啊
-----------------------------------------------------------------------

回复【21楼】qfmcu 清风徐徐
看不到图。
-----------------------------------------------------------------------

是你们的网速慢还是???
我昨晚发上来的时候都可以看到啊。
现在在上班网速不行我也看不到的
作者: eworker    时间: 2011-5-20 09:15
回复【23楼】chenyuqiu 小陈
-----------------------------------------------------------------------

LZ好像前段时间发过一个驱动步进电机的程序.
作者: chenyuqiu    时间: 2011-5-20 09:34
回复【24楼】eworker
回复【23楼】chenyuqiu 小陈
-----------------------------------------------------------------------
lz好像前段时间发过一个驱动步进电机的程序.
-----------------------------------------------------------------------

呵呵,是的。
STC11F16XE驱动4个步进电机(软件实现16细分)
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4440711&bbs_page_no=1&search_mode=3&search_text=chenyuqiu&bbs_id=9999
作者: littlepig    时间: 2011-5-20 09:39
楼主把资料打个包,好分享撒
作者: kbdcj2000    时间: 2011-5-20 09:59
mark
作者: monlika    时间: 2011-5-20 11:48
图挂了~~
作者: chenyuqiu    时间: 2011-5-20 12:47
回复【28楼】monlika 电子钟
图挂了~~
-----------------------------------------------------------------------
不知道为什么,重新上传也上传不了,过一会我再上传试试看
作者: chenyuqiu    时间: 2011-5-20 14:06
汗,试了一个中午都上传不了

作者: flyhouse    时间: 2011-5-20 14:42
回复【20楼】chenyuqiu 小陈
-----------------------------------------------------------------------
allegro的步进ic也挺诡异的,有好些个市面上有卖有大量应用,就是没有pdf

这个能找到pdf么   a6628sedt  plcc44封装。。。。
作者: yulongkui    时间: 2011-5-20 14:46

作者: chenyuqiu    时间: 2011-5-20 15:22
回复【31楼】flyhouse 丷_丷
回复【20楼】chenyuqiu 小陈
-----------------------------------------------------------------------
allegro的步进ic也挺诡异的,有好些个市面上有卖有大量应用,就是没有pdf
这个能找到pdf么   a6628sedt  plcc44封装。。。。

-----------------------------------------------------------------------

网上都有的,今天我的电脑都上传不了东西,怪死了
作者: chenyuqiu    时间: 2011-5-20 16:16
怪了,图片又可以显示出来了

作者: flyhouse    时间: 2011-5-20 17:02
回复【33楼】chenyuqiu 小陈

网上都有的,今天我的电脑都上传不了东西,怪死了
-----------------------------------------------------------------------

有???赶紧又上google搜索了,翻了3页,点开所有链接。。。。都是广告,号称有pdf的,也是假链接死链接。。。

不瞒你说,这个ic的pdf,偶找了6年。。。哈哈哈哈
作者: xinzhi1986    时间: 2011-5-20 17:28
果然是好东西~mark了~
作者: z0586mj    时间: 2011-5-20 17:28
mark
作者: hu7215    时间: 2011-5-20 21:51
谢谢分享
作者: chenyuqiu    时间: 2011-5-21 12:34
回复【38楼】hu7215
谢谢分享
-----------------------------------------------------------------------

不用客气!!

作者: wayhe    时间: 2011-5-21 12:45
MARK
作者: plc_avr    时间: 2011-5-21 13:01
MARK!!!
作者: mugangqin    时间: 2011-5-30 17:40
我想问一下,
4个IO口控制电机4根信号线
你是如何给信号产生16细分的呢,
能不能说说你的给信号的思路?
作者: mugangqin    时间: 2011-5-30 17:41
我想问一下,
4个IO口控制电机4根信号线
你是如何给信号产生16细分的呢,
能不能说说你的给信号的思路?
作者: winkle    时间: 2011-5-30 18:44
关键的关键应该是马达的加减速控制
作者: chenyuqiu    时间: 2011-5-30 20:24
回复【42楼】mugangqin
我想问一下,
4个io口控制电机4根信号线
你是如何给信号产生16细分的呢,
能不能说说你的给信号的思路?

-----------------------------------------------------------------------

你好,关于你这个问题请你查看一下我发表的一个帖子:
STC11F16XE驱动4个步进电机(软件实现16细分),里面有原理图和驱动代码,加减速算法也有在里面.
作者: yansuoqinlou    时间: 2011-5-31 17:16
犀利
作者: abcdezh    时间: 2011-5-31 17:28
好东东
作者: xrwf_2009    时间: 2011-5-31 17:45
权威
作者: chenyuqiu    时间: 2011-6-1 12:00
回复【48楼】xrwf_2009
权威
-----------------------------------------------------------------------

谢谢,权威这个就不敢当啊!!!
作者: chushichongyu    时间: 2011-6-1 12:17
经典
作者: zbb8637    时间: 2011-6-1 12:29
cool
作者: eric_wang    时间: 2011-6-1 17:33
學習了,多謝!
作者: jack_yu    时间: 2011-6-2 14:14
谢谢!受教了。
作者: lixingling    时间: 2011-6-2 15:05
真的难看懂
作者: chenyuqiu    时间: 2011-6-2 21:58
回复【54楼】lixingling
真的难看懂

-----------------------------------------------------------------------

技术上的东西不是看一下就能懂的,很多东西都是得靠慢慢钻研出来的
作者: luoxi    时间: 2011-6-2 23:03
谢谢小陈同志给我们带来帮助,我们支持你!!
作者: carlon    时间: 2011-6-3 08:19
记号+膜拜
作者: zjm520    时间: 2011-6-3 17:57
4个io口控制电机4根信号线  (电机为双极型步进电机)
你是如何给信号产生16细分的呢,  
能不能说说你的给信号的思路?

能不能用语句描述一下这个用软件做16细分的思路呢?
可以加我Q1352529817
你也可以给你Q我加你
谢谢!
作者: Bicycle    时间: 2011-6-3 19:53
学习中
作者: chenyuqiu    时间: 2011-6-3 21:21
回复【58楼】zjm520
4个io口控制电机4根信号线  (电机为双极型步进电机)
你是如何给信号产生16细分的呢,   
能不能说说你的给信号的思路?  
能不能用语句描述一下这个用软件做16细分的思路呢?
可以加我q1352529817
你也可以给你q我加你
谢谢!
-----------------------------------------------------------------------

A3992内部有一个64细分的PWM,我们可以通过写入相应的数据就可以了。你可以先去看看A3992的DataSheet.在结合我的驱动程序看就会明白的了,如果你的英文能力没问题的话那更好了,那样更容易理解我的驱动程序。
另:即使看不懂的话也可以直接用我上面的驱动代码,把驱动接口配置好就OK了。A3992是用SPI驱动的。所以接口很方便
作者: chenyuqiu    时间: 2011-6-3 21:23
感觉大家对电机这方面的资料很缺乏。
作者: outt60777    时间: 2011-6-3 22:02
mark!
作者: liukan    时间: 2011-6-3 22:30
正在学习步进电机,谢谢了
作者: zjm520    时间: 2011-6-4 09:07
回复【60楼】chenyuqiu 小陈
-----------------------------------------------------------------------

电机细机到底是怎么个思路?
不方便留个Q或电话什么的吗?
我现在用的是MD-123来做步进电机的驱动IC
作者: zjm520    时间: 2011-6-4 09:16
在书上看那些细分方式都很笼统,所以想听听你对电机细分的具体思路。
作者: chenyuqiu    时间: 2011-6-5 12:48
回复【65楼】zjm520
在书上看那些细分方式都很笼统,所以想听听你对电机细分的具体思路。
-----------------------------------------------------------------------

现在都是用专用的驱动IC来做细分的啦。
作者: yanrz    时间: 2011-6-6 17:22
不错,呵呵,到时候学习下!
要给空调厂做一个测试步进电机测试的小东西!
作者: lees    时间: 2011-6-15 19:36
陈哥,有没有L6205N,加减速的代码。我想的都头疼了,希望向陈哥学习学习。283105876我的QQ。zhi_cheng_li@126.com
作者: zprs    时间: 2011-6-16 19:09
mark
作者: luck851    时间: 2011-6-16 19:21
mark
作者: chenyuqiu    时间: 2011-6-24 17:32
回复【68楼】lees
陈哥,有没有l6205n,加减速的代码。我想的都头疼了,希望向陈哥学习学习。283105876我的qq。zhi_cheng_li@126.com

-----------------------------------------------------------------------

加减速算法在我另一个帖子
”STC11F16XE驱动4个步进电机(软件实现16细分) “已经有共享出来了,你可以去看看,希望能帮得到你
作者: yangsan123    时间: 2011-6-30 09:30
回复【20楼】chenyuqiu 小陈
-----------------------------------------------------------------------
陈哥
L6205驱动怎用的呀?
能否贴出来分享下呀!最近在弄
作者: lee345    时间: 2011-6-30 10:32
不错有时间好好参考下
作者: wind2100    时间: 2011-6-30 10:43
6205这种接法 没 DEADTIME 怎么行?
作者: chenyuqiu    时间: 2011-6-30 11:30
回复【74楼】wind2100
6205这种接法 没 deadtime 怎么行?
-----------------------------------------------------------------------

L6205芯片内部已经有自带衰减功能了。
作者: hncjs    时间: 2011-6-30 11:32
不错顶一下
作者: luck851    时间: 2011-6-30 11:56
mark
作者: Andy22    时间: 2011-7-5 12:38
回复【10楼】chenyuqiu  小陈
回复【5楼】amazing030
我用l6219做高速球,和这个差不多吧……一毕业就是做这个
-----------------------------------------------------------------------
其实驱动电机并不难,难的是运用到产品上时细节上处理好才是关键,比如电机噪音很大,很响,运行时抖动,低速时不平滑,启动加速和刹车减速算法不合理等等这些细节上的技术处理才是驱动步进电机的难点,也是重要要点。
-----------------------------------------------------------------------

毕业前,毕业后一两年,或者再久,同样是把一个模块跑起来,但回去看一下以前写的代码,画的板子,
就会发现以前什么都不是。
作者: charlie2008    时间: 2011-7-5 20:50
mark!
作者: ddapw    时间: 2011-7-19 19:17
这个要顶,mark慢慢看。
作者: mayiqing888    时间: 2011-7-20 16:07
回复【75楼】chenyuqiu  小陈
-----------------------------------------------------------------------

小陈,你好~我也有几个关于步进驱动的问题想请教你一下。可不可以留给我你的QQ或者邮箱?这样好交流一些~非常感谢!!!!
作者: chenyuqiu    时间: 2011-7-20 16:09
回复【82楼】mayiqing888
回复【75楼】chenyuqiu  小陈
-----------------------------------------------------------------------
小陈,你好~我也有几个关于步进驱动的问题想请教你一下。可不可以留给我你的qq或者邮箱?这样好交流一些~非常感谢!!!!
-----------------------------------------------------------------------

你好,我觉得还是在这里交流就行了,之前我有留下自己的QQ号码,但是现在不想再加人,有问题在这里讨论就行了。不好意思!!
作者: mayiqing888    时间: 2011-7-20 16:21
回复【83楼】chenyuqiu  小陈
-----------------------------------------------------------------------

好的~~
我的步进驱动器没有用专用芯片,是用FPGA+DA+MOS驱动+MOS+比较器做的~
目前来看,低速的时候振动比较厉害,不管是低细分还是高细分,但高速的时候(力矩下降),此时细分不再起作用,这时候电机就转的很好,几乎完全不会振动。

后来我又把脉冲频率调低,细分调到64,把锡丝固定在电机轴上,我发现,每完成1.8度的时候,就会停顿一下,并会有些抖动,手摸电机,也会有咯噔咯噔的感觉。后来看其他的帖子,有的网友说是因为电机在走这1.8度的过程中,会有加速-减速的过程。走完1.8度,这时A+为最大电流,B+为0,这一瞬间力矩是垂直于轴的,所以这时速度降为0,就会有电机停顿的现象。

我用的斩波做的,采样电阻采到相电流,经过D触发器,定频斩波,返回FPGA处理,然后输出4路信号控制4路MOS的开关。
你说有可能是换相没处理好,但我的换相是根据查表的地址值来分的。0-127输出A相,128-255输出B相,感觉没什么问题。
不知道你有没有什么好的办法可以解决这个停顿的问题,谢谢你了~~~
作者: mayiqing888    时间: 2011-7-21 10:30
顶起来
作者: chenyuqiu    时间: 2011-7-22 16:52
回复【84楼】mayiqing888
-----------------------------------------------------------------------

我用2803的时候也遇到跟你类似的现象,至今为止还无解。
作者: xoneftws_123    时间: 2011-7-22 18:53
这个对于步进电机的学者来说,真的不错
作者: Onsunsl    时间: 2011-7-22 20:27
回复【楼主位】chenyuqiu 小陈
-----------------------------------------------------------------------

用来驱动LED到是不错的想法,能否有适合载波通信的,
电流在1.5A,开关速率在1.2MHz左右的?
作者: 416446891    时间: 2011-7-22 21:08
MARK
作者: chenyuqiu    时间: 2011-7-26 15:55
回复【88楼】Onsunsl 金平合吾
回复【楼主位】chenyuqiu 小陈
-----------------------------------------------------------------------
用来驱动led到是不错的想法,能否有适合载波通信的,

-----------------------------------------------------------------------

你的想象能力也太丰富了吧?一般的大功率LED都是用恒流驱动IC来的,"电流在1.5a,开关速率在1.2mhz左右的"建议你看看LM3404合适你不
作者: wind2100    时间: 2011-7-27 00:07
回复【75楼】chenyuqiu 小陈
回复【74楼】wind2100  
6205这种接法 没 deadtime 怎么行?  
-----------------------------------------------------------------------
l6205芯片内部已经有自带衰减功能了。
-----------------------------------------------------------------------

你的意思就是说不需要插入死区了?  你的那个板子稳定吗 烧过6205没?
作者: chenyuqiu    时间: 2011-7-28 09:51
回复【92楼】wind2100
-----------------------------------------------------------------------

这个倒是一个问题哦,如果IC不短路的话就不会烧,我有试过只要IC一短路就会烧的情况。请问92楼的你有用过L6205的吗?能不能把你的电路图发给大家看看?
作者: gusigusi    时间: 2011-7-28 11:31
谢谢楼主
作者: largeboss    时间: 2011-7-28 12:22
mark
作者: wind2100    时间: 2011-7-28 12:24
据我所知 L6025 是意法半导体的 步进电机H桥驱动电路 不带死区时间 需要自己插入
在步进电机 内阻比较小 或是电流比较大的情况下 会烧H桥的。 当然 你可以选择内阻比较大的电机 从而(就算磁饱和了 也可以)达到电阻限流的作用。
作者: hpyanghua    时间: 2011-7-28 13:53
MARK
作者: chenyuqiu    时间: 2011-7-28 16:58
回复【97楼】wind2100
据我所知 l6025 是 步进电机h桥驱动电路 不带死区时间 需要自己插入  
在步进电机 内阻比较小 或是电流比较大的情况下 会烧h桥的。 当然 你可以选择内阻比较大的电机 从而(就算磁饱和了 也可以)达到电阻限流的作用。
-----------------------------------------------------------------------

L6205是意法半导体的,但是我用了这么久基本上是没因为电流过大而烧IC,只不过感觉这个IC是比较脆弱点,一短路就很容易烧。
还有就是很想请问wind2100如何自己手动插入死区时间?
作者: wind2100    时间: 2011-7-28 22:05
死区时间这个需要MCU来处理  也有MOS管驱动 有这个死区时间的 但是是固定的。
作者: chenyuqiu    时间: 2011-7-29 13:43
回复【100楼】wind2100
死区时间这个需要mcu来处理  也有mos管驱动 有这个死区时间的 但是是固定的。
-----------------------------------------------------------------------

能不能具体举个例子说明一下呢?谢谢!!
作者: joing2000    时间: 2011-7-29 14:58
有个好几个客户做这玩意的,上面的液晶都是我们公司做的。




欢迎光临 amobbs.com 阿莫电子技术论坛 (https://www.amobbs.com/) Powered by Discuz! X3.4