搜索
bottom↓
回复: 254

做舞台灯光的或驱动步进电机的有福了(有图)

  [复制链接]

出0入0汤圆

发表于 2011-5-19 19:49:10 | 显示全部楼层 |阅读模式
本来一直都不敢发表什么,也不敢回复什么,怕误人子弟,但是最近有很多网友与我共同讨论步进电机的驱动问题。其实我对电机的了解也是很有限的,由于在舞台灯光行业工作,所以会接触到驱动步进电机方面。以下是我最近的最新作品:

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


(原文件名:这款是最近舞台灯光行业比较火的一个产品,驱动是用A3992,效果还不错.jpg)

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

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

 楼主| 发表于 2011-5-19 19:55:24 | 显示全部楼层

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


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

出0入0汤圆

发表于 2011-5-19 20:13:21 | 显示全部楼层
欣赏

出0入0汤圆

发表于 2011-5-19 20:25:10 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-19 20:30:03 | 显示全部楼层
1、神马福?L6203、L6205,都是集成电机驱动芯片吧

出0入0汤圆

发表于 2011-5-19 20:44:00 | 显示全部楼层
我用L6219做高速球,和这个差不多吧……一毕业就是做这个

出0入0汤圆

 楼主| 发表于 2011-5-19 20:57:23 | 显示全部楼层
回复【4楼】flyhouse 丷_丷
1、神马福?l6203、l6205,都是集成电机驱动芯片吧
-----------------------------------------------------------------------

难道现在用驱动电机还想自己用元器件搭起来用啊?那样你觉得性能会很好吗?

出0入0汤圆

发表于 2011-5-19 21:05:31 | 显示全部楼层
楼主有步进电机加速算法吗?

出0入0汤圆

 楼主| 发表于 2011-5-19 21:12:20 | 显示全部楼层
回复【7楼】newhz
楼主有步进电机加速算法吗?
-----------------------------------------------------------------------
加减速算法肯定有的啦,整个产品的软件都是我弄的,电机部分最难搞

出0入0汤圆

发表于 2011-5-19 21:14:18 | 显示全部楼层
电机是哪家的?

出0入0汤圆

 楼主| 发表于 2011-5-19 21:16:34 | 显示全部楼层
回复【5楼】amazing030
我用l6219做高速球,和这个差不多吧……一毕业就是做这个
-----------------------------------------------------------------------

其实驱动电机并不难,难的是运用到产品上时细节上处理好才是关键,比如电机噪音很大,很响,运行时抖动,低速时不平滑,启动加速和刹车减速算法不合理等等这些细节上的技术处理才是驱动步进电机的难点,也是重要要点。

出0入0汤圆

 楼主| 发表于 2011-5-19 21:18:04 | 显示全部楼层
回复【9楼】ywl0409 老黄牛
电机是哪家的?
-----------------------------------------------------------------------

电机是用小厂家的,我用过比较好的是上海鸣志的,其次是宁波飞宏的。

出0入0汤圆

发表于 2011-5-19 21:21:40 | 显示全部楼层
刚开始玩电机,以后多向楼主请教。

出0入0汤圆

 楼主| 发表于 2011-5-19 21:22:22 | 显示全部楼层
回复【12楼】newhz
刚开始玩电机,以后多向楼主请教。

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

大家相互学习,共同进步!!!

出0入10汤圆

发表于 2011-5-19 21:49:19 | 显示全部楼层
这两款芯片能驱动多大的电机

出0入0汤圆

 楼主| 发表于 2011-5-19 22:25:54 | 显示全部楼层
L6205最大的相电流输出是5.6A,PWM驱动细分,我做的是128细分。
A3992最大的相电流输出是1.5A,64细分

出0入0汤圆

发表于 2011-5-20 00:11:35 | 显示全部楼层
记号!

出0入0汤圆

发表于 2011-5-20 00:19:50 | 显示全部楼层
记号一下,看不到图了

出0入0汤圆

发表于 2011-5-20 01:51:12 | 显示全部楼层
回复【6楼】chenyuqiu 小陈
-----------------------------------------------------------------------

光一个厂家pdf里面都有的图纸,能说明什么???

出0入0汤圆

 楼主| 发表于 2011-5-20 08:03:48 | 显示全部楼层
