for (i=0; i<8; i++) //一个周期转30度
{
P1 = FFW; //取数据
delay(); //调节转速
}
如果4拍或者8拍,都必须一次走完4拍或者8拍,那要怎么才能实现一次只走一个步距角呢?
就是说上面程序中的i应该必须是8吧?换乘1~7应该电机就不转了吧。
CIOneTwo 发表于 2011-8-30 12:51
也不是一定要走完 , 只在顺序能接上很方便,
只走 几拍也行, 程序上在作些处理就是了,
你只要搞实基础, 就能玩出很多花样,
以前写过的一个程序 这个就是单独走一步的,2个步进电机独立有自己的方向和速度
//===================
更新一下控制程序把
电路 就用到2个 ULN2003 其它的现在还是直接IO驱动(电源部分还没接入,电源部分会有339电压比较器)
这次用C语言中的 "|" 运算来解决 一组 IO 同时驱动2个 步进电机同时工作时对另一个电机的影响(表现为另一个电机丢步,丧失准确的驱动力)
//--------- 两相 5/6 线 步进电机同极性 2拍半/8拍 驱动----------------------------
// uchar code zj2[8]={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90}; ////P14~7.
10000000
11000000
01000000
01100000
00100000
00110000
00010000
10010000
(但愿我没打反了~~~哈哈)
void motor_ffw2()
{
// uchar i;
for (i=0; i<8; i++) //
{
P1 = fj2;
delay(30); //上电延时(也可以说是变相控制频率/转速了)
// delay();
//调节转速
(一个电机单独工作是没问题的)
//-------------------------------------
for (i=0; i<8; i++)
{
P1 = zj1; //取数据
delay(ccc2);
P1 = fj2; //取数据
delay(ccc);
这个驱动流程序就出问题(也可定义为逻辑错误了)
先是控制弟一个电机走一步 P1 = zj1; //对应用的IO 为 0000XXXX
在控制 弟二个电机走一步 P1 = fj2; //对应用的IO 为 XXXX0000 //问题就出在了弟二次控制这了 这一改变IO 后导致 弟一个IO的电机~~~ 掉电 (ULN2003IO为高电平驱动)电机失去自己锁能,张紧力丢失.
//-------------------------------------
使用了 "|" 运算 后 0000xxxx|xxxx0000 =xxxxxxxx 这样一组IO驱动2个电机都正常工作了
#include <reg51.h>
#include <intrins.h> //内部包含延时函数 _nop_();
#define uchar unsigned char
#define uint unsigned int
sbit key1 = P3^2; //进入设置菜单
sbit key2 = P3^3; //确定设置
sbit key3 = P3^4;
sbit key4 = P3^5;
sbit key5 = P3^6; // a1 ++
sbit key6 = P3^7; // a ++
sbit key8 = P3^0; // a1 ++
sbit key9 = P3^1;
uchar code table[]={0x28,0xeb,0x32,0xa2,0xe1,0xa4,0x24,0xea,0x20,0xa0,0xff};
uchar code zj1[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //P10~3. P20-3
uchar code fj1[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; //P10~3. P20-3
uchar code zj2[8]={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90}; ////P14~7.
uchar code fj2[8]={0x90,0x80,0xc0,0x40,0x60,0x20,0x30,0x10}; ////P14~7.
void delay(uint z);
uint aaa,bbb,ccc,ccc2,ggg,ggg2 ;
uchar smg,i2,i;
void time0_int(void) interrupt 1
{
TR0=0;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
smg++; //数码管
//ccc++; //
ggg++; // 电机1
ggg2++; // 电机2
TR0=1;
}
/********************************************************/
void delay(uint z)
{
do{
_nop_();_nop_();_nop_();
}while(--z);
}
main()
{
TMOD=0x01; //定时器0为方式1
TH0=(65536-2000)/256; //给T0赋初值
TL0=(65536-2000)%256; //定时5ms
ET0=1; //使能TO中断
EA=1; //开启总中断使能
TR0=1; //T0开始计数
bbb=100;
ccc=30;
ccc2=40;
ggg=0;
ggg2=0;
i=0;
i2=0;
//aaa=1;//测试
//P2=0xff; //测试
//P1=0x00;//测试
while(1)
{
if(key1==0)
{
aaa=1;
}
if(key2==0)
{
aaa=2;
}
if(key3==0)
{
aaa=3;
}
if(key4==0)
{
aaa=4;
}
if(aaa==1)
{
if(ggg>ccc)
{
ggg=0;
P1=zj1|fj2[i2];//1 1正 2反
//P1=zj1|zj2[i2];//2 1正 2正
//P1=fj1|zj2[i2];//3 1反 2正
//P1=fj1|fj2[i2];//4 1反 2反
i++;
if(i>8)
{
i=0;
}
}
if(ggg2>ccc2)
{
ggg2=0;
// P1=0x00;
P1=zj1|fj2[i2];//1 1正 2反
//P1=zj1|zj2[i2];//2 1正 2正
//P1=fj1|zj2[i2];//3 1反 2正
//P1=fj1|fj2[i2];//4 1反 2反
i2++;
if(i2>8)
{
i2=0;
}
}
}
if(aaa==2)
{
if(key3==0)
{
ccc++;
delay(300);
}
if(key4==0)
{
ccc--;
delay(300);
}
if(ggg>ccc)
{
ggg=0;
i++;
if(i>8)
{
i=0;
}
//P1=zj1|fj2[i2];//1 1正 2反
P1=zj1|zj2[i2];//2 1正 2正
//P1=fj1|zj2[i2];//3 1反 2正
//P1=fj1|fj2[i2];//4 1反 2反
}
}
if(aaa==3)
{
if(key3==0)
{
ccc++;
delay(300);
}
if(key4==0)
{
ccc--;
delay(300);
}
if(ggg>ccc)
{
ggg=0;
i++;
if(i>8)
{
i=0;
}
//P1=zj1|fj2[i2];//1 1正 2反
//P1=zj1|zj2[i2];//2 1正 2正
P1=fj1|zj2[i2];//3 1反 2正
//P1=fj1|fj2[i2];//4 1反 2反
}
}
if(aaa==4)
{
if(key3==0)
{
ccc++;
delay(300);
}
if(key4==0)
{
ccc--;
delay(300);
}
if(ggg>ccc)
{
ggg=0;
i++;
if(i>8)
{
i=0;
}
//P1=zj1|fj2[i2];//1 1正 2反
//P1=zj1|zj2[i2];//2 1正 2正
//P1=fj1|zj2[i2];//3 1反 2正
P1=fj1|fj2[i2];//4 1反 2反
}
}
/*
*/
}//w1
}//ma |