上周调了一个电路板,结合到之前画过的一块板子,现在写一点点心得,留作日后自我取笑解嘲。
首先,原理图设计。
这玩意儿难得没有百密一疏的时候,所以很少一次性投板后就不用改了的时候。一般参照datasheet的电路。一般常见的电路也可上网搜索,一大把。但是一定要知道这些电阻电容作用是什么,为什么是这个值。比如简单而言某个电阻是限流还是匹配(想到射频电路里的阻抗网络那章了,伤不起)。
一般重要的芯片都要加退耦电容,在原理图上可以摆成一排,布板时在哪需要往哪丢(别多了,原因是成本和空间考虑,一般一个钽电容的作用范围很大,具体网上可查)。
MOS管是压控流型,所以很容易被静电打坏,不要手潮湿得就去摸。静电生活中太常见,简而言之就是瞬间电压,电压很大几千伏但是电流很小,所以能量很小。
关于三极管和MOS管的用法水很深,同事推荐了一本书,小日本铃木雅臣写的《晶体管电路设计》,推荐。尤其注意的是PMOS的Vds是小于0的,别接反了,否则,嘿嘿。MOS管比较贵,别浪费。另外如果打坏了,如果是电池供电,正极直接到地了,电池会……不过一般的锂氩电池质量还行。
能在硬件中做的事就别留给软件控制。这次项目中的直流电机驱动电路考虑到死区而没有用互锁设计,结果调试时打坏了好几个管子。
如果IO口不够要去复用Jtag下载口之类的,要想好了,这样就不能在线调试了。
对外接口部分,你没法确定人家会输入什么鬼东西那就加TVS管,否则到时板子上芯片怎么被打坏的都不知道。
如果要用到数字电源和模拟电源,一定要隔离。“隔离”要好好揣摩啊。(看看隔离芯片有哪些)布板时分开覆铜。适当加磁珠。
对于一些LED指示灯,设计时一定要想想这个管脚上电后是什么电平。否则它可不是在你想亮的时候亮,不想亮的时候不亮。原理图不大的话,就别分页级联什么的了,省的看的时候切换来切换去的。
模块之间留意电平匹配,虽然貌似CMOS电平和TTL电平可以堆到一起,但还要看看系统要求。
其次,PCB布板
PCB板的元器件封装最好自己制作(当然排针、一般的贴片电阻电容之类的就不用了),这样正确性才有保障,免得日后再次投板,再美其名曰:改版。一般常见的错误是芯片(特别是SOT)的管脚和实际的弄错,这样日后调试的时候就不用到处飞线了。
一般对照芯片的datasheet 里面关于封装的部分自己制作,若对板子空间要求不特别大,建议引脚焊盘向内和向外延长共计1mm左右,要是用mil的话估算下。不然严格按照datasheet的尺寸做好后以后焊接不方便。
另外注意了,原理图和PCB管脚一定要一一对应,这是起码的。
电路板布局很重要,这一步做好了布线才好弄。布局时考虑下信号流的走向。一般输入模块(或者接口)在一边,输出模块(或者接口)在另一半。处理器芯片一般要尽量靠近中间,排针什么的一定要尽量靠边(其实做产品的话,按键,指示灯,接口什么的都是结构已经决定好了的,硬件设计必须按照结构的来)。其它模块就考虑重要信号线到处理器芯片相应管脚尽量短,然后综合平衡一下。
晶振一定要优先放,离对应芯片管脚要近,两个腿的线也尽量一样长。
接下来就是布线了。各个模块到MCU的信号线优先布,这些线尽量不打过孔,一般的线过孔也别超过3个。走线最基本的别走锐角就对了(想当年大学时还使用自动布线,悲剧)。
这些信号线中又优先布高频信号线,不要走过孔,因为过孔有电容和电感特性,这里主要是电感特性,你想想高频信号线上加个电感是什么效果就知道了。举个例子比如USB信号线。
电源线可以留到最后布,因为一般都能走通。对于电源线,这里又要注意过孔的电容效应了,不过有位前辈支了一招,重要电源线上如果要过孔,可以摆8个左右过孔的一起过,然后相当于8个电容并联……目的达到了。
布线时记得开启自动推挤功能,这样走线才平行,得到很漂亮的板子。
考虑到电磁兼容之类的,可能的话,如果是两层板,顶层走信号线,底层走电源线,然后,一层横向走,一层纵向走。
最后过孔一般全都加泪滴吧。记得板子要覆铜。
最后,软件代码
这次用的还是单片机,16位的MSP430,所以还是MCU呵呵。对于很多产品,对价格不敏感对功耗却很敏感。430满足这样的东东。
写代码一定要先架构好,否则到最后修修补补太多还不如推倒重新写,问题是那时的你舍不舍得。
至于芯片能不能满足需求,在设计初期的芯片选型时就应该论证过了,一般就看看对应模块有没有,内部的存储空间有多少,工作频率满足要求否之类的。
这次遇到的第一个问题,电池发热。必然是有地方短路了,把板子全面检查一遍,最后是MOS管那出问题了。
然后是下载时显示栈满,我当时开了50Kb的栈空间啊,什么定义的局部变量也不很多,最后发现是因为Jtag复用了IO口,而那个口被一直拉低了。最后解决方法是下载完成以后再利用那个口。
然后是程序下载到板子上结果不是自己想要的。还是学艺不精,原来自己耍小聪明,使用了定时器A的CCR0、CCR1、CCR2全部,他们都用一个计数器TAR,在程序中间反复修改CCR2的值使它在两个值之间切换。结果才想起CCRx的值只能改大不能改小,否则就要先清空TAR。最后解决方法是CCR2不修改,合并两个状态。
然后是led灯闪烁正常,但是电机无动作。最后发现是PC没有进到CCR0的中断服务程序A0。但是问题在哪?问了万兄,他也觉得没有问题。后来我自己一点点试验,才发现在初始化配置某个寄存器的时候,清空了TAR,这个貌似不应该有问题额,误打误撞的。
后来去掉初始化清空TAR操作后,A0是进去了,但是还是无动作,问万兄,他在第一句看门狗初始化的地方设置断点,结果发现芯片在不断复位,明明有喂狗的,都不知道为什么,最后关掉看门狗算了。
最后是检测到的信号不对,这个还得谢万兄,经验真是重要的东西。一方面,MSP430的IO口如果设为输入并且读值给一个变量,如# define KEYIN P2IN&BIT0 ,然后使用if(KEYIN)之类的语句不行。读取和判断必须分开。另一方面。外部中断优先级比TimerA低,在A0中断中打开GIE也不会被外中断打断,但是不管开没开GIE都会使某个外中断标志位置1,在响应完A0后去响应外中断。
又快到周一了,想起了加菲猫的那句话:I hate Mondays!