前言

  现在,很多人手上都有一两个电子设备,但是却很少有人清楚其中比较关键的部分(PCB电路板)是如何制作出来的。我虽然懂点硬件,但是之前设计的简单系统都是自己在万能板上用导线自己焊接的(如下图左),复杂的都是模块拼接的(如下图右):

    

  工作中原理图和PCB也有专门的工程师来制作,因此我对这一块了解比较少。而最近闲来无事,又因为手头上确实少一个四线二项步进电机驱动模块。起初是在淘宝上找了很久才找到一个适合的,结果实验了一下午还是不行;又考虑自己在万能板上焊接,可是发现该模块外围需要10个左右的电阻电容,连线焊接不方便。最后也就决定自己尝试“造”一个了,有时候不卖出一地步永远不知道前面是坑还是路!下面是整个的制作过程(存在一些不成熟之处还请见谅)~

PCB的绘制、打板、元件焊接与测试

  PCB绘制可以用很多种软件,如下图一个社区内的投票。其中Eagle是CadSoft Computer公司已经开发并销售EAGLE软件包超过20年。总部位于德国的CadSoft拥有庞大的用户群,从业余爱好者到全球跨国公司如3M, AT&T, BMW, Daimler Chrysler, Hewlett Packard, IBM等。 EAGLE(Easily Applicable Graphical Layout Editor)(易应用图形布局编辑器)是一款低价格、界面丰富、人性化、易于学习和使用且功能强大的原理图和PCB设计工具,它有很多高级功能:例如在线正反向标注功能、批处理命令执行脚本文件、覆铜以及交互跟随布线器等功能。EAGLE从20世纪90年代初开始,就是欧洲市场上此类软件中的畅销产品。曾5次被一家重要的德国电子杂志选为“年度产品”,EAGLE在北美也已取得相当大的成功。EAGLE目前有标准版及专业版,可用于Windows®、 Linux® 、 Mac®平台。(你在Ubuntu的应用商店上经常看见的那个评分还不错的大红鹰软件就是它了!)

  Altium Designer 是原Protel软件开发商Altium公司推出的一体化的电子产品开发系统,主要运行在Windows操作系统。这套软件通过把原理图设计、电路仿真、PCB绘制编辑、拓扑逻辑自动布线、信号完整性分析和设计输出等技术的完美融合,为设计者提供了全新的设计解决方案,使设计者可以轻松进行设计,熟练使用这一软件必将使电路设计的质量和效率大大提高。Altium Designer 除了全面继承包括Protel 99SE、Protel DXP在内的先前一系列版本的功能和优点外,还增加了许多改进和很多高端功能。该平台拓宽了板级设计的传统界面,全面集成了FPGA设计功能和SOPC设 计实现功能,从而允许工程设计人员能将系统设计中的FPGA与PCB设计及嵌入式设计集成在一起。 由于Altium Designer 在继承先前Protel软件功能的基础上,综合了FPGA设计和嵌入式系统软件设计功能,Altium Designer 对计算机的系统需求比先前的版本要高一些。

  Protel99SE是应用于Windows9X/2000/NT操作系统下的EDA设计软件,采用设计库管理模式,可以进行联网设计,具有很强的数据交换能力和开放性及3D模拟功能,是一个32位的设计软件,可以完成电路原理图设计,印制电路板设计和可编程逻辑器件设计等工作,可以设计32个信号层,16个电源--地层和16个机加工层。

  Altium公司作为EDA领域里的一个领先公司,在原来Protel 99SE的基础上,应用最先进的软件设计方 法,于2002年率先推出了一款基于Windows2000和Windows XP操作系统的EDA设计软件Protel DXP。并于2004年推出了整合Protel完整PCB板级设计功能的一体化电子产品开发系统环境——Altium Designer2004版。与99SE的区别(来源网上):protel99对于xp的兼容性差点、不太稳定,可以满足大部分设计需要;protel dxp引入了设计工程的思想,它的设计工程文件虽然只起到了一个和不同源文件间的链接作用,但可以方便组织起多层次的设计,另外好像在自动布线和集成元件库上更完善。

  铿腾电子科技有限公司(Cadence Design Systems, Inc; NASDAQ:CDNS)是一个专门从事电子设计自动化(EDA) 的软件公司,由SDA Systems和ECAD两家公司于1988年兼并而成。是全球最大的电子设计技术(Electronic Design Technologies)、程序方案服务和设计服务供应商。其解决方案旨在提升和监控半导体、计算机系统、网络工程和电信设备、消费电子产品以及其它各类型电子产品的设计。产品涵盖了电子设计的整个流程,包括系统级设计,功能验证,IC综合及布局布线,模拟、混合信号及射频IC设计,全定制集成电路设计,IC物理验证,PCB设计和硬件仿真建模等。 其总部位于美国加州圣何塞(San Jose),在全球各地设有销售办事处、设计及研发中心。


  从上面简单的投票可知国内用AD和99的人是比较多的,我也紧跟潮流下了个AD14。既然有工具了,接下来就该着手设计原理图了,经过千辛万苦终于找到一款适合我用的芯片——ST的L6219四线二项步进电机驱动芯片:

  然后阅读其datasheet知道:The L6219 is a bipolar monolithic integrated circuits(双极性单片集成电路) intended to control and drive both winding(双绕组,即四个线) of a bipolar(双极性) stepper motor or bidirectionally(直接地) control two DC motors. The L6219 with a few external components form a complete control and drive circuit for LS-TTL or microprocessor controlled stepper motor system(比较少的外设就能构成一个系统). The power stage is a dual full bridge capable of sustaining 46V and including four diodes for current recirculation. 此外,该芯片有双列直插和贴片两种样式:

      

