从废旧的光驱上拆除了几个电机,发现其中有个四线步进电机,拆下来后控制着玩了玩,挺好玩,这东西用在机器人上的话感觉会很牛逼。。。
四线步进电机不介绍了,网上有海量的资料,用万用表查出来相序,
驱动电路用的L298N,本来用这块板子做我的水下机器人玩的,暂时拆下来用用。。。
单片机用的atmega128,实验室还有DSP,哥还不会用。。。
好了,先上代码:用ICC编译环境
/*================================== 文件:stepMotor 功能:测试步进电机 ===================================*/ #include <iom128v.h> #include <macros.h> #define STEP_NUM 8 char stepRun[STEP_NUM]={0x01,0x05,0x04,0x06,0x02,0x0a,0x08,0x09}; /*================================== 函数:延时 功能: ===================================*/ void delay_gh(unsigned char times) { unsigned char i,k; for(i=0;i<0xff;i++) for(k=times;k>0;k--); } /*================================== 函数:正转函数 功能: 入口参数:正转速度级别,圈数(若圈数为负,则永远转下去) ===================================*/ void run_clockwise(unsigned char speed,signed char sicleNUM) { unsigned char i,round=0; if(sicleNUM<0) { while(1) { for(i=0;i<STEP_NUM;i++) { PORTC=stepRun[i]; delay_gh(speed); } } } else { while(round++<sicleNUM) { for(i=0;i<STEP_NUM;i++) { PORTC=stepRun[i]; delay_gh(speed); } } } } /*================================== 函数:反转函数 功能: 入口参数:反转速度级别,圈数(若圈数为负,则永远转下去) ===================================*/ void run_unclockwise(unsigned char speed,signed char sicleNUM) { unsigned char i,round=0; if(sicleNUM<0) { while(1) { for(i=STEP_NUM-1;i>0;i--) { PORTC=stepRun[i]; delay_gh(speed); } } } else { while(round++<sicleNUM) { for(i=STEP_NUM-1;i>0;i--) { PORTC=stepRun[i]; delay_gh(speed); } } } } /*================================== 函数:void portInit(void) 功能:端口初始化 ===================================*/ void portInit(void) { DDRC|=(1<<PC0)|(1<<PC1)|(1<<PC2)|(1<<PC3);//stepMotor 连接的PC口设置为输出 } /*================================== 函数:main() 功能: ===================================*/ int main() { while(1) { portInit(); //正转 run_clockwise(0xf,58); delay_gh(0xff); //返转 run_unclockwise(0x3f,58); delay_gh(0xff); } }
还有视频,呵呵,看网上很多大牛分享自己的图片啊,视频啊,那个把我眼馋的。。。mlgb的,咱也这样玩玩。。。
视频马上传。。。
下一步想把这东西弄到arm上,让linux控制步进电机,控制出速度、转角,把加速度计和步进电机结合起来肯定会很好玩