|
玩了好久单片机最近没啥感兴趣的东西了,打理抽屉是翻出了一个小电机,是很多年前在废了的传真机上拆下来的,有6根引线分别是:两根红色、黑、橙、棕、黄色;此时,我对步进电机的知识为0,百度补课后大致了解了这种电机的原理,但是没能确认我手里这个电机的型号,有说是两相6(5)线步进电机,也有说是四相6(5)线电机,究竟是两相还是四相我至今不懂,再此也希望各位先知能够指点一下,接下来经过网络搜索仍然没有解决如何接线到单片机的明确内容,于是准备拆开电机查看,不想仅仅轻轻一撬电机壳没有开启但接线盒却开了,接线方法一目了然就摆在眼前了,如下图:
接下来就是找驱动方法了,这一部分网上资料多如牛毛不在此详细描述,只是简单的说,这种电机有两种驱动模式,一是4拍模式:AB-BC-CD-DA;另一种为8拍模式:A-AB-B-BC-C-CD-D-DA;
再接下来就是驱动原理中的ABCD端如何与黄、棕、橙、黑线对应上,在这一步骤时我迷糊了两天,后来搞好了的时候才发现,不是原理有多难而是我想的太多了,其实电机的输出线的排列方式以及与驱动顺序对应好了,根本不必要走心考虑了,接下来做了一个三极管驱动的板子即可连线测试了。
接线如图:
晶体管驱动原理图如下:
说到这里关于电机方面的事情就说清楚了,要说一点经验的话就是驱动步进电机的编程与驱动LED数码管的方法类似,关键是要画一个表格而后再根据表格弄出来驱动码,其他就毫无悬念了。
表格如图所示:
演示装置如图:(图片拍虚了凑合看吧)
下面是驱动代码,单片机为STC12C5A32S2,晶振12MHz
重要提示:驱动仅用于演示,尚未经过实用检验,单片机仅用于电机驱动所以使用了软件延时,如果是实用系统需要开启定时器进行延时控制。
还是老办法复制粘贴代码即可用于实验:
#include <STC12C5A60S2.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code timing[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //八拍驱动(正转)
//A-AB-B-BC-C-CD-D-AD
//uchar code timing[4]={0x03,0x06,0x0c,0x09}; //四拍驱动(正转)
//AB-BC-CD-AD
//-----------------------------------------
void delay1ms(uchar n) [url=]//@12.000MHzuchar[/url] n ms
{
uchar i,j;
while(--n)
{
_nop_();
_nop_();
i = 12;
j = 168;
do
{
while (--j);
} while (--i);
}
}
//--------------------------------------------
void delay1s(void)
{
unsigned char i,j,k;
for(i=93;i>0;i--)
for(j=235;j>0;j--)
for(k=125;k>0;k--);
}
//------------------------------------------
void turn_right()
{
uint i;
uchar n;
for(i=0;i<200;i++) // 转100 步
{
for(n=0;n<8;n++)
{
P2=timing[n];
delay1ms(10);//经过测试延时低于7ms是电机不能启动
}
}
P2=0xf0; // 关闭低4位
}
//------------------------------------------------
void turn_left()
{
uint i;
uchar n;
for(i=0;i<200;i++) // 转100 步
{
for(n=8;n>0;n--)
{
P2=timing[n-1];
delay1ms(10);//经过测试延时低于7ms是电机不能启动
}
}
P2=0xf0; // 关闭低4位
}
//-------------------------------------------------------
void main(void)
{
P2M1 = 0x00; // P2推挽输出
P2M0 = 0x0f;
while(1)
{
turn_right();
delay1s();
turn_left();
delay1s();
}
}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|