最后在其后面找到了其典型应用的原理图(这就是我们最需要的啦)

然后根据原理图在AD14软件中绘制原理图

再接着用AD14自带的PCB生成功能自动生成并自动布线

最终效果如下

其3D效果如下

  最后就是在淘宝上联系一个PCB打样的,将.PcbDoc文件发给他,和他确认好采用多厚的pcb板(1mm\1.2mm\1.6mm\2mm...)、什么颜色的pcb板(黑\白\绿\紫\红\蓝...)、如果生产厂家更专业还会问是用无铅喷锡\有铅喷锡\沉金等。我当时设计时卖家说黑色的要另外交50元,我就忍痛割爱选择了蓝色的!当时的价格是30元10片(每片小于4x5cm)。不知道是我做的好\(^o^)/~还是店家爽快,我让他帮我看看对不对,他说没问题,然后我也就爽快地下单了~(就喜欢这么爽快的交易,哈哈)


  上面把pcb交给卖家生产了,接下来要考虑的问题是哪里去购买这些电子元件呢~当然贴片的L6219是比较好买的(唯一嘛),但是上面的电阻电容就麻烦了~如果是正规生产,一般是pcb和boom表都发给生产厂家进行pcb生产、贴片、测试等全套过程,你只要出钱最后就能拿到和3D显示效果一样的东西了!但是,由于量小,贴片成本太大,我就自己得看boom来采购、贴片、测试了!下面是boom表:

  为什么电阻和电容购买遇到了问题呢?是因为这里的电阻电容分别采用C2012和R2012封装的,而淘宝上卖的比较多的是0805、1206等封装。更坑的是我先把PCB发给卖家生产了,于是就得看看1206或0805那种封装能替代2012封装的,最后分别拿1206和0805的电容和2012的电容进行比较,最终发现0805封装的是可以替换2012封装的,于是每种电阻电容各买500个:(对于100uF的电容实在找不到适合的0805结果就买了个10uF的1206---->如下图中第二行第一室,明显比0805大,所以焊接的时候也给我带了点麻烦)


就这样在十一过后焦急地等待了3天,电子元件和pcb都过来了(十一他们不工作滴)

其实在十一之前我还做了件事,就是购买一套焊接装备(自己贴片当然少不了烙铁、风枪、吸锡器啥的啦)

下图是我的“车库”,工具齐全,环境良好

经过我的风枪吹、烙铁焊、吸锡器、镊子等反复蹂躏

