通过MT3608进行升压问题不大
前几天在《使用MT3608进行升压备忘》中记录了若干困惑和问题,今天通过电路板实现的电路基本上把之前的困惑都解决了,但也引入了一些新的问题: 1、这颗芯片的升压公式是准确的,Vout=Vref*(1+R1/R2),这个公式没有错,我使用的配置电阻是R1=18K、R2=1K,理论上应该得到0.6*(1+18)=11.4V的电压。实际测试不多不少、正好是11.4V;并且无论输入电压怎样波动,例如我将输入电压设置到2.11V,依然可以得到11.4V的输出电压; 2、之前在使用面包板+杜邦线的环境下,效果远达不到上面这么理想。在面包板+杜邦线的环境下,输出电压会随着输入电压不断地改变;而且当输入电压低于5V时,则不能得到有效的升压。估计是搭建的杜邦线比较凌乱、比较长,所以信号的完整性和有效性被破坏引起的吧?不清楚具体原因,也顾不上深究了; 3、今天在完成了第一个实验板之后,我草草的看了一眼升压结果,只瞥见11.4V时,内心窃喜。但也因为这个“窃喜”冲昏了头脑,没有做更多的测试便继续后面的工作。结果后面的工作将电路板搞坏了,当回顾一天的工作时,对于MT3608的升压表现有些忐忑,毕竟没有做更多的测试,但是看着眼前已经坏掉的电路,着实令人崩溃; 4、然后就只好硬着头皮又做了一块新的试验板,并且反复确认过它的升压表现,才确定这个电路基本上是正确的。但是就在进行这个测试的时候,发现它并不能与我之前制作的“蜂鸣器电路板”正常配合。结果就是又花了4个小时排查问题,直到此刻虽然找到了问题,但并不知道其中的原因,苦恼。 5、关于上面第4点的问题,需要再单开一篇博客进行记录了; 6、在今天的这块实验板上,除了MT3608升压部分,还有电池充电部分的电路。经过测试发现电池充电电路并不能正常工作,所以关于电池的充电,还需要继续花时间学习。
简单电路的想法及尝试(2)
之前想到一个简单的电路,然后画了画、今天动手试了一下,感觉没有问题、可以实现。但是比较郁闷的是其中要使用单刀双掷开关、或者更方便一些就是使用双刀双掷开关。虽然使用更高级的开关可以让电路简化,但是这些高级的开关并不好找,即便真的有、手感上和形式上也很难满足我的需求。 所以我觉得还是退而求其次,用比较简单的单刀单掷开关来实现吧。以下是第一部分电路的重新规划——完全改用单刀单掷开关来实现。电路看上去应该是可以运行的,不知道实际效果怎么样,还要再花时间搭建真实的电路来验证一下: 我设想的电路整体分成三个部分,上面是第一部分。现在觉得第一部分的电路无论怎么实现,都是可以搞定的,毕竟它的功能最简单;难的是第二部分的电路,没有想好怎么才能只通过一个单刀单掷开关实现。 另外,上面的第一部分电路现在也只是核心功能,如果考虑到更复杂的情况,例如将LED增加进去,也会让问题变得复杂。 看来这个“小功能”也不是一朝一夕能够搞定的,我索性也就不着急、慢慢学习、慢慢尝试了。 想了想,第二部分电路的结构大概清晰了,并且有对第一部分电路进行了微小调整,至此的基本思路如下:

蜂鸣器的震荡及发声部分可以运行了
前阵子本来都已经完成了这个小功能模块的制作,但是在进行PCB印刷的时候,却发现成品PCB无法正常工作。好在没花太多时间就找到了问题的结症——封装引脚定义问题。 我在使用分立元件的时候,用到了2N2222的BJT,这个三极管在插件型封装时,三个引脚中间的引脚是B极,而在贴片封装时却是第一个引脚是B极。只能怪自己经验不足。今天拿到了新做的板子,战战兢兢重新焊了一只出来,结果还算顺利,能够正常的工作了。 在使用蜂鸣器的时候,我想到了前几天买的成品DCDC电路板,有那块成品电路我就没有必要引入两个电压源,可以直接使用一个电压源输出5V电压、再通过DCDC升压到9V,这样就可以为蜂鸣器电路板同时供给5V和9V的工作电压。 其中5V电压是为了让蜂鸣器的震荡部分起振、而9V电压则是为了让蜂鸣器自身完成工作。两个电压同时通过一个开关进行控制,有电压则5V、9V同时有输出;没有输出则5V和9V都不进行输出。实验成功,效果还算满意。 在没有接入蜂鸣器之前,我是先把蜂鸣器电路板上电测试了一下,当时其实心里还在打鼓——通过电压表测量会发现DCDC在断电之后会有残留的电压,并不是戛然而止、而是逐渐释放,这估计应该是DCDC的成品板上面没有flyback二极管导致的,这就引发出两个问题: 1、对于我当前效仿制作的DCDC电路,是否应该接入flyback二极管? 2、如果不接这个flyback机制,会不会有什么问题? 这要等进行DCDC电路板的测试时再做推敲了,现在这里备忘一下。 另外:DCDC电路板实际上也已经到了,今天时间晚了没有时间测试,只先把其中另一个我比较关心的问题验证一下:上面预留的电池焊接插口的间隔和孔径是否准确?答:稍微掰一掰电池的引脚是可以顺利插入的,有一点点紧。 还有一点额外的感想:因为没有做过贴片,所以不知道自己动手能力和贴片的难易程度,所以这块电路板上使用的IC都是尽可能选用比较大的,全部使用的是2010的电容和电阻,实际贴装的时候感觉2010对我而言非常友好,可以比较容易的完成贴装和焊接。但是对于之后的其他电路部分(例如后面的电池管理部分),因为PCB面积太小,所以不得不将IC封装调整到了1206尺寸的,期望等到贴装1206的电路板时,也能像当前这个2010尺寸一样容易实现。