回复【18楼】wkman 鱼片
回复【6楼】chenyuqiu 小陈
-----------------------------------------------------------------------
光一个厂家pdf里面都有的图纸,能说明什么???
-----------------------------------------------------------------------

别急,猛料还在后头呢!!

出0入0汤圆

 楼主| 发表于 2011-5-20 08:17:26 | 显示全部楼层
什么都不说,先上料。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);
    }       
}

出0入0汤圆

发表于 2011-5-20 08:26:17 | 显示全部楼层
看不到图。

出0入0汤圆

发表于 2011-5-20 09:05:41 | 显示全部楼层
回复【20楼】chenyuqiu 小陈
-----------------------------------------------------------------------

看不到图啊

出0入0汤圆

 楼主| 发表于 2011-5-20 09:11:20 | 显示全部楼层
回复【22楼】xintrone
回复【20楼】chenyuqiu 小陈
-----------------------------------------------------------------------
看不到图啊
-----------------------------------------------------------------------

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

是你们的网速慢还是???
我昨晚发上来的时候都可以看到啊。
现在在上班网速不行我也看不到的

出0入0汤圆

发表于 2011-5-20 09:15:56 | 显示全部楼层
回复【23楼】chenyuqiu 小陈
-----------------------------------------------------------------------

LZ好像前段时间发过一个驱动步进电机的程序.

出0入0汤圆

 楼主| 发表于 2011-5-20 09:34:02 | 显示全部楼层
回复【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

出0入0汤圆

发表于 2011-5-20 09:39:24 | 显示全部楼层
楼主把资料打个包,好分享撒

出0入0汤圆

发表于 2011-5-20 09:59:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-20 11:48:16 | 显示全部楼层
图挂了~~

出0入0汤圆

 楼主| 发表于 2011-5-20 12:47:36 | 显示全部楼层
回复【28楼】monlika 电子钟
图挂了~~
-----------------------------------------------------------------------
不知道为什么,重新上传也上传不了,过一会我再上传试试看

出0入0汤圆

 楼主| 发表于 2011-5-20 14:06:06 | 显示全部楼层
汗,试了一个中午都上传不了

出0入0汤圆

发表于 2011-5-20 14:42:31 | 显示全部楼层
回复【20楼】chenyuqiu 小陈
-----------------------------------------------------------------------
allegro的步进ic也挺诡异的,有好些个市面上有卖有大量应用,就是没有pdf

这个能找到pdf么   a6628sedt  plcc44封装。。。。

出0入0汤圆

发表于 2011-5-20 14:46:07 | 显示全部楼层

出0入0汤圆

 楼主| 发表于 2011-5-20 15:22:52 | 显示全部楼层
回复【31楼】flyhouse 丷_丷
回复【20楼】chenyuqiu 小陈
-----------------------------------------------------------------------
allegro的步进ic也挺诡异的,有好些个市面上有卖有大量应用,就是没有pdf
这个能找到pdf么   a6628sedt  plcc44封装。。。。

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

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

出0入0汤圆

 楼主| 发表于 2011-5-20 16:16:45 | 显示全部楼层
怪了,图片又可以显示出来了

出0入0汤圆

发表于 2011-5-20 17:02:15 | 显示全部楼层
回复【33楼】chenyuqiu 小陈

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

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

不瞒你说,这个ic的pdf,偶找了6年。。。哈哈哈哈

出0入0汤圆

发表于 2011-5-20 17:28:21 | 显示全部楼层
果然是好东西~mark了~

出0入0汤圆

发表于 2011-5-20 17:28:42 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-20 21:51:52 | 显示全部楼层
谢谢分享

出0入0汤圆

 楼主| 发表于 2011-5-21 12:34:57 | 显示全部楼层
回复【38楼】hu7215
谢谢分享
-----------------------------------------------------------------------

不用客气!!

出0入0汤圆

发表于 2011-5-21 12:45:34 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-5-21 13:01:34 | 显示全部楼层
MARK!!!

出0入0汤圆

发表于 2011-5-30 17:40:30 | 显示全部楼层
我想问一下,
4个IO口控制电机4根信号线
你是如何给信号产生16细分的呢,
能不能说说你的给信号的思路?