最终弄出来一个


  其实,到上一步还不算结束,我们还需要测试一下新模块到底行不行、有没有虚焊啥的。接下来就是看家本领了,嵌入式开发想要控制它还不容易!从上面的原理图我们知道——I01\I11\I02\I12\Ph1\Ph2六个引脚是和MCU相连来控制的引脚,引脚1、21、2、5接4线步进电机对应的四线,我把电源输入强制都用5V的外部供电(其实有点不合理的)。 从它的datasheet中我们又获取下列信息:即当把I01\I11\I02\I12全部接地同时Ph1和Ph2输入00、10、11、01周期性的信号时,四线二项步进电机工作在FULL STEP MOTOR DRIVE状态。

  由于整个工程特别大,这里只贴出驱动该模块并控制步进电机的驱动部分:这里B7和B9两个引脚就是连接在我们只做的驱动模块的Ph1和Ph2上,看下面代码可知周期性输入10、11、01、00是一种转向,周期性输入01、11、10、00是另外一种转向,从而根据输入left的TRUE OR FALSE来控制步进电机的转动方向,而参数n表示要连续控制步进电机转多少个这样的周期从而达到精确转某个角度的需求。

  1. #define SET_A GPIO_SetBits(GPIOB, GPIO_Pin_7)
  2. #define RESET_A GPIO_ResetBits(GPIOB, GPIO_Pin_7)
  3. #define SET_B GPIO_SetBits(GPIOB, GPIO_Pin_9)
  4. #define RESET_B GPIO_ResetBits(GPIOB, GPIO_Pin_9)
  5. void smallGo(int n, bool left)
  6. {
  7. int i;
  8. if(left == TRUE)
  9. {
  10. for(i = ; i < n; i++)
  11. {
  12. SET_A;
  13. RESET_B;
  14. OSTimeDlyHMSM(, , , DelaySmall);
  15. SET_A;
  16. SET_B;
  17. OSTimeDlyHMSM(, , , DelaySmall);
  18. RESET_A;
  19. SET_B;
  20. OSTimeDlyHMSM(, , , DelaySmall);
  21. RESET_A;
  22. RESET_B;
  23. OSTimeDlyHMSM(, , , DelaySmall);
  24. }
  25. }
  26. else
  27. {
  28. for(i = ; i < n; i++)
  29. {
  30. RESET_A;
  31. SET_B;
  32. OSTimeDlyHMSM(, , , DelaySmall);
  33. SET_A;
  34. SET_B;
  35. OSTimeDlyHMSM(, , , DelaySmall);
  36. SET_A;
  37. RESET_B;
  38. OSTimeDlyHMSM(, , , DelaySmall);
  39. RESET_A;
  40. RESET_B;
  41. OSTimeDlyHMSM(, , , DelaySmall);
  42. }
  43. }
  44. }

  由于这里我们采用下面的步进电机,其每转步数为48,也就是说上面函数调用中n=12即可实现步进电机旋转一周的目的,也因此最小可控转角为360/12=30°。再通过计算求出旋转一步连接螺母可以移动的距离就能实现精确的距离控制,从而做一些机器人手臂、3D打印、喷墨、光盘托盘等机械部件的精确驱动模块。不过这里每步30°精度不太高,我在该项目中用的另一个商业版的步进电机驱动可以支持每转步数10000,是不是很厉害丫~

说明:

  最近如何为编程爱好者设计一款好玩的智能硬件暂时停止更新(目前已至十),不是因为我要放弃该DIY的更新,而是因为当我把无线、显示、传感器等模块的驱动封装好之后,发现少一个核心的支持点对点、点对多以及广播的稳定的通信协议。于是,接下来一段时间可能会先谈linux内核专题,等时机成熟我再带一个适合X-OS的通信协议继续DIY我们的积木物联网系统。哈哈,再谈谈本篇的写作目的:一方面想让大家了解一下一个业余电子爱好者怎么做自己的电路板;另一方面总结下自己第一次打板遇到的小问题和DIY过程中的小乐趣~请大家多多支持,♪(^∇^*)

@beautifulzzzz

  2015-10-17 持续更新中~