今天并没有完成关于IP5407的使用测试
之前因为卡在《MT3608升压问题》上面,所以心里总是感觉有些别扭:电路都已经搭建出来了,可就是无法完成持续稳定的升压。虽然我已经将所有用到的IC都与成品电路保持一致,可依然无法完成有效的电压升压。 想来想去,感觉最大的可能是我使用的是面包板+杜邦线做的电路搭建,因为MT3608是属于高频DCDC升压结构,如果使用杜邦线很可能会引入更多的干扰,从而影响芯片正常工作。当然这只是猜想,除非能够将当前的电路重新搭建,用更好的、更短的线材来测试,才可能确定这个猜测。 思来想去,与其再去找飞线用的铜丝、搭棚焊接电路,不如直接做一块PCB电路板来的方便,所以今天就没有做原本计划的IP5407的测试,而是花了一下午的电路板: 如果考虑花费,做电路板肯定比自己用铜丝搭棚更昂贵,但是让个角度想一想:即便我用铜丝搭棚搞定了DCDC升压电路,谁又能确保之后PCB实现的时候不再次出现这样或那样的问题呢?与其多一事、不如少一事,直接一步到位的用PCB来测试,搞定就是搞定了、没有搞定也就可以直接基于当前的PCB再做调整、修正,反而更省力气。 如此想着,咬咬牙花钱做了吧。 在做这个电路的时候,我还是期望能够连同IP5407的充电芯片也一并测试了,所以这个电路中也就将IP5407部分的电路一同画了进去,这样等到PCB到手,既可以用它完成DCDC升压的实验、也可以基于它完成充电的测试,一举两得。从工作效率的角度讲,说不定更高呢。
尝试使用IP5407完成对锂电池进行充电
MT3608的升压部分虽然还没有最终搞定,但是我想这块问题应该不会很大,或者说,无论这个节点上是否会有问题,后面还有很多路要走,我应该先把整条路走下来,只要大差不差的能先走通,就可以翻过头再仔细推敲现在遇到的问题。如果假设后面要走的整条路有不可逾越的障碍,那么现在在这一个细节点上较劲也就没有意义了。 所以这么想着,我就假设MT3608暂时虽然还有问题、但并不致命。接下来将继续学习关于锂电池充电芯片的使用。这两天如果有时间,会将锂电充电部分的电路搭建起来进行测试。 对于锂电充电,我找到了两个芯片,分别是IP5306和IP5407,二者应该都可以满足我的需求。但是对于306,有一些含混模糊的地方:它在自己进入休眠之后,是直接通过一个负载就能自动唤醒、还是需要人为的发出脉冲才能唤醒? 如果是前者,那么其实我用IP5306就可以了。但如果是后者就比不能使用它、而需要使用407了。因为我现在计划制作的电路中没有单片机、也没有用于控制306唤醒的按键,这就要求它必须能够被动唤醒、或者索性就像407那样无需唤醒、而是一直有着5V的待机输出。 其实这个问题上我也没有必要太过纠结,也可以直接就用IP5407来搭建电路,正所谓“多一事不如少一事”。所以接下来就是尝试使用IP5407完成对手中的锂电的充电操作。
《动物园之星》(1):这几十元花的很值得
前几天买了款游戏,叫《动物园之星》,听名字就知道是一款模拟运营动物园的游戏。起初只是以为可以有“参观动物园”的体验,出于这一目的购买,想着能在懒得出门的日子里,让家中小朋友在电脑上逛一逛动物园、又或者是走腻了自家附近的动物园之后,在游戏中畅游一下浩瀚的、各国各地的大型野生动物园。 结果买回来之后才发现,与我想象的要有一些差距:它并没有提供现成的各类动物园、博物园区让玩家进行体验、参观;而是需要玩家自己创建一个动物园出来。这与自己预期的差距有利有弊。 坏处很显然:初期游戏体验与我期望的实际上是不一样的。我更想“坐收其成”,直接参观各种精美的风景、观赏各类有趣的植物、又或者就是躲在园区的某个角落中,看着来来往往的行人,看云卷云舒、待花开花谢。 没有了上面的初期体验,但是好处也有:可以更细致的了解动物园中的每一个动物,毕竟需要自己亲手设计栖息地,了解动物的性格、偏好、居住喜好……如此更像是一本动物百科,要慢慢阅读、细细研究,想来一款游戏能够在玩耍的同时收获许多知识,也是很值得的。 而且我的“第一愿景”虽然初期无法实现,但如果能够坚持玩一阵子,相信也可以构造出一个有模有样的动物园,那时候就可以邀请家中小朋友来这座自己亲手构建起来的乐园中参观了。 住在城市,又没有时间、金钱、空间、精力,想真的拥有自己的一亩三分地,养花种草,可能性微乎其微。但是在这款游戏中应该是完全有机会将自己的想法实现出来,并且满足自己的“田园梦”。所以我想多花一些时间在这款游戏上,期望能够令自己沉浸其中,享受一阵子惬意的田园生活。
买了东西不敢再乱扔包装了
小的时候无论购买什么东西,买回来之后都是暴力拆包,只留下商品,然后会将外包装、商品包装、说明书、附件等等全部丢弃。想想那时的自己,活的真潇洒、过的真痛快。哪怕是几千元的手机、电脑、游戏机,只要到了手里,无论好坏,都会在第一时间撕掉所有的贴膜、附件。 如今不敢了,从什么时候转变的呢?也记不清了,总之就是如今购买回来商品,都会小心翼翼的拆开包装,如果遇到订书钉或胶带,也会非常谨慎的拆开,并且所有的包装一律保留着。万一内部的商品有问题、不喜欢、用不惯、用不着、买后悔了……都还能给自己留下一个退换的机会。 即便商品购买时没有退换政策的商品,也同样不再乱丢乱弃,去年购买的AMD R5,我就将它的盒子保留了下来,并将自己的一颗很古老的CPU放在其中,精心的收留着。时隔一年多,突然有了一个需要用到那颗老CPU的时机,很顺利的找到并替换使用。这种“爹味生活习惯”,恰恰就是“父母的生活习惯”,估计人到中年,都会被生活磨平棱角,变得如此吧。
仿真电路46、47、48(SLOC: 6354)
前几天感冒了,天昏地暗实在坚持不住,没有写开发日志,但是每天依然坚持写了几行代码。 主要完成的是将电容IC引入到当前的仿真体系中来。实际上在日志45中已经将它引入进来了,但是那个时候只是“初步引入”,对于它的的电压、电流的计算是错误的,所以这几天主要是将电容的电压、电流都逐步调整正确了。 电压网络的求解其实改动并不大,因为电容本身的阻抗计算与电阻是相似的,所以对于电压网络而言,任何一个电容、就和任何一个电阻没有差别。如果不考虑电容的初始电压,那么电容就是电阻。 电容本身的初始电压是唯一的区别,因而在构建矩阵时将其初始电压也当作一个超级电源考虑就可以了。 如上完成电压网络求解之后,接下来求解电流。 电容器的电流需要用自身的历史电压做“微分”完成计算。而在离散的仿真环境中,这个“微分”是利用“差分”近似代替出来的。在使用差分近似代替微分运算时,有2种常用的替代方法,分别是题型近似法、后向欧拉法。这两种统称为“数值计算”的计算方式,都可以完成电容电流的计算。 两种数值计算方法各有利弊,不同的仿真参数下,两种方案的选择不同。好在它们的实现都很简单,可以全部实现出来,然后选择使用。但是我还没有做梯形近似,只先用后向欧拉法完成了电流的计算。 虽然现在实现的IC还非常少,但是已经可以构建出非常简单、基础的电路了,所以接下来将完成以下功能的开发:1、电流移动动画;2、示波器;3、文件存取;4、物理单刀开关IC。
仿真软件开发进展
Day: 44, SLOC: 6182。 前阵子将仿真软件的基本开发环境搭建起来、勾勒了个整体的模型结构,并且先有的没的将符号绘制、图像渲染、参数调整、计算输出……都草草实现了一遍,绝大多数都是以快速成型、不确保正确为原则开拓的代码基底。 这套开发环境的构建原则是“尽量轻巧”,因而甚至连IDE工具、CMake都没有引入,纯粹使用裸代码撰写,虽然过程痛苦,换来的却是十分的轻便,而且每一行代码都是纯手写,代码敲得十分过瘾。 上面的快乐时光结束之后,就是实打实的撰写每一个具体方法,再不能天马行空、一日百行。每天代码增长大约只有几十行。好在我对模块拆分的很细,基本上每一天都能有个小小的新功能被实现出来。 今天完成的是AC电源的引入,现在终于可以看到一张“时域动画”,效果比之前每天看到的“直流稳态”要灵动一些。 接下来要完成的是电容的引入,这是一个比较重要的、也是需要用到更多核心计算机制的IC,一旦完成了电容的引入,就可以进行一些基本电路的仿真了。 当然,电容的引入并不是1、2天就能完成的事情,所以这期间还会找一些相对容易的功能也一起实现。例如:对已经绘制了的线段、IC进行删除、移动。这样以上普通功能和“难点功能”,就共同构成了本周要进行的开发需求。
sncircuit开发备忘:网络合并
在 NetlistManagerClass 中原本有一个方法叫做 updateAllNetlistIndexTo(),它起初的含义是将第一网络节点中所有的成员,从第一网络节点中删除、并且追加到第二网络节点中,然后第一网络节点便成为了“荒废节点”,可以删除掉了。 这个方法存在着一些问题。首先是它的名称今天看来已经不再准确,更准确的名称应该是 merge,完成的功能还是一样的:将网络节点a和网络节点b中的所有成员,都迁移到a或b网络节点中,然后将荒废掉的网络节点剔除掉。 其次,对于merge(netlist a, netlist b),究竟是将谁的内容迁移到另外一个网络节点中呢?昨天我纠结了很久,后来想明白了:无论从a到b,还是从b到a,实际上都是一样的,因而完全没有必要纠结要不要为这个方法增加第三个参数指明保留谁。 而今天重构这块代码的时候,又有了更为“智能”的一个方案:既然无论怎样的方向对于合并都没有影响,那么就应该选择成员最少的网络节点进行“搬家”操作,这样效率会更高,因而在merge()内部进行判断,找到a和b中迁移成本低的进行迁移。 额外的,在完成上述方法重构时发现,除了在 PlacementManagerClass 中会调用netlistManager->merge()方法外,在NetlistManagerClass中也会调用netlistManager->merge()方法,并且后者的调用是“迂回到footpin中”进行调用,后者的“迂回”导致代码逻辑十分难以理解,所以将迂回的调用删除了,如此就简化到只要在PlacementManagerClass和NetlistManagerClass两个类中的两个位置上调用merge(),如此代码相对比较容易理解。 即便做到了上面说的“只在两个地方调用”,实际上还是有些“繁琐”的,还是业务逻辑上的繁琐与不恰当。这一点上现在脑子有些乱,所以先写下这篇备忘,将相关工作记录一下。有时间会再推敲如何继续合并代码,争取只在一个地方、一个逻辑内,完成“网络节点的合并”。