注意:访问本站需要Cookie和JavaScript支持!请设置您的浏览器! 打开购物车 查看留言付款方式联系我们
初中电子 单片机教材一 单片机教材二
搜索上次看见的商品或文章:
商品名、介绍 文章名、内容
首页 电子入门 学单片机 免费资源 下载中心 商品列表 象棋在线 在线绘图 加盟五一 加入收藏 设为首页
本站推荐:
用软驱步进电机制作CNC三维工作平台
文章长度[14891] 加入时间[2007/6/15] 更新时间[2024/3/28 16:31:50] 级别[0] [评论] [收藏]

本文的作者真是太了不起了,本站怀着无比佩服的心情向大家介绍真人真事,希望能对大家学习单片机有帮助!
原文地址:http://hi.baidu.com/creative_zone/blog/item/c3c33dfad405389659ee900d.html  

用软驱的两相步进电机做的CNC三维工作平台,采用了L293D驱动,单片机控制,单片机通过串口和电脑时时通讯。 2007年03月25日 星期日 15:08

一直都想做个CNC三维工作平台,这个寒假总算有时间了,就开始准备了。初步设想就是PC做上位机,单片机做下位机,通过串口进行通讯。单片机通过驱动电路控制电机运动。如果有什么问题可以回复我~或QQ(博客首页)联系我!

以下是设计的流程:

需要的工具和材料万用表,电机,各种螺丝刀,锉刀,锯子,电烙铁,驱动芯片,电源,51单片机相关的串口相关的芯片,导线若干,螺丝,AB胶等等。

前期遇到的问题由于目标是微型,所以想把它做的尽量的小,所以选材很麻烦。我遇到两个比较大的困难。

1.伺服电机个头比步进电机的相对要小些,但费用比较高,且不容易控制。

2.还有CNC三维运动需要丝杠的传动,这么微小的丝杠恐怕没有吧,最初想通过皮带传动代替丝杠传动,慢速可以实现,但精度不高,速度过快后,皮带打滑,控制容易出现问题。

这两个问题困扰着我,后来想到软驱里有个很小的步进电机,而且还带有一套传动系统。如果可以把这一整套取出来的话上面的两个问题就很容易就可以解决了。控制方面也不会有问题。

硬件的设计这部分我认为是最重要也是最难最不容易实现的地方,费时费力。我先把我的电脑上的那个古董软驱拆了下来。哇塞,好多灰,本人太懒了从没有清理过。费了老大劲,终于卸了下来。擦干净拆开,和之前预计的模型相差不大,用笔把需要的部分画出来。用钢锯沿着画线部分把需要的那不分锯下来,注意不要搞变形咯。由于电机驱动能力有限,阻力过大就会使实现变得困难。另外两个步进电机是我到修电脑的地方花了十块买的。由于每块软驱都不一样,所以我截的形状也都略有不同,形状需要结合三个电机三维的组合来确定,需要发挥一下想象力了。

三个电机都搞定后,到电子市场上买了一段导轨(从机器上拆下来的二手货,十元搞定),把它作为二维运动的连接部分(设计见图片),把其中一个电机X按图示固定在滑轨的一端,另外一个电机Y固定在滑动轴承上,两个电机想办法连接起来就可以构成一个二维CNC平台了。最难选的是第三个电机Z的位置,始终不好放,最后自己做了个架子把它固定在电机Y上了,经测试是可行的。在电机Z上安装了笔头,何以测试效果。电机的位置校正是通过三个位置传感器来实现的。其中电机Z的传感器作用是感测平台的高度来确定电机的给进量,XY的作用主要是做Home用。

驱动部分采用了L293D芯片,电机是两相电机。网上有很多相关的资料,在这我就不详细说了。单片机做下位机,PC做上位机。

软件的设计单片机部分主要是电机的控制程序,PC主要是图象处理和运算的程序,用VB编写。握手程序的编写-PC通过串口把信息传给单片机,同时单片机把受到的信息发回给PCPC把收到的和发送的数据作比较,出错后,重新发送。

单片机与PC串口通信的部分C源代码