[PCB制作] 1、记录一个简单的电路板的制作过程——四线二项步进电机驱动模块(L6219)的更多相关文章

  1. 一个简单的CS系统打包过程图文版

    一个简单的CS系统打包过程图文版 1.     打包内容 1.1.  此次打包的要求和特点 主工程是一个CS系统: 此CS系统运行的先决条件是要有.Net Framework 3.5: 主工程安装完成 ...

  2. 20181015记录一个简单的TXT日志类

    20190422添加换行以及时间记录 using System; using System.Collections.Generic; using System.IO; using System.Lin ...

  3. 记录一个简单的dbcp数据连接池

    这个示例用到了ThreadLocal与dbcp,我觉得有点意思,就整理了下.使用dbcp,肯定要导入commons-dbcp.jar包.下面直接贴DBUtil代码: public class DBUt ...

  4. 记录一个简单的vue页面实现

    <template> <div class="userView"> <!-- 页眉颜色统一 --> <div class="bu ...

  5. Android一个简单的自定义对话框制作

    布局文件 <?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android= ...

  6. ASP.NET Core MVC 打造一个简单的图书馆管理系统 (修正版)(二)数据库初始化、基本登录页面以及授权逻辑的建立

    前言: 本系列文章主要为我之前所学知识的一次微小的实践,以我学校图书馆管理系统为雏形所作. 本系列文章主要参考资料: 微软文档:https://docs.microsoft.com/zh-cn/asp ...

  7. 在Qt Quick中一个简单Hello World加载过程

    Qt5基本类图: QQmlEngine    QQmlEngine类提供了一个QML引擎,用于管理由QML文档定义的对象层次架构,QML提供了一个默认的QML上下文(根上下文,获取函数QQmlEngi ...

  8. 一个简单的freemark输入输出的案例(二)

    freemarker入门实例 1.设计思路 (1)新建Maven Project (2)生成freemarker模板 (3)写freemarker页面ftl文件 (4)写测试文件 2.新建Maven ...

  9. Expression Blend4经验分享:制作一个简单的图片按钮样式

    这次分享如何做一个简单的图片按钮经验 在我的个人Silverlight网页上,有个Iphone手机的效果,其中用到大量的图片按钮 http://raimon.6.gwidc.com/Iphone/de ...

随机推荐

  1. Windows下的UDP爆了10054--远程主机强迫关闭了一个现有的连接

    原文地址:http://www.cnblogs.com/pasoraku/p/5612105.html 故事是这样的. 前几天在网上逛,看到了一个漂亮的坦克模型. 我觉得这个坦克可以做一个游戏,那需要 ...

  2. gcc与gdb版本兼容问题

    今天在用gdb调试C++程序的时候,想用"p i”命令打印出程序的一个局部变量i,却一直提示: No symbol "i" in current context. 我愣了 ...

  3. C语言的关键字,标示符以及数据类型

      1. 关键字 1>     关键字就是C语言提供的有特殊含义的符号,也叫做“保留字” 2>     C语言一共提供了32个关键字,这些关键字都被C语言赋予了特殊含义 auto doub ...

  4. vs2015 无法启动IIS Express Web服务器

    今天在VS2015上装了 之后无法启动IIS Express Web服务器. 然后我去查看了windows日志发现vs创建的虚拟目录不见了(至于是不是以上原因导致的没去查明) 然后在vs2015中点击 ...

  5. ros下多机器人系统(1)

    multi-robot system 经过两个多月的ros学习,对ros的认识有了比较深入的了解,本篇博客主要记录在ros下开发多机器人系统以及对ros更深入的开发.本篇博客是假定读者已经学习完了全部 ...

  6. redis命令总结

     Redis命令总结 redis 127.0.0.1:6379> info  #查看server版本内存使用连接等信息 redis 127.0.0.1:6379> client list  ...

  7. 将一个数组分成奇数部分和偶数部分,并分别排好序 CVTE

    给定一个数组,将奇数放到前面,偶数放到后面,各自排好序 (2016年3月12日晚上,CVTE笔试编程第一道题): 思路很简单: (1)先将数组中的奇数和偶数分开(利用两个指针遍历一遍即可,同时统计好数 ...

  8. 使用<c:if>标签处理页面数据

    使用${feeList.feeType}来取值的时候,因为定义的是数值,刚好看到<c:if>标签的使用,套用代码如下 <td> <c:if test="${fe ...

  9. UVALive 2191 Potentiometers (树状数组)

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...

  10. PHPExcel(1.8.0) 帮助代码

    以下代码不能直接运行,只是提供各种方法调用写法. require_once dirname(__FILE__) . '/Classes/PHPExcel.php'; $objPHPExcel = ne ...