出0入0汤圆

发表于 2011-5-30 17:41:07 | 显示全部楼层
我想问一下,
4个IO口控制电机4根信号线
你是如何给信号产生16细分的呢,
能不能说说你的给信号的思路?

出0入0汤圆

发表于 2011-5-30 18:44:01 | 显示全部楼层
关键的关键应该是马达的加减速控制

出0入0汤圆

 楼主| 发表于 2011-5-30 20:24:52 | 显示全部楼层
回复【42楼】mugangqin
我想问一下,
4个io口控制电机4根信号线
你是如何给信号产生16细分的呢,
能不能说说你的给信号的思路?

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

你好,关于你这个问题请你查看一下我发表的一个帖子:
STC11F16XE驱动4个步进电机(软件实现16细分),里面有原理图和驱动代码,加减速算法也有在里面.

出0入0汤圆

发表于 2011-5-31 17:16:01 | 显示全部楼层
犀利

出0入0汤圆

发表于 2011-5-31 17:28:41 | 显示全部楼层
好东东

出0入0汤圆

发表于 2011-5-31 17:45:50 | 显示全部楼层
权威

出0入0汤圆

 楼主| 发表于 2011-6-1 12:00:34 | 显示全部楼层
回复【48楼】xrwf_2009
权威
-----------------------------------------------------------------------

谢谢,权威这个就不敢当啊!!!

出0入0汤圆

发表于 2011-6-1 12:17:42 | 显示全部楼层
经典

出0入0汤圆

发表于 2011-6-1 12:29:26 | 显示全部楼层
cool

出0入0汤圆

发表于 2011-6-1 17:33:12 | 显示全部楼层
學習了,多謝!

出0入0汤圆

发表于 2011-6-2 14:14:26 | 显示全部楼层
谢谢!受教了。

出0入0汤圆

发表于 2011-6-2 15:05:44 | 显示全部楼层
真的难看懂

出0入0汤圆

 楼主| 发表于 2011-6-2 21:58:49 | 显示全部楼层
回复【54楼】lixingling
真的难看懂

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

技术上的东西不是看一下就能懂的,很多东西都是得靠慢慢钻研出来的

出0入0汤圆

发表于 2011-6-2 23:03:11 | 显示全部楼层
谢谢小陈同志给我们带来帮助,我们支持你!!

出0入0汤圆

发表于 2011-6-3 08:19:52 | 显示全部楼层
记号+膜拜

出0入0汤圆

发表于 2011-6-3 17:57:22 | 显示全部楼层
4个io口控制电机4根信号线  (电机为双极型步进电机)
你是如何给信号产生16细分的呢,  
能不能说说你的给信号的思路?

能不能用语句描述一下这个用软件做16细分的思路呢?
可以加我Q1352529817
你也可以给你Q我加你
谢谢!

出0入0汤圆

发表于 2011-6-3 19:53:22 | 显示全部楼层
学习中

出0入0汤圆

 楼主| 发表于 2011-6-3 21:21:46 | 显示全部楼层
回复【58楼】zjm520
4个io口控制电机4根信号线  (电机为双极型步进电机)
你是如何给信号产生16细分的呢,   
能不能说说你的给信号的思路?  
能不能用语句描述一下这个用软件做16细分的思路呢?
可以加我q1352529817
你也可以给你q我加你
谢谢!
-----------------------------------------------------------------------

A3992内部有一个64细分的PWM,我们可以通过写入相应的数据就可以了。你可以先去看看A3992的DataSheet.在结合我的驱动程序看就会明白的了,如果你的英文能力没问题的话那更好了,那样更容易理解我的驱动程序。
另:即使看不懂的话也可以直接用我上面的驱动代码,把驱动接口配置好就OK了。A3992是用SPI驱动的。所以接口很方便

出0入0汤圆

 楼主| 发表于 2011-6-3 21:23:45 | 显示全部楼层
感觉大家对电机这方面的资料很缺乏。

出0入0汤圆

发表于 2011-6-3 22:02:21 | 显示全部楼层
mark!

出0入0汤圆

发表于 2011-6-3 22:30:47 | 显示全部楼层
正在学习步进电机,谢谢了

出0入0汤圆