#define UART_RX_BUFFER_SIZE 16 /* 1,2,4,8,16,32,64,128 or 256 bytes */
#define UART_RX_BUFFER_MASK ( UART_RX_BUFFER_SIZE - 1 )
#define UART_TX_BUFFER_SIZE 16 /* 1,2,4,8,16,32,64,128 or 256 bytes */
#define UART_TX_BUFFER_MASK ( UART_TX_BUFFER_SIZE - 1 )
/* Static Variables */
static data unsigned char UART_RxBuf[UART_RX_BUFFER_SIZE];
static data volatile unsigned char UART_RxHead;
static data volatile unsigned char UART_RxTail;
static data unsigned char UART_TxBuf[UART_TX_BUFFER_SIZE];
static data volatile unsigned char UART_TxHead;
static data volatile unsigned char UART_TxTail;
bit fSeri0_Send_Ok;
/* initialize UART */
//t2 做波特率发生器 9600bps at 11.0592 MHz
void InitUART(        )
{
unsigned char x;
T2CON = 0x30;          //t2 做波特率发生器  
TH2 = 0xFF;
          TL2 = 0xdc;         
          RCAP2H = 0xFF;       
          RCAP2L = 0xdc;
          SCON = 0x50;              /* SM0 SM1 SM2 REN TB8 RB8 TI RI:9 bit */
          PCON = 0x00;              /* baut rate, 80h:double; 00h: normal        */
          ES = 1;                   /* 串口中断允许         1-enable                   */
          PS = 0;                   /* 串口中断优先级 1-高,0-低                 */
          TR2 = 1;                  /* Start T2 as baut rate generator           */    
x = 0; /* flush receive buffer */
UART_RxTail = x;
UART_RxHead = x;
UART_TxTail = x;
UART_TxHead = x;
}
/* interrupt handlers */
void UART_interrupt( void ) interrupt 4
{
if (TI)
{ // 是否是发送中断
unsigned char tmptail;
TI=0;
        if (UART_TxTail==UART_TxHead)
        {
        fSeri0_Send_Ok=0;              /*已发送完毕*/  
        }
        else
        {
        tmptail = ( UART_TxTail + 1 ) & UART_TX_BUFFER_MASK;
        UART_TxTail = tmptail; /* store new index */
        SBUF = UART_TxBuf[tmptail]; /* start
        transmition */
        }
}
if (RI)
{
unsigned char revdata;
unsigned char tmphead;
RI=0;
revdata = SBUF;  
tmphead = ( UART_RxHead + 1 ) & UART_RX_BUFFER_MASK;
UART_RxHead = tmphead; /* store new index */
UART_RxBuf[tmphead] = revdata; /* store received data in
buffer */
}
}

unsigned char ReceiveByte( void )
{
unsigned char tmptail;
while ( UART_RxHead == UART_RxTail );/* wait for incomming data */
tmptail = ( UART_RxTail + 1 ) & UART_RX_BUFFER_MASK;/* calculate buffer index */
UART_RxTail = tmptail; /* store new index */
return UART_RxBuf[tmptail]; /* return data */
}

void TransmitByte( unsigned char senddata )
{
unsigned char tmphead;
tmphead = ( UART_TxHead + 1 ) & UART_TX_BUFFER_MASK;
UART_TxBuf[tmphead] = senddata; /* store data in buffer */
UART_TxHead = tmphead; /* store new index */
if(fSeri0_Send_Ok==0)
        {
        fSeri0_Send_Ok=1;
        TI=1;
        }
}

这里进给出了步进电机部分驱动代码

//步进电机运行数据表 ,接线不同数据表也略有不同
const uchar motortb[]={0x11,0x99,0x88,0xaa,0x22,0x66,0x44,0x55};
void delay(unsigned char t)// 每步延时的子程序  
{
unsigned char i;
unsigned int j;
          for (i=0;i             for (j=0;j<500;j++);
}
void a_step(unsigned char d,unsigned char t)          //步进电机走一步d=0 正转d=1 反转。t 越大走得越慢  
{                              
          if (d&0x01)                   
             {
            if (NP==0)
               NP=7;
            else NP--; //NP记录步数,全局变量
           }
          else  
             {
            if (NP==7)
               NP=0;
            else NP++;
           }
          P1=motortb[NP]; //输出到单片机的P1口
            delay(t);
}

设计图片我已经放到相册里面了,感兴趣可以去看,本来想放个视频的,可惜不支持。

已实现功能能够将程序加载的图象通过三个电机画出来,效果相对来说比较好,可以参考空间相册的图片。

待开发的功能实现与CAD软件接口,能够把图形绘制出来。通过对笔头那部分的改进,以实现雕刻功能,甚至是三维雕刻。

参考图片:最头一张是运行在电脑上的绘图界面,后面是部分制作图片,大家可以到原出处欣赏原作者的大图以及更多风采!

 

 
 
   
 
   
 
   

 

1、 本站不保证以上观点正确,就算是本站原创作品,本站也不保证内容正确。
2、如果您拥有本文版权,并且不想在本站转载,请书面通知本站立即删除并且向您公开道歉! 以上可能是本站收集或者转载的文章,本站可能没有文章中的元件或产品,如果您需要类似的商品请 点这里查看商品列表!
本站协议 | 版权信息 |  关于我们 |  本站地图 |  营业执照 |  发票说明 |  付款方式 |  联系方式
深圳市宝安区西乡五壹电子商行——粤ICP备16073394号-1;地址:深圳西乡河西四坊183号;邮编:518102
E-mail:51dz$163.com($改为@);Tel:(0755)27947428
工作时间:9:30-12:00和13:30-17:30和18:30-20:30,无人接听时可以再打手机13537585389