最后就是在淘宝上联系一个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 = 0; i < n; i++) 11 { 12 SET_A; 13 RESET_B; 14 OSTimeDlyHMSM(0, 0, 0, DelaySmall); 15 SET_A; 16 SET_B; 17 OSTimeDlyHMSM(0, 0, 0, DelaySmall); 18 RESET_A; 19 SET_B; 20 OSTimeDlyHMSM(0, 0, 0, DelaySmall); 21 RESET_A; 22 RESET_B; 23 OSTimeDlyHMSM(0, 0, 0, DelaySmall); 24 } 25 } { 28 for(i = 0; i < n; i++) 29 { 30 RESET_A; 31 SET_B; 32 OSTimeDlyHMSM(0, 0, 0, DelaySmall); 33 SET_A; 34 SET_B; 35 OSTimeDlyHMSM(0, 0, 0, DelaySmall); 36 SET_A; 37 RESET_B; 38 OSTimeDlyHMSM(0, 0, 0, DelaySmall); 39 RESET_A; 40 RESET_B; 41 OSTimeDlyHMSM(0, 0, 0, DelaySmall); 42 } 43 } 44 }