发表于 2011-6-4 09:07:57 | 显示全部楼层
回复【60楼】chenyuqiu 小陈
-----------------------------------------------------------------------

电机细机到底是怎么个思路?
不方便留个Q或电话什么的吗?
我现在用的是MD-123来做步进电机的驱动IC

出0入0汤圆

发表于 2011-6-4 09:16:47 | 显示全部楼层
在书上看那些细分方式都很笼统,所以想听听你对电机细分的具体思路。

出0入0汤圆

 楼主| 发表于 2011-6-5 12:48:31 | 显示全部楼层
回复【65楼】zjm520
在书上看那些细分方式都很笼统,所以想听听你对电机细分的具体思路。
-----------------------------------------------------------------------

现在都是用专用的驱动IC来做细分的啦。

出0入0汤圆

发表于 2011-6-6 17:22:44 | 显示全部楼层
不错,呵呵,到时候学习下!
要给空调厂做一个测试步进电机测试的小东西!

出0入0汤圆

发表于 2011-6-15 19:36:22 | 显示全部楼层
陈哥,有没有L6205N,加减速的代码。我想的都头疼了,希望向陈哥学习学习。283105876我的QQ。zhi_cheng_li@126.com

出0入0汤圆

发表于 2011-6-16 19:09:51 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-16 19:21:31 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2011-6-24 17:32:08 | 显示全部楼层
回复【68楼】lees
陈哥,有没有l6205n,加减速的代码。我想的都头疼了,希望向陈哥学习学习。283105876我的qq。zhi_cheng_li@126.com

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

加减速算法在我另一个帖子
”STC11F16XE驱动4个步进电机(软件实现16细分) “已经有共享出来了,你可以去看看,希望能帮得到你

出0入0汤圆

发表于 2011-6-30 09:30:08 | 显示全部楼层
回复【20楼】chenyuqiu 小陈
-----------------------------------------------------------------------
陈哥
L6205驱动怎用的呀?
能否贴出来分享下呀!最近在弄

出0入0汤圆

发表于 2011-6-30 10:32:33 | 显示全部楼层
不错有时间好好参考下

出0入0汤圆

发表于 2011-6-30 10:43:06 | 显示全部楼层
6205这种接法 没 DEADTIME 怎么行?

出0入0汤圆

 楼主| 发表于 2011-6-30 11:30:15 | 显示全部楼层
回复【74楼】wind2100
6205这种接法 没 deadtime 怎么行?
-----------------------------------------------------------------------

L6205芯片内部已经有自带衰减功能了。

出0入0汤圆

发表于 2011-6-30 11:32:07 | 显示全部楼层
不错顶一下

出0入0汤圆

发表于 2011-6-30 11:56:54 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-5 12:38:21 | 显示全部楼层
回复【10楼】chenyuqiu  小陈
回复【5楼】amazing030
我用l6219做高速球,和这个差不多吧……一毕业就是做这个
-----------------------------------------------------------------------
其实驱动电机并不难,难的是运用到产品上时细节上处理好才是关键,比如电机噪音很大,很响,运行时抖动,低速时不平滑,启动加速和刹车减速算法不合理等等这些细节上的技术处理才是驱动步进电机的难点,也是重要要点。
-----------------------------------------------------------------------

毕业前,毕业后一两年,或者再久,同样是把一个模块跑起来,但回去看一下以前写的代码,画的板子,
就会发现以前什么都不是。

出0入0汤圆

发表于 2011-7-5 20:50:59 | 显示全部楼层
mark!

出0入0汤圆

发表于 2011-7-19 19:17:09 | 显示全部楼层
这个要顶,mark慢慢看。

出0入0汤圆

发表于 2011-7-20 16:07:13 | 显示全部楼层
回复【75楼】chenyuqiu  小陈
-----------------------------------------------------------------------

小陈,你好~我也有几个关于步进驱动的问题想请教你一下。可不可以留给我你的QQ或者邮箱?这样好交流一些~非常感谢!!!!

出0入0汤圆

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

你好,我觉得还是在这里交流就行了,之前我有留下自己的QQ号码,但是现在不想再加人,有问题在这里讨论就行了。不好意思!!

出0入0汤圆

