STC11F16XE驱动4个步进电机(软件实现16细分)
用STC11F16XE驱动4个2803带动4个步进电机,每个电机都是用软件实现16细分,有图片:http://cache.amobbs.com/bbs_upload782111/files_35/ourdev_603107N91302.jpg
(原文件名:1.jpg)
http://cache.amobbs.com/bbs_upload782111/files_35/ourdev_603108OCRXVA.jpg
(原文件名:2.jpg) 学习 mark. 关键的代码及如何实现的还望楼主能详细介绍,谢谢 回复【3楼】lwg998
-----------------------------------------------------------------------
呵呵,这个很简单的,如果有需要的话我可以说说 关注。。。 回复【3楼】lwg998
关键的代码及如何实现的还望楼主能详细介绍,谢谢
-----------------------------------------------------------------------
强烈需要呀,希望楼主能详细说说呀 想知道的话可以留下联系方式 很需要,希望楼主能讲讲课! 我现在就在用四个步进电机做产品,效果很好,上面那个图就是我们刚刚开发的电机方面的 liuguang1958@163.com
QQ:364801797 很不错,想了解细分思路。 cwcbacmwk@21cn.com
QQ:176534519 先上传关键代码先
ourdev_603668MNBQGC.txt(文件大小:1K) (原文件名:StepMotor.txt) 楼主还是把所有代码发上来,要不大家怎么研究,你这个电路谁都会画关键是算法啊,你只给一个函数我们怎么知道怎么个意思! 萍踪侠影 我再上传一个
ourdev_603678RIWDFW.txt(文件大小:234字节) (原文件名:StepMotor1.txt)
后面的就要由你们自己去理解啦,根据我给的原理图结合我的关键代码各位高手应该都是能够看出算法的 如果还有不明白的话我再讲解一下,这样你们先思考更能够理解这个算法 不好意思,ourdev_603678RIWDFW.txt(文件大小:234字节) (原文件名:StepMotor1.txt)是错误的,我更改为下面这个
ourdev_603683P029LI.txt(文件大小:203字节) (原文件名:StepMotor1.txt) #include "Uln2803Drive.h"
SUln2803Drive Uln2803;
volatile unsigned char idata
cPwmDriveBuffer;
unsigned char code cTableUnl2803DriveMask[]=
{
0xfc, 0xf3,0xcf,0x3f,
};
unsigned char code cTableUnl2803DrivePhase[] =
{
0x03, 0x01, 0x00, 0x02, 0x03,
0x0c, 0x08, 0x00, 0x04, 0x0c,
0x30, 0x10, 0x00, 0x20, 0x30,
0xc0, 0x40, 0x00, 0x80, 0xc0,
};
unsigned int code wTableUnl2803DriveValue[] =
{
0x0000, 0x0080, 0x0820, 0x1110, 0x2244, 0x2492, 0x4a52, 0x5554,
0xaaaa, 0xabaa, 0xbaae, 0xbbba, 0xeeee, 0xeefe, 0xf7f7, 0x7fff,
};
void Uln2803Drive(unsigned char cPort, unsigned char cPosition)
{
unsigned long int
wTemp;
unsigned char
c,
cDriveValue,
cPhaseValueLeft,
cPhaseValueRight,
cShieldValue;
cPosition &= 0x3f;
wTemp = wTableUnl2803DriveValue;
cPhaseValueLeft= cTableUnl2803DrivePhase[(cPosition / 16) + (cPort * 5)];
cPhaseValueRight = cTableUnl2803DrivePhase[(cPosition / 16) + (cPort * 5) + 1];
cShieldValue = cTableUnl2803DriveMask;
for (c = 0; c != 16; c ++)
{
if (wTemp & 0x0001)
cDriveValue = cPhaseValueRight;
else
cDriveValue = cPhaseValueLeft;
cPwmDriveBuffer &=cShieldValue;
cPwmDriveBuffer |=cDriveValue;
wTemp >>= 1;
}
cPwmDriveBuffer &=cShieldValue;
cPwmDriveBuffer |=cPhaseValueRight;
}
void Timer0_IRQHandler(void) interrupt 1 //8us中断一次
{
if (Uln2803.cCount > 16)
Uln2803.cCount = 0;
P0 = cPwmDriveBuffer;
++ Uln2803.cCount;
} MARK 这个函数void Uln2803Drive(unsigned char cPort, unsigned char cPosition) 中“unsigned char cPort”是指第几个电机端口,数据只能是0到3,“unsigned char cPosition”就是驱动电机是步数值,这个可以放在你们自己的电机模块中,整个函数都可以被四个电机驱动模块调用,只要把端口区分开来就可以了 还有不明白的地方吗? 8US中断一次,单片机可够累得! 还可以的,关键就是得看你怎么处理你的程序咯 步进的加减速怎么实现呢? 没看出来哪好 mark 回复【26楼】luhuaren
没看出来哪好
-----------------------------------------------------------------------
呵呵,等你用过才知道它的好处 回复【24楼】chenyuqiu 小陈
还可以的,关键就是得看你怎么处理你的程序咯
-----------------------------------------------------------------------
加减速处理得由各位自己处理咯,我只是提供思路,不过想知道的话也是可以留下联系方式的,我这里有步进电机加减速的处理程序 又看到楼主的作品,晚上学习学习。
谢谢了 回复【30楼】xiaowu191
又看到楼主的作品,晚上学习学习。
谢谢了
-----------------------------------------------------------------------
小巫同志,那个软件会不会用啊?电机调试好了吗?还会不会抖啊? 收藏,晚上催眠用 回复【31楼】chenyuqiu小陈
-----------------------------------------------------------------------
还真是不会用啊,你有空,指导一下才行 好像相电流是这样?
http://cache.amobbs.com/bbs_upload782111/files_35/ourdev_603790FV4PZN.JPG
(原文件名:未命名.JPG) </center> 懂了,挺简单的,这个函数不错 回复【22楼】chenyuqiu 小陈
还有不明白的地方吗?
-----------------------------------------------------------------------
有。
这个就是十七细分吗?
if (Uln2803.cCount > 16)
Uln2803.cCount的值分别可以是0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
加上0 就17细分啦。 那个应该是PWM的分辨率,
到时搭个电路效果, 崇拜
但是看不懂
最好详细详细再详细
新手没办法理解 加减速控制是步进电机不丢步的关键,那么你这四个电机最大驱动速度可以到多少呢 回复【39楼】lwg998
加减速控制是步进电机不丢步的关键,那么你这四个电机最大驱动速度可以到多少呢
-----------------------------------------------------------------------
其实速度还要看你用什么电机,不同电机有不同的性能的,效果肯定比没细分的好 回复【34楼】xiaowu191
好像相电流是这样?
(原文件名:未命名.jpg)
-----------------------------------------------------------------------
看这个图一应该是你的电机的相电流太低了,你的电路驱动所设置的最高电流高过你当前所用电机的最大相电流。所以你得换换电机,找一个相电流更大的。 回复【36楼】NE555
回复【22楼】chenyuqiu 小陈
还有不明白的地方吗?
-----------------------------------------------------------------------
有。
这个就是十七细分吗?
if (uln2803.ccount > 16)
uln2803.ccount的值分别可以是0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
加上0 就17细分啦。
-----------------------------------------------------------------------
呵呵,是的,第17步是补偿的,不加这一步的话效果不理想。所以还请大家想想更好的细分方法 自己顶一下 我也来顶一下。 马克 哈哈。终于大致看懂啦。
谢谢楼主。
觉得楼主风格有点与众不同。 回复【46楼】NE555
哈哈。终于大致看懂啦。
谢谢楼主。
觉得楼主风格有点与众不同。
-----------------------------------------------------------------------
我的风格是一位很厉害的软件工程师教我的,对比其他人写的程序风格我觉得还是自己的风格比较好,呵呵。这种风格很容易让其他人看得懂,程序模块化性很强等等 我也来顶一下。 回复【47楼】chenyuqiu 小陈
回复【46楼】ne555
哈哈。终于大致看懂啦。
谢谢楼主。
觉得楼主风格有点与众不同。
-----------------------------------------------------------------------
我的风格是一位很厉害的软件工程师教我的,对比其他人写的程序风格我觉得还是自己的风格比较好,呵呵。这种风格很容易让其他人看得懂,程序模块化性很强等等
-----------------------------------------------------------------------
LZ放一个完整的工程出来,学习一下! 回复【49楼】eworker
-----------------------------------------------------------------------
呵呵,我一个工程文件很大的哦 有几百K? 呵呵,没有啦。想要的话可以留下联系方式 强烈想要,楼主不要藏着掖着啦,逗大家胃口。
俺的神啊,俺下周就开始捣鼓电机,不过我同事已经做好了一个,也是用STC的,最近由我接手软件,算法方面正在钻研。
楼主是否放出全部工程参考一下。
邮件:wgj_king@163.com
QQ:372215923 想要。
请“小陈”有空发一份到 c118124@sina.com
谢谢 今天我大开杀戒,把我最珍贵的步进电机加减算法公布出来,大家好好收藏!!!!
unsigned int code wTableBrakeSpace211_1[] =
{
0, 2, 5, 9, 14, 20, 27, 35, 44, 54, 65, 77, 90,104,119,135,
152,170,189,209,230,252,275,299,324,350,377,405,434,464,495,527,
560,594,629,665,702,740,779,819,860,902,945,989, 1034, 1080, 1127, 1175,
1224, 1274, 1325, 1377, 1430, 1484, 1539, 1595, 1652, 1710, 1769, 1829, 1890, 1952, 2015, 2079,
2144, 2210, 2277, 2345, 2414, 2484, 2555, 2627, 2700, 2774, 2849, 2925, 3002, 3080, 3159, 3239,
3320, 3402, 3485, 3569, 3654, 3740, 3827, 3915, 4004, 4094, 4185, 4277, 4370, 4464, 4559, 4655,
4752, 4850, 4949, 5049, 5150, 5252, 5355, 5459, 5564, 5670, 5777, 5885, 5994, 6104, 6215, 6327,
6440, 6554, 6669, 6785, 6902, 7020, 7139, 7259, 7380, 7502, 7625, 7749, 7874, 8000, 8127, 8255,
8384, 8514, 8645, 8777, 8910, 9044, 9179, 9315, 9452, 9590, 9729, 9869,10010,10152,10295,10439,
10584,10730,10877,11025,11174,11324,11475,11627,11780,11934,12089,12245,12402,12560,12719,12879,
13040,13202,13365,13529,13694,13860,14027,14195,14364,14534,14705,14877,15050,15224,15399,15575,
15752,15930,16109,16289,16470,16652,16835,17019,17204,17390,17577,17765,17954,18144,18335,18527,
18720,18914,19109,19305,19502,19700,19899,20099,20300,20502,20705,20909,21114,21320,21527,21735,
21944,22154,22365,22577,22790,23004,23219,23435,23652,23870,24089,24309,24530,24752,24975,25199,
25424,25650,25877,26105,26334,26564,26795,27027,27260,27494,27729,27965,28202,28440,28679,28919,
29160,29402,29645,29889,30134,30380,30627,30875,31124,31374,31625,31877,32130,32384,32639,32895,
65535
};
#include "Motor.h"
#include "Pan.h"
bit
bPanMotorMove,
bPanMotorDirection,
bPanPositionInverse;
unsigned char xdata
cPanDmxValue,
cPanPositionValue,
cPanAutoSpeed,
cPanOffsetValue,
cPanDriveValue,
cPanDriveDelay;
unsigned char xdata
cPanMotorSpeed,
cPanMotorNowSpeed,
cPanMotorResetStep;
unsigned int xdata
wPanMotorNowPosition,
wPanMotorEndPosition;
void PanSetSpeed(void)
{
if (cPanAutoSpeed < PAN_MAX_SPEED)
{
cPanMotorSpeed = cPanAutoSpeed;
}
else
{
cPanMotorSpeed = PAN_MAX_SPEED;
}
}
void PanGetAutoSpeed(unsigned int i)
{
cPanAutoSpeed = i / 350;
PanSetSpeed();
}
void PanReset(void)
{
// initial
cPanMotorNowSpeed = 0;
wPanMotorNowPosition = 30000;
// Dmx
cPanDmxValue = 0;
cPanPositionValue = 0;
// reset
wPanMotorEndPosition = 0;
cPanMotorSpeed = 5;
// state
cPanMotorResetStep = 127;
// flag
PanSetMoveFlag();
Motor.wResetState |= (1 << PAN);
}
void PanProcStep(void)
{
unsigned char c;
DOUBLE_BYTE i;
if (wPanMotorNowPosition > wPanMotorEndPosition)
{
i.word = wPanMotorNowPosition - wPanMotorEndPosition;
c = DECREASE;
}
else
{
i.word = wPanMotorEndPosition - wPanMotorNowPosition;
c = INCREASE;
}
if ((i.word != 0) || (cPanMotorNowSpeed != 0))
{
if (c != bPanMotorDirection)
{
bPanMotorDirection = c;
if (cPanMotorResetStep == 0)
{
PanGetAutoSpeed(i.word);
}
}
if ((c != bPanMotorDirection) || (i.word < wTableBrakeSpace211_1))
{
c = 0;
}
else if ((i.word < wTableBrakeSpace211_1) && (cPanMotorSpeed > cPanMotorNowSpeed))
{
c = cPanMotorNowSpeed;
}
else
{
c = cPanMotorSpeed;
}
if (cPanMotorNowSpeed != c)
{
if (cPanMotorNowSpeed < c)
{
++ cPanMotorNowSpeed;
}
else
{
-- cPanMotorNowSpeed;
}
}
c = cPanMotorNowSpeed;
if (c == 0)
{
c = 1;
}
if (bPanMotorDirection)
{
wPanMotorNowPosition += c;
}
else
{
wPanMotorNowPosition -= c;
}
c = wPanMotorNowPosition >> 4;
if (c != cPanDriveValue)
{
cPanDriveValue = c;
Uln2803Drive(0, -c);
}
}
else if (PanIsMove())
{
PanClearMoveFlag();
}
else if (cPanMotorResetStep)
{
wPanMotorNowPosition = 0;
wPanMotorEndPosition = 0;
cPanMotorResetStep = 0;
Motor.wResetState &= ~(1 << PAN);
}
}
void PanProcPositionDmxValue(unsigned char c)
{
DOUBLE_BYTE i;
cPanPositionValue = c;
if (bPanPositionInverse)
{
c = 255 - c;
}
wPanMotorEndPosition = c* 100;
if (wPanMotorNowPosition > wPanMotorEndPosition)
{
i.word = wPanMotorNowPosition - wPanMotorEndPosition;
c = DECREASE;
}
else
{
i.word = wPanMotorEndPosition - wPanMotorNowPosition;
c = INCREASE;
}
if ((c == bPanMotorDirection) || (cPanMotorNowSpeed == 0))
{
PanGetAutoSpeed(i.word);
}
PanSetMoveFlag();
} 没人顶,自己再顶一下。 这是梯形,还是S形 加减速呀! 没有仔细看.
最好用一个应用接口.
如: Moto(运行步数,最高频率,启动时间) 再帮你顶一下.
步进电机三轴联动的快速加减速算法研究ourdev_603986JAXL9A.pdf(文件大小:156K) (原文件名:步进电机三轴联动的快速加减速算法研究.pdf) 回复【57楼】SystemARM
-----------------------------------------------------------------------
是梯形的 wo ding 我再顶 谢谢楼主的资料,觉得楼主的姿态有点高。 回复【62楼】exploer
谢谢楼主的资料,觉得楼主的姿态有点高。
-----------------------------------------------------------------------
我的姿态有点高??????????? 谢谢楼主的东东,不如都放出来! 呵呵,上面的东西已经很有参考价值的啦!! make mark 我也留个记号 我自己再顶!!! 我顶一顶,mark一下 支持楼主,步进电机细分真不错,有空学习下了 急停功能如何实现的?或 需求当按下停止键后,当前步执行完后再停止, 如何实现, 谢谢 您好:
楼主能否给我发一份?我的邮箱是1dychen_04@163.com 元旦放假仔细看看,感谢楼主提供思路 软件细分?楼主的意思是PWM是由CPU直接产生?每个细分步都不用电流反馈吗?如此能达到多少转速?PWM的最小脉宽是否8uS?1000000/8=125000/16=7812.5HZ/(200整步)=2343.75,这样算来速度很高啊。那个2803会不会发热呢? 谢谢,这个有用的上,过两天仔细看看 mark mark Mark 回复【75楼】xiaobendan 仲跻东
软件细分?楼主的意思是pwm是由cpu直接产生?每个细分步都不用电流反馈吗?如此能达到多少转速?pwm的最小脉宽是否8us?1000000/8=125000/16=7812.5hz/(200整步)=2343.75,这样算来速度很高啊。那个2803会不会发热呢?
-----------------------------------------------------------------------
2803不会很热的,我是做舞台灯光这个行业的,驱动步进马达这部分我们一定是避免不了的,而且要求也是比较高的,具体的转速我就没测试过,但是用PWM做出来的效果是真的很好. 回复【72楼】winkle
急停功能如何实现的?或 需求当按下停止键后,当前步执行完后再停止, 如何实现, 谢谢
-----------------------------------------------------------------------
你好,当你需要执行完当前步再停止的话我那个程序就是这样处理的;当你需要立刻停止的话一般是不再发送脉冲信号给步进马达就好,不过这样有可能会失步.转速过快时有可能刹车不住的. 回复【79楼】dmxfeng
mark
-----------------------------------------------------------------------
请问你也是做舞台灯光这个行业的吧??? 我也做了STC控制4步进,比起楼主来惭愧了,我用的是TB6560,细分硬件完成了,速度只能到1000rpm。有兴趣的看下视频吧
http://v.youku.com/v_show/id_XMTY1MjYzMjEy.html 回复【83楼】liujing0146
我也做了stc控制4步进,比起楼主来惭愧了,我用的是tb6560,细分硬件完成了,速度只能到1000rpm。有兴趣的看下视频吧
http://v.youku.com/v_show/id_xmty1mjyzmjey.html
-----------------------------------------------------------------------
视频我看过啦,很强悍!!! ding 回复【81楼】chenyuqiu 小陈
回复【72楼】winkle
急停功能如何实现的?或 需求当按下停止键后,当前步执行完后再停止, 如何实现, 谢谢
-----------------------------------------------------------------------
你好,当你需要执行完当前步再停止的话我那个程序就是这样处理的;当你需要立刻停止的话一般是不再发送脉冲信号给步进马达就好,不过这样有可能会失步.转速过快时有可能刹车不住的.
-----------------------------------------------------------------------
执行完当前步再停止的话我那个程序就是这样处理的, ---讨教一下是通过外部中断实现吗?如果是外部中断的话就会出现失步,过冲。 mark一下 回复【86楼】winkle
执行完当前步再停止的话我那个程序就是这样处理的, ---讨教一下是通过外部中断实现吗?如果是外部中断的话就会出现失步,过冲。
-----------------------------------------------------------------------
我的程序不是用外部中断的,只要程序处理得当(加减速算法处理得合理的话),应该不会有失步现象的. 回复【88楼】chenyuqiu 小陈
回复【86楼】winkle
执行完当前步再停止的话我那个程序就是这样处理的, ---讨教一下是通过外部中断实现吗?如果是外部中断的话就会出现失步,过冲。
-----------------------------------------------------------------------
我的程序不是用外部中断的,只要程序处理得当(加减速算法处理得合理的话),应该不会有失步现象的.
-----------------------------------------------------------------------
是不是通过硬件支持啊, 如停止键设计为常闭和键,按下后I/O被拉低;等待当前步完成后检测该flag,如果是低则保存当前状态后停机.
chenyuqiu 小陈:讲一下你的思路, open一下 回复【89楼】winkle
请问一下你是把步进马达运用在哪方面的呢? 回复【90楼】chenyuqiu 小陈
回复【89楼】winkle
请问一下你是把步进马达运用在哪方面的呢?
-----------------------------------------------------------------------
消费电子行业, 生产线.
可否交流一下:我的QQ 344891192 (公司禁止上QQ,只有下班在家) 回复【91楼】winkle
回复【90楼】chenyuqiu 小陈
回复【89楼】winkle
请问一下你是把步进马达运用在哪方面的呢?
-----------------------------------------------------------------------
消费电子行业, 生产线.
可否交流一下:我的qq 344891192 (公司禁止上qq,只有下班在家)
-----------------------------------------------------------------------
我已经加你了,欢迎大家多多交流!!! 我自己再顶~~~~~~ 楼主还是讲讲细分思路吧!不然新手很难理解 楼主风格有点与众不同
但我没看出来这种风格有什么好的,很别扭 顶一下 回复【95楼】zhuyi25762
楼主风格有点与众不同
但我没看出来这种风格有什么好的,很别扭
-----------------------------------------------------------------------
呵呵,每个人写的程序风格都是属于自己喜欢的,能够让自己接受的,看别人写的时候可能一时就适应不过来,是不是这样的? 顶下.
小弟也想进舞台灯光行业,但无从下手.望楼主给一个舞台灯光的小项目给小弟参考.
DMX512部分和步进电机的.
邮箱:xxiangj@tom.com.QQ:344820687
多谢! 回复【98楼】xxiangj
顶下.
小弟也想进舞台灯光行业,但无从下手.望楼主给一个舞台灯光的小项目给小弟参考.
dmx512部分和步进电机的.
邮箱:xxiangj@tom.com.qq:344820687
多谢!
-----------------------------------------------------------------------
呵呵,你之前就已经加我QQ啦~~~~