有图有真相 ULN2003A驱动 24BYJ48步进电机 失步的问题
本帖最后由 LGY910 于 2012-9-10 16:28 编辑主控芯片 STC12C5A08-AD 1T 贴片
驱动芯片 ULN2003A 贴片
步进电机 24BYJ48 - 12V
问题如下
1.驱动步进电机时有失步现象,造成角度错误。
已考虑过问题
1.启动频率过高 (频率减速启动也还是有失步现象,说明书说500PPS,减速到250PPS启动依然失步)
2.负载过重 (负载基本可以不考虑,无负载)
3.电压电流不够 (额定电压12V,实际电压15V,电流测试过ULN2003双通道驱动一相,依然失步)
4.相序,拍数不对 (相序再三测试过没问题用的 4相4拍 )
5.IO口设置不对 (设置的是强上拉,无上拉电阻)
示波器观察步进电机波形如下,这个是正确的
波形图最后有缺口,这个波形有点不对,最后有缺口
原理图如下
感觉问题就出在波形缺口上
请各位老大看一看怎么解决,谢谢各位。
驱动程序如下
#include "stc5a08ad.h"
#include <intrins.h>
#define uchar unsigned char
#define uintunsigned int
code uchar tab= {0x06,0x03,0x09,0x0c};
code uchartab1 = {0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
uchar angle1 = 0;
/*--------------步进电机参数-----------------*/
uint cnt5;
uchar sl;
sbit P04 = P0^4;
sbit P05 = P0^5;
sbit P06 = P0^6;
sbit P07 = P0^7;
void Io_Init(void)
{
P0M0 = 0xf0;
P0M1 = 0x00;
P0 &= 0x0f;
}
void dj_delay(void) // 2ms
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=222;b>0;b--)
for(a=12;a>0;a--);
}
void dj_run(void)
{
if((sl == 1) && cnt5)
{
cnt5--;
if(angle1 < 3)angle1++;
else angle1=0;
P0 = 0x0f;
_nop_();
_nop_();
P0 |= tab<<4;
}
else if((sl == 0) && cnt5)
{
cnt5--;
if(angle1 > 0)angle1--;
else angle1=3;
P0 = 0x0f;
_nop_();
_nop_();
P0 |= tab<<4;
}
if(cnt5 == 0)
{
P0 &= 0x0f;
}
dj_delay();
}
void delay(void) //误差 -0.000000000111us
{
unsigned char a,b,c;
for(c=71;c>0;c--)
for(b=168;b>0;b--)
for(a=250;a>0;a--);
}
/*------------------------------------*/
void main(void)
{
Io_Init();
while(1){
cnt5 = 160;
sl = 0;
while(cnt5)dj_run();
delay();
cnt5 = 160;
sl = 1;
while(cnt5)dj_run();
delay();
}
}
本帖最后由 LGY910 于 2012-9-10 14:38 编辑
饿希望有高手路过指导一下。。上面那个图发错了,有缺口的是反转,无缺口的是正转。。。十分不解为何正反转波形却不一样。。{:dizzy:}
只有看的没有回的???是不是觉得太低级了?? 算了。。今天下午仔细对比了波形,发现其实缺口不是主要因素,现在能做的是,尽量做曲线加速。。但是效果不明显,暂时没想出很好的办法,只有做换向补偿,以及其他补偿一点。。
那天有高手路过了告诉我终极办法。。。谢谢了我QQ 506472517 我也在学步进电机 ,正好可以参考一下,谢谢分享!{:smile:} 大哥你好!我问下你的那个驱动电路输出要上拉12v电阻了吗?怎么我输入高输出电压估计也就0.3v输入低也是低? const unsigned char Motor1Table={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; 用这个表
取消 P0 = 0x0f;这个试一试,,,,,,上次用来调PID控制都没有出现丢步的现象,
页:
[1]