发表于 2011-7-20 16:21:56 | 显示全部楼层
回复【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相,感觉没什么问题。
不知道你有没有什么好的办法可以解决这个停顿的问题,谢谢你了~~~

出0入0汤圆

发表于 2011-7-21 10:30:31 | 显示全部楼层
顶起来

出0入0汤圆

 楼主| 发表于 2011-7-22 16:52:42 | 显示全部楼层
回复【84楼】mayiqing888
-----------------------------------------------------------------------

我用2803的时候也遇到跟你类似的现象,至今为止还无解。

出0入0汤圆

发表于 2011-7-22 18:53:32 | 显示全部楼层
这个对于步进电机的学者来说,真的不错

出0入0汤圆

发表于 2011-7-22 20:27:37 | 显示全部楼层
回复【楼主位】chenyuqiu 小陈
-----------------------------------------------------------------------

用来驱动LED到是不错的想法,能否有适合载波通信的,
电流在1.5A,开关速率在1.2MHz左右的?

出0入0汤圆

发表于 2011-7-22 21:08:47 | 显示全部楼层
MARK

出0入0汤圆

 楼主| 发表于 2011-7-26 15:55:19 | 显示全部楼层
回复【88楼】Onsunsl 金平合吾
回复【楼主位】chenyuqiu 小陈
-----------------------------------------------------------------------
用来驱动led到是不错的想法,能否有适合载波通信的,

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

你的想象能力也太丰富了吧?一般的大功率LED都是用恒流驱动IC来的,"电流在1.5a,开关速率在1.2mhz左右的"建议你看看LM3404合适你不

出0入0汤圆

发表于 2011-7-27 00:07:28 | 显示全部楼层
回复【75楼】chenyuqiu 小陈
回复【74楼】wind2100  
6205这种接法 没 deadtime 怎么行?  
-----------------------------------------------------------------------
l6205芯片内部已经有自带衰减功能了。
-----------------------------------------------------------------------

你的意思就是说不需要插入死区了?  你的那个板子稳定吗 烧过6205没?

出0入0汤圆

 楼主| 发表于 2011-7-28 09:51:00 | 显示全部楼层
回复【92楼】wind2100
-----------------------------------------------------------------------

这个倒是一个问题哦,如果IC不短路的话就不会烧,我有试过只要IC一短路就会烧的情况。请问92楼的你有用过L6205的吗?能不能把你的电路图发给大家看看?

出0入0汤圆

发表于 2011-7-28 11:31:00 | 显示全部楼层
谢谢楼主

出0入0汤圆

发表于 2011-7-28 12:22:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-28 12:24:05 | 显示全部楼层
据我所知 L6025 是意法半导体的 步进电机H桥驱动电路 不带死区时间 需要自己插入
在步进电机 内阻比较小 或是电流比较大的情况下 会烧H桥的。 当然 你可以选择内阻比较大的电机 从而(就算磁饱和了 也可以)达到电阻限流的作用。

出0入0汤圆

发表于 2011-7-28 13:53:55 | 显示全部楼层
MARK

出0入0汤圆

 楼主| 发表于 2011-7-28 16:58:14 | 显示全部楼层
回复【97楼】wind2100
据我所知 l6025 是 步进电机h桥驱动电路 不带死区时间 需要自己插入  
在步进电机 内阻比较小 或是电流比较大的情况下 会烧h桥的。 当然 你可以选择内阻比较大的电机 从而(就算磁饱和了 也可以)达到电阻限流的作用。
-----------------------------------------------------------------------

L6205是意法半导体的,但是我用了这么久基本上是没因为电流过大而烧IC,只不过感觉这个IC是比较脆弱点,一短路就很容易烧。
还有就是很想请问wind2100如何自己手动插入死区时间?

出0入0汤圆

发表于 2011-7-28 22:05:50 | 显示全部楼层
死区时间这个需要MCU来处理  也有MOS管驱动 有这个死区时间的 但是是固定的。

出0入0汤圆

 楼主| 发表于 2011-7-29 13:43:41 | 显示全部楼层
回复【100楼】wind2100
死区时间这个需要mcu来处理  也有mos管驱动 有这个死区时间的 但是是固定的。
-----------------------------------------------------------------------

能不能具体举个例子说明一下呢?谢谢!!

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-10-3 07:25

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

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