Hello blog

终于,我还是给知识库加上了博客的功能。 在听了 捕蛇者说 的播客节目「个人知识管理体系系列」后,我思考了一番,发现之前倾向的单一知识库的做法,存在一些弊端: 日常一些零碎的观点或想法,不适合提出来长篇大论、单独成文。 知识库的文风比较正式,需要引经据典、咬文嚼字,这样一来写作的周期也会被拉长,这也削弱了零碎写作的积极性。 我希望把博客当 gist 用,简单记录一些零碎观点或想法。

2025/9/17
articleCard.readMore

如何不长痘

最近因为吃了一顿麦当劳上火感冒了,在养病的几天里,我发现脸上的痘渐渐消了,而且也没有新长痘。 之前小发也跟我讨论过,于是我想了想,大概是这几个原因: 足够睡眠、不熬夜。在那几天里,我每天晚上十一点半睡,早上七八点醒。 饮食清淡。那几天吃的都很清单,基本上都是汤面、汤饭,也不吃辣,不吃冷饮雪糕,所以一点儿上火或生寒的元素都不存在。 一直到现在我都保持着这些做法,所以到现在也不怎么长痘。 一旦知道自己没长痘,整个人就精神多了,待人接物也自信了许多。这也反过来督促自己该早睡早起、饮食清淡。这是一个积极的正向循环,希望我能坚持下去。

2025/9/17
articleCard.readMore

买了一台 NAS

我从闲鱼代理买了一台 DS220+。直接原因是因为,Google Photos 从六月以后取消了无限上传额度,且我也慢慢意识到,把从小到大整整几百个 G 的照片,都托付给垄断公司,是非常不保险的做法。甚至可以说,只要他们想,是可以找个借口,把用户数据丢掉的。 不仅仅是照片,项目仓库、音乐、电影等等,我都急切需要一个反脆弱的数据存放方式。 「让我的数字资产比我活得更久。」这是我的目标。 最开始,我仅仅是把数据存在电脑单一硬盘上,但如果不巧碰上硬盘坏了无法修复,或者往极端点想,电脑被偷了,那数据就永远丢失了。大多数人会想到这个问题,并选择冷备份的办法。但是我们都知道,数据是不断更新的,冷备份有周期性,一旦在备份开始前发生意外,那么这一个周期的数据(甚至恰好有关键数据)也是找不回来的。而且这种办法非常不 geek,繁琐的流程应该交给机器来解决。 后来我尝试用各种局域网 sync 工具和 git 的方法,但前者方案并不完善,而 git 虽然安全可靠,但不适合处理非二进制的大文件(所以我现在仅仅用 git 来处理项目仓库)。 所以我索性上了白群晖,NAS 本地储存 + Cloud Sync 加密上传各大网盘,一步到位。而群晖的 Photos 套件,跟 Google Photos 的用户习惯相差无几,不难入手。 数据的迁移还是挺花时间的,需要有耐心。这星期内我也会出炉一篇文章,讲讲我是如何「永久」保存数据的。

2025/9/17
articleCard.readMore

不要自己感动自己

这些年我一直提醒自己一件事情,千万不要自己感动自己。大部分人看似的努力,不过是愚蠢导致的。什么熬夜看书到天亮,连续几天只睡几小时,多久没放假了,如果这些东西也值得夸耀,那么富士康流水线上任何一个人都比你努力多了。人难免天生有自怜的情绪,唯有时刻保持清醒,才能看清真正的价值在哪里。 —— 于宙《我们这一代人的困惑》 该工作工作,该学习学习,该睡觉睡觉,该玩就放开玩。

2025/9/17
articleCard.readMore

为什么要抵制智能推荐算法

我认为,对人工智能的恐惧,大多数情况下,就是对资本主义的恐惧。我们担心资本主义将如何通过技术来利用我们。 -- Ted Chiang,美国科幻小说作家

2025/9/17
articleCard.readMore

关于新能源行业的一些观点

其实在互联网工作了这么多年,各个巨头无非都在抢一个东西 —— 流量入口,车是未来的流量入口,互联网公司争抢造车这块市场也无非是这个原因。 在我看来,未来 3-5 年之内,新造车的战局就会稳定下来,到时候国内应该会有 1-2 家特别大的新能源车公司,就像之前的大众集团一样,吃掉大部分的市场,就像当年的美团、滴滴一样。 其实造车行业在各个行业吸了很多血,包括金融、互联网以及其他行业,人、财、物都往这个行业聚拢,洗牌之后可能并不需要这么多的从业人员。人是会跟着行业趋势走的,如果这个行业洗牌后依然能保持不错的增长,我会在这个行业工作比较长的时间。

2025/9/17
articleCard.readMore

内卷与未来的职业趋势

经济不景气,更有利于早点去朝阳行业。 早早去站位,早早去占坑。 本科生去了,几年后,就会发现,读研的同学还没有你混的好。 内卷,是无意义的做功。 一群人在无意义的做功,我们只要找到新方向的风口,过去占位。 占位,不卷。等到占稳了位置,就会有人卷过来。 到时候门槛水涨船高,但进入的早,便能卡住位置。 熟悉历史规律,自然能够找到合理的策略。 就像是在历史上,历次大萧条后,都会出现的洗牌。 对普通人来说,这恰恰是珍贵的机会。 —— 「立华说」

2025/9/17
articleCard.readMore

RoboMaster 赛后随笔

终于是打完比赛了,今年的成绩较前两年有突破,从南部赛区打进了国赛。但也仅仅是止步于国赛。 今年的问题在于硬实力。战术只能弥补一定的实力差距,带我们进国赛。但若说机器人在场上的基本功能都不能保证,那么无论多好的战术,都是弥补不来的。 最后一场打北科大,可以称得上是终局之战了。一号英雄被击毁,二号工程图传过热抓瞎,三号步兵翻车,五号步兵不能动,哨兵被摧毁,飞镖已打出但没击中前哨战。在操作间里,我们已经知道比赛无望了,所以尝试让四号步兵飞坡,结果也翻车了。最后一分钟金钱到位,只能启动无人机当哨兵用,倒是将敌方击退并造成两百多伤害(自瞄稳健)。无人机打完所有弹丸之后,也无力回天了。 还记得打川大那一局,本来第一局已经输了,但后来却扳回两局。他们三局的飞镖全都打中前哨战,到后来我们完全放弃守塔了。不过最后还是靠着地面推进,硬是赢回了比赛。 希望能一年比一年好吧。

2025/9/17
articleCard.readMore

8 月深圳小记

8 月 28 日的午后,我来到车站等候回学校的火车。转眼间 8 月匆匆过去,我决定记录在深圳的这一个月。 月初,在 RM 比赛因疫情延期了两个月之后,我们的队伍终于来到了深圳。这是我第一次踏上赛场(去年因疫情变成了线上赛),在比赛中有幸作为云台手进入操作间,淋漓尽致地体验了一回比赛的氛围。 刚来到赛场的前两天,我们的准备完全不充分,在适应性训练和第一场比赛之中,各兵种机器人都遇到了大大小小的问题。不过,在接踵而至的比赛中,我们且战且进,逐渐适应了比赛的节奏。也感谢技术组的队员们,在团队士气最低落的时刻,依然默默坚守,修复机器人的各种问题。 小组赛,击败重庆理工和厦门理工后,却与福建工程学院打平,使我们非常被动地去迎战四川大学。在前年的比赛中,我们输给川大,从而无缘国赛。第一局,我们非常没有信心。川大的飞镖一开局就拆掉了我们的前哨战,而高佬的步兵下坎一急就翻车了,我们只能硬撑着局面。虽然第一小局输了,但坤坤发现,似乎我们少一台步兵,却勉强还能打得过。第二局开始了,我看着雷达的画面,十分焦虑,于是在麦克风里对大家说,我们要记住,我们是没有前哨战的,破釜沉舟,背水一战才有可能赢(事实上,三局对面的飞镖都把我们前哨战给拆掉了……)。川大虽然有飞镖这个杀器,但他们的地面单位没有战术配合。于是,我们根据演练了三个多月的战术配合,逐个击破。第二局的扳回,我们信心大增,在第三局的决战中,我们稳中求进,拿下了国赛的门票。 国赛无弱队,我们最终止步于国赛二等的奖项,只能期待明年下一届的比赛了。 打完了比赛,我就拖着行李箱往公司去了。读初中的时候,我开始接触单片机,Seeed 和柴火创客空间于我而言,一直是写在未来的愿望清单上的。 在这里的每一天都充满成就感,因为工作的内容就是兴趣所在,而且还能与优秀的伙伴们一起共事,这实在是一种享受。 在深圳的内卷的大环境下,生活仍然可以有甜点。偶然去了福田市中心的酒展,虽然酒一般般,但还是挺开心的: 周末午后书店的柠檬茶和苏打水: 终于与来深圳打工的朋友们聚了一回,晚上的啤酒搭烧烤还挺不错: 有天下班去地铁站的路上,一片晚霞搭起了一座虹桥,我才发现很久没有抬头仰望过天空了。 8 月底,开学了,接下来该何去何从呢? 回想起在赛场上喊得震天的口号,「脚踏实地,仰望星空」,我已经有了答案。

2025/9/17
articleCard.readMore

当下与永恒

当年,古罗马人在宏伟华丽的浴宫中吹着口哨,认为帝国就像身下的浴池一样,建在整块花岗岩上,将永世延续。 现在人们知道,没有不散的宴席,一切都有个尽头。 —— 刘慈欣《三体 Ⅲ·死神永生》 置身于浓厚的节日气氛里,看着身边欢乐的人们,我也不禁被融入其中。 「如果每一天都能如此快乐就好了」。但仔细一想,如果每天都一样地快乐着,那还能称之为快乐吗?先前读过一段话,「快乐是生活的点缀,无聊和痛苦才是生活的本质」。 远看到人的一生,生命之于宇宙的刻度,是尤其短暂的。如果可以永生,那活着的每天,还会有新鲜感吗? 经历过无聊和痛苦,才能明白快乐的来之不易;人知道生命会有终将逝去的一天,才会去珍惜在这个世界上的每一天。 如何把有限的生命,刻进永恒的宇宙维度,这是我一直在追寻的谜题。 不过,尚存一点我们可以把握的,是去珍惜身边的美好,珍惜你所爱的人,别待失去才追悔。 预祝中秋快乐~ 一杯敬明天 一杯敬過往 一杯敬自由 一杯敬死亡 寬恕我的平凡 驅散了迷惘 好吧天亮之後總是潦草離場 清醒的人最荒唐 …… —— 毛不易《消愁》

2025/9/17
articleCard.readMore

雨下了四年十一个月零两天。间或有细雨绵绵的日子,一开始人人都还身着盛装,带着久病初愈的神情预备庆祝天晴,但很快便习惯了将这些间歇当作滂沱重现的前奏。 🎵Who'll Stop the Rain🎵 那是最昌明的时世,那是最衰微的时世; 每天早晨,太阳升上地平线,爬到最高点再回落,这一天就宣告结束,为下一天让路。 大低谷纪念碑是纪念大低谷的建筑群,是一只只从沙漠中向上伸展的枯树干般的手,其都对着天空做出各种扭曲的姿态。 在疫情汹涌而至前的岁月,大家的目光都向着前方;居家办公的日子里,外面的世界似乎愈发向着低谷在塌陷,瘟疫、战争的阴霾挥之不去,天启四骑士正逐一降临,巴别塔一次次被推倒。在人类漫长的历史岁月里,和平、开放、富足的年代是短暂的、火花一般闪耀了一下,随即跌入漫漫长夜之中。 白昼之光,岂知夜色之深。 危机出现后的一个世纪,曾经在黄金时代生活过的人们都离开了人世。……这个时代在今后一直被人不断地回忆,经历过这段美好岁月的老人像反刍动物似的不断把那段记忆吐出来,甜蜜地咀嚼,最后总是加上一句:「唉,那时咋就不懂得珍惜呢?」而听他们讲述的年轻人目光中充满嫉妒,同时也将信将疑:那神话般的和平、繁荣和幸福,那世外桃源般的无忧无虑,是否真的存在过。 假如某些相当偶然的事件发生,就会很容易就被视为传统,因而再也无法打破,或者几乎牢不可破。 Long as I remember the rain been comin' down Clouds of mystery pourin' confusion on the ground Good men through the ages tryin' to find the sun And I wonder, still I wonder, who'll stop the rain? I went down Virginia, seekin' shelter from the storm Caught up in the fable, I watched the tower grow Five Year Plans and New Deals, wrapped in golden chains And I wonder, still I wonder, who'll stop the rain? Heard the singers playin', how we cheered for more The crowd had rushed together, tryin' to keep warm Still the rain kept pourin', fallin' on my ears And I wonder, still I wonder, who'll stop the rain?

2025/9/17
articleCard.readMore

现代都市与末日田园

🎵Nowwhere Man🎵 He's a real nowhere man, Doesn't have a point of view, 现代都市能解决你的大部分需求: 饿了?去楼下全家买个饭团填饱肚子,或者干脆下馆子 想消费?走几步就能逛 mall 出行?地铁公交网约车能带你去任何地方 生病了?药店医院也不少 在赛博空间里也是一样的。微信、网易云音乐、淘宝……新时代的人们,能够随时享受到它们带来的便利。 曾几何时,我们以为它们是永恒的,不会对我们关闭入场权限,至少也不应该那么突然。 当下载的音乐因版权无法收听,当聊天与文字因敏感而被屏蔽,当现代都市因封锁而休克。我们开始意识到,面对它们的强势,我们是十分被动的。 于是,我们只能开始开垦自己的末日田园。「深挖洞,广积粮」,以末日生存的标准来做灾备,即使这样做会失去很多便利性。 自建博客、导航站、书库、音乐影视库、使用 RSS 订阅与播客,使用 NAS 进行分布式储存备份。 虽然我们尚未有条件去构筑现实世界的末日田园,但是至少可以在赛博空间内先实验一番,首先让精神得到安抚。 文明像一场五千年的狂奔,不断的进步推动着更快的进步,无数的奇迹催生出更大的奇迹,人类似乎拥有了神一般的力量……但最后发现,真正的力量在时间手里,留下脚印比创造世界更难,在这文明的尽头,他们也只能做远古的婴儿时代做过的事:把字刻在石头上。

2025/9/17
articleCard.readMore

硬件行业趋势与个人的选择

对硬件行业的一些观点 供需关系不匹配 我们的教育培养了一种不太正确的思维方式,认为难的东西就更值钱。其实现实中并非如此。一个东西的价格主要是由供需关系决定的。供不应求价格就会上涨,供大于求价格就会下跌。 一个职位的工资高低并不取决于该职位的技术难度,而是取决于该职位的市场价值。而市场价值又是由市场需求来决定。 一个人的技能是否值钱和这个技能的难度是没有一丁点关系的,只和市场需求有关系。市面上如果需要 100000 个熟练前端,但是只能培养出 5000 个熟练前端,这些人的薪资当然高了。反之,如果全中国每年只需要 20 个做编译器的软件工程师,但是每年光做编译器的博士研究生都有 30 个毕业的话。那些本科生是一丁点机会都没有的,无论你在大学四年中学了多么难且艰深的理论,连免费实习的机会都没有,别人嫌你浪费电。 作为基础设施的硬件行业,其本身的发展需要依赖于实实在在的基础科学与工程技术,与业务关联性没有很强,所以其更新换代的速度就没有那么快,也就限制了从业人员需求的增长。所以,即使某些硬件工程的门槛高,也架不住需要的人少呀。 扩张边际效益低、试错成本高、产品开发周期长 对于实体制造业,每扩张一倍,就意味着与之对应的其他各项成本(包括人力成本,机器成本,土地成本等等)至少也要扩张一倍,考虑到效率的因素,扩张的边际成本甚至是在增加的。而且这个过程需要大量的时间准备。 芯片器件集成度变高 芯片厂家的生态、参考设计越来越成熟,应用开发的门槛越来越低。 板级硬件现在都只剩抄抄图,看看芯片说明书。芯片说明书甚至帮你把外围电路都说了个七七八八。只需要一个高级的拼装工。 至于为什么需求这么小,前面也提到了,板级硬件技术发展了这么多年,很多东西都集成化,模块化了,没有硬件工程师发挥创造的舞台了,招一个牛逼的和一般的差不了太多。尤其在联发科创造的 turnkey 解决方案推动下,几乎所有的芯片原厂都会提供全套参考设计,也就是可以抄作业,抄好作业甚至还可以请芯片原厂检查一下作业。一旦作业完成之后,硬件工程师的活就剩下日常打杂,失效分析,产线故障处理,配合软件调试软件之类,再也没有设计与创作的空间。一个产品上市如果需要持续的硬件设计改进,说明这个产品的硬件设计一开始就是一坨屎,这种事情是绝对不允许发生的。而对软件而言,无论什么阶段,都可以持续改进,提高创新。说不定,还能引出一点新问题出来,大不了后续来个 OTA 升级修复就得了,可这些工作都需要人去干吧,需要软件去干吧。 职业发展选择 硬件工程师虽然待遇低,但公司与公司之间差距也是很大的。待遇按供应链分,欧美芯片原厂 > 国内芯片厂(包括台湾省)> OEM&ODM 终端厂 > 方案公司。所以,在跳槽的时候,尽量从右往左跳,工资待遇和技术竞争力会越来越好。凡事都有例外,像 OPPO/VIVO 这样的终端厂硬件待遇长期碾压芯片原厂,但我仍然建议一个硬件工程师至少有一段在芯片原厂的工作经历,以夯实技术,丰富经验,拓展视野,这只有原厂才能给你的,终端厂是给不了。然后再居高临下,傲视天下的姿态下嫁到有钱的终端厂,才是一个完美的结局。 基于以上各家的观点,我们能够得出来的结论是:如果还没入行,快逃,逃往嵌入式软件或纯软件领域;如果已经入行,往上游走,往原厂走,往硬件领域最核心的地方谋发展。 参考与致谢 硬件工程师有哪些发展方向和具体的发展前景? 硬件明明比软件更难,国内的硬件技术也不如软件,为什么硬件工程师待遇还不如软件?

2025/9/17
articleCard.readMore

有限与无限世界

Take a piano. The keys begin, the keys end. You know there are 88 of them, nobody can tell you any different. They are not infinite. You are infinite. And on these keys the music that you can make is infinite. I like that. That I can live by. -- The legend Of 1900 我在构想一个有限的世界,它是被约束在一个小区域内,你只能在其中进行探索,而不能越出其边界。 这样的描述也许过于抽象,但是可以有具体的实例来比喻:它是 iPod 里有限层级且功能很少的菜单、它是封闭式的学校、疫情下不进不出的社区、抑或是《海上钢琴师》中 1900 一生所在的船上。 它们都有一些共同的特征:因为是有限的范围内,所以探索程度会随时间推进而逐渐饱和,且呈现出边际效益递减的趋势。 生活在有限世界中,我们每天都经历着重复的景色。但是,如果你愿意花心思去探索,也许能发现彩蛋,有时转瞬即逝,有时微乎其微,但我们仍能惊叹于它的出现,感受着它带来不一样的体验。 在大学封校的那段日子里,我爬上了学校几乎所有楼的楼顶,仔细欣赏形色各异的落日与景色。在一栋文科楼的楼顶,我发现了围墙上的涂鸦。这种感觉,正如在孤独的银河系中找到了人类以外的其它智慧生命体一般。 这就是有限的世界,每天重复的景色也许会使你感到无聊,但也在无形中让你思考,在已知中发掘未知。 继而说到无限世界。在这里,每一步都可以是全新的探索,沿途的景色可以永不重复,探索永远不会趋向饱和。 现代人生活在无限世界中。我们每天都在摄入新的信息,但我们鲜有想过,如何将它们消化。 以前的世界并没有现在这么过量的信息流,普通人想要获得一些信息需要拼尽全力,因此他们有大把的时间去反复咀嚼自己已经获得的信息。 一本书翻来覆去看几十上百遍,每一句话都会在他们脑中无意识的回想,在日常生活里,在他们那些闲着没事的时间里,突然蹦出来,突然有了新的感悟。 但到了我们这里,我们每天花很少的时间思考,我们追求干货、追求结论,直接将别人整理好的观点拿来用,并对其坚信不疑。 结果每个人的脑中都充满了思想,但这些思想绝大部分都不是自己的,只是一个片面的结论,大家很擅长用这些已经得出来的结论去互相攻击,但却少有人知道这些结论得出来的过程。 人类所有的问题,都源于人无法独自安静地坐在房间里。身处于无限世界中的我们,有时候也需要为自己构建一个有限世界,任思想纷飞、碰撞、绽放出火花。 参考与致谢: 浪费掉的时间,才是自己的

2025/9/17
articleCard.readMore

星夜漫游

🎵Sgt. Peppers Lonely Hearts Club Band🎵 当我踏出实验室时,已是午夜时分。 跨上驾驶位,点火。披头士的 Sgt. Peppers Lonely Hearts Club Band 如同热浪一般,从音响中喷涌而出。好久没回顾经典摇滚了,我想,就接着听这部专辑吧。 最开始喜欢上这首富有张力的摇滚,是源自披头士波普风格的动画 Yellow Submarine. 经典从未消逝,在一次又一次的演绎中得以重生。 Yellow Submarine is the tenth studio album by English rock band the Beatles, released on 13 January 1969 in the United States and on 17 January in the United Kingdom. It was issued as the soundtrack to the animated film of the same name, which premiered in London in July 1968. The album contains six songs by the Beatles, including four new songs and the previously released "Yellow Submarine" and "All You Need Is Love". The remainder of the album is a re-recording of the film's orchestral soundtrack by the band's producer, George Martin. 游弋在城市快速路上,四下空无一人,震耳欲聋的音乐灌满了整个车舱。我置身于自己的黄色潜水艇中,一边琢磨着星空与月夜。或许在百万年前,这片土地也曾是深不可测的海洋。我心无旁骛,发现舱外逐渐现出寒武纪的三叶虫,三叠纪的长颈龙,头顶还有蓝鲸的庞大身影。它们呈半透明态,泛着荧光。它们丝毫不受惊扰,仿佛这片海洋就是自己的常驻之地。 一只胭脂色的水母朝我游过来。虽然我也在漫游,但它仍随我而动,游动姿态是那么的优雅。我很想把手伸出窗外触摸它,但却不想破坏了这般奇幻的美景。鲨鱼在不远处捕食一头海龟,自然的规律一直都存在于曾经或正生存在地球的生物上,人类创造的文明也仅仅是块遮羞布。 云层重新散开,月光再次漫无目的地洒落,夜色寂静如空。 没有鱼群,没有海洋,我恍过神来,到家了。 唯留下清澈的夜空,月明,星稀。

2025/9/17
articleCard.readMore

探索之路 - 2022 小记

2022 年转眼即逝,有趣之事蛮多,挑一些记录下来吧。 在专业领域的探索 2022 年,我在自己的专业领域 - 硬件与嵌入式的基础上,在射频、信号完整性、电源、半导体 ATE 等领域有了新的探索。也画了很多很多的电路板,焊接了数不清的元件。 在我的知识库体系下,各个分类的知识也在蓬勃增长着。 重新思考未来的方向 在职业生涯的路上,我看到供需关系不匹配、扩张边际效益低、试错成本高、开发周期长这一系列的问题,正压缩着硬件解决方案从业者的天花板。 认真调研了一番,我发现往上游的路似乎更好走。 一个人的命运啊,当然要靠自我奋斗,但是也要考虑到历史的进程。 正值半导体行业火热,我决定去试试。于是,我离开了实习的公司。诚然,在 2022 年末看,半导体行业虽然会受经济传导到消费电子市场的影响,带来持续的下行周期,但从长期看来仍然是一个朝阳行业。 抓住每一个机会 江湖上说,半导体行业去原厂香,并且欧美原厂更香。记得有一段时间,我隔三岔五就有面试。在家、在火车上、开车在路上、甚至在毕业旅行在酒店里,我都在与面试官们谈笑风生。 在某一回大厂的面试后,面试官告诉我,有一个好消息和一个坏消息。好消息是我通过了面试,坏消息是此岗位只招实习生。面试官私底下给了我隔壁厂工程师的邮箱,说可以投个简历试试看。看似虚无缥缈的线索,我还是认真准备了简历,即使成功的概率很低,我也要努力去试试看。 后来令我没想到的是,居然能够成功通过面试并拿到 Offer。还记得去年在 RoboMaster 打进国赛后,我们激励自己,抓住机会,输了不亏,赢了血赚。实践再一次证明,这个思路还是非常具有可行性的。 复前行,豁然开朗 新的工作在上海,得开始动身了,这是我第一回去离家这么远的大城市打工。查了查地图,发现还是挺远的,1500 公里的距离,一个人开长途,为了不疲劳驾驶,同时还要给车规划充电,我只好把行程拆分成了好几天。 从深圳到上海,路过惠州、瑞金、上饶、杭州,小跨了半个中国。一路上,我听完了全集「易中天品三国」,在服务区与别的车抢充电桩,途中还因为感冒浑浑噩噩开了两天,终于在某一天的清晨开在了上海的高架路上。 在旅途中,我在西湖边上玩了两天。从南方到北方(广东人看来),一路上看着植被的变化,长途自驾其实还是挺有趣的。 跟 Covid 躲猫猫 疫情三年来,我一直与 Covid 玩躲猫猫。4 月的上海,9 月的广州深圳,我一直在避着毒圈跑,也时时处在幻阳的笼罩下。 所幸运气足够好,也感谢我身体细胞们的共同努力,又苟过一年,我们决赛圈见。 展望 2022 于我而言还是挺幸运的,不过现阶段尚未稳定下来,半场开香槟是不明智的。2023 年将会是一个不错的开始,有什么想法就勇敢去想,大胆放开去做吧。

2025/9/17
articleCard.readMore

Home

Power's Wiki 博览万物,融会贯通。 Hi there~ 欢迎来到我的知识库。 为了避免遗忘、便于分享,我在这里收录知识。 硬件 & 半导体 嵌入式 & 软件开发 生活 & 折腾

2025/9/17
articleCard.readMore

3D 打印:ABS 与 PLA 的区别

3D 打印:ABS 与 PLA 的区别 3D 打印中,该如何合理选择 ABS 和 PLA 材料? ABS 材料 ABS(丙烯腈 - 丁二烯 - 苯乙烯共聚物),是相对传统的 3D 打印用料。 打印温度 使用 ABS 打印时,一般将打印机喷头温度设置为 210~240℃,热床温度为 80℃ 以上。另外,ABS 的软化温度为 105℃。 打印性能 ABS 打印时很顺滑,但遇冷收缩,可能会造成翘边脱落等问题。 强度 ABS 强度高,且因为弹性佳,即使承受压力也只会弯曲,一般不会折断。 气味 ABS 在打印时会产生异味。最好使用封闭式打印机,或是保持室内通风,避免过量吸入气体。 使用场景 相对来说,ABS 适用于经常碰撞、需要韧度、相对高温的场景。 缺点是,没有热床的打印机不能使用 ABS 进行打印,因为打印时可能会翘边脱落;通风不好的房间尽量也别用。 PLA 材料 PLA(通常指聚乳酸)为生物分解性塑料,部分甚至可达到食用级别标准。 打印温度 使用 PLA 打印时,一般将打印机喷头温度设置为 180~200℃,热床非必须但建议使用,温度设为 60℃。另外,PLA 的软化温度为 60℃。 打印性能 相较于 ABS,PLA 在打印时很容易堵喷头(因为 PLA 熔化后容易附着和延展),但不会产生翘边脱落的情况。 强度 PLA 弹性和强度都会差一些,不过打印时可以通过设置填充和壁厚来解决。 使用场景 PLA 相对环保(因为其可降解),相对便宜,不易翘边,打印时不会产生异味。 PLA 不适用的场景是高温和碰撞。60℃ 以上的高温和磕碰会让打印成品变形或折断。 参考与致谢 3D 打印入门必读:ABS 与 PLA,用哪个好?

2025/9/17
articleCard.readMore

ADC - Dynamic Parameters

ADC - Dynamic Parameters This post was originally written in English. Dynamic Parameters ADC's dynamic parameters mainly contain: Signal to Noise Ratio (SNR) Total Harmonic Distortion (THD) Signal to Noise and Distortion Ratio (SINAD) Inter-modulation Error (IM) Signal to Noise Ratio (SNR) Signal to Noise Ratio (SNR) of an ADC is defined as the ratio of the Measured Signal Power's RMS (excluding Harmonic Distortion) to the Noise Power's RMS: \[ SNR(dB)=20log(\frac{V_{Signal(RMS)}}{V_{Noise(RMS)}}) \] Since SNR is an ratio of power, \(20\) in the equation means the square of the ratio of voltage. Although the Harmonic Distortion is not included in the measurement of SNR, but the Quantization, Thermal and other residual noise in converter are included. Total Harmonic Distortion (THD) Total Harmonic Distortion (THD) of an ADC is defined as the ratio of the fundamental to all the harmonic distortion: \[ THD(dB)=20log(\frac{\sqrt{V^2_{2(RMS)}+V^2_{3(RMS)}+...+V^2_{n(RMS)}}}{V_{1(RMS)}}) \] How to Test Dynamic Parameters Test System Setup Test system setup for ADC dynamic parameter tests: Resolution of AC SRC should be at least 2 to 4 bits better than DUT. Tests Concept ADC has a theoretical best ever SNR of: \[ SNR = (6.02N + 1.76) dB \] Where \(N\) is the number of ADC's bits. Procedure of testing the dynamic parameters of an ADC DUT is listed below. 1. Make a continuous input signal with the tester for the ADC to convert It is common practice to ensure that the analog/digital clock are referenced to a common master clock, so that the relationship of the clock sources's frequency is fixed and synchronized, which making test results highly repeatable. 2. Collect a set of samples with the ADC coherently For AC Source: \[ \frac{Fs}{Fi}=\frac{Ns}{Ms} \] Where \(Fs\) is the samping rate of AC Source, \(Fi\) is signal frequency, \(Ns\) is the number of samples (does not have to be a 2x number), \(Ms\) is the number of integer cycles (does not have to be odd). For Digital Capture: \[ \frac{Fs(dut)}{Fi}=\frac{Ncap}{Mc} \] Where \(Fs(dut)\) is the ADC sampling rate also the Digital Capture's sample rate, \(Fi\) is the signal frequency, \(Ncap\) is the number of samples captured (2x number), \(Mc\) is the number of integer cycles (odd). 3. Send the collected set of time samples to the DSP to perform DFT / FFT analysis ? 4. Analyze the frequency bins of interest using equations or tester algorithms for SNR, THD and compare to specification 5. Make a pass / fail decision based on the results References & Acknowledgements Fundamentals of Testing Using ATE The-Fundamentals-of-Mixed-Signal-Testing_Brian-Lowe Original: https://wiki-power.com/ CC BY-NC-SA 4.0 agreement, should be reproduced with attribution.

2025/9/17
articleCard.readMore

ADC - Static Parameters

ADC - Static Parameters This post was originally written in English. Analog to Digital Converter (ADC) is a device to converts analog signals into a sequence of digital data. Though ADC's ideal transfer function should be a straight line, but actually is a uniform staircase, that the number of steps corresponds to the number of digital output codes. Since analog is continuous and digital is discrete, quantization error will be introduced in the procedure. Static Parameters ADC's static parameters mainly contain: LSB Size Full Scale Range (FSR) Offset Error Gain Error Differential Non-Linearity Error (DNE or DNL) Integral Non-Linearity Error (INE or INL) LSB Size The width of one step is defined as 1 Least Significant Bit (LSB). The resolution of an ADC is normally expressed as number of bits (digital output code). An ADC with an n-bit resolution has \(2^n\) possible digital codes (\(2^n\) step levels). \[ LSB=\frac{V_{FST}-V_{ZST}}{2^{bits}-2} \] For an ideal ADC, LSB represents all of the each code's width. Full Scale Range (FSR) For example, for a 3 bit converter, there are: 8 horizontal steps 7 transitions 6 steps between 7 transitions Zero Scale Range Transition Voltage (\(V_{ZST}\)): Voltage of the analog input signal when the first transition is recorded. Full Scale Range Transition Voltage (\(V_{FST}\)): Voltage of the analog input signal when the last transition is recorded. Full Scale Range (FSR): Maximum extreme of the analog input signal supplied to the ADC. \(FSR = (V_{FST}-V_{ZST}) + 2 LSB\), \(V_{FSR(refer to VZS)} = (V_{FST}-0.5LSB)-(V_{ZST}-0.5LSB) + 2 LSB\) Offset Error Offset Error (Zero-Scale Error) is the difference between ideal and actual offset (initial) points. It is measured from the midpoint of the zero step (ideal to actual) for the ADC. Where \[ V_{ZS}=V_{ZST}-0.5LSB \] Gain Error Gain Error is the difference between ideal and actual gain points on the transfer function (after the offset error has been corrected to zero). It is measured from the midpoint of the full step for the ADC. Where \[ V_{FS}=V_{FST}-0.5LSB+2LSB \] Differential Non-Linearity Error (DNL) Differential Non-Linearity Error (DNL) is the difference between an actual step width and an ideal step width (1 LSB). It's a measure of "small-signal" linearity error, and is measured from the difference in the analog input voltage between 2 adjacent transitions and the device's average LSB. Equations to describe DNL: \[ DNL[n]=CodeWidth_n-LSB_{average} \] \[ DNL=(V_{in2}-V_{in1})-LSB_{average} \] another image to decribe DNL: If DNL exceeds is too large, one or more codes will be missing and never receive an output. Integral Non-Linearity Error (INL) Integral Non-Linearity Error (INL) is the cumulative effect at any given input of all differential non-linearity values. It is a measure of "large-signal" linearity error. INL at any point along the curve is the deviation of the ideal linearity line. The deviations are measured at the transition points from one step to the next for the ADC. INL is the deviation of the values of the actual step function to the ideal straight line function. Equations to describe INL: \[ INL[n]=INL_{n-1}+{\frac{DNL_{n-1}+DNL_{n}}{2}} \] \[ INL=[(\frac{BinaryCode}{2^{bits}-1})(V_{FS}-V_{ZS})+V_{offset}]-CodeCentor \] How to Test Static Parameters Test System Setup Test system setup for ADC static parameter tests: Since the ADC voltage-to-code transfer curve is a many-to-one mapping function: We use linear ramp histogram method (code width measurement) practically. The input ramp is slow enough to give a statistically relevant "number of hits per code". Block diagram of signal setup: Tests Concept Procedure of testing the static parameters of an ADC DUT is listed below. 1. Make a ramp wave segment for AC SRC The input ramps goes above and below ±Fs to assure that all codes are covered: 2. Take data between the start (min+1, e.g. 0…01) and the end (max-1, e.g. 1…10) of the ramp. That gives \(2^n – 2\) codes' worth of data Voltage applied must be wider than the full-scale range to cover all transitions. 16 steps in-between each code transition is shown below: for the ideal ADC DUT, 16 output codes are appear in the same times: However, a real device will have a count more than 16 times for wider codes, and less than 16 times for narrower ones (But sum of the total occurrence should be still \(2^{bits}\) times of 16): 3. Calculate for DNL for each step \[ DNL[i]=\frac{Hits[i]-\frac{\sum Hits[i]}{2^n-2}}{\frac{\sum Hits[i]}{2^n-2}} \] Where \(Hits[i]\) represents the Actual Output Code Count, and \(\frac{\sum Hits[i]}{2^n-2}\) represents the Ideal Output Code Count. For an example historam graph as shown below: for \(DNL[1](Code 001)\), Actual Output Code Count = 14 Idea Output Code Count = (14 +18 +15 + 17+ 17 + 15) / (8 -2 ) = 16. Therefore \(DNL[1] (Code 001) = (14-16)/16 \ LSB => -0.125 \ LSB\). 4. Get the max and min DNL 5. Calculate for INL for each step INL is the cumulative value of the first DNL to the DNL[i] (except zero and full scale DNL): \[ INL[i]=DNL[i]+DNL[i-1]+...+DNL[2]+DNL[1] \] Note that \(DNL[0]\) is not used, \[ INL[0]=INL[FullScale]=0 \] For an example graph below, \[ INL[1] = DNL[1] = -0.125 * LSB \] \[ INL[2] = DNL[2] + DNL[1] = 0 * LSB \] \[ INL[3] = DNL[3] + DNL[2] + DNL[1] \\ INL[3]= 0.0625 * LSB \] 6. Get the max and min INL References & Acknowledgements Fundamentals of Testing Using ATE The-Fundamentals-of-Mixed-Signal-Testing_Brian-Lowe Original: https://wiki-power.com/ CC BY-NC-SA 4.0 agreement, should be reproduced with attribution.

2025/9/17
articleCard.readMore

ADC 与 DAC 基础知识

ADC 与 DAC 基础知识 在现实世界中,常见的信号大都是模拟量,像温度、声音、气压等,但在信号的处理与传输中,为了减少噪声的干扰,较多使用的是数字量。因此我们经常会将现实中的模拟信号,通过 ADC 转换为数字信号进行运算、传输、储存,再通过 DAC 转换为模拟信号,呈现出来。 但要注意的是,现实中的模拟量连续的,意味着它有无限的分辨率,但转换为数字量之后,将会丢失一定的精度,在时间和幅度上都会变成离散的值。 ADC 基本原理 ADC(Analog-to-Digital Converter)指模拟 / 数字转换器,可将真实世界的模拟信号,例如温度、压力、声音或者图像等,转换成更容易储存、处理和发射的数字形式。 采样 因为输入的模拟信号是连续的,而将要输出的数字信号是离散的,所以只能进行瞬时采样,再将采样值转换为输出的数字量,再重新开始下一轮的采样。 为了能准确无误用信号 \(v_s\) 表示出模拟输入信号 \(v_1\),至少需要满足采样定理,即采样频率 \(f_s\) 在模拟输入信号最高频率分量 \(f_{i(max)}\) 的 2 倍以上(通常会取 3~5 倍,但太高的频率需要更快的工作速度,需要综合成本考虑): \[ f_s≥2\cdot f_{i(max)} \] 只要满足了采样定理,即可用低通滤波器,将 \(v_s\) 还原为 \(v_1\)。滤波器电压传输系数应在低于 \(f_{i(max)}\) 时保持不变,在 \(f_s-f_{i(max)}\) 前迅速下降为 0。 保持 保持电路能够采样结束后,让信号保持一段时间,使 ADC 有充分时间进行转换。一般采样脉冲频率越高、采样越密,采样值就越多,采样保持电路的输出信号就越接近输入信号的波形。采样 - 保持电路的基本形式如下: 采样 - 保持的基本步骤: 当采样控制信号 \(v_L\) 为高电平时,使 MOS 管 \(T\) 导通,\(v_1\) 经过电阻 \(R_1\) 和 MOS 管 \(T\),给电容 \(C_H\) 充电。 若取 \(R_1=R_F\),则充电结束后 \(v_0=v_c=-v_1\)。 当采样控制信号 \(v_L\) 跌落回电平时,MOS 管 \(T\) 截止,电容 \(C_H\) 上的电压不会突变,所以 \(v_0\) 也能保持一段时间,采样结果得以被记录下来。 量化 采样得到的数字量,必须为某个规定的最小数值单位的整数倍,这个转换过程称为量化,所取的最小数量单位称为量化单位 \(\Delta\)。数字信号最低有效位 LSB 的 1 所代表的数量大小就等于 \(\Delta\)。 因为模拟电压是连续的,不一定能被 \(\Delta\) 整除,因此会出现量化误差。 量化级越细,量化误差就越小,所用二进制代码的位数就越多,电路也越复杂。 编码 将量化的结果用二进制(或其他进制)表示出来,称为编码。 ADC 常见类型 并联比较型(Flash) 并联比较型 ADC 又称 Flash ADC,属于直接 ADC,能将输入的模拟电压直接转换为输出的数字量,不需要经过中间变量转换。它由一系列电压比较器组成,每个比较器将输入信号与唯一的分压后的参考电压进行比较。比较器的输出连接编码器电路的输入,产生二进制的输出。 不仅在操作理论方面是最简单的,而且在速度方面也是最有效的 ADC 技术,仅受比较器和栅极传播延迟的限制。不幸的是,对于任何给定数量的输出位,它是最密集的组件 并联比较型 ADC 的转换速度是最快的,但缺点是需要使用很多电压比较器和大规模的代码转换电路(常见的并联比较型输出大都在 8 位以下)。 逐次逼近型 逐次逼近型(Successive Approximation)ADC 采用的是一种反馈比较型电路结构。由比较器、DAC、寄存器、时钟脉冲源和控制逻辑等组成: 其原理是,设定一个数字量,通过 DAC 得到一个对应的输出模拟电压。将这个模拟电压和输入的模拟电压信号从最高位开始顺序地相比较,如果两者不相等,则调整所取的数字量,直到两个模拟电压相等为止,最后所取的这个数字量就是所求的转换结果。其过程像用天平去称量位置重量的物体,先加大砝码,再逐次添加或换用小砝码。 逐次逼近型 ADC 的优点是速度高,功耗低,在低分辨率(12 位)下具有性价比优势;缺点是转换速率一般,电路规模中等。 双积分型(V-T) 双积分型 ADC 是一种间接 ADC,它首先将输入的模拟电压信号转换成与之成正比的时间宽度信号,随后在此时间宽度内,对固定频率的时钟进行脉冲计数,计数的值就是正比于模拟输入电压的数字信号。因此,也将这种 ADC 称为电压 - 时间变换型(V-T)ADC。 双积分型 ADC 由积分器、比较器、计数器、控制逻辑和时钟信号源组成,如图: 双积分型 ADC 的优点是工作性能稳定(两次积分,排除 RC 参数差异)、抗干扰能力强(积分受噪声影响不大);缺点是转换速率低(转换精度依赖于积分时间)。 Σ-Δ 型 Σ-Δ 调制型 ADC 的原理与上文的并联型与逐次逼近型 ADC 不同,它不是将采样信号的绝对值进行量化编码,而是将两次相邻采样值之差(增量)进行量化与编码的。其基本结构如下: 它由线性电压积分器、1 位输出量化器、1 位输入 DAC 和一个求和电路组成。经过量化器处理输出的数字信号 \(V_0\),经过 DAC 转换为模拟信号 \(V_F\),并负反馈至输入端的求和电路,与输入信号 \(v_1\) 相减,得到差值 \(v_D\)。积分器对 \(v_D\) 作线性积分,输出电压 \(v_{INT}\) 至量化器,由量化器量化为 1 位的数字量输出。由于采用 1 为输出的量化器,所以在连续工作的状态下,输出信号 \(V_0\) 是由 0 和 1 组成的数据流。 Σ-Δ 调制型 ADC 的优点是可以容易地做到高分辨率测量;缺点是转换速率低、电路规模大。 电压 - 频率变换型(V-F) 电压 - 频率变换型(V-F)ADC 是一种间接 ADC。主要由 V-F 变换器(也称为压控振荡器 Voltage Controlled Oscillator,简称 VCO)、计数器及其时钟信号控制闸门、寄存器、单稳态触发器等几部分构成: 其原理是: 将输入的模拟电压信号转换为对应的频率信号。 在固定的时间内对频信号率计数。 计数结果正比于输入电压的幅值。 ADC 主要参数 分辨率:输出数字量变化一个相邻数值所需输入模拟电压的变化量,一般用二进制的位数表示,分辨率为 n 表示是满刻度 Fs 的 2 的 n 次方分之一。 量化误差:ADC 的有限位数对模拟量进行量化而引起的误差。要准确表示模拟量,ADC 的位数需要很大甚至无穷大,所以 ADC 器件都有量化误差。一个分辨率有限的 ADC 的阶梯状转换特性曲线与具有无限分辨率的 ADC 转化特性曲线之间的最大偏差就是量化误差。 转换速率:每秒进行转换的次数。 转换量程:ADC 所能测量的最大电压,一般等于参考电压,超过此电压有可能损毁 ADC。当信号较小时可以考虑降低参考电压来提高分辨率,改变参考电压后,对应的转换值也会改变,计算实际电压时需要将参考电压考虑进去,所以说一般参考电压都要做到很稳定且不带有高次谐波。 偏移误差:ADC 输入信号为 0 时,但 ADC 转换输出信号不为 0 的值。 满刻度误差:ADC 满刻度输出时对应的输入信号与理想输入信号值之差。 线性度:实际 ADC 的转移函数和理想直线的最大偏移。 DAC 基本原理 DAC(Digital-to-Analog Canverter),指数字 / 模拟转换器。可将数字量转换为成比例的模拟电压或电流。举个例子,计算机可能产生范围从 00000000 到 11111111 的数字输出,DAC 将其转换为范围从 0 到 10V 的电压。DAC 从基本原理上可以分两类:电流求和型、分压器型。 DAC 常见类型 开关树型 开关树型 DAC 是最简单粗暴的 DAC,由电阻分压器和树状的开关网络组成: 这些开关分别受 3 位输入 \(d_0,d_1,d_2\) 控制,由此可得: \[ v_0=\frac{V_{REF}}{2^1} d_2+\frac{V_{REF}}{2^2} d_1+\frac{V_{REF}}{2^3} d_0 \] \[ v_0=\frac{V_{REF}}{2^3} (d_2 2^2+d_1 2^1+d_0 2^0) \] 进一步看,对于 n 位二进制输入的开关树型 DAC,输出为: \[ v_0=\frac{V_{REF}}{2^n} (d_{n-1} 2^{n-1}+d_{n-2} 2^{n-2}+...+d_1 2^1+d_0 2^0) \] 开关树型 DAC 特点是电阻种类单一,且在输出端基本不取电流的情况下,对开关导通电阻要求不高;但缺点是用的开关太多。 权电阻网络 权指的是一个多位二进制数中,每一位 1 所代表的数值。例如,一个 n 位二进制数 \(D_n=d_{n-1}d_{n-2}...d_1 d_0\) 从最高位(Most Significant Bit, MSB)到最低位(LSB)的权依次为 \(2^{n-1},2^{n-2}...2^1,2^0\)。 权电阻网络型 DAC(属于电压输出型)的原理如下图所示(4 位),它由权电阻网络,4 个模拟开关和 1 个求和放大器组成: 其中,\(S_0,S_1,S_2,S_3\) 是 4 个电子开关,受 \(d_0,d_1,d_2,d_3\) 4 个信号的控制,输入为 1 时开关拨到 \(V_{REF}\),输入为 0 时开关接地。所以,当 \(d_i=1\) 时有之路电流 \(I_i\) 流向求和放大器,\(d_i=0\) 时之路电流为零。求和放大器是一个负反馈放大器,当反相输入端 \(V_-\) 的电位低于同相输入端的电位 \(V_+\) 时,输出端对地电压 \(v_0\) 为正;当 \(V_->V_+\) 时,\(v_0\) 为负。且当 \(V_-\) 稍高于 \(V_+\) 时,即可在 \(v_0\) 产生大幅度的负输出电压。\(v_0\) 经 \(R_F\) 反馈回 \(V_-\),使得 \(V_-\) 降低回 \(V_+\)(0V)。 假设运算放大器为理想器件(输入电流为零),则可得到: \[ v_O=-R_F i_{\sum}=-R_F (I_3+I_2+I_1+I_0) \] 又因为 \(V_-\approx 0\),因此各支路电流分别为: \[ I_3=\frac{V_{REF}}{2^0 R} d_3 \] \[ I_2=\frac{V_{REF}}{2^1 R} d_2 \] \[ I_1=\frac{V_{REF}}{2^2 R} d_1 \] \[ I_0=\frac{V_{REF}}{2^3 R} d_0 \] 其中,\(d_n\) 可取 0 或 1。代入上式,并假设反馈电阻 \(R_F=\frac{R}{2}\) 时,可得到输出电压: \[ v_O=-\frac{V_{REF}}{2^4}(d_3 2^3+d_2 2^2+d_1 2^1+d_0 2^0) \] 进一步看,对于 n 位权电阻网络 DAC,当反馈电阻 \(R_F=\frac{R}{2}\) 时,输出电压计算公式是: \[ v_O=-\frac{V_{REF}}{2^n}(d_{n-1} 2^{n-1}+d_{n-2} 2^{n-1}+...+d_{1} 2^{1}+d_{0} 2^{0}) \] \[ v_O=-\frac{V_{REF}}{2^n}D_n \] 所以,输出的模拟电压正比于输入的数字量 \(D_n\),其变化范围是 0 至 \(-\frac{2^n-1}{2^n}V_{REF}\)。另外一方面,如果需要得到正输出电压,则应该提供负的 \(V_{REF}\)。 权电阻网络型 DAC 的优点是结构简单,但缺点是个电阻阻值相差较大,在现实中有可能造成比较大的精度差。为了改善,可以采用双极权电阻网络,此处不展开说明,但仍无法从根本上解决。 倒 T 形电阻网络 为了改善权电阻网络 DAC 阻值相差太大的问题,可以采用倒 T 形电阻网络 DAC,它只用了 R 和 2R 两种阻值的电阻(所以也称为 R2R DAC),对于控制精度有很大的帮助: 当求和放大器反馈电阻阻值为 R 时,输出电压: \[ v_O=-Ri_{\sum}=-\frac{V_{REF}}{2^n}D_n \] 可见,倒 T 形电阻网络与权电阻网络 DAC 的计算公式是相同的。 权电流型 在分析权电阻网络与倒 T 形电阻网络时,会将模拟开关当理想器件看待,但实际中它们存在一定的导通电阻和压降,开关之间的一致性又有差别,所以会产生转换误差而影响精度。解决方法是采用权电流型 DAC,它有一组恒流源,每个恒流源电流大小依次为前一个的一半,与输入二进制对应位的权成正比。采用恒流源使得每个支路电流大小不再受开关导通电阻和压降的影响。 当输入数字量的某位为 1 时,对应的开关将恒流源接至运算放大器的输入端;当输入代码为 0 时,对应的开 关接地,故输出电压为: \[ v_O=\frac{R_F V_{REF}}{2^n R_R}D_n \] DAC 主要参数 分辨率:最小输出电压(也就是输入数字量为 1 时的电压)与最大输出电压(也就是输入数字量为最大,每一位都是 1 时的电压)之比。一般通过输入数字量的位数来表示。 转换量程:DAC 能输出的最大电压,一般的关于参考电压或其倍数。 建立时间:从输入数字量到输出模拟量之间的延时时间。 转换精度:与 ADC 的转换精度类似。 参考与致谢 《ADC/DAC 应用设计宝典》 数模转换与模数转换 ADC and DAC (Analog to Digital And Digital to Analog Converters) 漫谈 DAC 原理 《Analog Engineer’s Pocket Reference》 《数字电子技术(第六版)_阎石》 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

AD 使用 Git 的注意事项

AD 使用 Git 的注意事项 使用 Git 管理项目 Altium Designer 支持使用 Git/SVN 用以版本控制。如果使用 Git, 直接在项目所在路径建立 Git 仓库即可。重启 Altium Designer, 会看到文件树边上出现了版本状态: 图标的含义如下: 可以在 工程(C) - 版本控制(E) 菜单直接进行 Git 操作,甚至可以直接提交 GitHub. .gitignore 文件 在使用 Altium Designer 时,软件会自动生成一些缓存文件(例如 History 文件夹),它们不但拖慢了提交速度,也污染了提交记录。这时候就要使用 .gitignore,用来忽略这些缓存文件。 适用于 Altium Designer 的 .gitignore 文件包含以下内容: # ============================= Projects ============================= *.DesWrk # Altium Workspace *.DsnWrk # Altium Project Group !*.LibPkg # Altium Inegrated Library Package *.PrjGrp # Altium Project Group !*.PrjMbd # Altium Muti-board Design Project !*.PrjPcb # Altium PCB Project *.PrjScr # Altium Script Project *.PrjPCBStructure # ============================= Schematic ============================= *.Dot # Altium Schematic Template !*.MbsDoc # Altium Multi-board Schematic !*.Sch # Altium Schematic Document !*.SchDoc # Altium Schematic Document *.SchDot # Altium Schematic Template !*.SchLib # Altium Schematic Library # ============================= PCB ============================= !*.MbaDoc # Altium Multi-board Assembly !*.Pcb # Protel PCB Document !*.PcbDoc # Altium PCB Document !*.PcbLib # Altium PCB Library # ============================= Libraries ============================= *.CmpLib # Altium Component Library !*.IntLib # Altium Compiled Library !*.Lib # Altium Library *.PvLib # Altium Pad Via Library # ============================= CAMtastic ============================= *.Apr # CAMtastic Aperture Data *.Apt # CAMtastic Aperture Data *.Cam # Altium CAMtastic Document *.Drl # CAMtastic NC Drill Binary Data # ============================= Gerber ============================= *.G[1-30] # CAMtastic Mid Layer 1-30 Gerber Data # ============================= Outputs ============================= *.Drc # Design Rule Check Report *.Drr # Altium NC Drill Report File *.Net # Altium Netlist File *.Nsx # Simulation Netlist Document *.OutJob # Altium Output Job File *.Rep # Report File *.Rpt # Report File # ============================= Scripts ============================= *.Bas # Altium Script Document *.SrcDoc # Altium Script Document *.Tcl # Altium Script Document # ============================= Simulation ============================= *.Ckt # Simulation Sub-Circuit *.LaxAn # Logic Analyser Analog File *.LaxDig # Logic Analyser Digital File *.Mdl # Simulation Model *.Pld # CUPL PLD File *.Pwl # Simulation Piecewise Linear Description *.Sdf # Altium Simulation Data File *.Si # CUPL Simulation Input File *.So # Digital Waveform File # ============================= Folders ============================= __Previews/ History/ Project Logs for */ # ============================= Other ============================= *.BomDoc # Bom Document *.DBLib # Altium Database Library File *.DBLink # Altium Database Link File 直接将其放在 Git 仓库的根目录即可,如果显示重复,则需与原先的 .gitignore 合并。 参考与致谢 .gitignore 文件配置:Altium Designer 工程文件类型 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

AD 基本操作 - 原理图绘制

AD 基本操作 - 原理图绘制 —— Altium Designer 系列教程 背景 经过上一章节的预热,从这一章开始,我们进入原理图绘制环节。 绘制原理图 调整图纸 按照前文提到的基本流程,我们新建了一个项目,将原理图文件添加到项目中。此时,出现了一张空白的图纸。我们可以直接在上绘制原理图。如果原理图变得复杂,也可以 更改图纸的尺寸,使元器件不显得过于拥挤: 双击 图纸任意空白处, 在 Properties 面板内找到 Page Options 栏目, 点击 Sheet Size 下拉框更改图纸尺寸。 放置元件 接下来我们开始放置元件。库的安装在前一章已讲解,我们打开 Components 面板,点击显示为库的名称的下拉框,即可切换已经安装的库。切换之后。在搜索框搜索所需的元器件(键入后不用按回车),找到对应的之后,可用鼠标左键 直接拖进 原理图中,这就成功放置了一个元件。 如果忘记元件是属于哪个库的,也可以用全局搜索的功能。点击库名称左边的 三条杠 标志,在下拉框选择 File-based Librarys Search ,即可搜索所有可用的库。 元件属性 放置的元件有几个关键属性: Designator:元件位号。元件唯一标识,不可重名。通常用 R1, R2 ... 代表电阻,C1, C2 ... 代表电容(参考上一章的知识点), Comment:元件大小参数,如阻值、容值、芯片型号等, Description:元件的功能描述, Footprint:链接到封装库,将元件与某个 PCB 封装对应上, Models:包括 Simulation(仿真模型)、Signal Integrity(信号完整性)等。 基本操作 左键单击:选择命令 左键长按:拖动对象 左键双击:设置对象属性 右键单击:取消或弹出命令菜单 右键长按:拖动原理图页面 Ctrl + 滚轮:缩放页面 Shift + 左键单击/框选:选择多个元器件 更高级的操作,使用命令 S(Select),弹出命令菜单: 快捷键 详细命令 功能 E Lasso Select 套索,选择范围内元件;单击左键开始绘制套索,再次单击完成范围结束绘制 I Inside Area 框选,选中区域内所有的元件 O Outside Area 反选,选中区域外所有的元件 L Touching Line 线选,选中被线条触碰到的元件 C Connection 选中网络名称相同的元件 A All 选择所有元件 T Toggle Select 反选,单击原来选中的将取消选中,原来未选中的将选中 元件的旋转:选中元件后按 Space 空格键 复制剪切粘贴:Ctrl + C,Ctrl + X,Ctrl + V 复制后自动填充位号:选中元件,按住 Shift 同时拖动,即可粘贴递增位号的元件。步长可在 TP(Tools-Preference-Schematic-General)中设置。 绘制导线:Ctrl + W 绘制网络标签:PN 放置电源/地:直接在工具栏中左键选取,右键则可以选择不同样式 全局元件自动编号 当原理图工程比较庞大,元件比较多,有时候可能会出现元件位号重名、缺失的情况。这时候可以用全局位号管理:TAA,代替手动检查。 勾选需要自动排号的元器件,点击 更新更改列表,再点击 接收更改(创建 ECO),执行变更,即可完成元件的自动编号。 总结 以上仅仅是绘制原理图的最基本操作,就像提供了一套厨具。至于怎么做出更香的饭菜,更多靠的是 想象力 与 不断的练习 。 参考与致谢 Altium 公司 Altium Designer 专栏 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

AD 基本操作 - 基础知识

AD 基本操作 - 基础知识 —— Altium Designer 系列教程 背景 配置完软件运行环境,在开始画板子之前,我们务必先熟悉一些 Altium Designer 及电路设计的基本知识。 库文件安装 库相当于把每个分立元件(如电阻、电容等)的原理图 / PCB 封装起来,方便直接调用。不一定每个元器件的原理图库 / 封装库都必须自己画,但 整理自己的库是必须的。假想你的项目内每个元器件用的都是别人的(且不同的库有自己的规则),那么越往后你将越受制于人。拥有自己的库,这不仅方便迁移、提高效率,也有利于知识的体系化。适合自己的规则与体系,从时间轴上看,知识将呈指数型增长。刚开始曲线增长虽然缓慢,但到了后期,将不会有重复性的工作,那时候你需要做的,只是学习新知识,并将其归纳到体系中了。 温馨提示:自己的项目所需的所有元器件,尽量全部从自己整理的原理图库 / 封装库中提取。 可参考的库 Power_Lib_Altium:我自己整理的库。封装库齐全,原理图库仅包含我的项目所需要的元器件型号。不断更新中。 AltiumDesigner_PcbLibrary:一个较为齐全的库。 My_PCB_Library_Github:挺齐全的一个库,还包含一些单片机方案板。 JLCSMT_LIB:嘉立创提供的标准集成库,包含嘉立创可以 SMT 贴片的所有元件,直接用这个集成库,打板 / SMT 的时候兼容性会比较好。 Hare_Library:彬哥整理的原理图库 / 封装库,涵盖队内硬件所需的大部分元器件。 如何安装库文件:参考 Altium Designer 安装库文件 不常见的元器件 以上提供的库,已经涵盖市面上 95% 以上的元器件型号了。如果真的找不到所需元器件,可以尝试以下方法: AD 插件: Altium Library Loader:这个用起来真的超级方便 搜索引擎:原理图与封装下载 · Power's NAV 快捷键 于 Altium Designer 而言,熟练掌握常用的快捷键,可以很大程度提高效率。Altium Designer 的系统快捷键都是根据菜单下命令中有下划线的字母组合而成,例如 Place-Line 的快捷键为 P-L (先按 P 再按 L) 原理图 显示 Library 面板:PP 绘制导线:Ctrl + W 绘制网络标签:PN 复制元件并自动更新位号:按住 Shift + 拖动 给图纸编号:TAT 元件自动编号:TAA Reset All:复位所有元件标号,使其变成 " 字母 + ? " 的格式 Update Change List:对元件列表进行标号变更 Accept Changes(Create ECO):表示接受编号变更,实现原理图的变更 生成 BOM 表:RI 更新 PCB:DU 左对齐(右):AL(AR) PCB 把原理图的变更导入 PCB:DI 把 PCB 的变更覆盖回原理图:DU 切换单位(英寸/毫米):Q 旋转元器件(任意角度):EMO 把元件放置在底层:拖动同时按 L 自动布局:框选 + TOL 设置坐标原点:EOS 设置栅格:G 自动布线:UAA 清除布线:UUA 高亮接线:按住 Shift + 光标移至线 高亮节点所对应连线:按住 Ctrl + 左键单击 水平翻转:Ctrl + F 测量:Ctrl + M 切换视图(二维 / 三维):2 / 3 三维视图中旋转:按住 Shift + 拖动 清除过滤器:Shift + C 切换单层/多层显示:Shift + S 过孔盖油(可略,打板时可直接选择) 单击某一过孔 右键 - 查找相似对象 选择大小属性为 Same,确定以激活选择所有过孔 在属性中的 Solder Mask Expansion 中把顶层和底层都勾选上 设置布线规则 UAA 新建策略并编辑规则 一般修改 Routing 中的规则(新建规则) Width:设置线的粗细 Routing Via Style :设置过孔规则 铺铜:? 原理图库 待补充…… 封装库 测量距离:Ctrl + N 切换单位(英寸/毫米):Q 流程及规范 一块电路板从无到有设计出来,基本流程如下: 初始化 新建项目 在项目内创建原理图和 PCB 文件 绘制原理图 完成后确保编译通过 绘制 PCB 从原理图导入变更 隐藏元件 Designator 标识 1. 打开右侧 Properties 面板 2. 点击 Designator 旁边的 眼睛 标志,即可关闭 绘制板形 - 切换 90°/45° 走线(Shift+Space) - 以所画形状定义板子(DSD) - 设置板框属性为机械层 1 - 固定孔 - M3 螺孔:内 3.1 mm、外 4 mm 排布元件 - 跳转文章 PCB 元件布局规范 布线 - 设置布线规则 - 参考 PCB 布线规范 - 不要开启自动布线! - 开启泪滴功能 字体标识(引脚标识 / 版权 / 迷惑性文字) - 放置于丝印层(顶层 / 底层) - 放底层要先镜像 敷铜(PG) - 参考 PCB 布线规范 打板 保存项目 将 .pcb 文件压缩(这样做似乎不太对,可以的话导出 Gerber) 上传至 嘉立创下单助手 (可选 SMT) 其他知识 元件属性 Designator:元件位号,是元件的唯一标识,用来标识原理图中的不同的元件 R:电阻 RN:排阻 C:电容 J:接口/跳线 X:晶振 D:二极管 Q 或 T:三极管 FB:磁珠 U:芯片 TP:测试点 Comment:元件大小参数,如电阻的阻值、电容的容值、IC 芯片型号等 Description:用于填写元件的功能描述 Logo 添加 跳转文章 Logo 添加 。 使用 Git 管理项目 详见 AD 使用 Git 的注意事项 总结 以上是 Altium Designer 及电路设计的基本知识。 参考与致谢 Altium 公司 Altium Designer 专栏 嘉立创 SMT 贴片 可贴列表 PADS 集成库 \(正式版) Altium Designer 使用 Git 构想 Using Version Control 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

AD 基本操作 - 多板系统设计 🚧

AD 基本操作 - 多板系统设计 🚧 使用多板系统设计的原因是,一个硬件项目内可能包含多块 PCB、各种装配元素例如外壳,如果仅仅从每块板的角度去设计,最终做出来的产品有可能会出现配合误差或干涉。在设计多元素的硬件项目时,我们最好使用机电协同。对于硬件工程师来说,可以不用 SolidWorks 等软件,直接在 Altium Designer 里实现。 创建多板项目 首先,新建多板项目类型文件(.PrjMbd),在项目下创建基于原理图的逻辑设计文件(.MbsDoc)和基于 PCB 的文件(.MbaDoc),然后先保存。在文件系统的层面上把多个单独的 PCB 项目文件夹拷贝到 .PrjMbd 同级目录下,例如: 输入逻辑设计 输入逻辑设计是根据 PCB 上的物理连接器来进行的。在此之前,我们需要先给项目原理图内的连接器添加参数(点开连接器的属性,添加 Parameters,名字为 System,值为 Connector)。 创建模块并链接项目 在逻辑设计文件(.MbsDoc)内放置模块,并双击它弹出属性,选择对应的源 PCB 项目。 导入子项目的接口数据 单机鼠标右键,选择 设计 - 从子项目导入,就可以自动导入参数为连接器的端口。 添加模块间的逻辑连接 使用快捷键 P - W,绘制连接线。 点击连接线,就可以在属性面板修改两个模块对应的详细端口连接。 如果一个连接器需要连接对应多块板,那么可以在属性里面拆分某个端口。 物理多板装配 从逻辑设计文件导入 PCB 使用快捷键 D - I,就可以从逻辑设计文件导入项目对应的的 PCB 模拟装配 拖动每个 PCB 的坐标轴,就可以进行模拟装配了。 生成生产数据 🚧 参考与致谢 PCB 中进行多板设计会是怎样的体验? 输入逻辑系统设计 创建物理多板装配 生成多板设计的生产数据 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

AD 基本操作 - 环境搭建

AD 基本操作 - 环境搭建 —— Altium Designer 系列教程 背景 本系列教程基于 Altium Designer 19(20 也兼容),往后的版本我也将同步跟进。 软件下载 直接参考 Altium Designer 2020 安装教程,此处不再赘述。 调整设置项 工欲善其事,必先利其器。初次打开 Altium Designer,我们可以调整其中的一些设置项,让工具用起来更顺手一些。找到右上角的 齿轮 标志,打开设置页面,继续以下操作。 设置中文 左侧列表依次单击 System - General 选项卡,在 Localizatioin 栏目下勾选 Use localized resources 选项 点击 应用 保存设置,重启 Altium Designer PCB 编辑器 左侧列表单击 PCB Editor 选项卡 在 PCB Editor 下单击 General 选项卡,在 铺铜重建 栏目下,勾选 铺铜修改后自动重铺 ;在 文档格式修改报告 栏目下,勾选 禁用打开旧版本报告 和 禁用打开新版本报告 ;在 其他 栏目下,将 光标类型 改为 Large 90 单击 Display 选项卡,在 高亮选项 栏目下,勾选 交互编辑时应用高亮 单击 Board Insight Color Overrides 选项卡,在 基础样式 栏目下,选择 实心(覆盖颜色) 单击 DRC Violations Display 选项卡,在 冲突 Overlay 样式 栏目下,选择 实心(Overlay 颜色) 点击 应用 保存设置,重启 Altium Designer 面板 关闭设置页面,在主页菜单栏选择 视图 - 面板 ,依次点击 Components, Messages 在弹出的面板右上角点击 回形针 标志,将面板吸附在右侧 背景设置为网格 打开任意 PCB 文件(若没有可以新建一个) Ctrl + G 打开网格设置窗口 在 显示 栏目下,将 精细 和 粗糙 选项卡都设为 Dots 输入法兼容性 若无法使用快捷键,请检查是否已经切换到英文状态(输入法状态栏显示为 ENG),若无此选项,按如下步骤操作: 打开 控制面板 ,打开 时钟、语言和区域 - 语言 页面 点击 添加语言 按钮,添加 英语 并选择 英语(美国) 在桌面任务栏即可切换输入法 总结 在这一章节中,我们基本配置好了 Altium Designer 的环境,可以开始愉快地画板子了 :) 参考与致谢 Altium 公司 Altium Designer 专栏 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

AD 常用技巧

AD 常用技巧 —— 收纳整理了一些实用的小技巧。 原理图库部分 引脚名称上划线(低电平有效) 方法:给需要加上划线的每个字母后面加 “\” 符号 示例:RESET 加上划线 - R\E\S\E\T PCB 封装库部分 (待更新) 原理图部分 禁止 Add Room 操作 原因:Room 操作在多通道布线中比较有用,可将一个通道内的布线直接应用到其他通道。单通道可以不用 Room. 方法: 菜单栏 - 工程 - 工程选择 - Class Generation 选项卡 取消勾选 “生成 Room” PCB 部分 Logo 及标识的添加 原因:如果用直接导入图片的方式,创建的 Logo 无法自由调整大小。 方法:使用字库软件 Font Creator, 在 GitHub 下载我的字库作为模板,定制自己的专属字库。字库制作完成后,安装 .ttf 文件,即可在 Altium 内用相应字符调出 Logo 。 字符对应 Logo 如下图: 自动排布元器件至划定区域 原因:原理图更新到 PCB 时,有些元件会跑很远。 方法:全选 - TOL - 框选 圆形阵列布局 方法: 选中对象 - 复制 EA - 勾选 粘贴到当前层 点击 粘贴阵列 - 设置对象数量与间距 快捷打过孔并换层 方法:布线时用小键盘 + / - 切换 统一设置过孔网络属性 方法: 右键单击任意无属性过孔 - 查找相似对象 - 设置 Net 为 Same 在属性面板中统一添加过孔网络属性 添加泪滴 原因:泪滴的作用是提高信号的完整性,减少信号损失和反射,降低外力冲撞时导线与过孔接触点断裂的风险。 方法:使用快捷键 TE 导线开窗 原因:导线开窗上锡可增加载流量。 方法:将所需走线复制,特殊粘贴到相应 Top / Bottom Solder 层 3D 预览下的操作 方法: 按数字键 “3” 进入 3D 预览界面 按数字键 “2” 返回 PCB 编辑 按数字键 “0” 恢复默认视角 Ctrl + F 翻面 Ctrl + 滚轮 缩放 Shift + 右键 改变视角 复制粘贴中保持网络属性 原因:复制粘贴具有电气属性时,网络属性会丢失。 方法:复制对象 - EA - 勾选 保持网络名称 - 粘贴 焊接位号图的输出 (待更新) 如何在 PCB 上开槽 在 PCB 上的 机械 1 层 绘制开槽的封闭图形,选中并使用快捷键 T - V - B 即可生成开槽(最好切换 3D 视角进行确认)。 参考与致谢 Altium Designer19 设计宝典:实战操作技巧与问题解决方法 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

AHB 上的 TIC

AHB 上的 TIC 撰写中…… 参考与致谢 IHI0011 - ARM advanced microcontroller bus architecture (AMBA) specification.Rev 2.0 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

AI 影响下未来的职业选择

AI 影响下未来的职业选择 背景 The future of employment 这篇论文对现在 700 多个职业进行了评估,结论是未来十年将会有一半的职业消失。那么,各类职业的具体情况是怎么样的,以及个人应该如何应对,我们来具体地看一看。 将会消失的职业 最先会消失的职业有:司机、实体店店员、裁判、一般事务员等。其中,司机指各类交通工具的职业驾驶者,包括出租车司机、货车司机、客机飞行员等等,将会被出错更少的自动驾驶取代。 他们的职业大多 规则比较明确、技术点比较少、可替代性强 。 短期内不会消失,但以后会逐渐消失的职业:医生、搬砖型程序员、消防员、警察等。其中,医生职业风险较高,且人为失误影响大;搬砖型程序员将会被人工智能的自我编程取代;对于消防员和警察这类高风险的职业,显然机器人优势更大,且在对案件的处理中,人工智能可以比人类遍历更多的可能性。 不会消失的职业 很难消失的职业有:法官、小学教师、神职人员、创新型设计师、歌手等等。其中,因涉及伦理问题(机器不能够给人定罪 / 决定人的生死),法官这个职业很难消失;启蒙教育阶段,儿童需要被培养自主学习的意识与人文关怀,需要有教师带领;神职人员(神父、方丈、主持等)则肯定不会被取代。 以上职业共有的特性是 人文关怀、道德伦理、创新 。 如何选择职业方向 在未来社会,不被机器与人工智能取代工作,需要的是这三种品质: 同理心 团队协作 讲故事的能力 同理心,即 换位思考 的能力。很多时候,需求不会自己跑出来,而是需要我们把自己的思考投射到别人身上,去挖掘需求,而不要只是顾着技术实现。 团队协作与「长板效应」相关。现代社会不要求每个人将短板补齐,而应专注于打造自己的专长,靠团队协作补齐短板。将每个人的长板拼起来,才是一个长板团队;否则如果每个人「全方位发展」却资质平平,这个团队如何从竞争中脱颖而出呢? 讲故事的能力,体现在对内维系一个团队,需要共同的价值认知;对外,让别人接受你的理念,使用你的产品,也需要有讲故事的能力。 要学会讲好一个让利益相关者都能认同的故事。价值不仅受产品本身影响,宣传也是至关重要的。 总结 卢德运动阻挡不了工业革命的浪潮。对普通人而言,个人力量永远阻挡不了时代趋势。预测时代的浪潮,借势而为,个人才能得到更好的发展。 参考链接 你需要补哪些核心能力? 十年內將會消失的職業,你如果正在做這些工作最好盡快轉行 The future of employment 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

ATTiny85 调试记录

ATTiny85 调试记录 Bootloader P:\Arduino\hardware\tools\avr/bin/avrdude -C "P:\Arduino\hardware\tools\avr/etc/avrdude.conf" -v -pattiny85 -carduino -PCOM4 -b119200 -Uflash:w:D:\t85_default.hex:i -U lfuse:w:0xE1:m -U hfuse:w:0xDD:m -U efuse:w:0xFE:m Arduino 作为 ISP 下载器 Attiny Arduino Pin 1(PB5) D10 Pin 4 (GND) GND Pin 5 (PB0) D11 Pin 6 (PB1) D12 Pin 7 (PB2) D13 Pin 8 (VCC) 5V 先给 Arduino 烧 ISP 程序: 打开 IDE 首选项,在附加开发板地址中填写: https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json 打开开发板管理器: 搜索并安装(可能需要代理): 烧录时注意选对芯片型号、时钟速率(Internal 16 MHz)、Arduino 所在的端口,注意编程器选择 Arduino as ISP: 总结 参考与致谢 基于 ATTiny85 的 digispark Arduino 最小系统的自制教程(一) 基于 ATTiny85 的 digispark Arduino 最小系统的自制教程(二) Digispark USB 开发板把玩笔记(一):认识这块小巧、便宜、多功能的 Arduino 兼容板 Connecting and Programming Your Digispark Attiny85 Micronucleus bootloader 燒錄 ATtiny85 制作迷你小游戏机 DigiSpark ATtiny85 8 脚 Arduino AVR ISP 编程的那点事儿 BootLoader 熔丝 Quick Reference Frequently requested info 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

AirForce - 充满灵性的电机驱动模块

AirForce - 充满灵性的电机驱动模块 AirForce 项目是一款电机驱动组合套件,包含集成稳压功能的母板 AirPort, 和双路电机驱动子板 AirCraft. 可以根据电机数量需求,自由拓展驱动最多 16 路电机。因外观小巧轻便,性能强劲、拓展性高,故命名为 Project AirForce. 特征: 体积较小,接口方便布线 接口不完全黑盒子封装,提高布线的能力 不占用单片机(STM32)过多的定时器引脚资源 项目仓库:linyuxuanlin/AirForceDVR AirPort - 集成稳压功能的母板 🚧 AirCraft - 双路电机驱动子板 AirCraft 双路电机驱动子板基于 TB6612FNG 集成驱动芯片设计,外加逻辑控制方式,仅需 4 根引脚(2 路普通+2 路 PWM)即可实现双路电机控制(转向 / 速度),相比市面上一般方案,减少了两路 IO, 减少占用主控器宝贵的引脚资源。至于驱动芯片的参数,单通道最大连续驱动电流可达 1.2A,峰值 2A/3.2A(连续脉冲 / 单脉冲),驱动一般机器人上的电机绰绰有余。 产品参数 逻辑部分输入电压 VCC:3.3~5V(默认 5V) 驱动部分输入电压 VM:2.5~12V(默认 12V) 驱动电机路数:2 通道 单通道 最大连续驱动电流:1.2A 启动峰值:2A/3.2A (连续脉冲 / 单脉冲) 接口方式:2.54mm 间距排针、XH2.54 母座 模块尺寸:23.7 × 15.8 (mm) 引脚说明 接口分组 名称 功能描述 控制接口 PWM1 电机 M1 速度控制引脚 控制接口 DIR1 电机 M1 方向控制引脚 控制接口 DIR2 电机 M2 方向控制引脚 控制接口 PWM2 电机 M2 速度控制引脚 电源接口 5V 逻辑控制部分电源 电源接口 G GND 地 电源接口 12V 电机电源 电机接口 M1+ 电机 M1 输出 1 电机接口 M1- 电机 M1 输出 2 电机接口 M2+ 电机 M2 输出 1 电机接口 M1- 电机 M2 输出 2 控制教程 控制接口 DIR1/DIR2:正反转控制信号输入端 e.g. DIR1 赋值为 1(高电平),则 M1 电机正转;DIR1 赋值为 0(低电平),则 M1 电机反转 PWM1/PWM2:分别为两个电机控制的使能端 (可使用 PWM 调速) 电源接口:接至 AirPort 母板上任意电源接口(或外接 12V 与 5V 输入) 电机接口:接至电机的输入口 尺寸图 🚧 参考与致谢 Dual Motor Driver TB6612 微型电机驱动模块 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Altium Designer 安装库文件

Altium Designer 安装库文件 将库文件全部 拷贝 至软件对应的 Shared\Library 文件夹下; 打开 Altium Designer ,在右侧面板点击 Components 页面,点击右上角 三条杠 标志,点击 File-based Library Preferences 选项,点击 已安装 页面,点击 安装 按钮,安装对应的库文件; 几种特殊情况: 嘉立创集成库的路径位于 JLCSMT_LIB\Project Outputs for Miscellaneous Devices LC 文件夹内; 若第三方库文件非 集成库(.IntLib),而是 原理图库(SchLib) 或 封装库(PcbLib) 的形式,则需 同时安装 以上两个文件。此时需要在安装库文件时弹出的路径选择窗口右侧点击下拉框切换 All Files\(\*.\*\) 通配符,否则只能看到 .Intlib 格式的文件。 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Auto-i18n:使用 ChatGPT 的自动多语言翻译工具

Auto-i18n:使用 ChatGPT 的自动多语言翻译工具 Auto-i18n 是一个使用 ChatGPT 自动将 Markdown 文件批量翻译为多语言的工具。它实现了博客文章 i18n(Internationalization) 的全自动化。你仅需将博文推送至 GitHub 仓库,即可借助 GitHub Actions 实现自动转译为多种语言。(目前支持英语、西班牙语和阿拉伯语,后续将提供更多语言支持) Auto-i18n 的主要特性: 批量多语言翻译:Auto-i18n 提供了批量翻译的功能,使你能够将一整个路径下的所有 Markdown 文档一次性翻译多语言,极大地提高了多语言化项目的效率。 兼容 Front Matter:Auto-i18n 兼容 Markdown Front Matter 语法,你可以自定义不同字段的翻译或替换规则。 固定内容替换:Auto-i18n 还支持固定内容替换。如果你希望文档中一些重复字段的译文保持不变,这个功能可以帮助你实现文档的一致性。 自动化工作流:你可以使用 GitHub Actions 实现自动化的翻译流程"。。无需手动干预,翻译工作会自动进行并更新文档,使你能够更专注于内容。 快速上手 将仓库克隆到本地,把 env_template.py 重命名为 env.py,并提供你的 ChatGPT API。如果你没有自己的 API,可以到 GPT_API_free 申请到一个免费的;也可也借助 go-chatgpt-api 把网页版 ChatGPT 转 API 使用。 安装必需的模块:pip install -r requirements.txt 。 执行命令 python auto-translater.py 运行程序,它将会自动处理测试目录 testdir/to-translate 下的所有 Markdown 文件,批量翻译为英语、西班牙语、阿拉伯语。(后续将提供更多语言支持) 详细描述 程序 auto-translater.py 的运行逻辑如下: 程序将自动处理测试目录 testdir/to-translate 下的所有 Markdown 文件,你可以在 exclude_list 变量中排除不需要翻译的文件。 处理后的文件名会被记录在自动生成的 processed_list.txt 中。下次运行程序时,已处理的文件将不会再次翻译。 对于原本使用英文撰写的文章,程序不会重新翻译成英文,也不会翻译回中文,而会翻译为其他语言。你需要在文章中添加字段 > This post was originally written in English.(注意在上下各留一个空行),以便程序识别。请参考 测试文章_en.md。 如果需要重新翻译指定文章(例如,翻译结果不准确,或文章内容发生更改等),你可以在文章中加入字段 [translate](同样需要在上下各留一个空行)。这将会忽略 exclude_list 和 processed_list 的规则,强制进行翻译处理。请参考 测试文章_force-mark.md。 如果 Markdown 文件中包含 Front Matter,将按照程序内的规则 front_matter_translation_rules 选择以下处理方式: 自动翻译:由 ChatGPT 翻译。适用于文章标题或文章描述字段。 固定字段替换:适用于分类或标签字段。例如同一个中文标签名,不希望被翻译成不同的英文标签造成索引错误。 不做任何处理:如果字段未出现在以上两种规则中,将保留原文,不做任何处理。适用于日期、url 等。 GitHub Actions 自动化指南 你可以在自己项目仓库下创建 .github/workflows/ci.yml,当检测到 GitHub 仓库更新后,可以使用 GitHub Actions 自动进行翻译处理,并自动 commit 回原仓库。 ci.yml 的内容可参考模板:ci_template.yml 你需要在仓库的 Settings - Secrets and variables - Repository secrets 中添加两个 secrets:CHATGPT_API_BASE 和 CHATGPT_API_KEY,并在程序 auto-translater.py 中将 import env 语句注释掉。 错误排除 如果需要验证 ChatGPT API key 的可用性,可以使用程序 verify-api-key.py 进行测试。如果在国内使用官方 API,需要有本地代理。 如果 Markdown 中的 Front Matter 无法被正常识别,可以使用程序 detect_front_matter.py 测试。 在使用 GitHub Actions 遇到问题时,请优先检查路径引用是否正确(例如 dir_to_translate dir_translated_en dir_translated_es dir_translated_ar processed_list)。 待解决的问题 在某些特殊的情况下,可能会出现翻译不准确、或某些字段没有翻译的情况,建议翻译后手动校验再发布文章。 (已解决)~~如果 Markdown 中包含 Front Matter,将保留 Front Matter 的原始内容。Front Matter 部分参数翻译的功能正在开发中。~~ 贡献 欢迎你参与本项目的改进!如果您想要贡献代码、报告问题或提出建议,请查看 贡献指南。 版权和许可 本项目采用 MIT 许可证。 问题和支持 如果你在使用 Auto-i18n 时遇到任何问题,或者需要技术支持,请随时 提交问题。 我的博客使用 Auto-i18n 实现了多语言支持,你可以到 Power's Wiki 查看 Demo 效果。 致谢 感谢 chatanywhere/GPT_API_free 提供的免费 ChatGPT API key。 感谢 linweiyuan/go-chatgpt-api 提供的把网页版 ChatGPT 转 API 的方法。 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Basics of Fourier Transform

Basics of Fourier Transform This post was originally written in English. There are several algorithms for transforming data from the time domain to the frequency domain as below. Fourier Series A Fourier Series(傅里叶级数) is summarized as creating a complex waveform by summing pure sine waves with different amplitudes and frequencies, and to decompose a complex signal into a sum of sinusoids of different amplitudes and frequencies. Dirichlet Conditions Dirichlet Conditions specify a set of conditions that must be met before a signal can be decomposed into a Fourier Series: The signal is a mathematical function, i.e., one and only one y-point corresponds to each x-point. The signal is periodic. The area bounded by the signal over one period is finite. Decompose into a Fourier Series A complex signal that meets the Dirichlet Conditions can be represented by a sum of sinusoids: \[ f(t)=a_0+A\{\sum_{n=1}^\infty[a_n cos(n \omega_1 t+\phi_n)+b_n sin(n \omega_1 t+\phi_n)]\} \] where: \(a_0\) is the DC component. \(A\) is an overall scale factor for all harmonic components. \(\omega_1\) is the frequency of the fundamental. \(n\) is an integer multiplier of the fundamental frequency for each harmonic term. This proves that not only can we sum a series of sine and cosine waves to create any other wave, but also that the frequencies of the sinusoids are integer multiples (harmonics) of a single fundamental frequency. Discrete Fourier Transform (DFT) Discrete Fourier Transform (DFT): takes amplitude versus time data, and then translates to amplitude versus frequency data. Mathematically, the algorithm is a series summation of the product of each sample times a complex number: \[ X(b)=\sum_{n=0}^{N-1}x[n](cos(2\pi nb/N)-jsin(2\pi nb/N)) \] where: \(n\) is one of \(N\) samples. \(N\) is total number of samples. \(b\) is one of \(B\) frequency bins (each bin represents a frequency range of \(F_s /N\)). \(j\) is the imaginary operator. The DFT algorithm uses each sample point in the summation from 0 to N-1 for each analyzed frequency. All N sample points contain information about all B frequencies, thus each of the B frequencies for which information is desired requires a summation of N time sample products. Because of the reasons above, processing a DFT is slow, because \(N^2\) calculations are necessary. For example, a 2000 point DFT requires 4 million calculations, often floating point calculations, which are slower than integer calculations. Fast Fourier Transform (FFT) Fast Fourier Transform (FFT) remedies the DFT speed problem by skipping over portions of the summations which produce redundant information. Rules for using FFT: The number of sample points must be a power of 2 (\(2^n\)). The number of additions and multiplications is: \(\frac{N}{2}\log_2 N\). References & Acknowledgements Fundamentals of Testing Using ATE The-Fundamentals-of-Mixed-Signal-Testing_Brian-Lowe Original: https://wiki-power.com/ CC BY-NC-SA 4.0 agreement, should be reproduced with attribution.

2025/9/17
articleCard.readMore

Basics of Mixed Signal Test

Basics of Mixed Signal Test This post was originally written in English. Mixed signal contains both analog and digital signals. Devices processing mixed signal typically include ADCs, DACs, analog switches and multiplexers, sample-and-hold amplifiers, and so on. As a part of it, analog signals is signals we use in the real world such as voice or tempurature, it's continuous in both time and amplitude. To process analog signals into computers, we need to convert them to digital signals, as it's discrete in both time and amplitude. Sampling Theory Sampling theory applies to the signal to be periodic, or errors will be introduced. Nyquist Theorem We use Nyquist Theorem(奈奎斯特定理) to gain the minimum sampling frequency when sampling signals: \[ F_s≥2F_i \] We must sample at a rate higher than twice the highest frequency of interest, to be able to recreate a signal from its samples and avoid losing information. If we sample at a frequency that lower that the Nyquist rate, it will exhibit a phenomenon called aliasing(混叠)(unwanted components) when we try to convert it back to a continuous time signal, and some of the frequencies in the original signal may be lost. To minimize aliasing problem, we need to remove the frequency greater than \(\frac{F_s}{2}\) of the signal, via the anti-aliasing filter (e.g. low-pass-filter): Coherent Sampling If a time sample set does not contain a precise integer number of cycles, spectral leakage(频谱泄露) will occur. Coherent sampling(相干采样) is to ensure the continuity of sampling and prevent spectral leakage, it guarantees that a sample set (a series of samples which represent the analog signal) has a fixed and well defined relationship between the sample frequency \(F_s\), the number of samples \(N\), the test signal frequency \(F_i\), and the number of test signal periods sampled \(M\): \[ \frac{M}{N}=\frac{F_i}{F_s} \] The total time required to take all samples is called the Unit Test Period (UTP) and requires \(M\) cycles of the test signal, which has frequency \(F_i\). For an example, if we want to calculate the \(F_s\) of continuous repeating sinewave, where \(F_i\) is 1kHz, \(M=3\) and \(N=16\): So we can conclude that \(F_s=5.333kHz\). Important tips of coherent sampling: Increasing \(M\) and/or \(N\) will increase both accuracy and test time. \(M\) and \(N\) needs to be an integer. \(N\) needs to be a power of 2 when using Fast Fourier Transform (FFT). \(M\) and \(N\) are recommended to be mutually prime(互质)so that each sample gives unique information. Described in the following. If \(M\) and \(N\) are not mutually prime (\(M=3,N=12\)), samples are taken at the same position in every cycle, so there is no new information: If \(M\) and \(N\) aremutually prime (\(M=3,N=16\)), so they are mutually prime and every sample is discrete, so it gives unique information: Common Frequency Analysis Algorithms For \(N\) time-domain signal samples, there are \(N\) frequency-domain signal values, and there are \(N/2\) frequency-domain power spectrum values. A typical spectral components example is shown below: There are several parameters for describing spectral components as follows: Signal To Noise Ratio (SNR)(信噪比) Total Harmonic Distortion (THD)(总谐波失真) Signal to Noise and Distortion (SINAD)(信纳比) Intermodulation Distortion (IM)(互调失真) Spurious Free Dynamic Range (SFDR)(无杂散动态范围) Signal To Noise Ratio (SNR) Signal To Noise Ratio (SNR) is derived by storing the value of the fundamental (signal power) first: Then remove the DC component and harmonics (usually up to 5): Next sum all bins of the remaining power spectrum (the noise power) measured by the RMS value (Root Mean Squared, The analog voltage that is equal to a DC voltage containing the same amount of energy, for a sine wave, the RMS value is 0.707 times the peak value): Ultimately we can conclude that: \[ {SNR}(dB)=10log_{10}(\frac{{Fundamental}}{{Noise\ Power}}) \] SNR is usually expressed in decibels (dB), and is often a positive value (assuming the Fundamental Power is much larger than the Noise Power). Total Harmonic Distortion (THD) Total Harmonic Distortion (THD) is derived by keeping a running sum of the total harmonic power (usually only the first five harmonics, start at the second harmonic): And we can conclude that: \[ {THD}(dB)=10log_{10}(\frac{{Harmonic \ Power}}{{Fundamental}}) \] THD is often a negative value (assuming the Fundamental Power is much larger than the total Harmonic Power). Signal to Noise and Distortion (SINAD) Signal to Noise and Distortion (SINAD) is the same methodology as computing SNR, but now the power of the harmonics is added into, and only zero out the DC component. \[ {SINAD}=\frac{S}{N+D} \] And we can conclued that: \[ \because {SNR}=\frac{S}{N}, {THD}=\frac{D}{S} \] \[ \therefore {SNR}^{-1}+{THD}=\frac {N}{S}+\frac {D}{S}=\frac {N+D}{S}={SINAD}^{-1} \] \[ \therefore {SINAD}=({SNR}^{-1}+{THD})^{-1} \] Intermodulation Distortion (IM) Intermodulation Distortion (IM) occurs when two or more signals are used in a non-linear system. The spectrum will not only consist of the original signals, but will also contain the sum and difference of the input signals along with their harmonics. Spurious Free Dynamic Range (SFRD) Spurious Free Dynamic Range (SFRD) is derived by finding the highest element after the fundamental (ignoring the DC component): Note that the highest element may or may not be a harmonic. So we can conclude that: \[ {SFDR}(dB)=10log_{10}(\frac{{Fundamental}}{{Next \ Highest}}) \] The Spurious Free Dynamic Range is a positive value (assuming the Fundamental Power is much larger than the next highest Spur Power. Architecture of Generic Mixed Signal Tester In the generic mixed signal tester, the AWG (AC src) and WD (AC dig) are both connected to the DUT via relay interconnects through the channel board. Arbitrary Waveform Generator (AWG) Arbitrary Waveform Generator (AWG) is a low distortion signal generator. It contains a DAC to generate an analog signal from the digital data. LPF (Low Pass Filter) is to smooth the waveform and remove high frequency components. A set of data points for a given waveshape is stored in the waveform source memory, each time a clock occurs, a data point will pass to the DAC. Important parameters of AWG: Maximum Peak to Peak Voltage output Waveform resolution (DAC resolution) Band-width Waveform source memory depth Output Impedance Noise, THD, SNR Waveform Digitizer (WD) Waveform Digitizer (WD) samples analog signals, and converts them into digital values. It performs the opposite operation to the AWG. It converts analog signal into digital samples that represent the original analog signal. The low-pass filter limits the bandwidth of the signal in order to remove unwanted frequency components like noise and spurs, also provides anti-aliasing by attenuating spurs that would be aliased into the pass band of the filter during the ADC conversion. Important parameters of WD: Maximum Peak to Peak input Voltage range Waveform resolution (ADC resolution) Band-width Waveform capture memory depth Input Impedance Noise, THD, SNR, spur Clock The analog and digital clocks are derived from a system wide reference clock. If there is no clock synchronization signal, the timing offset may lead to incorrect results. Digital Signal Processor (DSP) Digital Signal Processor (DSP) is a specialized microprocessor to performs mathematical operations on arrays of digital numbers. Various algorithms like DFT and FFT are performed on DSP to transform time domain information into the frequency domain. The architecture of a DSP is optimized to allow fast multiplication, summing, logarithm calculations, squaring, and square root calculations. The tester will carry the stored captured signal to the DSP processor through data buses. References & Acknowledgements Fundamentals of Testing Using ATE The-Fundamentals-of-Mixed-Signal-Testing_Brian-Lowe Original: https://wiki-power.com/ CC BY-NC-SA 4.0 agreement, should be reproduced with attribution.

2025/9/17
articleCard.readMore

Basics of Signal and Power Integrity 🚧

Basics of Signal and Power Integrity 🚧 This post was originally written in English. References & Acknowledgements Signal and Power Integrity - Simplified, 3rd Edition Original: https://wiki-power.com/ CC BY-NC-SA 4.0 agreement, should be reproduced with attribution. Signal Integrity (SI) refers to the quality of the signal on the signal line. Good signal integrity means that the level on the signal line reaches the preset value as expected, no more or less. As clock frequencies and data rates increase, identifying and solving signal-integrity problems becomes critical.

2025/9/17
articleCard.readMore

Basics of VBT Syntax

Basics of VBT Syntax This post was originally written in English. Data Objects TheHdw and TheExec There are two global handles in VBT interface, to operate the hardware of the tester: TheHdw (The Hardware): Support to access and control the instruments, and include more general functions of the hardware, such as alarms. TheExec (The Executive): To control the overall test program-related functions, such as executing the test, handling the test results, and recording datalog. Below are examples of their usage: ' Set the current range of pin p0 TheHdw.DCVI.Pins("p0").CurrentRange = 0.002 ' Get the path of the current output STDF file CurrStdfFile = TheExec.Datalog.Setup.STDFOutputFile Other Data Objects More global handles are included in the VBT interface, such as PinListData, DSPWave, RtaDataObj (Run-Time Adjust Data Object) and so on. We will continue to explore them in future articles. Access By-instrument or By-pin The VBT syntax supports access tester hardware by-instrument or by-pin, they are equivalent in the result. Below are examples of their usage: ' By-instrument Access, applies a single instrument to different pins With TheHdw.instrument .Pins("Vcc").CurrentLimit = 0.75 .Pins("Vee").ForceValue = 3.2 End With ' By-pin Access, defines a pin list and then using different instruments With TheHdw.Pins("Vcc,Vdd,Vee") .instrument1.Disconnect .instrument2.CurrentLimit = 0.75 End With Structure of the VBT code A VBT code file must be named as VBT_xxx, and the name must be unique. The return value of a VBT function is expected to be 0 by default, or may cause unexpected results. For the parameters about timing and levels, you may add them in the Instance Editor or Test Instant sheet, don't need to include in the VBT function. And you can control whether to enable them in the VBT function by following usage: TheHdw.Digital.ApplyLevelsTiming For the test limits, you can use the following code: TheExec.Flow.TestLimit to compare a result value against low/high limits, and send the test result(TL_SUCCESS/TL_ERROR) and other information to the datalog. To see more clearly the basic structure of a VBT test function, here is a sample: Public Function VBTLeakTest(Pins As PinList, ForceVoltage As Double, PrePattern As PatternSet) As Long On Error GoTo errHandler Dim measure_results As New PinListData ' Set up timing and levels for Preconditioning Pattern TheHdw.Digital.ApplyLevelsTiming ConnectAllPins:=True, loadLevels:=True, loadTiming:=True, relaymode:=tlPowered ' Run Preconditioning Pattern and test for Pass/Fail TheHdw.Patterns(PrePattern).test pfAlways, 0 ' Force V, Measure I With TheHdw.DCVI.Pins(Pins) .Mode = tlDCVIModeVoltage ... ' Addition code measure_results = .Meter.Read End With ' Test using limits in flow and write datalog Call TheExec.Flow.TestLimit(resultval:=measure_results, unit:=unitAmp, forceval:=ForceVoltage, forceunit:=unitVolt, ForceResults:=tlForceFlow) ' Reset the variable measure_results = Nothing Exit Function errHandler: If AbortTest Then Exit Function Else Resume Next End Function Multi-site 🚧 PinList Operation 🚧 Tips in VBA Avoid saving code in VBA, because this will create internal hard links in the workbook. Saving in DataTool interface instead. If you meet the error "Procedure Too Large", you may against the Excel restriction of 64K limit per vb file. But actually, it is possible that you forgot to switch the version from 32bit to 64bit of the Windows system. Recommended add Option Explicit on the top of the VBT module, to explicitly declare all variables by using the Dim, Private, Public, ReDim, or Static statements.

2025/9/17
articleCard.readMore

BeagleBone 系列 - BBAI 入坑

BeagleBone 系列 - BBAI 入坑 初始化 首先,连接 Cape 的 12V 电源输入,使用 USB 转串口模块,连接板载串口(J3 口才能用于调试): 确保 USB 转串口模块有驱动(我用到是 FTDI 模块,驱动下载地址是 https://ftdichip.com/drivers/vcp-drivers/)。 使用命令行工具连接串口(我用的是 MobaXterm),波特率设置为 115200。 安装补丁包 wget https://github.com/linyuxuanlin/File-host/blob/main/stash/k3-j721e-beagleboneai64.dtb?raw=true 改名为 k3-j721e-beagleboneai64.dtb,移至 /boot 目录下并覆盖原文件。(我将文件传到 GitHub 仓库,使用 wget 命令获取。可能需要修改 GitHub host 才能正常下载) 也可以直接使用 sftp 传输文件。 evtest event test 工具是打印 evdev 内核事件的工具,它直接从内核设备读取并打印设备描述的带有值和符号名的事件,可以用来调试鼠标、键盘、触摸板等输入设备。 下载 evtest 工具: sudo apt install evtest 使用工具: sudo evtest /dev/input/eventx(x就是时间编号) 按键 debian@BeagleBone:~$ evtest No device specified, trying to scan all of /dev/input/event* Available devices: /dev/input/event0: gpio-keys Select the device event number [0-0]: 0 Input driver version is 1.0.1 Input device ID: bus 0x19 vendor 0x1 product 0x1 version 0x100 Input device name: "gpio-keys" Supported events: Event type 0 (EV_SYN) Event type 1 (EV_KEY) Event code 256 (BTN_0) Event code 257 (BTN_1) Event code 258 (BTN_2) Key repeat handling: Repeat type 20 (EV_REP) Repeat code 0 (REP_DELAY) Value 250 Repeat code 1 (REP_PERIOD) Value 33 Properties: Testing ... (interrupt to exit) Event: time 1634868166.060258, type 1 (EV_KEY), code 257 (BTN_1), value 1 Event: time 1634868166.060258, -------------- SYN_REPORT ------------ Event: time 1634868166.284257, type 1 (EV_KEY), code 257 (BTN_1), value 0 Event: time 1634868166.284257, -------------- SYN_REPORT ------------ SPI 总线上设备 Barometer - BMP280 6-DOF - LSM6DS3TR Compass - BMM150 cd /sys/bus/iio/devices && ls -l cat iio\:device0/name cat iio\:device1/name cat iio\:device2/name cat iio\:device3/name cat iio\:device4/name cat iio\:device5/name BeagleConnect 通信 # BC_RST cd /sys/class/gpio echo 326 > export echo out > gpio326/direction echo 0 > gpio326/value echo 1 > gpio326/value # Uart2 root@BeagleBone:/sys/class/tty# ls -l lrwxrwxrwx 1 root root 0 Jul 13 17:29 ttyS4 -> ../../devices/platform/bus@100000/2820000.serial/tty/ttyS4 sudo apt-get install minicom sudo minicom -D /dev/ttyS4 Welcome to minicom 2.8 OPTIONS: I18n Port /dev/ttyS4, 10:57:41 Press CTRL-A Z for help on special keys hello 测试不成功,未收发到数据。 LEDs cd /sys/class/leds && ls -l echo 255 > beaglebone:green:cape0/brightness echo 255 > beaglebone:green:cape3/brightnessb echo 0 > beaglebone:green:cape1/brightness # 关不掉 激光雷达 如果提示没有权限,请见 启用 ssh 的 root 帐户,使用 root 权限执行。 首先,操作 GPIO 使激光雷达转起来。 cd /sys/class/gpio echo 306 > export echo 374 > export echo out > gpio306/direction echo out > gpio374/direction echo 0 > gpio374/value echo 1 > gpio306/value echo 1 > gpio374/value echo 0 > gpio306/value 确认接口: ls -l /sys/class/tty/ lrwxrwxrwx 1 root root 0 Jul 13 17:29 ttyS0 -> ../../devices/platform/bus@100000/2880000.serial/tty/ttyS0 下载最新的 SDK:https://github.com/Slamtec/rplidar_sdk/releases 修改 /sdk/sdk/src/hal/event.h 文件以正常编译: enum { EVENT_OK = 1, - EVENT_TIMEOUT = -1, + EVENT_TIMEOUT = 2, EVENT_FAILED = 0, }; 切换到 /sdk 目录下,使用 make 命令编译,编译出来的文件在 /sdk/output 目录下。 切换到 /sdk/output/Linux/Release 目录下,使用以下命令跑测试例程: ./ultra_simple /dev/ttyS0 参考与致谢 原理图 镜像 测试代码 Cape 问题 激光雷达 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

BeagleBone 系列 - 使用 BBIO 库开发

BeagleBone 系列 - 使用 BBIO 库开发 安装 Adafruit-BBIO sudo apt-get update sudo apt-get install build-essential python3-dev python3-pip -y sudo pip3 install Adafruit_BBIO 基本程序框架 import time import Adafruit_BBIO.GPIO as GPIO RELAY = "P9_22" # GPIO P9_22 GPIO.setup(RELAY, GPIO.OUT) while True: GPIO.output(RELAY, GPIO.HIGH) time.sleep(1) GPIO.output(RELAY, GPIO.HIGH) time.sleep(1) GPIO 调用库: import Adafruit_BBIO.GPIO as GPIO 设置引脚输入 / 输出 GPIO.setup("P8_14", GPIO.OUT) 输入 / 输出 可选 GPIO.IN/GPIO.OUT。 设置输出高 / 低电平 GPIO.output("P8_14", GPIO.HIGH) 高 / 低 电平可选 GPIO.HIGH/GPIO.LOW,或 1/0。 引脚输入模式 查看输入端口的状态: if GPIO.input("P8_14"): print("HIGH") else: print("LOW") 等待边沿输入,参数有 GPIO.RISING/GPIO.FALLING/GPIO.BOTH: GPIO.wait_for_edge(channel, GPIO.RISING) 或 GPIO.wait_for_edge(channel, GPIO.RISING, timeout) 监测输入 GPIO.add_event_detect("P9_12", GPIO.FALLING) if GPIO.event_detected("P9_12"): print "event detected!" 延时 延时 1 秒: import time time.sleep(1) PWM 输出 import Adafruit_BBIO.PWM as PWM #PWM.start(通道, 占空比, 默认频率=2000, 极性=0) PWM.start("P9_14", 50) #也可以自己定义频率和极性 PWM.start("P9_14", 50, 1000, 1) 其中,占空比的有效值为 0.0-100.0,start 函数用于激活该通道上的 PWM。 当启动 PWM 之后,就可单独设置占空比或频率了: PWM.set_duty_cycle("P9_14", 25.5) PWM.set_frequency("P9_14", 10) 用完之后,也可以停止 PWM 输出,或清除信息: PWM.stop("P9_14") PWM.cleanup() ADC 输入 在这个框架里面,ADC 有三个函数方法:setup,read 和 read_raw。在读取数据之前,要先 setup。 在 BeagleBone 上,以下引脚可以使用 ADC: "AIN4", "P9_33" "AIN6", "P9_35" "AIN5", "P9_36" "AIN2", "P9_37" "AIN3", "P9_38" "AIN0", "P9_39" "AIN1", "P9_40" 注意:ADC 的最大电压为 1.8V,ADC 的地是 GNDA_ADC (P9_34) 引脚。如果需要检测 3.3V,可以用电阻分压,就像下图,把 0-3.3V 分到 0-1.65V 以读取模拟值。 初始化 ADC import Adafruit_BBIO.ADC as ADC ADC.setup() 读取模拟值 value = ADC.read("P9_40") 或 value = ADC.read("AIN1") 这框架有个 bug,需要连续读两次,才能获取最新的的模拟值。 读回来的结果是一个 0-1.0 之间的值,可以乘以 1.8 以转换成电压值。如果不想这么麻烦,也可以用 read_raw 来直接读出真实电压值。 I2C 通信 使用 I2C,只需要导入库,设置 I2C 地址,选择是哪个 I2C(默认是 I2C-1)。 from Adafruit_I2C import Adafruit_I2C i2c = Adafruit_I2C(0x77) I2C 功能需要安装 python 包 python-smbus,但目前这个包只兼容 python 2 版本。我们可以用 smbus2 替换使用。 SPI 通信 导入 SPI 库: from Adafruit_BBIO.SPI import SPI 其他 安装 Adafruit-BBIO 时,如果失败可选手动安装: sudo apt-get update sudo apt-get install build-essential python3-dev python3-pip -y git clone git://github.com/adafruit/adafruit-beaglebone-io-python.git cd adafruit-beaglebone-io-python sudo python3 setup.py install 升级 Adafruit-BBIO: sudo pip3 install --upgrade Adafruit_BBIO 因为 python-smbus 这个依赖的原因,I2C 仅限在 python2 下使用。 参考与致谢 Python Adafruit_GPIO.I2C Examples Adafruit-BBIO 1.2.0 Setting up IO Python Library on BeagleBone Black 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

BeagleBone 系列 - 基本参数与环境配置

BeagleBone 系列 - 基本参数与环境配置 硬件资源 USB Type-A:作为 USB 从机(Host)模式使用 USB Micro:为板子供电并且作为从机 LEDs D2:在启动时以心跳灯闪烁 D3:读写 SD 卡数据时亮起 D4:当 CPU 活动时亮起 D5:当 eMMC 读写时亮起 Boot/User 按钮:不管按不按,如果有 SD 卡都会默认从 SD 卡启动(殊途同归),当启动后就作为一个普通按钮,连接到 GPIO_72 I2C Grove 接口:连接到 I2C2 Uart Grove 接口:连接到 UART2 Serial Debug:连接到 UART0,靠近 USB 的引脚为 pin1,从 pin1-pin6 分别为:GND, NC, NC, RX, TX, NC 环境配置 驱动安装问题 在 Windows 10 及以上版本系统,默认采用驱动程序强制签名,这可能是驱动安装失败的原因。 解决方法: 按住 shift,点击重启电脑 进入 疑难解答 - 高级选项 - 启动设置,点击 重启 重启后,按页面提示,按键盘 7,即可禁用驱动程序强制签名 开机后,即可正常安装 BeagleBone 的驱动程序 镜像下载烧录 官网镜像下载地址:https://beagleboard.org/latest-images 将镜像烧录进 SD 卡,断电插入 BeagleBone,下次上电就会从 SD 卡启动系统 使用命令行工具访问 使用串口访问 使用 USB 转串口连接板载的串行端子,在电脑端打开串口工具(如 WindTerm)进行连接。(初始用户名和密码均为 root) 波特率是 115200! 使用以太网访问 在串口连接内使用命令 ifconfig 找到以太网地址,通过地址连接。用户名为 debian,密码为 temppwd。 通过 USB 访问 usb0:192.168.7.2 使用 SSH 方式访问,用户名为 debian,密码为 temppwd。 启用 ssh 的 root 帐户 vi /etc/ssh/sshd_config 将 #PermitRootLogin prohibit-password 修改为 PermitRootLogin yes 即可。 驱动 Seeed OLED(SSD1306,I2C,12864) 使用 pip3 下载 smbus2 包: sudo apt-get install python3-pip pip3 install smbus2 程序参考 Grove - OLED Display 0.96 inch。 参考与致谢 Beaglebone black 4G 调试中的问题 项目 Upgrade the software on your Beagle 测试固件

2025/9/17
articleCard.readMore

BeagleBone 系列 - 无线连接

BeagleBone 系列 - 无线连接 各版本 BeagleBone 的区别 BeagleBone® Black Seeed Studio BeagleBone® Green Seeed Studio BeagleBone® Green Wireless Seeed Studio BeagleBone® Green Gateway $ 60.00 USD $ 44.00 USD $ 52.90 USD $ 78.90 USD 1 x USB Host 1 x USB Host 4 x USB2.0 Host 2 x USB2.0 Host Ethernet Ethernet 10/100M Wi-Fi 802.11b/g/n 2.4GHz and Bluetooth 4.1 LE Ethernet 10/100M Bit and Wi-Fi 802.11b/g/n 2.4GHz and Bluetooth 4.1 LE HDMI Port 2 x Grove Connectors 2 x Grove Connectors 2 x Grove Connectors BeagleBone Green Gateway 连接 Wi-Fi debian@beaglebone:~$ connmanctl connmanctl> scan wifi Scan completed for wifi connmanctl> services se.101 wifi_1862e41aec0d_73652e313031_managed_psk STU-EE wifi_1862e41aec0d_5354552d4545_managed_psk connmanctl> agent on Agent registered connmanctl> connect wifi_1862e41aec0d_5354552d4545_managed_psk Agent RequestInput wifi_1862e41aec0d_5354552d4545_managed_psk Passphrase = [ Type=psk, Requirement=mandatory, Alternates=[ WPS ] ] WPS = [ Type=wpspin, Requirement=alternate ] Passphrase? 输入密码 Connected wifi_1862e41aec0d_5354552d4545_managed_psk connmanctl> quit 连接蓝牙 sudo apt install bluez 如果有错误,就先更新一下: sudo apt update 连接附近的蓝牙: bb-wl18xx-bluetooth bluetoothctl scan on 配对连接设备(后面一串是要配对设备的 MAC 地址): pair A4:xx:xx:xx:xx:30 trust A4:xx:xx:xx:xx:30 connect A4:xx:xx:xx:xx:30 可使用 quit 推出蓝牙命令行。 参考与致谢 Seeed Studio BeagleBone® Green Gateway 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

BookJourney - 二手书商城小程序

BookJourney - 二手书商城小程序 项目仓库:linyuxuanlin/BookJourney Demo(微信扫码体验): 背景 朋友想搞些副业,做在微信朋友圈卖二手书,于是托我做一个微信小程序。正逢暑假闲着没事干,于是练练手。需求是搞一个商城类的小程序,定时上架新的书籍信息,让买家自行选购。 开发 不想自己造轮子,我发现了一个不错的商城类小程序的开源项目: wechat-app-mall 于是在它的基础上,修改、添加自己想要的样式。(全局搜索很实用) 这个开源小程序原有的默认样式很不符合我的审美。我需要的效果,是能在简洁的页面上,把用户的专注聚焦在要展现的内容上。 后来,经过很多个版本的迭代,样式基本已经符合要求。 功能上,我删去了与砍价、分享有赏有关的一系列乱七八糟的东西,只留下核心功能。 因为后期商品上新不由我负责,所以后台商品编辑必须是图形化界面。BookJourney 用的是 api 工厂 的后台,省去了自己搭建服务器的过程,也方便团队成员上架新的商品。相应地,免费用户有储存限制。 避坑 开发 BookJourney 的过程中,遇到的坑不少。 就比如支付的问题,常识告诉我应该接入微信支付,方便用户下单,但微信官方阉割掉了个人注册小程序的微信支付窗口。(虽说也考虑到用户的资金安全)唯一的方法是注册一个企业账户,但首先我得有个公司。 进一步了解,我发现注册一个公司似乎并不容易。找会计事务所代理,要有办公地址,红本合同,去银行被经理审核;申请时间接近两三个月;费用要近千元,还不包括各种杂七杂八的收费…… 解决方法是,把下单的按钮直接改为联系客服。此时,用户只需要在「购物车」页面截图,直接发给负责客服的团队成员,就能下单了。 FAQ Q:为什么叫 BookJourney? Q:赚到钱了吗? 总结 经过了时间的证明,这是一个失败的项目。 前期没有认真调研市场,没有理清用户的需求,而只是做出来一个自己认为很酷的产品。以后做项目要注意不能只专攻于技术,还要更多关注市场,知道市场需要一些什么样的产品。 参考与致谢 EastWorld / wechat-app-mall 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

CPR - Fundamental

CPR - Fundamental This post was originally written in English. CPR represents of Core Power Reduction, an adaptive power management technology that determine the optimal product voltage, allow closed loop compensation of DC voltage, temperature variation, process(制程) and aging degradation(老化退化), to optimize device power and performance, CPR core consists of one controller, and a number of sensors embedded into the SoC, to control the VDD level of a chip. The sensors consists of multiple ring oscillators, to estimate the running speed of the chip. Then the controller provide a VDD modification command result to the PMIC, which can be programmed with software.

2025/9/17
articleCard.readMore

CSS 学习笔记

CSS 学习笔记 调用 在 HTML 的 <head> 下添加外部样式表: <link rel="stylesheet" href="xxx.css"> 其中,xxx.css 为同目录下的 CSS 文件。 链接式的外部样式表(如上) 选择器 基本语法 selector { prpperty: value; } 几种选择器对比 选择器 定义 调用 优先级 标签选择器 p <p> ... </p> 低 类选择器 .carrot {...} / p.carrot {...} class = "carrot" 中 ID 选择器 #first id = "first" 高 选择器组 用相同样式定义不同元素。 h1, h2, h3 { color: navy; } 颜色 /*字体颜色*/ color: #56a455; /*背景色*/ background-color: blue; /*透明度*/ /*取值 0.0 ~ 1.0*/ opacity: 0.5; 文本 字体大小 样式 百分比 EM 值 h1 200% 2em h2 150% 1.5em h3 133% 1.125em body 100% 1em /*字体大小*/ font-size: 200%; 字体选用 注:多单词组成的字体名称,要放引号,eg. 'Courier New' /*字体选用*/ /*本地*/ font-family: "Courier New", Courier, monospace, 外链字体名称; /*外链*/ @font-face { font-family: 外链字体名称; src: url("外链地址"); } 文本格式化 默认值为 normal /*粗体*/ font-weight: bold; /*斜体*/ font-style: italic; /*大小写*/ /*uppercase,lowercase,capitalize(首字母大写)*/ text-transform: uppercase; /*下划线*/ text-decoration: underline; /*删除线*/ text-decoration: line-through; /*行间距*/ line-height: 1.4em; /*对齐*/ /*left,right,center,justify(两端对齐)*/ text-align: left; 伪类 /* 未访问的链接 */ a:link { color: #ff0000; } /* 已访问的链接 */ a:visited { color: #00ff00; } /* 鼠标划过链接 */ a:hover { color: #ff00ff; } /* 已选中的链接 */ a:active { color: #0000ff; } 盒子 列表,表格与表单 待补充 布局 待补充 规范 属性分类顺序 显示方法 & 布局 定位 盒模型框 外边距 边框 内边距 尺寸 文本样式 字体 文本 文字颜色 背景 轮廓 透明度 & 阴影 动效 过渡 转换变形 动画 其他 伪类 & 伪元素 引用 媒体查询 属性顺序列表 [ [ "display", "visibility", "float", "clear", "overflow", "overflow-x", "overflow-y", "clip", "zoom" ], [ "table-layout", "empty-cells", "caption-side", "border-spacing", "border-collapse", "list-style", "list-style-position", "list-style-type", "list-style-image" ], [ "position", "top", "right", "bottom", "left", "z-index" ], [ "margin", "margin-top", "margin-right", "margin-bottom", "margin-left", "box-sizing", "border", "border-width", "border-style", "border-color", "border-top", "border-top-width", "border-top-style", "border-top-color", "border-right", "border-right-width", "border-right-style", "border-right-color", "border-bottom", "border-bottom-width", "border-bottom-style", "border-bottom-color", "border-left", "border-left-width", "border-left-style", "border-left-color", "border-radius", "border-top-left-radius", "border-top-right-radius", "border-bottom-right-radius", "border-bottom-left-radius", "border-image", "border-image-source", "border-image-slice", "border-image-width", "border-image-outset", "border-image-repeat", "padding", "padding-top", "padding-right", "padding-bottom", "padding-left", "width", "min-width", "max-width", "height", "min-height", "max-height" ], [ "font", "font-family", "font-size", "font-weight", "font-style", "font-variant", "font-size-adjust", "font-stretch", "font-effect", "font-emphasize", "font-emphasize-position", "font-emphasize-style", "font-smooth", "line-height", "text-align", "text-align-last", "vertical-align", "white-space", "text-decoration", "text-emphasis", "text-emphasis-color", "text-emphasis-style", "text-emphasis-position", "text-indent", "text-justify", "letter-spacing", "word-spacing", "text-outline", "text-transform", "text-wrap", "text-overflow", "text-overflow-ellipsis", "text-overflow-mode", "word-wrap", "word-break" ], [ "color", "background", "background-color", "background-image", "background-repeat", "background-attachment", "background-position", "background-position-x", "background-position-y", "background-clip", "background-origin", "background-size" ], [ "outline", "outline-width", "outline-style", "outline-color", "outline-offset", "opacity", "box-shadow", "text-shadow" ], [ "transition", "transition-delay", "transition-timing-function", "transition-duration", "transition-property", "transform", "transform-origin", "animation", "animation-name", "animation-duration", "animation-play-state", "animation-timing-function", "animation-delay", "animation-iteration-count", "animation-direction" ], [ "content", "quotes", "counter-reset", "counter-increment", "resize", "cursor", "user-select", "nav-index", "nav-up", "nav-right", "nav-down", "nav-left", "tab-size", "hyphens", "pointer-events" ] ] 参考与致谢 CSS 入门教程 CSS3 Tutorial 《CSS3 教程》 CSS 属性声明顺序规范 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

CentOS 配置 Oh My Zsh

CentOS 配置 Oh My Zsh 查看当前 Shell echo $SHELL 一般情况下会返回 bin/bash 安装 zsh yum install -y zsh 切换默认 Shell 为 zsh 需要在 root 用户下运行此命令: chsh -s /bin/zsh 安装 git yum install -y git 安装 Oh My Zsh 自动 sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" 或 sh -c "$(wget https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)" 手动 如果无法通过上面的方式安装(可能因为墙),则可通过以下方式手动安装: 下载源码: git clone https://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh 复制配置: cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc 修改 Oh My Zsh 主题 列出所有主题: ls ~/.oh-my-zsh/themes 修改主题: vim ~/.zshrc 将默认主题是 ZSH_THEME="robbyrussell" 修改为自己喜欢的即可。 重启生效 reboot 参考与致谢 centos7 安装 zsh 配置 oh-my-zsh CentOs 安装 oh my zsh 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Contact and Subscribe

Contact and Subscribe

2025/9/17
articleCard.readMore

Continuity Test

Continuity Test This post was originally written in English. Continuity test contains open/short test and power pin short test. The former checks the signal pins, while the latter checks the power pin. Open/Short Continuity Test Open/short continuity test is to confirm the electronical contact between tester and DUT, and whether if short-circuit existed to other pins or to ground. Test Method Open/short continuity test is performed with testing the protection diodes (diodes to VDD and to GND). Usually use PPMU with VBT code (also can be tested using PE and functional pattern). Test through GND protection diode Force 0V to all other pins that are not tested (include power pin). Force a small negative current (-100uA) on the Pin Under Test (with voltage clamp). Meaure voltage on the Pin Under Test: Higher than max spec(>-0.2V): FAIL (Short) Midband(-1.5V~-0.2V): PASS Lower than min spec(<-1.5V): FAIL (Open) Test through VDD protection diode Force 0V to all other pins that are not tested (include power pin). Force a small positive current (+100uA) on the Pin Under Test (with voltage clamp). Meaure voltage on the Pin Under Test: Higher than max spec(>1.5V): FAIL (Short) Midband(0.2V~1.5V): PASS Lower than min spec(<0.2V): FAIL (Open) Power Pin Short Test Power pin short test is to check if there is a short-circuit from VDD to GND pin, which will cause damagement to DUT or tester. Power pin short test always run immediately after open/short continuity test, and when it fails, device power will be shut off and the DUT will be rejected. Test Method Power Pin Short Test is performed by applying a small voltage to VDD, and measure the current into it, to check if a short-circuit existed. Usually use DCVI with VBT code. Apply a small voltage to VDD (100mV) (with current clamp). Force all other pins to 0V with PPMU. Measure current flowing into VDD pin: Higher than max spec(>20uA): FAIL (Short) Midband(-1uA~20uA): PASS Lower than min spec(<-1uA): FAIL References & Acknowledgements The Fundamentals Of Digital Semiconductor Testing Fundamentals of Testing Using ATE Original: https://wiki-power.com/ CC BY-NC-SA 4.0 agreement, should be reproduced with attribution.

2025/9/17
articleCard.readMore

CubeMX 与 CubeIDE 避坑

CubeMX 与 CubeIDE 避坑 项目名称路径不能是中文 如题,新建项目的名称与路径,都必须是英文的,不然可能会出现奇奇怪怪的错误。 默认关闭调试端口 问题描述: 检测到 ST-Link,却检测不到板子,提示 No target connected 首次能成功下载,第二次及以后就不行了 原因: CubeMX 把调试端口给关了 解决方法(本次): 用 STM32 ST-LINK Utility 工具,刷出厂程序救回来 或者用 这篇文章 提供的方法(通过 Keil) 解决方法(长远): 在 CubeMX 的 SYS 设置中,将 Debug 选项更改为 Serial Wire(SW) STM32CubeIDE 中文注释乱码 如果代码是从 Keil 导入的,需要先确保原本的编码是 GB2312。 依次点击菜单栏 - Window - Preferences - General - Apperance - Colors and Fonts - C/C++ - Editor - C/C++ Editor Text Font,点击右侧的 Edit,确认字体支持中文(如微软雅黑),并确认脚本为 中文 GB2312。 如果还是没有解决,那么可以在左侧文件树中,右键项目名称,点击最后的属性 Properties,将 Resource 面板中的字体编码改为 GBK(如果没得选,直接输入即可),保存即可解决。 STM32CubeIDE 汉化 打开链接 http://mirrors.ustc.edu.cn/eclipse/technology/babel/update-site/ ,点选到最新的数据目录下(比如我可选的是 mirrors.ustc.edu.cn/eclipse/technology/babel/update-site/),复制此地址链接。 在 STM32CubeIDE 菜单栏选择 Help - Install New Software,点击 Add,在 Name 栏填入 language;Location 栏填入刚刚复制的链接,然后点击添加,在弹出来的界面选择简体中文语言包,安装后按提示重启软件即可。 参考与致谢 STM32 调试器配置异常导致的问题与解决方法(一) STM32cubeIDE 环境配置安装-汉化-主题设置 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

C 与 STM32 代码规范

C 与 STM32 代码规范 参考与致谢 代码规范 V3.0.pdf

2025/9/17
articleCard.readMore

C 与 STM32 常用宏定义

C 与 STM32 常用宏定义 在嵌入式开发中,有些通用的宏定义,可以让项目兼容性和可移植性更佳。 防止头文件被重复定义 #ifndef COMDEF_H #define COMDEF_H //头文件内容 #endif 自定义数据类型 自定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异。这样也方便移植。 typedef unsigned char boolean; /* Boolean value type. */ typedef unsigned long int uint32; /* Unsigned 32 bit value */ typedef unsigned short uint16; /* Unsigned 16 bit value */ typedef unsigned char uint8; /* Unsigned 8 bit value */ typedef signed long int int32; /* Signed 32 bit value */ typedef signed short int16; /* Signed 16 bit value */ typedef signed char int8; /* Signed 8 bit value */ 获取指定地址上的一个字或字节 #define MEM_B( x ) ( *( (byte *) (x) ) ) #define MEM_W( x ) ( *( (word *) (x) ) ) 获取最大 / 最小值 #define MAX( x, y ) ( ((x) > (y)) ? (x) : (y) ) #define MIN( x, y ) ( ((x) < (y)) ? (x) : (y) ) 返回数组元素的个数 #define ARR_SIZE( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) ) 将首字母转换为大写 #define UPCASE( c ) ( ((c) >= 'a' && (c) <= 'z') ? ((c) - 0x20) : (c) ) 判断字符是否为十进制 #define DECCHK( c ) ((c) >= '0' && (c) <= '9') 判断字符是否为十六进制 #define HEXCHK( c ) ( ((c) >= '0' && (c) <= '9') ||\ ((c) >= 'A' && (c) <= 'F') ||\ ((c) >= 'a' && (c) <= 'f') ) 参考与致谢 嵌入式工程师常用的宏定义 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

DAC - Dynamic Parameters

DAC - Dynamic Parameters This post was originally written in English. Dynamic Parameters DAC's dynamic parameters mainly contain: Signal to Noise Ratio (SNR) Total Harmonic Distortion (THD) Signal to Noise and Distortion Ratio (SINAD) Inter-modulation Error (IM) Signal to Noise Ratio (SNR) Signal to Noise Ratio (SNR) of an DAC is defined as the ratio of the Measured Signal Power's RMS (excluding Harmonic Distortion) to the Noise Power's RMS: \[ SNR(dB)=20log(\frac{V_{Signal(RMS)}}{V_{Noise(RMS)}}) \] Since SNR is an ratio of power, \(20\) in the equation means the square of the ratio of voltage. Although the Harmonic Distortion is not included in the measurement of SNR, but the Quantization, Thermal and other residual noise in converter are included. Total Harmonic Distortion (THD) Total Harmonic Distortion (THD) of an DAC is defined as the ratio of the fundamental to all the harmonic distortion: \[ THD(dB)=20log(\frac{\sqrt{V^2_{2(RMS)}+V^2_{3(RMS)}+...+V^2_{n(RMS)}}}{V_{1(RMS)}} \] How to Test Dynamic Parameters Test System Setup Test system setup for ADC dynamic parameter tests: Resolution of AC Digitizer should be at least 2 to 4 bits better than DUT. Tests Concept Procedure of testing the dynamic parameters of an DAC is listed below. 1.Make a continuous input digital data signal (of a Sine wave) with the tester for the DAC to convert It is common practice to ensure that the analog/digital clock are referenced to a common master clock, so that the relationship of the clock sources's frequency is fixed and synchronized, which making test results highly repeatable. 2.Coherently collect a set of samples with the DAC For Digital Source: \[ \frac{Fs(dut)}{Fi}=\frac{N}{M} \] Where \(Fs(dut)\) is the samping rate of Digital Source, \(Fi\) is signal frequency, \(N\) is the number of samples, \(M\) is the number of integer cycles. For AC_Digital Capture: \[ \frac{Fs}{Fi}=\frac{Ncap}{Mc} \] Where \(Fs\) is the DAC sampling rate also the Digital Capture's sample rate, \(Fi\) is the signal frequency, \(Ncap\) is the number of samples captured (2x number), \(Mc\) is the number of integer cycles (odd). 3.Send the collected set of time samples to the DSP to perform DFT / FFT analysis 4.Analyze the frequency bins of interest using equations or tester algorithms for SNR, THD and compare to specification 5.Make a pass / fail decision based on the results References & Acknowledgements Fundamentals of Testing Using ATE The-Fundamentals-of-Mixed-Signal-Testing_Brian-Lowe Original: https://wiki-power.com/ CC BY-NC-SA 4.0 agreement, should be reproduced with attribution.

2025/9/17
articleCard.readMore

DAC - Static Parameters

DAC - Static Parameters This post was originally written in English. Digital to Analog Converter (ADC) is a device to converts a sequence of digital input data into analog signals. Static Parameters DAC's static parameters mainly contain: Zero Scale Output Full Scale Range (FSR) LSB Size Offset Error Gain Error Differential Non-Linearity Error (DNE or DNL) Integral Non-Linearity Error (INE or INL) Zero Scale Output Zero Scale Output is the measured output value when the zero/null level digital input code is presented to the DUT. Full Scale Range (FSR) Range of DAC output voltage between the minimum (\(V_{ZS}\)) and maximum (\(V_{FS}\)) analog outputs is called Full Scale Range (FSR): LSB Size Average change in voltage when in between the input codes is defined as LSB: \[ LSB=\frac{FSR_{measured}}{2^{bits}-1} \] Offset Error Offset Error (Zero-Scale Error) is the voltage difference between ideal and actual offset (initial) points. \[ OffsetError=V_{ZS(Actual)}-V_{ZS(ideal)} \] Gain Error Gain Error is the voltage difference between ideal and actual gain points on the transfer function. \[ GainError=FSR_{Ideal}-FSR_{Actual} \] Where \[ FSR_{Ideal}=V_{FS(ideal)}-V_{ZS(ideal)} \] \[ FSR_{Actual}=V_{FS(Actual)}-V_{ZS(Actual)} \] Differential Non-Linearity Error (DNL) Differential Non-Linearity Error (DNL) is the difference in the output voltage at a specific, compared to the output at the previous input, then minus one device LSB: \[ DNL=(V_{in2}-V_{in1})-LSB_{average} \] where \(V_{in2}\) is the voltage of the upper transition, \(V_{in1}\) is the lower. DNL is a measure of "small-signal" linearity error. Measurement of DNL is made from one step to the next, not each step to the ideal value. Integral Non-Linearity Error (INL) Integral Non-Linearity Error (INL) is the cumulative effect of all differential non-linearity values.It is a measure of "large-signal" linearity error. INL at any point along the curve is the deviation of the ideal linearity line. \[ ExpectedOutput[i]=FSR*InputCode[i]+OffsetError \] \[ INL[i]=\frac{ActualOutput[i]-ExpectedOutput[i]}{LSB_{average}} \] Also, INL can also be expressed as a function of DNL: \[ INL[i]=\sum_{n=1}^{n=i}DNL[n] \] How to Test Static Parameters Test System Setup Test system setup for DAC static parameter tests: Block diagram of signal setup: Tests Concept Procedure of testing the static parameters of an DAC DUT is listed below. 1. Measure the output voltage by applying the digital data inputs from Zero Scale to Full Scale 2. Calculate DNL for each input code \[ DNL[i]=\frac{OutputMeasured[i]-OutputMeasured[i-1]-LSB_{average}}{LSB_{average}} \] Where \[ LSB_{average}=\frac{OutputMeasured[n]-OutputMeasured[0]}{2^{bits}-1} \] 3. Get the max and min DNL 4. Calculate for INL for each step 5. Get the max and min INL References & Acknowledgements Fundamentals of Testing Using ATE The-Fundamentals-of-Mixed-Signal-Testing_Brian-Lowe Original: https://wiki-power.com/ CC BY-NC-SA 4.0 agreement, should be reproduced with attribution.

2025/9/17
articleCard.readMore

DC Parameters

DC Parameters This post was originally written in English. Testing DC parameters is essentially measuring the resistivity of the silicon. They can be tested DC method, with DCVI/PPMU forcing current then measuring voltage, or forcing voltage then measuring current. Will compare the measured value with the spec value out of the tester, then conclude a test result with PASS or FAIL. Items can be tested under DC method are as follows: Power Supply Current Test (IDD) Gross IDD Test Static IDD Test Dynamic IDD Test Quiescent IDD Test (IDDQ) Leakage Test Input Leakage Test (IIL & IIH) Output Tristate Leakage Test (IOZL & IOZH) Level Threshold Test Output Level Threshold Test (VOL/IOL & VOH/IOH) Input Level Threshold Test (VIL & VIH) Optional tests Input Clamp (VI) Output Short-circuit Current (IOS) Test Resistive Inputs Test Output Fanout Test DC parameters can also be tested with digital functional method, will be compared with the spec value by voltage comparator inside the PE (Pin Electronic) during functional test procedure, and conclude a Go/No-Go test result without specific values. Metions that current is defined to positive when flow into DUT, and negative when flow outside of DUT. References & Acknowledgements The Fundamentals Of Digital Semiconductor Testing Fundamentals of Testing Using ATE Original: https://wiki-power.com/ CC BY-NC-SA 4.0 agreement, should be reproduced with attribution.

2025/9/17
articleCard.readMore

Digital Functional Test 🚧

Digital Functional Test 🚧 This post was originally written in English. References & Acknowledgements The Fundamentals Of Digital Semiconductor Testing Fundamentals of Testing Using ATE Original: https://wiki-power.com/ CC BY-NC-SA 4.0 agreement, should be reproduced with attribution. Drive and Compare Timing D0 or Drive On: Start of cycle for each channel D1 or Drive Data: Start of drive pulse for each channel D2 or Drive Return: End of drive pulse for each channel D3 or Drive Off: Time of I/O switch R0 or Compare Start (On): Start of compare window for each channel (window strobe) R1 or Compare End (Off): End of compare window for each channel (window strobe) or edge strobe Troubleshooting of Digital Functional Debug Reduce test frequency. View the actual waveform, modify the position of comparison. Repeat pattern lines for more times in prevent of the influence of setup time. Use Shmoo method to analyze. Switching the order of test execution, in prevent of the interaction between tests. Pay attention to the Pin Electronic Driver Mode Vt, Hi-Z, Largeswing-VT1K or Smallswing-VT? Hi-Z: the balance bridge will be used for driving, and VCOM will be used for current loads. Vt: directly connect to Vt level through a 50Ω resistance. If the DUT output is running at a high speed, using the VT results in fewer reflections seen by the comparator. Check if TDR is calibrated. Defects with pattern itself.

2025/9/17
articleCard.readMore

Docker Compose - 镜像编排工具

Docker Compose - 镜像编排工具 Docker Compose 是 Docker 镜像的编排工具。推荐使用 Docker Compose 作为 Docker 的默认打开方式,因为它不仅可以方便地配置与部署镜像,还可以更方便地配置多镜像服务,甚至区分它们的启动顺序,这是使用命令的打开方式所不具备的。 虽然 Docker 的思想是解耦(一个镜像一个进程)、提高复用率、不在一个镜像内封装多个服务,但是,有些应用是需要多个服务同时启动的。例如,一个典型的 web 应用,至少需要服务端和数据库配合。这样一来,你需要分别部署两个容器,甚至有些服务需要按一定先后顺序启动。这样一来,需要的镜像和操作步骤会很复杂。 Docker Compose 把所需要调用的镜像(所有需要的服务、容器的属性、网络配置以及存储卷的挂载)和顺序等,全部写在一个 YAML 文件里,直接运行这个配置文件,就可以按照你所需的方法和步骤运行容器,而不需要手动操作每个容器。以下是一个 Docker Compose 示例,用于部署一个 web 服务: compose.yaml version: "3" services: web: image: beginor/geoserver:2.11.1 container_name: geoserver-web hostname: geoserver-web ports: - 8080:8080 volumes: - ./web/data_dir:/geoserver/data_dir - ./web/logs:/geoserver/logs restart: unless-stopped links: - database:database database: image: beginor/postgis:9.3 container_name: postgis hostname: postgis ports: - 5432:5432 volumes: - ./database/data:/var/lib/postgresql/data environment: POSTGRES_PASSWORD: 1q2w3e4R restart: unless-stopped 在这个 YAML 文件中,定义并启动了web 和 database 这两个实例。 Docker Compose 的安装与配置 Docker Compose 依赖 Docker Engine,所以请先确保你已经安装了 Docker Engine 环境。如果你还没安装,可以参考上一篇教程:Docker 基础知识,安装 Docker Engine. 如果你用的是 Windows/MacOS/Linux 桌面客户端,那就不用另外安装 Docker Compose 了,因为已经包含在内。下面介绍 Linux Docker Engine 环境下 Docker Compose 的安装方法。 对于 Ubuntu 和 Debian,使用以下的命令安装 Docker Compose: sudo apt-get update sudo apt-get install docker-compose-plugin 对于 RPM 发行版的 Linux(比如 CentOS),使用以下的命令安装 Docker Compose: sudo yum update sudo yum install docker-compose-plugin 完成后,使用以下的命令检验安装是否成功: docker compose version 如何使用 Docker Compose 一般我们创建一个 compose.yaml 文件(老版本为 docker-compose.yml,也是兼容的),并将其放到一个以应用名称命名目录下,比如 web/compose.yaml。 要运行这个程序,只要在这个目录下执行 docker compose up 命令,即可按 YAML 文件中的配置启动服务。(加参数 -d 可以后台运行) 要停止应用栈的运行,用 docker compose down 就可以了。 Docker Compose 文件的写法 Docker Compose 的默认打开方式,是创建一个 YAML 格式的文件,默认命名为 compose.yaml。以下是一个示例的模板,包含所有可用的参数(但并不一定要全部用上): compose.yaml version: "3" services: service1: build: context: . dockerfile: Dockerfile image: your-image1 command: ["python", "app.py"] ports: - "8000:8000" volumes: - ./data:/app/data networks: - your-network environment: - ENV_VARIABLE=value depends_on: - db db: image: mysql:5.7 environment: - MYSQL_ROOT_PASSWORD=yourpassword volumes: - db-data:/var/lib/mysql networks: your-network: volumes: your-volume: db-data: 在一个 compose.yaml 中,通常会包含以下的参数: version:仅用来展示 compose 文件的版本信息。与 Docker Engine 版本相关联,更新的版本可能会有新增功能特性或语法。请参考官方文档 Compose file versions and upgrading。 services:定义了此 compose 文件中包含的各个服务(容器)。每个服务都是一个独立的容器,可以定义其镜像、端口映射、环境变量等。 container_name:容器名称,非必须,但不能出现重名。 networks:定义了服务之间的网络配置。可以创建自定义网络,并将服务连接到这些网络上,实现容器之间的通信。 volumes:定义了容器的卷的挂载配置。可以将容器的目录或文件与主机的目录或文件进行关联,实现数据持久化和共享。相当于 Docker CLI 中的 -v 参数。 environment(或 env_file):指定容器的环境变量的文件名与路径,指定以这文件来加载环境变量。如果没有配置环境变量可忽略。如果环境变量在当前目录下且名为 .env,也可以省略。相当于 Docker CLI 中的 -e 参数。 build:使用构建的镜像启动。指定 Dockerfile 文件的路径。 image:指定容器所使用的镜像。可以使用公共镜像仓库中的镜像,或者指定本地的 Dockerfile 文件。 ports:定义容器与宿主机之间的端口映射关系,也可指定映射协议(TCP 或 UDP)。相当于 Docker CLI 中的 -p 参数。 depends_on:定义服务之间的依赖关系。可以指定一个或多个服务的名称,表示当前服务依赖于这些服务的启动。 restart:定义容器的重启策略。可以设置为 no(不自动重启)、always(始终自动重启)、unless-stopped(自动重启,除非手动停止容器)或 on-failure(仅奔溃时自动重启)。相当于 Docker CLI 中的 --restart 参数。 command:指定容器启动时要执行的命令,可用于覆盖容器镜像中默认的启动命令。 volumes_from:指定容器要挂载卷的来源容器。 一些常用的 Docker Compose 命令 以下是一些常见的 Docker Compose 命令,用于管理和操作 `compose.yaml`` 文件定义的服务: docker compose up:构建 compose 中定义的镜像并启动容器。如果需要,它会自动构建镜像(如果 Dockerfile 已更改),然后启动所有定义的服务。如果需要在后台启动,请加上 -d 参数。 docker compose down:停止并移除 compose 中的所有容器、网络和卷。它会停止正在运行的服务并清理所有相关的资源。 docker compose pull:拉取 compose 中定义的所有镜像,或用于更新镜像、 docker compose start:启动已经创建的 compose 中的容器,不会重新创建容器或重新构建镜像。 docker compose stop:停止已经创建的 compose 中的容器,但不会移除容器。 docker compose restart:重启已经创建的 compose 中的容器。 docker compose pause:暂停已经创建的 compose 中的容器,使其暂时停止运行。 docker compose unpause:恢复已经暂停的 compose 中的容器,使其继续运行。 docker compose ps:显示 所有 正在运行的 compose 中的容器的状态。 docker compose logs:查看 compose 中的容器的日志输出。 docker compose exec:在运行的 compose 中的容器中执行命令。比如 docker exec -it [compose-name] /bin/bash 这是一些常见的命令,你也可以执行 docker compose --help 查看更多可用的命令。 环境变量 在 Docker Compose 中,虽然环境变量并非必选项,但是推荐多使用,因为以下几个优点: 灵活性和可配置性:轻松调整应用的配置信息,而无需修改 Docker 镜像或重新构建容器。 安全性和隔离性:通过将敏感信息存储在环境变量中,而不是直接写在代码或配置文件中,对环境变量单独授权,可以提高应用程序的安全性。 跨平台兼容性:不同的操作系统或平台都可以通过环境变量传递不同的配置信息,无需对配置文件或镜像代码进行修改。 部署和管理的简化:通过统一使用环境变量来配置不同容器的参数,可以减少配置文件中的重复内容,使整个过程更加清晰和易于维护。 集成和自动化:通过与 CI/CD 和自动化工具结合,可自动将应用的配置参数传递给 Docker 容器,实现自动化部署和集成。 环境变量是一个 .env 后缀的文件,一般是直接在 compose.yaml 同级目录下创建一个名为 .env 的文件,以下是一个示例: .env TAG=v1.5 在 compose.yaml 中可以直接调用环境变量: compose.yaml services: web: image: "webapp:${TAG}" 小技巧 有一个将 Docker CLI 转换为 Docker Compose YAML 的网站:composerize,转换结果不一定准确,需检验。 参考与致谢 使用 docker compose 替代 docker run Install Docker Compose Docker-Compose 模板文件参数详解 原来,群晖也能用 Docker Compose! Docker - 从入门到实践 Docker 系列 - 了解 Docker Compose 的配置文件 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Docker 基础知识

Docker 基础知识 众所周知,软件开发中最麻烦的事情之一,就是环境的配置。运行环境的差异,可能导致意想不到的结果,而使用 Docker 可以避免出现这样的问题。 Docker 与容器化技术 Docker 把软件本身和它所需的运行环境打包起来,使用的时候就不需要再去配置环境了(因为环境都在包里),这样就能确保你的环境和开发者的一模一样,避免因运行环境差异而造成问题。 Docker 使用的是 容器化技术。当我们谈论容器化技术时,可以将其类比 集装箱。它是一种 标准化 的大型容器,可以在各种运输工具(如船舶、火车、卡车)之间进行简单的装载和卸载,而无需考虑其内部的具体内容组成。类似地,容器化技术将应用程序及其所有依赖项打包在一个独立的、可移植的环境中,称为容器。 容器化技术的主要目标是实现应用程序的快速部署、可扩展性和环境隔离。通过将应用程序和相关依赖项打包在一个容器中,我们可以确保在不同的计算机或服务器上以一致的方式运行应用程序,而无需担心环境差异或依赖冲突的问题。这使得开发人员可以更快速地交付应用程序,同时也简化了应用程序的部署和管理过程。 容器化技术的一大优势是它提供了轻量级的虚拟化解决方案。与传统的虚拟机相比,容器化技术更加轻巧且资源消耗更少。每个容器都运行在宿主操作系统的相同内核上,共享操作系统的资源,因此容器启动更快、占用更少的内存,也可以在同一台机器上同时运行多个容器。 Docker 是目前比较流行的容器化解决方案。它主要包含三要素,分别是 Image(镜像)、Container(容器)和 Repository(仓库)。 Image(镜像):镜像是一个可执行文件,包含了应用程序及其依赖的所有文件系统(代码、runtime、系统工具、库文件)和配置。我们可以将镜像看作是容器的模板,通过它可以创建多个不同的容器实例。 Container(容器):容器是由镜像创建的运行实例。每个容器都是相互隔离的、独立运行的环境,可以在其中运行应用程序。 Repository(仓库):仓库是用来存储和分享镜像。我们可以将自己创建的镜像推送到仓库中,也可以从仓库中拉取他人创建的镜像。 容器与镜像的关系,就像面向对象编程中的对象与类。 Docker 的安装与配置 在安装 Docker 之前,可以先用以下的命令卸载旧版本包,避免冲突: for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done 对于主流的 Linux 系统,可以使用官方脚本的方法下载安装 Docker Engine:(需要使用 root 用户权限) curl -fsSL https://get.docker.com -o get-docker.sh sudo sh ./get-docker.sh --dry-run 因为 Docker 运行在并依赖于 Linux 环境,所以它几乎没有效率损耗。但是,如果在其他系统上部署 Docker,就必须先安装一个虚拟 Linux 环境。 Windows 下 Docker 的安装方法,请参考官方文档 Install Docker Desktop on Windows。 MacOS 下的安装方法,请参考官方文档 Install Docker Desktop on Mac。 按照流程安装后,我们可以使用以下的命令,验证 Docker 是否安装成功: docker version 在 Linux 下安装 Docker Engine 后,如果想要以非 root 用户使用,可以使用以下的命令配置权限: sudo groupadd docker sudo usermod -aG docker $USER 完成配置后,可能需要注销重新登录,以更新权限。 如果安装出现问题,请参考官方文档 Troubleshoot Docker Engine installation。 实例:Hello World 下面将用官方 hello-world 例子来演示 Docker。打开终端或命令提示符,并输入以下命令运行 hello-world 容器: docker run hello-world 这将从 Docker 镜像仓库中下载 hello-world 镜像,创建并运行容器。当看见 hello world 的输出时,说明运行成功。 一些常用的 Docker CLI 命令 Docker 提供了一组强大而丰富的命令,用于管理和操作容器、镜像、网络等资源。下面是一些常用的 Docker CLI 命令: docker run:基于指定的镜像创建并运行一个新容器。例如,docker run -d -p 8080:80 nginx 会在后台运行一个 NGINX 容器,将主机的 8080 端口映射到容器的 80 端口。 docker ps:列出正在运行的容器。默认情况下,它会显示正在运行的容器的 ID、镜像、命令等信息。使用docker ps -a命令可以显示所有的容器,包括已停止的容器。 docker stop:停止一个或多个运行中的容器。可以指定容器的 ID 或名称。例如,docker stop mycontainer 会停止名为 mycontainer 的容器。 docker start:启动一个或多个已停止的容器。可使用容器的 ID 或名称来指定容器。 docker stop:停止一个或多个运行中的容器。 docker restart:重启一个或多个容器。 docker rm:删除一个或多个容器。如果要删除运行中的容器,可以使用 docker rm -f 命令。 docker images:列出本地镜像。它会显示本地计算机上已经下载和创建的 Docker 镜像的列表,包括镜像 ID、大小和创建时间等信息。 docker rmi:删除一个或多个镜像。可以使用镜像的 ID 或标签来指定镜像。例如,docker rmi myimage:1.0 会删除名为 myimage 且标签为 1.0 的镜像。 docker build:基于 Dockerfile 构建一个自定义镜像。例如,docker build -t myimage:1.0 .会根据当前目录下的 Dockerfile 构建一个名为 myimage 且标签为 1.0 的镜像。 docker exec:在运行中的容器中执行命令。可以指定容器的 ID 或名称,以及要执行的命令。例如,docker exec -it mycontainer bash会在名为 mycontainer 的容器中启动一个新的交互式终端。 这些是一些常用的 Docker 命令,用于管理和操作容器和镜像。还有更多的命令可以探索,可以通过docker --help命令查看完整的命令列表和其它可用选项,也可以参考官方文档 Use the Docker command line。 如需了解更多 Docker 相关的知识,请移步后续的文章: Docker Compose - 镜像编排工具 将应用封装为 Docker 容器 如果你想直接上手实践,也可参考以下系列的文章: 搭建属于自己的 HomeLab Homelab - 轻量服务器管理面板 CasaOS Homelab - 反代证书管理面板 Nginx Proxy Manager Homelab - 内网穿透工具 frp Homelab - 免费的内网穿透替代方案 Cloudflared Homelab - 在线代码编辑器 code-server Homelab - 网站状态监控工具 Uptime Kuma Homelab - 高质量图片压缩工具 TinyPNG-docker Homelab - 极简个人书签导航站 Flare Homelab - 容器应用管理平台 Portainer Homelab - 跨设备同步工具 Syncthing Homelab - 碎片笔记工具 memos Homelab - 功能强大的 wiki 系统 Wiki.js Homelab - 自托管密码管理器 Vaultwarden Homelab - 支持公有云的图床系统 Cloudreve Homelab - 自托管 RSS 聚合器 FreshRSS Homelab - 支持多种协议的堡垒机 Next Terminal Homelab - 多功能 PDF 工具箱 Stirling-PDF Homelab - 网站 favicon 抓取工具 iconserver Homelab - 自动更新 Docker 容器的工具 Watchtower Homelab - 支持多存储的文件列表程序 Alist Homelab - 功能丰富的看板软件 WeKan Homelab - 播客与有声书服务器 Audiobookshelf Homelab - 云端音乐服务器 Navidrome Homelab - 影视媒体服务器 Jellyfin Homelab - 电子书管理服务器 calibre-web Homelab - 智能家居服务器 Home Assistant Homelab - 卡片辅助记忆软件 Anki 参考与致谢 Docker - 从入门到实践 Docker 教程 Docker 入门教程 CentOS 安装 Docker 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Docusaurus 极简部署指南

Docusaurus 极简部署指南 使用 这个模板 生成自己的仓库 注册 Vercel 账户(选择用 GitHub 账户注册),并导入刚刚的仓库 行了。

2025/9/17
articleCard.readMore

Doxygen 注释规范

Doxygen 注释规范 文件头标注展开目录 /**************************************************************************** * Copyright (C) 2018 by Doxygen C Comment * * * * This file is part of Box. * * * * Box is free software: you can redistribute it and/or modify it * * under the terms of the GNU Lesser General Public License as published * * by the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * Box is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with Box. If not, see <http://www.gnu.org/licenses/>. * ****************************************************************************/ /** * @file doxygen_c.h * @author someone * @date 2018.1.4 * @brief doxygen 规范的 C 文件注释规范文档,可以换行, * 所有 brief 同 * * @details 对该文档的详细说明和解释,可以换行, * 所有详细说明同 */ #include "hearder.h" 结构体、枚举类型标注展开目录 /** * @brief 简要说明 * * @details 详细说明 */ typedef enum BoxEnum_enum { BOXENUM_FIRST, /**< Some documentation for first. */ BOXENUM_SECOND, /**< Some documentation for second. */ BOXENUM_ETC /**< Etc. */ } BoxEnum; 函数头注释展开目录 /** * @brief 函数简要说明,可以换行 * * @details 对函数的详细说明和解释,可以换行 * * @note 注意事项内容 * * @param index 说明文字 * @param cent 说明文字 * * @return 描述函数返回的内容 * @retval 1 测试成功 * @retval -1 测试失败 */ bool Test(int index, char *cent); 变量注释展开目录 int element = 0; /**< 变量简单说明 */ /** * @brief 变量简要说明 * * @details 变量详细说明 */ unsigned int variable = 0; 宏注释展开目录 /** * @brief 宏简要说明 * * @details 宏详细说明 */ #define variable 10 参考与致谢 基于 Doxygen 的 C 语言简要注释规范

2025/9/17
articleCard.readMore

EMC 设计指南

EMC 设计指南 电磁兼容性(Electromagnetic Compatibility, EMC)指的是设备在其电磁环境中能正常工作且不对环境中任何事物构成不能承受的电磁骚扰的能力,通俗地说,就是你的板子不怕别人干扰,也尽量不去干扰别人,达到「兼容」的状态。 电磁兼容性(EMC) 包括了 电磁干扰(EMI,Electro-Magnetic Interference) 和 电磁耐受性(EMS,Electro-Magnetic Susceptibility)。 EMI 有以下要素: 辐射发射(RE,Radiated Emission):指干扰源通过空间把其信号耦合(干扰)到另一个电网络。 传导发射(CE,Conducted Emission):指通过导电介质把一个电网络上的信号耦合(干扰)到另一个电网络。 谐波(Harmonic):谐波电流骚扰测试。 闪烁(Flicker):电压变化和闪烁测试。 EMS 有以下要素: 辐射抗扰(RS):射频电磁场辐射抗扰度测试。 传导抗扰(CS):射频场感应的传导骚扰抗扰度测试(大电流注入)。 防静电(ESD):静电抗扰度测试(静电放电实验)。 瞬态脉冲干扰(EFT):电快速瞬变脉冲群抗扰度测试。 电压暂降(DIP):短时中断和电压变化抗扰度测试。 浪涌、雷击(SURGE):浪涌(雷击)抗扰度测试。 工频磁场抗扰(PFMF):工频磁场抗扰度测试。 EMC 优化基本方法 产生 EMC 问题的要素是:电磁干扰源、耦合途径、敏感设备。 规律: 高频电流环路面积 S 越大, EMI 辐射越严重。 环路电流频率 f 越高,引起的 EMI 辐射越严重,电磁辐射场强随电流频率 f 的平方成正比增大。 基本应对方法: 传输通道抑制:具体的方法有滤波、屏蔽、接地、搭接、合理的布线; 空间分离:即通过加大骚扰源和敏感电路间的距离,抑制空间辐射骚扰和感应耦合骚扰的有效方法; 时间分离:有用信号在干扰信号发射时短暂关闭,而在干扰信号停止的时间内传输; 频谱处理:频谱改变、展频技术; 电气隔离:光电隔离、继电器隔离、变压器隔离、DC/DC 变换。 最小化高频线和电源环路的面积 基本原则: 信号总是返回到源端。 信号回流总是走阻抗最小的路径。 在高频信号中,信号回流路径通常是最小电感的路径,这通常也是环路面积最小的路径。在低频中(通常为 KHz 频率及以下),信号回流往往走阻值最小的路径。 尽量保持信号回流屏幕完整 如图,如果切割了信号回流平面,则信号电流将不能经最优化(最短)路径返回源头,在寻找替代回流路径的时候将变得不可预期,增大信号环路面积。 特殊情况下,数字地和模拟地需要隔离,防止串扰。 高速信号远离连接器 通过连接器连接到 PCB 的线缆是高效的天线,而高速信号容易产生电位差,这些电压会驱动电流到连接的线缆上,引发辐射超标。 抑制高速信号上升沿和下降沿时间 通过减慢数字信号的上升沿和下降沿时间,可以很好地控制高次谐波频率。过长的转换时间会导致信号完整性和过热问题。 EMC 元器件 EMC 常用元件有共模电感、磁珠与滤波电容器。 常见滤波器模型: 共模电感 共模电感的等效模型: 磁珠 磁珠的介绍与选型请见 基本元器件-电感与磁珠 · 磁珠 部分。 滤波电容 电容的介绍与选型请见 基本元器件 - 电容 部分。 PCB 的 EMC 设计 🚧 3W 与 20H 原则 3W 原则指的是线中心距不少于 3 倍线宽时,则可保持 70%的线间电场不互相干扰。如要达到 98% 的电场不互相干扰,则使用 10W 规则。 20H 原则指的是确保电源平面的边缘要比地平面边缘至少缩入相当于两个平面间层距的 20 倍,是为抑制边缘辐射效应,可以将 70% 的电场限制在接地边沿内;内缩 100H 则可以将 98% 的电场限制在内。 参考与致谢 电磁兼容介绍 电磁兼容(EMC):简单粗暴的 EMC 设计指南 EMI/EMC 设计秘籍–电子产品设计工程师必备手册 利用混成式共模电感抑制传导电磁干扰 [电路]EMC 基础概念_共模差模干扰 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

ESD 基础知识

ESD 基础知识 ESD(Electrostatic discharge)即静电释放。指两个物体在接近或接触时,发生的电子迅速转移的现象。众所周知,物体会在与其他物体的接触与摩擦中产生并积累电荷。比如我们的手跟外界摩擦时就会积累很多正电荷。当积累了很多正电荷的物体与一个导体距离非常近或接触的时候,电子将会快速从导体转移到积累正电荷的物体上。这个电子快速转移的过程就是静电释放(ESD)。 电子设备上通常会有很多接口,接口再通过导线连接到芯片的管脚上,然后连到芯片内部。静电释放时产生的高电压(一般高达上千伏)可能会击穿管子,如果是大电流,还可能会烧熔器件,所以要避免。 ESD 防护的关键在于为静电提供一条单独的放电通道(原理就像避雷针)。ESD 器件主要分为四类:TVS 二极管、压敏电阻、MLCC、ESD 抑制器。 ESD 测试模型 HBM MM CDM IEC 61000-4-2 MODEL 测试电压(V) 500-2000 100-200 500-2000 2000-15000 脉冲时间(ns) ~150 ~80 ~1 ~150 施加 2kV 时的峰值电流(\(A_pk\)) 1.33 - ~5 7.5 上升时间 25ns - <400ps <1ns 电压冲击次数 2 2 2 20 人体模型(HBM, Human Body Model) 假设由人体静电放电时的测试,模拟出人用手触摸芯片时的情况。 机器模型(MM, Machine Model) 假设由机械静电放电时的测试,模拟出通过机械手或者其他电阻较小的工具触碰芯片时发生静电释放的情形。 它与人体模型的区别在于电容更大、没有电阻,因此可想而知放电电流会大得多,而且由于导线的电感效应还会出现震荡电流,即对芯片放电的电流是正负变化的。 带电设备模型(CDM, Charged Device Model) 前两种模型模拟的都是带电体向芯片放电的情况,带电设备模型则模拟的是芯片自身带电,对地放电的情形。从在仓库存放了一段时间的包装里把芯片拿出来时会发生这种现象。这种情况下没有电阻、电容,而是芯片通过管脚直接对地放电。 ESD 参考标准 常见的 HBM 测试规格: 标准 充电电容 \(C_d (pF)\) 放电电阻 \(R_d (Ω)\) AEC-Q200-002 150 2000 IEC61000-4-2 150 330 以 AEC-Q200-002 标准为例,其 ESD HBM 测试电路如下: 其中,\(C_x\) 为测试对象的电容,\(C_d\) 为充电电容,\(R_d\) 为放电电阻,\(R_c\) 为保护电阻。ESD 测试方法如下: 开关 1 闭合,开关 2 开路:高压电源将电荷充进 \(C_d\) 开关 1 开路,开关 2 闭合:\(C_d\) 中储存的电荷将施加在 \(C_x\) 上,进行 ESD 测试。 放电电流曲线: ESD 测试流程 以 AEC-Q200-002 标准,HBM 测试流程可以按照下图进行: 测试出来的耐压等级按下表分类: 分类级别 最大耐压 1A 小于 500V (DC) 1B 0.5 kV (DC) 以上, 小于 1 kV (DC) 1C 1 kV (DC) 以上, 小于 2 kV (DC) 2 2 kV (DC) 以上, 小于 4 kV (DC) 3 4 kV (DC) 以上, 小于 6 kV (DC) 4 6 kV (DC) 以上, 小于 8 kV (DC) 5A 8 kV (DC) 以上, 小于 12 kV (AD) 5B 12 kV (AD) 以上, 小于 16 kV (AD) 5C 16 kV (AD) 以上, 小于 25 kV (AD) 6 25 kV (AD) 以上 DC(Direct Contact Discharge)为直接接触放电;AD(Air Discharge)为空气放电。 测试对象的电容容值与 ESD 耐性的关系 测试对象的电容 \(C_x\) 的容值大小会影响其两端的电压,满足以下的关系: \[ V_x=\frac{C_d}{C_d+C_x}V_d \] 电源电压(\(V_d\))和充电电容(\(C_d\))的容值恒定时,测试对象的电容(\(C_x\))容值的变大,会导致出现在其两侧的电压(\(V_x\))降低。 因此一般来说,\(C_x\) 的容值越大,ESD 耐性有变大的趋势。但实际上,因电介质的种类及厚度之类的设计上的差异,耐电压的性能范围也有不同,并不完全符合上述趋势。 电容容值与 ESD 耐性的参考 \(C_x\) 电容参数:GCM 系列 / 0402 封装 / X7R / 50V 测试条件:\(C_d=150pF,R_d=2kΩ\) 按图表曲线可得,如果我们要抵御 1kV 的 ESD,则可以用 1000pF 的电容来进行防御。在实际的电路设计中,最好给电容并联一个大电阻,在消除 ESD 后对电容里的电释放掉。 参考与致谢 可靠性与 ESD 介绍 电子工程师手记:ESD 基本知识及 ESD 保护的选取 ESD Resistance of Capacitors 一文搞懂 ESD 器件在 PCB 设计当中的作用 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

ESXi 初始化指南

ESXi 初始化指南 VMware ESXi 是一个可裸机安装的虚拟机管理器。本篇教程基于 ESXi 8,仍在草稿阶段。 可以先跟着这篇教程上手:『软路由踩坑指南』 篇二:ESXi 8.0 虚拟机必备知识与保姆级安装过程 进行至 5.修改ESXI的默认空间 这个地方时,改用以下方法,修改 ESXI 的默认空间大小。 减小 VMFSL 的占用 在点安装系统后 5 秒内,按 Shift + O,输入 cdromBoot runweasel systemMediaSize=min, 将虚拟内存配置到最小值。具体可参考官方文档 ESXi System Storage Overview。 Windows 11 虚拟机的安装 Win11 对系统配置比较严苛,安装的时候可能会出现 这台电脑无法运行Windows 11。一般问题来自于 TPM 检查,可以通过以下的方法避开: 在虚拟机的初始化页面,启用 Windows 基于虚拟化的安全性。 在进入 Windows 虚拟机后的 现在安装 页面,按快捷键 Shift + F10 启动 cmd 窗口(如果调出 cmd 界面,有可能是笔记本的键盘键位问题,可以尝试外接一个键盘)。 输入 regedit,打开注册表。在 HKEY_LOCAL_MACHINE\SYSTEM\Setup 路径下,创建两个 32 位的 DWORD 值: BypassTPMCheck,数值为 16 进制 1。 BypassSecureBootCheck,数值为 16 进制 1。 如果仍然无法安装,可以尝试检查其他的条件。可能是有一些条件达不到要求,比如 1GHz 以上的主频、64GB 以上的磁盘空间、4G 以上的内存。具体可参考 System requirements。

2025/9/17
articleCard.readMore

Flip - 基于全志 F1C200s 的 Linux 开发板

Flip - 基于全志 F1C200s 的 Linux 开发板 项目仓库:linyuxuanlin/Flip 项目在线预览 : F1C100s/F1C200s 基于 ARM9 CPU 架构,封装相同,区别仅仅是 F1C100S 内置 32MB DDR1 内存,而 F1C200S 为 64MB。 除此之外,这个芯片还集成了 USB OTG、UART、SPI、TWI、TP、SD/MMC、CSI 等通用外设。 基本参数 F1C200s 的基本参数如下: ARM9 CPU architecture 400M Memory SIP 64MB DDR1 SD2.0, eMMC 4.41 Video H.264/MPEG1 1920x1080@30fps decoding,MJPEG 1280x720@30fps encoding Audio, 2xDAC 和 1xADC, DAC up to 192kHz,ADC up to 48kHz 1 x I2S/PCM interface Display RGB interface up to 1280x720@60fps TV CVBS output, support NTSC/PAL USB OTG SDIO IR 3 x TWI 2 x SPI 3 x UART Melis or Linux SDK OS Package QFN88, 10mm x 10mm F1C200s 的系统架构框图: 典型应用示意图: Pin 定义: 参考与致谢 【目录】全志 F1C100S/F1C200S 学习笔记 peng-zhihui/Planck-Pi 小白自制 Linux 开发板 一. 瞎抄原理图与乱画 PCB MangoPi 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。 各模块的设计

2025/9/17
articleCard.readMore

FreeRTOS 开发笔记 🚧

FreeRTOS 开发笔记 🚧 参考与致谢 FreeRTOS(Official Website) STM32F429 FreeRTOS 开发手册 | 正点原子 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。 下载安装 首先,跳转官方下载页面 Download FreeRTOS 下载最新的安装器。

2025/9/17
articleCard.readMore

GitHub 改 Host

GitHub 改 Host 问题 错误:curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused 原因 国内 DNS 污染。 解决 在本机的 host 文件中添加: 199.232.68.133 raw.githubusercontent.com 199.232.68.133 user-images.githubusercontent.com 199.232.68.133 avatars2.githubusercontent.com 199.232.68.133 avatars1.githubusercontent.com Host 路径: Windows: C:\Windows\System32\drivers\etc Linux: /etc/hosts 补一点 Linux 下的操作方法: 打开终端 输入命令:vi /etc/hosts 按 A 切换到编辑模式 在末尾添加上面的几句 Host 指向 按 Esc 退出编辑,按 :wq 保存并退出 拓展 查询域名的 IP 使用 IPAddress 参考与致谢 添加 Host 加速访问 github 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Git 学习笔记

Git 学习笔记 安装与配置 下载安装包:git-scm.com/downloads 配置: git config --global user.name "username" git config --global user.email "email@example.com" 基础语句 基本流程 切换到指定的路径下:cd git-learning 初始化 Git 仓库:git init 将已存在 / 新增的文件,由 工作区 转移至 暂存区 : git add . :添加工作区的所有文件 git add xxx.xx :添加单个文件 提交更新至 暂存区分支 :git commit -m "description" 切换至某一个版本:git reset --hard commit_id 常用语句 查看修改(仅文件在工作区时可以使用):git diff 查看仓库状态:git status 查看提交历史(按照提交顺序):git log ,按 q 退出 查看命令历史(所有提交记录):git reflog 远程仓库 本地项目远程化 适用于本地已有项目文件的情况。 创建 SSH Key:ssh-keygen -t rsa -C "youremail@example.com" 更换为你的邮箱,一路回车即可 点开 GitHub 个人设置 - SSH and GPG keys,添加新的 SSH key Title 任意,Key 为 id_rsa.pub 文件中的内容 在 GitHub 新建仓库,不要勾选 Initialize this repository with a README 如果不小心初始化了仓库,则要先 pull 下来:git pull origin master 复制 SSH 地址(示例:git@github.com:linyuxuanlin/git-learning.git),在本地 Git 仓库下运行命令:git remote add origin git@server-name:user/repo-name.git 将本地内容推送到远程仓库:git push -u origin master 在出现提示信息时输入 yes 并回车继续 由于远程库是空的,我们第一次推送 master 分支时,加上了 -u 参数,Git 不但会把本地的 master 分支内容推送的远程新的 master 分支,还会把本地的 master 分支和远程的 master 分支关联起来,在以后的推送或者拉取时就可以简化命令 未来每一次提交:git push origin master 远程项目本地化 适用于从零开始,或基于别人的项目开发的情况。 将远程仓库克隆下来:git clone git@server-name:user/repo-name.git 分支管理 分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习 Git 的时候,另一个你正在另一个平行宇宙里努力学习 SVN。 分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了 50% 的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。 创建并切换至新分支:git switch -c branch_name -c 代表创建并切换分支 查看当前分支:git branch 将新分支内容合并到 master 上:git merge branch_name 先切换到待合并的分支,再使用合并命令(示例:先切换到 master,再执行以上命令) 当 Git 无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成 解决冲突就是把 Git 合并失败的文件手动编辑为我们希望的内容,再提交 删除某个分支:git branch -d dev 禁用 Fast forward 合并分支:git merge --no-ff -m "commit text" branch_name 因为本次合并要创建一个新的 commit,所以加上 -m 参数,把 commit 描述写进去 Fast forward 模式下,删除分支后,会丢掉分支信息 GitHub 漫游指南 借助 GitHub 平台,我们可以发现丰富多彩的开源项目,并于全世界的开发者一起搭建开源世界。 GitHub CLI GitHub CLI 是 GitHub 的命令行工具,将 pull requests,issues 等功能搬到命令行使用。 cli.github.com 参考与致谢 Git 教程 - 廖雪峰 实际项目中如何使用 Git 做分支管理 A successful Git branching model git-cheatsheet.pdf Pro Git GitHub CLI - Manual 20 多张精美图带你进入 Git 大门 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Git 配置代理

Git 配置代理 问题来源 国内 git clone 与 git pull 速度太慢。 解决方法 1. 代理软件内设置 在代理软件内勾选 允许来自局域网的连接 记下端口号(例如:1080) 开启 全局模式 2. 给 Git 全局配置 http 代理 git config --global http.proxy http://127.0.0.1:【端口号】 git config --global https.proxy https://127.0.0.1:【端口号】 # 例如: git config --global http.proxy http://127.0.0.1:10808 git config --global https.proxy https://127.0.0.1:10808 # 如果上面的不生效,则试试走 socks5 端口: git config --global http.proxy socks5://127.0.0.1:【端口号】 git config --global https.proxy socks5://127.0.0.1:【端口号】 # 如果只对 GitHub 进行代理,对国内的仓库不影响(不熟悉配置文件不建议使用): git config --global http.https://github.com.proxy https://127.0.0.1:【端口号】 git config --global https.https://github.com.proxy https://127.0.0.1:【端口号】 # 只对 GitLab 进行代理,对国内的仓库不影响(不熟悉配置文件不建议使用): git config --global https.https://https://gitlab.com.proxy https://127.0.0.1:1080 Ubuntu 下配置: git config --global http.https://github.com.proxy socks5://127.0.0.1:10808 查看配置文件的路径 git config –list –show-origin 恢复 如果不想用代理,可以用以下的方法恢复: git config --global --unset http.proxy git config --global --unset https.proxy 参考与致谢 征服 git clone 与 git pull 的龟速提交 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

HAL 库开发笔记 - CAN 通信 🚧

HAL 库开发笔记 - CAN 通信 🚧 本篇基于自研 RobotCtrl 开发套件,单片机内核为 STM32F407ZET6,CAN 通信使用 TJA1050 芯片,原理图及详细介绍请见 RobotCtrl - STM32 通用开发套件。 回环测试简单步骤 CubeMX 内配置 根据所用的 CAN 硬件,在左侧栏点开 CAN1 或 CAN2 页面,勾选 Activated,在参数页面,配置这些参数: 将 Prescaler (for Time Quantum) 设置为 6,Time Quanta in Bit Segment 1 和 Time Quanta in Bit Segment 2 都设置为 3 Times,这个组合将比特率设置为 1Mbps(最高)。 将 ReSynchronization Jump Width 配置为 1 Time ,这是重新同步时可调整的最大步长。 将 Operating Mode 配置为 Loopback,用于回环测试。 在 NVIC Settings 标签页,开启 CANx RX0 interrupts。 代码内配置 在项目下创建 can.c,设置筛选器,这里配置的是列表模式,筛选了拓展 ID 0x2233 和标准 ID 0: ```c title="can.c"/* * 函数名:CAN_Filter_Config * 描述 :CAN的过滤器 配置 * 输入 :无 * 输出 : 无 * 调用 :内部调用 */ static void CAN_Filter_Config(void) { CAN_FilterTypeDef CAN_FilterTypeDef; /*CAN筛选器初始化*/ CAN_FilterTypeDef.FilterBank = 0; //筛选器组0 CAN_FilterTypeDef.FilterMode = CAN_FILTERMODE_IDLIST; //工作在列表模式 CAN_FilterTypeDef.FilterScale = CAN_FILTERSCALE_32BIT; //筛选器位宽为单个32位。 /* 使能筛选器,按照标志的内容进行比对筛选,扩展ID不是如下的就抛弃掉,是的话,会存入FIFO0。 */ CAN_FilterTypeDef.FilterIdHigh = ((((uint32_t) 0x2233 << 3) | CAN_ID_EXT | CAN_RTR_DATA) & 0xFFFF0000) >> 16; //要筛选的ID高位 CAN_FilterTypeDef.FilterIdLow = (((uint32_t) 0x2233 << 3) | CAN_ID_EXT | CAN_RTR_DATA) & 0xFFFF; //要筛选的ID低位 CAN_FilterTypeDef.FilterMaskIdHigh = 0; //第二个ID的高位 CAN_FilterTypeDef.FilterMaskIdLow = 0; //第二个ID的低位 CAN_FilterTypeDef.FilterFIFOAssignment = CAN_FILTER_FIFO0; //筛选器被关联到FIFO0 CAN_FilterTypeDef.FilterActivation = ENABLE; //使能筛选器 HAL_CAN_ConfigFilter(&hcan1, &CAN_FilterTypeDef); } ``` 测试 打开设备管理器查看设备是否已经显示,如果没有发现设备,或有黄色的感叹号,请到 ST 官网下载驱动 STM32 Virtual COM Port Driver。 如果安装了驱动还是未能正常识别,可尝试在 CubeMX - Project Manager - Project - Linker Settings,将 Minimum Heap Size 调整为 0x600 或更高。 打开串口工具(波特率任意),可发现发送任意字符,将返回相同字符。 参考与致谢 STM32CubeMX 与 HAL 库学习--简单的 CAN 回环测试 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

HAL 库开发笔记 - DMA

HAL 库开发笔记 - DMA DMA(Direct Memory Access,直接存储器访问)允许不同速度的硬件装置直接沟通,而不需要依赖于 CPU 的大量中断负载。 基本原理 DMA 是什么 DMA 提供外设 / 存储器或存储器 / 存储器之间的高速数据传输,其过程中无需占用 CPU 资源。 如上图所示,STM32F4 系列有两个 DMA 控制器,共 12 通道(DMA1 有 7 个,DMA2 有 5 个)。DMA 控制器与 Cortex-M3 核心共享系统的数据总线。 简单地理解,当 CPU 懒得把一大串数据转移到另一个地方,或者说它还有更重要的事情要做的时候,就可以把这个任务丢给 DMA 去干,DMA 干完 / 出问题了跟 CPU 说一声就行。 DMA 的使用场景 串口通讯:最常见的使用情况,当有大量数据从串口读入或者写入的时候,让 DMA 处理。这样可以将 CPU 解放出来,让 CPU 处理更重要的事情。 ADC:一般在需要 ADC 时的通道扫描模式下,可以用 DMA 处理。 SD 卡读写:需要往 SD 卡里面读写大量数据的时候,一般也用 DMA 来处理。 DMA 的传输方向 P2P(Peripheral to Peripheral,从外设到外设)。 P2M(Peripheral to Memory,从外设到内存):一般用于传感器通过串口发送读数回单片机。 M2P(Memory to Peripheral,从内存到外设):一般用于单片机通过串口发送数据到执行器。 M2M(Memory to Memory,从内存到内存):MCU 内部的数据转移,常见于 Buffer 之间互相转移数据,或者从 Buffer 读写数据。只有 DMA2 能够进行 M2M 操作。 DMA 的传输模式 DMA_Mode_Normal:正常模式。任务完成后就停止 DMA,如果还需使用,要再次手动启动。 DMA_Mode_Circular: 循环传输模式。当传输结束时,硬件自动会将传输数据量寄存器进行重装,进行下一轮的数据传输。 常用的 DMA 函数参考 串口 DMA 发送数据 HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) 功能:串口通过 DMA 发送指定长度的数据。 UART_HandleTypeDef *huart:UATR 的别名(如 : UART_HandleTypeDef huart1 -> huart1) *pData:需要发送的数据 Size:发送的字节数 例子: HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff)); //串口发送 Senbuff 数组 串口 DMA 接收数据 HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) 功能:串口通过 DMA 接收指定长度的数据。 UART_HandleTypeDef *huart:UATR 的别名(如 : UART_HandleTypeDef huart1 -> huart1) *pData:需要存放接收数据的数组 Size:接收的字节数 例子: HAL_UART_Receive_DMA(&huart1, (uint8_t *)Recbuff, sizeof(Recbuff)); //串口接收,存放到 Recbuff 数组 串口 DMA 恢复函数 HAL_UART_DMAResume(&huart1) 作用:恢复 DMA 的传输 DMA 串口传输实验 在 CubeMX 内配置 DMA 串口部分的配置请跳转文章 HAL 库开发笔记 - 串口通信。 配置完 USART 引脚和 NVIC 中断后,切换到 DMA Settings 标签页,按照下图进行配置: 点击 Add 添加通道(USART1_RX 与 USART1_TX) 将两个的优先级都设置为 Medium(中优先级) DMA 传输模式为 Normal(正常模式) DMA 内存地址自增,每次增加一个 Byte(字节) 随后,在 System Core 标签页找到 DMA,增加一个 MEMTOMEM 栏目,如图: 在代码内配置 DMA main.c /* USER CODE BEGIN Init */ uint8_t Senbuff[] = "Serial Output Message by DMA \r\n"; // 自定义发送的字符串 /* USER CODE END Init */ ...... /* USER CODE BEGIN 3 */ HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff)); HAL_Delay(1000); } /* USER CODE END 3 */ 烧录程序,打开串口助手,即可看见循环发送的自定义数组。 参考与致谢 进阶篇 IV [DMA] 【STM32】HAL 库 STM32CubeMX 教程十一 ---DMA (串口 DMA 发送接收) 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

HAL 库开发笔记 - GPIO

HAL 库开发笔记 - GPIO 基本原理 GPIO 是 通用输入输出端口(General Purpose Input Output)。 拿 F103C8T6 芯片举个例子(上图),除了有颜色的引脚(电源和某些功能引脚)之外的,都叫 GPIO. 可见其通用程度。 GPIO 的功能是输入 / 输出电信号。我们来看看它的内部结构: 最右边的 I/O 引脚 ,就是实物芯片的引脚。上下的 保护二极管 在一定程度上可防止外部不正常电压经引脚烧毁芯片。 红色虚线框内是输入功能(芯片读取外部信号)。两个带开关的上拉 / 下拉电阻,是用来实现上下拉输入功能的。如果两个开关都不闭合,我们则称其为浮空输入(上不顶天下不着地,没有参考电平)。这三种输入模式读出来的都是数字量(高 / 低电平)。此外,还有模拟输入功能,顾名思义就是直接读取引脚上的模拟量。(复用功能输入我们后面再提及)。 蓝色虚线框内是输出功能。输出有 4 种模式:推挽、开漏、复用推挽、复用开漏。 输入输出模式 输入模式: 浮空输入:既不上拉也不下拉, STM32 复位之后的默认模式。 上拉输入:闭合上拉电阻的开关,使参考电平永远保持在高位,当输入信号为低电平时就触发。 下拉输入:闭合下拉电阻的开关,使参考电平永远保持在低位,当输入信号为高电平时就触发。 模拟输入:这个模式下,既不上拉也不下拉,也不经过 TTL 触发器,STM32 直接读取引脚上的模拟信号。 输出模式: 开漏输出:开漏指的是开下方的 N-MOS 管的漏极(上面的引脚),这个模式仅仅用到下方的 N-MOS 管。我们知道,MOS 管是电压控的元器件。理解为水龙头,给 N-MOS 的栅极(左边的引脚)输入低电平信号时,N-MOS 就导通。 推挽输出:推挽有两种模式,第一种是同时给两个 MOS 管的栅极通低电平,此时 P-MOS 导通而 N-MOS 截止,电流从 VDD 流向外部引脚,引脚呈高电平。第二种则相反,同时给两个 MOS 管的栅极通高电平,此时 P-MOS 截止而 N-MOS 导通,电流从外部引脚流向内部的 GND,引脚呈低电平。 复用开漏 复用推挽 常用的 GPIO 函数参考 读取 GPIO 状态,返回高 / 低电平: GPIO_PinState HAL_GPIO_ReadPin(GPIOx, GPIO_Pin); 写 GPIO 状态,写入高 / 低电平: HAL_GPIO_WritePin(GPIOx, GPIO_Pin, PinState); 翻转 GPIO 电平: HAL_GPIO_TogglePin(GPIOx, GPIO_Pin); 点亮 LED 在进行下一步实验之前,需要在 CubeMX 里配置串口下载、时钟等各类参数。 HAL 库开发笔记 - 环境配置 中的方法进行配置。 在 CubeMX 内配置 GPIO 将 LED 相应的 GPIO 口设置为输出,并设置初始电平。 对应到我的板子上,就需要把 PD4 和 PI3 这两个 GPIO 设置为输出(GPIO_Output)。 Low)。 在代码内配置 GPIO 如果配置之无误的话,上电即可点亮两颗用户 LED. main.c /* USER CODE BEGIN 3 */ HAL_Delay(500); HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_4); HAL_GPIO_TogglePin(GPIOI, GPIO_PIN_3); } /* USER CODE END 3 */ 即可实现闪灯效果。 按键控灯 在学习了 GPIO 的输出后,我们用按键来学习 GPIO 的输入模式。 在 CubeMX 内配置 GPIO 按照上面的方法配置 LED 所属的 GPIO 端口后,根据板载按键的原理图: 将按键所属的 GPIO(PI8)设置为输入(GPIO_Input)。根据原理图,选择内部上拉(Pull-up)。生成代码。 在代码内配置 GPIO 在主循环的用户代码区域内添加如下代码: main.c /* USER CODE BEGIN 3 */ if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==0) { HAL_Delay(100); if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==0) { HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET); } }else{ HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET); } } /* USER CODE END 3 */ 即可实现按下按键开灯,松开按键关灯的效果。 有许多人搞不清楚 GPIO_PIN_SET 和 GPIO_PIN_RESET 是什么意思。其实这两个变量的功能仅仅为设置 GPIO 引脚高 / 低电平。具体灯是开是关,还得看电路原理图。 另外,HAL_Delay(100); 的功能是代码消除按键抖动。不过 HAL_Delay() 函数用的是轮询,会占用资源导致卡机,下一篇文章我们将用硬件中断来解决这个缺陷。 参考与致谢 【STM32】STM32CubeMX 教程二 -- 基本使用 (新建工程点亮 LED 灯) STM32CubeMX 实战教程(二)—— 按键点个灯 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

HAL 库开发笔记 - I2C 通信(MPU6050)

HAL 库开发笔记 - I2C 通信(MPU6050) 本篇基于自研 RobotCtrl 开发套件,单片机内核为 STM32F407ZET6,使用 MPU6050 模组讲解 HAL 库 I2C 通信的方式,开发套件原理图及详细介绍请见 RobotCtrl - STM32 通用开发套件。 基本原理 I2C 通信 I2C 通信的基本原理可跳转文章 通信协议 - I2C MPU6050 模组 模组的引脚定义: VCC:3.3V~5V GND:地 SCL:I2C 时钟 / SPI 时钟 SDA:I2C 数据 / SPI 数据输入 XDA:给 I2C 设备提供主时钟 AD0:I2C 器件地址选择位 / SPI 数据输出 INT:中断引脚 带卡尔曼滤波的 MPU6050 库 这里我们调用带卡尔曼滤波的 MPU6050 库:leech001/MPU6050,将下载的 mpu6050.c 和 mpu6050.h 拷贝至项目文件夹下,并在 STM32CubeIDE/Keil 内将其添加到项目中: mpu6050.h #ifndef INC_GY521_H_ #define INC_GY521_H_ #endif /* INC_GY521_H_ */ #include <stdint.h> #include "i2c.h" // MPU6050 structure typedef struct { int16_t Accel_X_RAW; int16_t Accel_Y_RAW; int16_t Accel_Z_RAW; double Ax; double Ay; double Az; int16_t Gyro_X_RAW; int16_t Gyro_Y_RAW; int16_t Gyro_Z_RAW; double Gx; double Gy; double Gz; float Temperature; double KalmanAngleX; double KalmanAngleY; } MPU6050_t; // Kalman structure typedef struct { double Q_angle; double Q_bias; double R_measure; double angle; double bias; double P[2][2]; } Kalman_t; uint8_t MPU6050_Init(I2C_HandleTypeDef *I2Cx); void MPU6050_Read_Accel(I2C_HandleTypeDef *I2Cx, MPU6050_t *DataStruct); void MPU6050_Read_Gyro(I2C_HandleTypeDef *I2Cx, MPU6050_t *DataStruct); void MPU6050_Read_Temp(I2C_HandleTypeDef *I2Cx, MPU6050_t *DataStruct); void MPU6050_Read_All(I2C_HandleTypeDef *I2Cx, MPU6050_t *DataStruct); double Kalman_getAngle(Kalman_t *Kalman, double newAngle, double newRate, double dt); mpu6050.c #include <math.h> #include "mpu6050.h" #define RAD_TO_DEG 57.295779513082320876798154814105 #define WHO_AM_I_REG 0x75 #define PWR_MGMT_1_REG 0x6B #define SMPLRT_DIV_REG 0x19 #define ACCEL_CONFIG_REG 0x1C #define ACCEL_XOUT_H_REG 0x3B #define TEMP_OUT_H_REG 0x41 #define GYRO_CONFIG_REG 0x1B #define GYRO_XOUT_H_REG 0x43 // Setup MPU6050 #define MPU6050_ADDR 0xD0 const uint16_t i2c_timeout = 100; const double Accel_Z_corrector = 14418.0; uint32_t timer; Kalman_t KalmanX = { .Q_angle = 0.001f, .Q_bias = 0.003f, .R_measure = 0.03f}; Kalman_t KalmanY = { .Q_angle = 0.001f, .Q_bias = 0.003f, .R_measure = 0.03f, }; uint8_t MPU6050_Init(I2C_HandleTypeDef *I2Cx) { uint8_t check; uint8_t Data; // check device ID WHO_AM_I HAL_I2C_Mem_Read(I2Cx, MPU6050_ADDR, WHO_AM_I_REG, 1, &check, 1, i2c_timeout); if (check == 104) // 0x68 will be returned by the sensor if everything goes well { // power management register 0X6B we should write all 0's to wake the sensor up Data = 0; HAL_I2C_Mem_Write(I2Cx, MPU6050_ADDR, PWR_MGMT_1_REG, 1, &Data, 1, i2c_timeout); // Set DATA RATE of 1KHz by writing SMPLRT_DIV register Data = 0x07; HAL_I2C_Mem_Write(I2Cx, MPU6050_ADDR, SMPLRT_DIV_REG, 1, &Data, 1, i2c_timeout); // Set accelerometer configuration in ACCEL_CONFIG Register // XA_ST=0,YA_ST=0,ZA_ST=0, FS_SEL=0 -> � 2g Data = 0x00; HAL_I2C_Mem_Write(I2Cx, MPU6050_ADDR, ACCEL_CONFIG_REG, 1, &Data, 1, i2c_timeout); // Set Gyroscopic configuration in GYRO_CONFIG Register // XG_ST=0,YG_ST=0,ZG_ST=0, FS_SEL=0 -> � 250 �/s Data = 0x00; HAL_I2C_Mem_Write(I2Cx, MPU6050_ADDR, GYRO_CONFIG_REG, 1, &Data, 1, i2c_timeout); return 0; } return 1; } void MPU6050_Read_Accel(I2C_HandleTypeDef *I2Cx, MPU6050_t *DataStruct) { uint8_t Rec_Data[6]; // Read 6 BYTES of data starting from ACCEL_XOUT_H register HAL_I2C_Mem_Read(I2Cx, MPU6050_ADDR, ACCEL_XOUT_H_REG, 1, Rec_Data, 6, i2c_timeout); DataStruct->Accel_X_RAW = (int16_t)(Rec_Data[0] << 8 | Rec_Data[1]); DataStruct->Accel_Y_RAW = (int16_t)(Rec_Data[2] << 8 | Rec_Data[3]); DataStruct->Accel_Z_RAW = (int16_t)(Rec_Data[4] << 8 | Rec_Data[5]); /*** convert the RAW values into acceleration in 'g' we have to divide according to the Full scale value set in FS_SEL I have configured FS_SEL = 0. So I am dividing by 16384.0 for more details check ACCEL_CONFIG Register ****/ DataStruct->Ax = DataStruct->Accel_X_RAW / 16384.0; DataStruct->Ay = DataStruct->Accel_Y_RAW / 16384.0; DataStruct->Az = DataStruct->Accel_Z_RAW / Accel_Z_corrector; } void MPU6050_Read_Gyro(I2C_HandleTypeDef *I2Cx, MPU6050_t *DataStruct) { uint8_t Rec_Data[6]; // Read 6 BYTES of data starting from GYRO_XOUT_H register HAL_I2C_Mem_Read(I2Cx, MPU6050_ADDR, GYRO_XOUT_H_REG, 1, Rec_Data, 6, i2c_timeout); DataStruct->Gyro_X_RAW = (int16_t)(Rec_Data[0] << 8 | Rec_Data[1]); DataStruct->Gyro_Y_RAW = (int16_t)(Rec_Data[2] << 8 | Rec_Data[3]); DataStruct->Gyro_Z_RAW = (int16_t)(Rec_Data[4] << 8 | Rec_Data[5]); /*** convert the RAW values into dps (�/s) we have to divide according to the Full scale value set in FS_SEL I have configured FS_SEL = 0. So I am dividing by 131.0 for more details check GYRO_CONFIG Register ****/ DataStruct->Gx = DataStruct->Gyro_X_RAW / 131.0; DataStruct->Gy = DataStruct->Gyro_Y_RAW / 131.0; DataStruct->Gz = DataStruct->Gyro_Z_RAW / 131.0; } void MPU6050_Read_Temp(I2C_HandleTypeDef *I2Cx, MPU6050_t *DataStruct) { uint8_t Rec_Data[2]; int16_t temp; // Read 2 BYTES of data starting from TEMP_OUT_H_REG register HAL_I2C_Mem_Read(I2Cx, MPU6050_ADDR, TEMP_OUT_H_REG, 1, Rec_Data, 2, i2c_timeout); temp = (int16_t)(Rec_Data[0] << 8 | Rec_Data[1]); DataStruct->Temperature = (float)((int16_t)temp / (float)340.0 + (float)36.53); } void MPU6050_Read_All(I2C_HandleTypeDef *I2Cx, MPU6050_t *DataStruct) { uint8_t Rec_Data[14]; int16_t temp; // Read 14 BYTES of data starting from ACCEL_XOUT_H register HAL_I2C_Mem_Read(I2Cx, MPU6050_ADDR, ACCEL_XOUT_H_REG, 1, Rec_Data, 14, i2c_timeout); DataStruct->Accel_X_RAW = (int16_t)(Rec_Data[0] << 8 | Rec_Data[1]); DataStruct->Accel_Y_RAW = (int16_t)(Rec_Data[2] << 8 | Rec_Data[3]); DataStruct->Accel_Z_RAW = (int16_t)(Rec_Data[4] << 8 | Rec_Data[5]); temp = (int16_t)(Rec_Data[6] << 8 | Rec_Data[7]); DataStruct->Gyro_X_RAW = (int16_t)(Rec_Data[8] << 8 | Rec_Data[9]); DataStruct->Gyro_Y_RAW = (int16_t)(Rec_Data[10] << 8 | Rec_Data[11]); DataStruct->Gyro_Z_RAW = (int16_t)(Rec_Data[12] << 8 | Rec_Data[13]); DataStruct->Ax = DataStruct->Accel_X_RAW / 16384.0; DataStruct->Ay = DataStruct->Accel_Y_RAW / 16384.0; DataStruct->Az = DataStruct->Accel_Z_RAW / Accel_Z_corrector; DataStruct->Temperature = (float)((int16_t)temp / (float)340.0 + (float)36.53); DataStruct->Gx = DataStruct->Gyro_X_RAW / 131.0; DataStruct->Gy = DataStruct->Gyro_Y_RAW / 131.0; DataStruct->Gz = DataStruct->Gyro_Z_RAW / 131.0; // Kalman angle solve double dt = (double)(HAL_GetTick() - timer) / 1000; timer = HAL_GetTick(); double roll; double roll_sqrt = sqrt( DataStruct->Accel_X_RAW * DataStruct->Accel_X_RAW + DataStruct->Accel_Z_RAW * DataStruct->Accel_Z_RAW); if (roll_sqrt != 0.0) { roll = atan(DataStruct->Accel_Y_RAW / roll_sqrt) * RAD_TO_DEG; } else { roll = 0.0; } double pitch = atan2(-DataStruct->Accel_X_RAW, DataStruct->Accel_Z_RAW) * RAD_TO_DEG; if ((pitch < -90 && DataStruct->KalmanAngleY > 90) || (pitch > 90 && DataStruct->KalmanAngleY < -90)) { KalmanY.angle = pitch; DataStruct->KalmanAngleY = pitch; } else { DataStruct->KalmanAngleY = Kalman_getAngle(&KalmanY, pitch, DataStruct->Gy, dt); } if (fabs(DataStruct->KalmanAngleY) > 90) DataStruct->Gx = -DataStruct->Gx; DataStruct->KalmanAngleX = Kalman_getAngle(&KalmanX, roll, DataStruct->Gx, dt); } double Kalman_getAngle(Kalman_t *Kalman, double newAngle, double newRate, double dt) { double rate = newRate - Kalman->bias; Kalman->angle += dt * rate; Kalman->P[0][0] += dt * (dt * Kalman->P[1][1] - Kalman->P[0][1] - Kalman->P[1][0] + Kalman->Q_angle); Kalman->P[0][1] -= dt * Kalman->P[1][1]; Kalman->P[1][0] -= dt * Kalman->P[1][1]; Kalman->P[1][1] += Kalman->Q_bias * dt; double S = Kalman->P[0][0] + Kalman->R_measure; double K[2]; K[0] = Kalman->P[0][0] / S; K[1] = Kalman->P[1][0] / S; double y = newAngle - Kalman->angle; Kalman->angle += K[0] * y; Kalman->bias += K[1] * y; double P00_temp = Kalman->P[0][0]; double P01_temp = Kalman->P[0][1]; Kalman->P[0][0] -= K[0] * P00_temp; Kalman->P[0][1] -= K[0] * P01_temp; Kalman->P[1][0] -= K[1] * P00_temp; Kalman->P[1][1] -= K[1] * P01_temp; return Kalman->angle; }; 可以看到,在设置了 I2C 的地址后,在 MPU6050_Init 函数内初始化,并在其余的函数中操作读取各个数值。 使用 I2C 读取 MPU6050 返回的信息 在 CubeMX 内配置 I2C 总线 在 CubeMX 左侧功能分类栏选择 通信 - I2Cx,将 I2C 的选项设置从 disable 更改为 I2C,并在弹出的配置界面配置参数(默认即可): 在代码内配置 I2C 读取 MPU6050 返回的信息 首先,在 main.c 中调用 MPU6050 的库: main.c /* USER CODE BEGIN Includes */ #include "mpu6050.h" /* USER CODE END Includes */ 接着,实例化对象: main.c /* USER CODE BEGIN PV */ MPU6050_t MPU6050; /* USER CODE END PV */ 在主函数里面初始化,完毕时才继续执行程序: main.c /* USER CODE BEGIN 2 */ while (MPU6050*Init(&hi2c1) == 1); /* USER CODE END 2 */ 在 while 循环内读取库计算出来的变量,并给一定的延时缓冲: main.c /* USER CODE BEGIN 3 */ MPU6050_Read_All(&hi2c1, &MPU6050); HAL_Delay(100); } /* USER CODE END 3 */ 执行了这条语句,就能读出 MPU6050 结构体内的变量,比如MPU6050.KalmanAngleX(X 轴滤波后角度)。MPU6050 结构体的元素及类型如下: typedef struct { int16_t Accel_X_RAW; int16_t Accel_Y_RAW; int16_t Accel_Z_RAW; double Ax; double Ay; double Az; int16_t Gyro_X_RAW; int16_t Gyro_Y_RAW; int16_t Gyro_Z_RAW; double Gx; double Gy; double Gz; float Temperature; double KalmanAngleX; double KalmanAngleY; } MPU6050_t; 可以在配置串口后,通过以下语句输出变量: printf("XAngle: %.2f°\t", MPU6050.KalmanAngleX); 参考与致谢 leech001/MPU6050 通信协议 - I2C 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

HAL 库开发笔记 - TIM 基本定时器

HAL 库开发笔记 - TIM 基本定时器 在 STM32 中,有基本定时器、通用定时器和高级定时器这三类定时器,用于处理各类周期任务。在本篇文章中,我将对基本定时器展开详细介绍。 基本原理 我们常用的定时器分基本、通用和高级定时器三类,在 STM32F4 系列单片机上,其对应关系如下: 基本定时器 TIM6 TIM7 通用定时器 TIM2-TIM5 TIM9-TIM14 高级定时器 TIM1 TIM8 (SysTick 定时器) 通常,我们拿基本定时器当计时器用,拿通用定时器输出 PWM 信号用。 基本定时器的特性 在 STM32F4 系列单片机上,TIM6 和 TIM7 这两个基本定时器的特性如下: 挂载在 APB1 总线上 16 位自动重载递增计数器 16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数介于 1 和 65536 之间 用于触发 DAC 的同步电路 发生计数器上溢更新事件时会生成中断 / DMA 请求 常用的定时器函数参考 HAL_TIM_Base_Init():初始化定时器时基单元 HAL_TIM_Base_DeInit():禁用定时器,与初始化相反 HAL_TIM_Base_MspInit():MSP 初始化函数,定时器初始化时会自动调用 HAL_TIM_Base_MspDeInit():与上一个相反 HAL_TIM_Base_Start():开启定时器 HAL_TIM_Base_Stop():停止定时器 HAL_TIM_Base_Start_IT():以中断模式开启定时器 HAL_TIM_Base_Stop_IT():关闭中断模式的定时器 HAL_TIM_Base_Start_DMA():以 DMA 模式开启定时器 HAL_TIM_Base_Stop_DMA():关闭 DMA 模式的定时器 用基本定时器使 LED 定时闪烁 本次实验是用基本定时器实现计时功能,让 LED 0.5 秒变换一次开关状态。 在 CubeMX 内配置基本定时器 首先,我们打开 Clock Configuratgion 时钟树配置页面,找到并记下最右侧 APB1 Timer clocks 的数值: 这是因为,STM32F4 系列的 TIM2-TIM7,TIM12-TIM14 是挂载在低速 APB1 总线上,而 TIM1,TIM8-TIM11 是挂载在高速 APB2 总线上,我们这里用到基本定时器 TIM6,所以要看 APB1 的速率(这里经过分频倍频后是 90 MHz)。 接着,我们找到侧边栏 Timer 中找到 TIM6,先勾选 Activated 激活定时器,并在下方配置以下的参数: 各参数的含义: Prescaler(预分频系数):8999 Counter Mode(计数模式):Up(从 0 开始向上计数至预分频系数后溢出) Counter Period(计时周期 / 装载值):4999 auto-reload preload(是否自动重装载):Enable(溢出时会自动重装初值) 因为我这里用的时钟源为 90 MHz,因此将预分频系数设置为 8999(也就是 9000 分频),分频后为 10 kHz(90 MHz/9000)。装载值设置为 4999(每周期计数 5000 次),所以得到 500 ms 一个周期。 接着我们在其 NVIC 标签页,对中断进行使能: 在代码内配置基本定时器 在 main.c 中开启定时器: main.c /* USER CODE BEGIN 2 */ HAL_TIM_Base_Start_IT(&htim6); /* USER CODE END 2 */ 在 stm32f4xx_it.c 中添加回调函数: stm32f4xx_it.c /* USER CODE BEGIN 1 */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM6) { HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); } } /* USER CODE END 1 */ 关于 LED 的配置,可以参考前面的文章 HAL 库开发笔记-GPIO。 下载烧录,可以看到 LED 按我们预设的 500 ms 周期切换开关状态(也就是每 500 ms 发生溢出并产生一个上溢事件,我们在回调函数中对 LED 灯进行了翻转操作)。 参考与致谢 STM32CubeMX 实战教程(四)—— 基本定时器(还是点灯) 进阶篇 VI [Timer & PWM] 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

HAL 库开发笔记 - TIM 通用定时器

HAL 库开发笔记 - TIM 通用定时器 在上一篇文章中,简单介绍了 STM32F4 的三类定时器,也详细讲解了基本定时器。在本篇文章中,我们将继续介绍通用定时器。 基本原理 在 STM32F4 中,通用定时器有 TIM2-TIM5,TIM9-TIM14。 通用定时器的特性 在 STM32F4 中,通用定时器的特性如下: 16/32 位递增、递减和递增 / 递减自动重载计数器 16 位可编程预分频器,用于对计数器时钟频率进行分频(分频系数为 1-65536) 4 个独立通道,分别可用于: 输入捕获 输出比较 PWM 生成(边沿和中心对齐模式) 单脉冲模式输出 使用外部信号控制定时器且可实现多个定时器互连的同步电路 发生如下事件时生成中断 / DMA 请求: 更新:计数器上溢 / 下溢、计数器初始化(通过软件或内部 / 外部触发) 触发事件(计数器启动、停止、初始化或通过内部 / 外部触发计数) 输入捕获 输出比较 支持定位用增量(正交)编码器和霍尔传感器电路 外部时钟触发输入或逐周期电流管理 常用的定时器函数参考 以下是常用的定时器函数参考,与基本定时器的函数相同。 HAL_TIM_Base_Init():初始化定时器时基单元 HAL_TIM_Base_DeInit():禁用定时器,与初始化相反 HAL_TIM_Base_MspInit():MSP 初始化函数,定时器初始化时会自动调用 HAL_TIM_Base_MspDeInit():与上一个相反 HAL_TIM_Base_Start():开启定时器 HAL_TIM_Base_Stop():停止定时器 HAL_TIM_Base_Start_IT():以中断模式开启定时器 HAL_TIM_Base_Stop_IT():关闭中断模式的定时器 HAL_TIM_Base_Start_DMA():以 DMA 模式开启定时器 HAL_TIM_Base_Stop_DMA():关闭 DMA 模式的定时器 用通用定时器输出 1 kHz/50% 占空比的 PWM 本次实验使用通用定时器输出 1 kHz,50% 占空比的 PWM 信号,可用示波器显示输出的波形。 在 CubeMX 内配置通用定时器 首先,我们打开 Clock Configuratgion 时钟树配置页面,因通用定时器挂载在挂载在高速 APB2 总线上,所以我们找到并记下 APB2 Timer clocks 的时钟频率(180 MHz): 接着,我们找到侧边栏 Timer 中找到 TIM8,设置通道 1(Channel 1)为 PWM 生成(PWM Generation CH1),为了能生成 1 kHz 频率的 PWM 方波,我们需要在下方配置以下参数: Prescaler(预分频系数):180-1 Counter Mode(计数模式):Up(从 0 开始向上计数至预分频系数后溢出) Counter Period(计时周期 / 装载值):1000-1 auto-reload preload(是否自动重装载):Enable(溢出时会自动重装初值) 因此处选用的时钟源为 180 MHz,因此将预分频系数设置为 180-1 = 179,分频后为 1 MHz,将装载值设置为 1000-1 = 9999,所以得到 1 kHz 的频率。 在代码内配置基本定时器 在 main.c 中开启定时器: main.c /* USER CODE BEGIN 2 */ HAL_TIM_PWM_Start(&htim8,TIM_CHANNEL_1); // 设置占空比为 500(500 Hz/1 kHz=50%) __HAL_TIM_SetCompare(&htim8,TIM_CHANNEL_1,500); /* USER CODE END 2 */ 编译并烧录,用示波器可以看出波形: 参考与致谢 STM32CubeMX 实战教程(五)—— 通用定时器(PWM 输出) 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

HAL 库开发笔记 - USB 通信 🚧

HAL 库开发笔记 - USB 通信 🚧 本篇基于自研 RobotCtrl 开发套件,单片机内核为 STM32F407ZET6,USB_Slave 引脚为 PA11 和 PA12,原理图及详细介绍请见 RobotCtrl - STM32 通用开发套件。 回环测试简单步骤 CubeMX 内配置 配置为外部高速时钟(HSE)。 配置时钟树,确保时钟树末端 48MHz Clocks (MHz) 为 48MHz。 在 USB_OTG_FS 页面,将 Mode 配置为 Device_Only,默认引脚是 PA11 和 PA12。 在 USB_DEVICE 页面,将 Class For FS IP 配置为 Commmunication Device Class (Virtual Port Com)。 代码内配置 实现数据回环功能,只需要在 usbd_cdc_if.c 文件的 CDC_Receive_FS 函数内添加一行: usbd_cdc_if.c CDC_Transmit_FS(Buf,*Len); // 返回相同数据 测试 打开设备管理器查看设备是否已经显示,如果没有发现设备,或有黄色的感叹号,请到 ST 官网下载驱动 STM32 Virtual COM Port Driver。 如果安装了驱动还是未能正常识别,可尝试在 CubeMX - Project Manager - Project - Linker Settings,将 Minimum Heap Size 调整为 0x600 或更高。 打开串口工具(波特率任意),可发现发送任意字符,将返回相同字符。 参考与致谢 STM32 使用 CubeMX HAL 库快速生成 USBVCP 虚拟串口工程 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

HAL 库开发笔记 - 串口通信

HAL 库开发笔记 - 串口通信 本篇基于自研 RobotCtrl 开发套件,单片机内核为 STM32F407ZET6,RS-232 通信使用 SP3232EEN 芯片,原理图及详细介绍请见 RobotCtrl - STM32 通用开发套件。 基本原理 串口通信的基本原理请跳转文章 通信协议-串口通信。 串口通讯实验 在进行下一步实验之前,需要在 CubeMX 里配置串口下载、时钟等各类参数。 HAL 库开发笔记 - 环境配置 中的方法进行配置。 在 CubeMX 内配置串口 根据原理图,我们用来进行通讯实验的串口是 USART1 ,即 PA9 PA10 引脚。那么,我们首先需要在 CubeMX 内将这两个引脚配置为 USART1 的发送和接受功能,然后点击左侧 USART1 标签页,将模式(Mode)设为异步(Asynchronous),并在下方修改波特率(Baud Rate)等参数: 参数详情如下: 波特率设置(Baud Rate):没有哪种波特率最好,根据实际情况进行修改,要与串口调试助手上一致。 数据位数(Word Length):如果使能了奇偶校验,那么实际数据将在该位数上减一。 校验(Parity):可选择奇偶校验或不校验。 停止位(Stop Bits):额外一位或两位用于作为发送或接收完毕信号位。 数据方向(Data Direction):可选择仅发送,仅接收或收发模式。 过采样(Over Sampling):8 倍或 16 倍采样率可以有效防止数据出错。 最后,在 NVIC 标签页使能 USART1 的串口中断,如图: 在代码内配置串口 首先需要在 stm32f4xx_it.c 末尾添加如下代码: stm32f4xx_it.c /* USER CODE BEGIN 1 */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance==USART1) { HAL_UART_Receive_IT(huart, &aRxBuffer, 1); // 接收并写入 aRxBuffer HAL_UART_Transmit(huart, &aRxBuffer, 10, 0xFFFF); // 把接收到的 aRxBuffer 发回去 } } /* USER CODE END 1 */ 其中,Buffer 是在 main.c 中定义的 uint8_t 类型全局变量。这里每接受的一个字节后就产生中断,将该字节数据返回并重新开启中断。我们需要分别在 main.c 和 stm32f4xx_it.c 中定义它: main.c /* Private variables -----------------------------------------------------------*/ /* USER CODE BEGIN PV */ uint8_t aTxBuffer[] = "USART TEST\r\n"; //用于发送的字符串 uint8_t aRxBuffer[20]; //用于接收的字符串 /* USER CODE END PV */ stm32f4xx_it.c /* Private variables -----------------------------------------------------------*/ /* USER CODE BEGIN PV */ extern uint8_t aTxBuffer; extern uint8_t aRxBuffer; /* USER CODE END PV */ 另外,在 main.c 中,我们需要在串口初始化后、主循环前,添加接收中断开启函数: main.c /* USER CODE BEGIN 2 */ HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 1); // 接收中断开启函数 /* USER CODE END 2 */ 也可以发送一条初始化消息,代表串口已启动: main.c /* USER CODE BEGIN 2 */ HAL_UART_Transmit(&huart1, (uint8_t*) aTxBuffer, sizeof(aTxBuffer) - 1, 0xFFFF); // 发上一次自定义的 aTxBuffer /* USER CODE END 2 */ 如果需要对 printf 进行重定向(把 printf 函数用在 STM32 中做串口输出功能),请参考 STM32CubeIDE 串口重定向(printf)及输出浮点型。 下载验证 程序烧录成功后,我们打开串口助手,配置对应的端口和波特率。 连上串口后,会先打印一行 aTxBuffer 的内容,然后将会把接收到的 aRxBuffer 回传打印出来。如图: 参考与致谢 STM32CubeMX 实战教程(六)—— 串口通信 进阶篇 III [UART & USART] STM32 非阻塞 HAL_UART_Receive_IT 解析与实际应用 HAL 库教程 6:串口数据接收 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

HAL 库开发笔记 - 以太网通信(LwIP) 🚧

HAL 库开发笔记 - 以太网通信(LwIP) 🚧 以下是基于 反客 STM32F407 主控核心板 与 DP83848 以太网 PHY 模块 的教程。 硬件 DP83848 接口为 RMII,DP83848 可支持 10M/100M 的线速,板载 50MHz 无源晶振。 STM32 主控 DP83848 模块 ETH_REF_CLK PA1 ETH_MDIO PA2 ETH_MDC PC1 ETH_CRS_DV PA7 ETH_RXD0 PC4 ETH_RXD1 PC5 ETH_TX_EN PB11 ETH_TXD0 PB12 ETH_TXD1 PB13 软件 CubeMX 内配置 RCC:HSE 选择外部晶振 SYS DEBUG:SW GPIO PA15:USER_BTN, Input, Pull-up PC13:LED_GREEN, Output Push Pull, level High PC14:LED_BLUE, Output Push Pull, level High PC15:LED_RED, Output Push Pull, level High ETH Mode:RMII Advanced Parameters PHY:DP83848_PHY_ADDRESS LWIP Key Options 勾选 Show Advanced Parameters 确保 LWIP_NETIF_LINK_CALLBACK 为 Enable(一般默认) xLWIP_LOOPIF_MULTICAST:Enabled xLWIP_MULTICAST_TX_OPTIONS:Enabled xLWIP_NETIF_STATUS_CALLBACK:Enabled xLWIP_NETIF_EXT_STATUS_CALLBACK:Enabled xLWIP_SO_RCVBUF:Enabled Genetal Settings xLWIP_IGMP:Enabled 时钟树配置:按照板载晶振(此板为 8M)配置。 添加功能代码 main.c /* USER CODE BEGIN PV */ extern struct netif gnetif; /* USER CODE END PV */ /* USER CODE BEGIN 0 */ void ethernetif_notify_conn_changed(struct netif *netif) { /* NOTE : This is function could be implemented in user file when the callback is needed, */ if (netif_is_link_up(netif)) { HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_SET); } else { HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_RESET); } } /* USER CODE END 0 */ /* USER CODE BEGIN 2 */ ethernetif_notify_conn_changed(&gnetif); /* USER CODE END 2 */ /* USER CODE BEGIN 3 */ MX_LWIP_Process(); } /* USER CODE END 3 */ lwip.c /* USER CODE BEGIN 4_3 */ ethernetif_set_link(&gnetif); if (netif_is_link_up(&gnetif) && !netif_is_up(&gnetif)) { netif_set_up(&gnetif); dhcp_start(&gnetif); } /* USER CODE END 4_3 */ 调试 查看连接到此电脑的设备 IP:arp -a 通过插拔确定 STM32 的 IP 地址 ping [ip 地址] (-t) 热插拔网线会出现 传输失败,常见故障,稍等即可自动重新建立连接。 参考与致谢 STM32 HAL Ethernet initialization 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。 本篇基于自研 RobotCtrl 开发套件,单片机内核为 STM32F407ZET6,以太网 PHY 芯片为 LAN8720A,原理图及详细介绍请见 [**RobotCtrl - STM32 通用开发套件**](https://wiki-power.com/RobotCtrl-STM32%E9%80%9A%E7%94%A8%E5%BC%80%E5%8F%91%E5%A5%97%E4%BB%B6)。 LwIP 是 轻型(Light Weight)IP 协议,不管有没有操作系统的支持,都可以运行。LwIP 实现的重点是在保持 TCP 协议主要功能的基础上减少对 RAM 的占用,它只需十几 KB 的 RAM 和 40K 左右的 ROM 就可以运行,这使 LwIP 协议栈适合在低端的嵌入式系统中使用。 LwIP 提供了三种编程接口,分别为 RAW/Callback API、NETCONN API、SOCKETAPI。它们的易用性从左到右依次提高,而执行效率从左到右依次降低。可以权衡利弊选择适合自己的 API 进行开发。在本文中,使用 Raw API,调用以下的函数: | API 函数 | 说明 | | -------------- | ---------------------------------------- | | udp_new | 创建新的 UDP PCB | | udp_remove | 移除 UDP PCB 并释放相关资源 | | udp_bind | UDP PCB 与本地 IP 地址和端口绑定 | | udp_connect | 建立 UDP PCB 远程 IP 地址和端口 | | udp_disconnect | 移除 UDP PCB 远程 IP 和端口 | | udp_send | 发送 UDP 数据 | | udp_recv | 注册回调函数,当收到新数据报时即对其调用 | ## CubeMX 内配置 1. 在 `RCC` 页面内为 HSE 选择外部晶振。 2. 在 `ETH` 页面内配置 PHY 模式为`RMII`,并配置以下参数: 1. 在 `Parameter Setting` 标签页下,将 `PHY Address` 配置为 `0`(根据 PHYAD0 管脚配置决定的)。 2. 在 `Advanced Parameter` 标签页下,根据 LAN8720A 的芯片手册,将 `PHY special control/status register Offset` 配置为 `31`; `PHY Speed mask` 配置为 `0x0004`; `PHY Duplex mask` 配置为 `0x0010`。 3. 在 `LWIP` 页面内开启使能,并配置以下参数: 1. 在 `General Settings` 标签页下,将 `LWIP_DHCP (DHCP Module)` 配置为 `Disabled`(使用静态 IP); `IP_ADDRESS` 配置为 `192.168.001.100`; `NETMASK_ADDRESS` 配置为 `255.255.255.000`;`GATEWAY_ADDRESS` 配置为 `192.168.001.001`;`LWIP_UDP (UDP Module)` 和 `LWIP_TCP (TCP Module)` 配置为 `Enabled`。 ## 参考与致谢 - [LwIP TCP/IP stack demonstration for STM32F4x7 microcontrollers (AN3966)](https://www.st.com/en/embedded-software/stsw-stm32070.html) - [Developing applications on STM32Cube with LwIP TCP/IP stack (UM1713)](https://www.st.com/resource/en/user_manual/um1713-developing-applications-on-stm32cube-with-lwip-tcpip-stack-stmicroelectronics.pdf) - [54zorb/stm32-lwip](https://github.com/54zorb/stm32-lwip) > 原文地址:<https://wiki-power.com/> > 本篇文章受 [CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by/4.0/deed.zh) 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

HAL 库开发笔记 - 外部中断

HAL 库开发笔记 - 外部中断 上一篇文章我们提到,用轮询的方法消除按键抖动、检测输入,有可能会消耗过多的系统资源并导致卡机,也有可能会错过检测。这就是为什么我们需要使用中断了。 基本原理 轮询与中断 什么是轮询和中断?以取外卖举个例子,轮询就是每分钟我都要去一趟门口,看看外卖小哥来了没。那么这段时间我做不了别的事情了,就光盯着外卖;但假如外卖小哥在我恰好离开门口的时候送到了,那么就错过了外卖。相反的,中断就是让外卖小哥来的时候打个电话,我搁下手中的活去拿外卖,这样我既能够安心干活,又不怕错过外卖。 外部中断 中断分外部(Interrupt)和内部(Exception)。外部中断由外部外设来打断 MCU,内部中断由内部的软件程序自行打断 MCU. NVIC NVIC 全称为 Nested Vectored Interrupt Controller,翻译过来就是 嵌套向量中断控制器 。它主要有三个参数,分别是:中断使能,抢占优先级,响应优先级。(优先级数值越小,优先级越高) 中断使能:指的就是是否开启中断。如果开启中断,那么当满足中断触发条件的时候,会跳到中断服务程序运行;否则不理会中断服务程序,继续运行主程序。 抢占优先级:用于判断一个中断是否可以打断另一个中断的服务程序,抢先运行。举个例子,条件触发了 A 中断,A 中断的服务程序正在运行中,此时条件触发了 B 中断。此时如果 B 中断的抢占优先级比 A 的高,那么 A 的服务程序就会被打断,先去执行 B 的服务程序,执行完之后再继续执行 A,这也称为中断嵌套。如果 B 的抢占优先级不比 A 高,那还是乖乖先执行完 A,再去执行 B. 响应优先级:如果抢占优先相同的几个中断同时被触发,那么响应优先级高的最先运行。 欲判断中断的优先级,首先要先比较的是抢占优先级。抢占优先级相同的情况下,响应优先高的中断优先级别高。如果两个优先级都一样,那么就要根据中断向量表来确定。 中断回调函数参考 配置了 GPIO 中断和 NVIC 优先级之后,在 stm32f4xx_it.c 文件末尾重写中断回调函数即可实现功能。 /* USER CODE BEGIN 1 */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { } /* USER CODE END 1 */ 外部中断按键控灯 在进行下一步实验之前,需要在 CubeMX 里配置串口下载、时钟等各类参数。 HAL 库开发笔记 - 环境配置 中的方法进行配置。 在 CubeMX 内配置中断 如图,LED 还是按照上一篇文章的方法,配置为输出;按键因为是低电平触发,也就是在按下的一瞬间会产生一个下降沿,所以引脚应该配置为下降沿触发的中断。 在我的板子上,就是将 PI8 配置为 GPIO_EXTI8 模式(外部中断,挂载在中断线 8 上的),并配置为下降沿触发,根据原理图,选择内部上拉(Pull-up)。如图所示: 接着,点击跳转 NVIC 标签页面,使能我们配置的中断: 另外,要把抢占优先级降低一位(从 0 变为 1,原因下文会解释)。 在代码内配置中断 只需要在 stm32f4xx_it.c 末尾添加如下代码: stm32f4xx_it.c /* USER CODE BEGIN 1 */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 0) { HAL_Delay(100); if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 0) { HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin); } } } /* USER CODE END 1 */ 这段代码的作用是重写中断的回调函数,增加用按键切换灯开关的功能。但是这里的 HAL_Delay() 延时函数有坑,因为其来源是 SysTick 定时器(在固定时间间隔内产生中断),所以就有所属的中断优先级。在上面配置 NVIC 的图中可以看出,SysTick 和我们配置的中断抢占优先级都是 0,所以便无法在外部中断触发时接着触发 SysTick 了。所以,我们要把外部中断的抢占优先级改低(由 0 改为 1)。 编译上传后即可通过按下按键,切换 LED 灯的亮灭状态了。 参考与致谢 进阶篇 II [Interrupt] STM32CubeMX 实战教程(三)—— 外部中断(中断及 HAL_Delay 函数避坑) 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

HAL 库开发笔记 - 环境配置

HAL 库开发笔记 - 环境配置 注:本教程基于反客的 STM32F429IGT6 板子。 软件安装 Keil MDK 详见文章 Keil MDK 配置指南 Java Runtime Environment 这是 STM32CubeMX 所需要的 Java 环境,从 官网链接 下载安装即可。 STM32CubeMX 从 官网链接 下载并安装 STM32CubeMX。 项目的配置 初始化 新建项目,选择芯片后先保存。 配置 SYS Pinout & Configurations - System Core - SYS 将 Debug 选项改为 Serial Wire(原因详见文章 CubeMX 与 CubeIDE 避坑) 配置 RCC Pinout & Configurations - System Core - RCC 按照板子的情况设置就行了。 举个例子,参照板子原理图: 将 HSE 和 LSE 的选项都设置为外部晶振就可以了: 配置时钟树 在 Clock Configuration 界面进行配置。 根据上图的步骤如下: 根据板载外部晶振的参数,填入最左侧两个频率的值 勾选 HSE ,因为外部晶振频率和精度都比内部的高 勾选 PLLCLK ,使用 PLL 锁相环倍频得到高频率 填入 HCKL 的值,一般根据下方提示的最大频率填写,填写后按回车,便可自动计算分频倍频数 配置项目管理选项 HAL 库与标准库的区别 为了增加可移植性,HAL 库相比标准库多了 句柄、MSP 函数、Callback 函数 这三个功能,具体可参见文末引用链接中的内容。 参考与致谢 【STM32】系统时钟 RCC 详解 板子初始化,RCC 时钟树完整配置的方式和详细过程 STM32 HAL 的超全知识总结 清晰了,STM32 HAL 的超全知识总结 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

HTML 学习笔记

HTML 学习笔记 基本框架 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>标题</title> </head> <body> </body> </html> 可打开 .html 文件,直接输入 html:5 调出 语句 一些规范: 标签使用小写,元素必须闭合 空元素要加斜杠以闭合 eg. <br /> 不使用语义化,所有样式都存放于 CSS 中,内容与样式分离 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>标题</title> </head> <body> <h1>一级标题</h1> <h2>二级标题</h2> <p>段落</p> <!--换行符--> <br /> <!--分割线--> <hr /> <!--列表,可嵌套--> <!--有序列表--> <ol> <li>第一项</li> <li>第二项</li> </ol> <!--无序列表--> <ul> <li>第一项</li> <li>第二项</li> </ul> <!--链接--> <a href="https://www.google.com/">链接显示的文本</a> <!--链接到页面特定位置,使用 ID 特性--> <a href="#top">回到顶部</a> <p id="top">顶部</p> <!--链接到其他页面的特定位置--> <a href="http://wiki-power.com/#top">跳转到站外页面的某个位置</a> <!--图像--> <img src="/xx.png" alt="无法加载时的文字说明" /> <!--表格--> <table> <!--第一行--> <tr> <!--第一列--> <th></th> <!--第二列--> <th scope="col">周六</th> <!--第三列--> <th scope="col">周日</th> </tr> <!--第二行--> <tr> <th scope="row">数量</th> <td>120</td> <td>135</td> </tr> <!--第三行--> <tr> <th scope="row">收益</th> <!--跨列 colspan,跨行 rowspan--> <td colspan="2">500</td> </tr> </table> <!--表单,待补充--> <!--iframe,待补充--> <!--flash/视频/音频,待补充--> </body> </html> 参考与致谢 HTML 教程 | 菜鸟教程 HTML 30 分钟入门教程 HTML - head 头部浅析 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Hack.init( ) 黑客马拉松

Hack.init( ) 黑客马拉松 —— Wight · 基于云平台的去线缆化照明系统。 项目仓库:linyuxuanlin / Wight 背景 项目制作于 2017 hack.init() 创客马拉松。 20 多个小时的敲代码、建模、调试各种乱七八糟的 bug、等待打印、展示 & 演讲,终于有点成品的样子。 这个项目主要用于乡村偏远地区的路灯照明系统。 模型有点抽象,其实它正扮演的是一杆路灯。 项目创新点 太阳能供电。 自给自足(经查阅详细资料,太阳能发电量足以点亮 LED) 去线缆化。 为偏远山区不方便铺线缆提供便利 智能算法。 检测到夜晚,自动开灯;检测到人或车辆经过,提高 LED 亮度 云平台统一控制。 用的是 GSM 主控,可以批量远程调试 拓展性。 对个别有自定义照明需求的特殊用户提供各种自定义的功能 原理及实现 代码: #define BUTTONS_address "channel/widget4_0/cmd/control" //开关命令 #define LIGHT_STATUS_address "channel/widget4_0/data/light"//开关状态 #define ITENSITY_DATA_address "channel/widget4_0/data/lightsensor" #define LEDPIN1 D1 //定义灯泡控制引脚 #define LEDPIN2 D2 #define LEDPIN3 D3 #define LEDPIN4 D5 #define CHECKIN1 A0 #define CHECKIN2 D4 int autostate = 2; int light_state = 2; void buttons_function(uint8_t *payload, uint32_t len)//自动&浇水按钮 { uint8_t SwitchKey; uint8_t SwitchKey2; aJsonClass aJson; aJsonObject *root = aJson.parse((char *)payload); if(root == NULL) { aJson.deleteItem(root); return; } aJsonObject *_switch = aJson.getObjectItem(root, "mode"); if(_switch != NULL) { SwitchKey = atoi(_switch->valuestring); if(SwitchKey) { SerialUSB.println("auto on"); autostate=1; IntoRobot.publish(LIGHT_STATUS_address,"1"); } else { SerialUSB.println("auto off"); autostate=0; IntoRobot.publish(LIGHT_STATUS_address,"0"); } } aJsonObject *_switch2 = aJson.getObjectItem(root, "manual"); if(_switch2 != NULL) { SwitchKey2 = atoi(_switch2->valuestring); if(SwitchKey2) { SerialUSB.println("manual on"); light_state=1; IntoRobot.publish(LIGHT_STATUS_address,"1"); } else { SerialUSB.println("manual off"); light_state=0; IntoRobot.publish(LIGHT_STATUS_address,"0"); } } else { } aJson.deleteItem(root); } void lightup() { digitalWrite(LEDPIN1, HIGH); // 打开灯泡 digitalWrite(LEDPIN2, HIGH); // 打开灯泡 digitalWrite(LEDPIN3, HIGH); // 打开灯泡 digitalWrite(LEDPIN4, HIGH); // 打开灯泡 } void light_half_up() { analogWrite(LEDPIN1, 80); // 打开灯泡 analogWrite(LEDPIN2, 80); // 打开灯泡 analogWrite(LEDPIN3, 80); // 打开灯泡 analogWrite(LEDPIN4, 80); // 打开灯泡 } void lightdown() { digitalWrite(LEDPIN1, LOW); digitalWrite(LEDPIN2, LOW); digitalWrite(LEDPIN3, LOW); digitalWrite(LEDPIN4, LOW); } int getlight() { int k = analogRead(CHECKIN1); SerialUSB.println(k); return k; } int get_IR_data() { int b = digitalRead(CHECKIN2); SerialUSB.println(b); return b; } void automode() { if(getlight()>=400) { IntoRobot.publish(LIGHT_STATUS_address,"1"); if (get_IR_data()==0) lightup(); else light_half_up(); } else { IntoRobot.publish(LIGHT_STATUS_address,"0"); lightdown(); } } void HUMIDITY_print_function(uint8_t *payload, uint32_t len) { } // IntoRobot.publish(LIGHT_STATUS_address,"1"); // IntoRobot.publish(LIGHT_STATUS_address,"0"); void setup() { pinMode(D4,INPUT); SerialUSB.begin(115200); SerialUSB.println("hello world"); pinMode(LEDPIN1, OUTPUT); //初始化 pinMode(LEDPIN2, OUTPUT); //初始化 pinMode(LEDPIN3, OUTPUT); //初始化 pinMode(LEDPIN4, OUTPUT); //初始化 //设备接收云平台的灯开关命令 IntoRobot.subscribe(BUTTONS_address,NULL,buttons_function); IntoRobot.subscribe(ITENSITY_DATA_address,NULL,HUMIDITY_print_function); } void loop() { int a =map(getlight() ,0,1024,100,0); IntoRobot.publish(LIGHT,a); SerialUSB.println(getlight()); if(autostate==0) { if(light_state ==1) lightup(); else lightdown(); } else if (autostate==1) { SerialUSB.println("state=1"); automode(); } delay(100); } 因比赛时间所限,只能粗略画出模型,打印出来组装。 FAQ Q:项目后期还有跟进吗? 总结 我们在这次比赛中并没有获奖。不过,比赛锻炼了赶代码和路演的能力,也让我提前体验了加班上线的感受,也认识了很多人,收获了好多纪念品。 参考与致谢 团队成员:林沛杰,黄岳峰,张梓宜 IntoRobot 云平台 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Homelab - 云端音乐服务器 Navidrome

Homelab - 云端音乐服务器 Navidrome Navidrome 是一个开源的基于 web 的音乐服务器和流媒体,你可以储存自己的音乐,并在多个客户端上收听。 部署(Docker Compose) 首先创建 compose.yaml 文件,并粘贴以下内容: compose.yaml version: "3" services: navidrome: container_name: ${STACK_NAME}_app image: deluan/navidrome:${APP_VERSION} user: 1000:1000 # 如果出现权限问题,可尝试使用root(0:0)部署 ports: - "${APP_PORT}:4533" environment: # Optional: put your config options customization here. Examples: ND_SCANSCHEDULE: 24h ND_LOGLEVEL: info ND_SESSIONTIMEOUT: 24h ND_BASEURL: "" volumes: - ${STACK_DIR}:/data - ${DATA_DIR}:/music:ro restart: unless-stopped (可选)推荐在 compose.yaml 同级目录下创建 .env 文件,并自定义你的环境变量。如果不想使用环境变量的方式,也可以直接在 compose.yaml 内自定义你的参数(比如把 ${STACK_NAME} 替换为 navidrome)。 .env STACK_NAME=navidrome STACK_DIR=xxx # 自定义项目储存路径,例如 ./navidrome DATA_DIR=xxx # 自定义播客储存路径,例如 ./music # navidrome APP_VERSION=latest APP_PORT=xxxx # 自定义访问端口,选择不被占用的即可 如果你有个 NAS,也可以通过 NFS 协议挂载 NAS 上的储存空间,把音乐储存在 NAS 上以节省服务器空间,详情请参考 Linux 下挂载群晖 NAS 硬盘拓展空间(NFS)。 最后,在 compose.yaml 同级目录下执行 docker compose up -d 命令即可启动编排的容器。 配置说明 移动端 App 有很多种选择,Android 上我自用体验最佳的是 substreamer,更多 App 可以参考官方列表 Apps。 参考与致谢 官网 文档 GitHub repo Docker Hub Demo site(用户名密码均为 demo) 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Homelab - 免费的内网穿透替代方案 Cloudflared

Homelab - 免费的内网穿透替代方案 Cloudflared Cloudflared 是一个免费的内网穿透方案,用于外网访问无公网 IP 的主机。 必需条件: 虽然 Cloudflared 是免费的,但需要绑定 VISA/PayPal。 域名 NameServer 需要指向 Cloudflare 需要启用 Cloudflare CDN(国内访问速度偏慢) 优点: 不需要公网 IP 的服务器 不需要防火墙、反向代理 不需要备案就可以使用 80 和 443 端口 不需要自行申请 SSL 证书 免费 缺点: 国内访问速度慢 相对依赖 Cloudflare 平台 部署(Docker Compose) 首先创建 compose.yaml 文件,并粘贴以下内容: compose.yaml version: "3" services: cloudflared: container_name: ${STACK_NAME}_app image: cloudflare/cloudflared:${APP_VERSION} network_mode: host restart: unless-stopped command: tunnel run environment: - TUNNEL_TOKEN=${APP_TUNNEL_TOKEN} (可选)推荐在 compose.yaml 同级目录下创建 .env 文件,并自定义你的环境变量。如果不想使用环境变量的方式,也可以直接在 compose.yaml 内自定义你的参数(比如把 ${STACK_NAME} 替换为 cloudflared)。 .env STACK_NAME=cloudflared # cloudflared APP_VERSION=latest APP_TUNNEL_TOKEN=xxx # 替换为你的 token 最后,在 compose.yaml 同级目录下执行 docker compose up -d 命令即可启动编排的容器。 配置说明 访问 Cloudflare Zero Trust 面板,在左侧栏选择 Access - Tunnels,点击 Create a tunnel 创建隧道,填写隧道名称(用于区分不同的物理机器)然后保存。记录下 token 后填写在 compose.yaml 中。 随后点进你创建的隧道,在 Public Hostname Page 选项卡中添加代理的端口。举个例子,我绑定在 Cloudflare 的域名是 wiki-power.com,我需要代理的服务本地的端口是 80、HTTP 协议,那么我只需要这样填写: 即可通过 https://dashboard.wiki-power.com 访问本地的端口。并且,它会帮你自动申请 SSL 证书,直接在公网通过 https 访问。 参考与致谢 官网 / 文档 GitHub repo Docker Hub 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Homelab - 内网穿透工具 frp

Homelab - 内网穿透工具 frp frp 是一种内网穿透的方法。你可以通过有公网 IP 的服务器,将内网主机端口暴露到互联网。frp 支持 TCP、UDP、HTTP、HTTPS 等多种协议多种协议。 服务端 frps 部署(Docker Compose) 首先创建 compose.yaml 文件,并粘贴以下内容: compose.yaml version: "3" services: frps: container_name: ${STACK_NAME}_app image: fatedier/frps:${APP_VERSION} network_mode: host volumes: - ${STACK_DIR}/frps.toml:/etc/frp/frps.toml command: "-c /etc/frp/frps.toml" restart: always (可选)推荐在 compose.yaml 同级目录下创建 .env 文件,并自定义你的环境变量。如果不想使用环境变量的方式,也可以直接在 compose.yaml 内自定义你的参数(比如把 ${STACK_NAME} 替换为 frps)。 .env STACK_NAME=frps STACK_DIR=/DATA/AppData/frps # 自定义项目储存路径,例如 ./frps # frps APP_VERSION=v0.56.0 在你的项目储存路径 ${STACK_DIR} 中添加配置文件 frps.ini: frpc.toml bindAddr = "0.0.0.0" bindPort = 7000 # 服务器开放的 frp 端口,需要与之后 frpc 的设置保持一致 kcpBindPort = 7000 transport.maxPoolCount = 5 webServer.addr = "0.0.0.0" # 面板的地址,如果要外网访问必须是 0.0.0.0 webServer.port = 7500 # frps 面板的端口 webServer.user = "xxxxxx" # 面板的用户名 webServer.password = "xxxxxx" # 密码 auth.method = "token" auth.token = "xxxxxx" # 自定义 token,需要与 frpc 的保持一致 allowPorts = [ { start = 2000, end = 3000 }, { single = 3001 }, { single = 3003 }, { start = 4000, end = 50000 } ] 最后,在 compose.yaml 同级目录下执行 docker compose up -d 命令即可启动编排的容器。 如果你不用 docker 的方法,也可以参考这篇文章:服务端配置·如何实现外网 RDP 远控(frp)。 客户端 frpc 部署(Docker Compose) 首先创建 compose.yaml 文件,并粘贴以下内容: compose.yaml version: "3" services: frpc: container_name: ${STACK_NAME}_app image: fatedier/frpc:${APP_VERSION} network_mode: host volumes: - ${STACK_DIR}/frpc.toml:/etc/frp/frpc.toml command: "-c /etc/frp/frpc.toml" restart: always (可选)推荐在 compose.yaml 同级目录下创建 .env 文件,并自定义你的环境变量。如果不想使用环境变量的方式,也可以直接在 compose.yaml 内自定义你的参数(比如把 ${STACK_NAME} 替换为 frpc)。 .env STACK_NAME=frpc STACK_DIR=/DATA/AppData/frpc # 自定义项目储存路径,例如 ./frpc # frpc APP_VERSION=v0.56.0 在你的项目储存路径 ${STACK_DIR} 中添加配置文件 frps.toml: frpc.toml user = "client-device-1" # 当前设备名 serverAddr = xx.xx.xx.xx # 服务器的公网 IP serverPort = 7000 # 服务器开放的 frp 端口,需要与 frps 的设置保持一致 auth.method = "token" auth.token = "xxxxxx" # 需要与 frps 的设置保持一致 transport.poolCount = 5 [[proxies]] name = "app-name" # 应用名称 type = "tcp" remotePort = xx # 公网访问的端口号 localIP = "127.0.0.1" localPort = xx # 内网的端口号 最后,在 compose.yaml 同级目录下执行 docker compose up -d 命令即可启动编排的容器。 配置说明 请务必确保 toml 文件的格式正确,否则无法正常启动服务。可以用 Toml 在线编辑校验器检查。 参考与致谢 GitHub repo · fatedier/frp GitHub repo · snowdreamtech/frps GitHub repo · stilleshan/frpc Docker Hub · snowdreamtech/frps Docker Hub · stilleshan/frpc 如何实现外网 RDP 远控(frp) 使用 frp 访问群晖 NAS 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Homelab - 功能丰富的看板软件 WeKan

Homelab - 功能丰富的看板软件 WeKan WeKan 是一款灵活、易用且高效的开源看板软件,它可以帮助团队协作管理任务、项目和工作流程。它提供了一个简单而强大的用户界面,用户可以轻松创建多个看板,为每个看板添加列表和卡片,并将任务分配给不同的成员,从而更好地管理项目并跟踪进度。 部署(Docker Compose) 首先创建 compose.yaml 文件,并粘贴以下内容: compose.yaml version: "2" services: wekandb: container_name: ${STACK_NAME}_db image: mongo:${DB_VERSION} command: mongod --logpath /dev/null --oplogSize 128 --quiet networks: - wekan-tier expose: - 27017 volumes: - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro - wekan-db:/data/db - wekan-db-dump:/dump restart: no wekan: container_name: ${STACK_NAME}_app image: quay.io/wekan/wekan:${APP_VERSION} user: 0:0 networks: - wekan-tier ports: - ${APP_PORT}:8080 environment: - WRITABLE_PATH=/data - MONGO_URL=mongodb://wekandb:27017/wekan - ROOT_URL=http://localhost - MAIL_URL=smtp://<mail_url>:25/?ignoreTLS=true&tls={rejectUnauthorized:false} - MAIL_FROM=Wekan Notifications <noreply.wekan@mydomain.com> - WITH_API=true - RICHER_CARD_COMMENT_EDITOR=false - CARD_OPENED_WEBHOOK_ENABLED=false depends_on: - wekandb volumes: - /etc/localtime:/etc/localtime:ro - wekan-files:/data:rw restart: no volumes: wekan-files: driver: local driver_opts: type: none device: ${STACK_DIR}/wekan-files o: bind wekan-db: driver: local driver_opts: type: none device: ${STACK_DIR}/wekan-db o: bind wekan-db-dump: driver: local driver_opts: type: none device: ${STACK_DIR}/wekan-db-dump o: bind networks: wekan-tier: driver: bridge (可选)推荐在 compose.yaml 同级目录下创建 .env 文件,并自定义你的环境变量。如果不想使用环境变量的方式,也可以直接在 compose.yaml 内自定义你的参数(比如把 ${STACK_NAME} 替换为 wekan)。 .env STACK_NAME=wekan STACK_DIR=xxx # 自定义项目储存路径,例如 ./wekan # wekandb DB_VERSION=6 # wekan APP_VERSION=latest APP_PORT=xxxx # 自定义访问端口,选择不被占用的即可 接着我们初始化目录结构。切换到我们自定义的 STACK_DIR 下(例如 ./wekan),执行命令创建文件夹: mkdir -vp {wekan-files,wekan-db,wekan-db-dump} 最后,在 compose.yaml 同级目录下执行 docker compose up -d 命令即可启动编排的容器。 配置说明 上文的 compose.yaml 经过了简化与修改,如需查看完整版本请参考 wekan/compose.yaml。 部署完成后,首次注册的账户为管理员账户。如果是自己使用,建议在设置面板中关闭用户注册功能。 参考与致谢 官网 文档 GitHub repo Docker Hub Demo site 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Homelab - 功能强大的 wiki 系统 Wiki.js

Homelab - 功能强大的 wiki 系统 Wiki.js Wiki.js 是一个带后台编辑器和管理页面的 wiki 文档工具,包括多用户权限管理、Markdown、多种同步与储存方式(比如 git 同步)等功能。 部署(Docker Compose) 首先创建 compose.yaml 文件,并粘贴以下内容: compose.yaml version: "3" services: wikijs: container_name: ${STACK_NAME}_app image: ghcr.io/requarks/wiki:${APP_VERSION} depends_on: - db environment: DB_TYPE: ${APP_DB_TYPE} DB_HOST: ${APP_DB_HOST} DB_PORT: ${APP_DB_PORT} DB_USER: ${APP_DB_USER} DB_PASS: ${APP_DB_PASS} DB_NAME: ${APP_DB_NAME} restart: unless-stopped ports: - "${APP_PORT}:3000" db: container_name: ${STACK_NAME}_db image: postgres:${DB_VERSION} environment: POSTGRES_DB: ${DB_POSTGRES_DB} POSTGRES_PASSWORD: ${DB_POSTGRES_PASSWORD} POSTGRES_USER: ${DB_POSTGRES_USER} logging: driver: "none" volumes: - ${STACK_DIR}/postgres/db-data:/var/lib/postgresql/data restart: unless-stopped volumes: db-data: (可选)推荐在 compose.yaml 同级目录下创建 .env 文件,并自定义你的环境变量。如果不想使用环境变量的方式,也可以直接在 compose.yaml 内自定义你的参数(比如把 ${STACK_NAME} 替换为 wikijs)。 .env STACK_NAME=wikijs STACK_DIR=xxx # 自定义项目储存路径,例如 ./wikijs # wikijs APP_VERSION=2 APP_PORT=xxxx # 自定义访问端口,选择不被占用的即可 APP_DB_TYPE=postgres APP_DB_HOST=db APP_DB_PORT=5432 # 默认数据库的内部端口 APP_DB_USER=xxx # 数据库用户名 APP_DB_PASS=xxx # 数据库密码 APP_DB_NAME=wikijs # 数据库名称 # db DB_VERSION=10-alpine DB_POSTGRES_DB=wikijs # 数据库名称,与上方保持相同 DB_POSTGRES_PASSWORD=xxx # 数据库密码,与上方保持相同 DB_POSTGRES_USER=xxx # 数据库用户名,与上方保持相同 最后,在 compose.yaml 同级目录下执行 docker compose up -d 命令即可启动编排的容器。 配置说明 配置 git 仓库同步的详细教程:https://docs.requarks.io/storage/git 参考与致谢 官网 文档 GitHub repo Docker Hub 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Homelab - 卡片辅助记忆软件 Anki

Homelab - 卡片辅助记忆软件 Anki Anki 一款开源的记忆卡片应用程序,可帮助用户轻松高效地记忆各种知识点,一般常用于背单词。它的特点在于采用记忆遗忘曲线,根据学习情况生成适当的复习计划,帮助用户充分利用大脑的记忆规律,达到最佳的记忆效果。Anki 具有极高的定制性,你可以制作自己的学习卡片,包括文字、图片甚至音频和视频。Anki 也支持多平台使用。 由于同步服务器在国外,有时候可能会无法正常同步,我们可以使用 anki-sync-server 自己搭建同步服务。以下教程使用的是 johngong/anki-sync-server 镜像,可正常使用,其他版本未经测试。 部署(Docker Compose) 首先创建 compose.yaml 文件,并粘贴以下内容: compose.yaml version: "3" services: anki-sync-server: container_name: ${STACK_NAME}_app image: johngong/anki-sync-server:${APP_VERSION} ports: - "${APP_PORT}:27701" volumes: - ${STACK_DIR}:/config environment: - ANKI_SYNC_SERVER_USER=${APP_USERNAME} - ANKI_SYNC_SERVER_PASSWORD=${APP_PASSWORD} - UID=1000 - GID=1000 restart: unless-stopped (可选)推荐在 compose.yaml 同级目录下创建 .env 文件,并自定义你的环境变量。如果不想使用环境变量的方式,也可以直接在 compose.yaml 内自定义你的参数(比如把 ${STACK_NAME} 替换为 anki-sync-server)。 .env STACK_NAME=anki-sync-server STACK_DIR=/DATA/AppData/anki-sync-server # 自定义项目储存路径,例如 ./anki-sync-server # anki-sync-server APP_VERSION=latest APP_PORT=xxxx # 自定义访问端口,选择不被占用的即可 APP_USERNAME=xxx@xx.com # 自定义账户名,需要邮箱格式 APP_PASSWORD=xxxxxx # 自定义密码 最后,在 compose.yaml 同级目录下执行 docker compose up -d 命令即可启动编排的容器。 配置说明 Windows Windows 端我使用的是 Anki 2.1.28(测试过 2.1.65 无法同步)。 安装完成后,依次点击顶栏的 工具 - 附加组件,然后点击 获取插件,输入插件代码 358444159 后点击 OK,随后点击 设置,将地址改为你部署 anki-sync-server 的服务器的地址与端口,最后重启软件。 重启后,在主界面点击同步,输入 docker 部署时填写的邮箱和密码,即可进行同步。 如果仍然无法同步,请参考 Setting up Anki。 Android Android 端使用的是 AnkiDroid,不用安装插件即可自定义服务器地址,但是需要使用 https 登录。推荐通过反向代理使用(反向代理服务器的搭建可参考文章 Homelab - 反代证书管理面板 Nginx Proxy Manager。 可使用 https 登录后,在主界面选择 Advanced - Custom sync server 可配置自定义服务器。注意,在 Media sync url 一栏中,需要在原地址后加上 /msync,才可正常进行同步。 参考与致谢 官网 文档 GitHub repo Docker Hub 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Homelab - 反代证书管理面板 Nginx Proxy Manager

Homelab - 反代证书管理面板 Nginx Proxy Manager Nginx Proxy Manager 是一个 Nginx 图形化面板,能让用户在 Web 界面上轻松配置反向代理、申请网站 SSL 证书,而无需了解过多 Nginx / Letsencrypt 的底层原理。 部署(Docker Compose) 首先创建 compose.yaml 文件,并粘贴以下内容: compose.yaml version: "3" services: nginx-proxy-manager: container_name: ${STACK_NAME}_app image: "jc21/nginx-proxy-manager:${APP_VERSION}" ports: - "${APP_PORT}:81" # 面板地址 - "80:80" - "443:443" volumes: - ${STACK_DIR}/data:/data - ${STACK_DIR}/letsencrypt:/etc/letsencrypt restart: unless-stopped (可选)推荐在 compose.yaml 同级目录下创建 .env 文件,并自定义你的环境变量。如果不想使用环境变量的方式,也可以直接在 compose.yaml 内自定义你的参数(比如把 ${STACK_NAME} 替换为 nginx-proxy-manager)。 .env STACK_NAME=nginx-proxy-manager STACK_DIR=xxx # 自定义项目储存路径,例如 ./nginx-proxy-manager # nginx-proxy-manager APP_VERSION=latest APP_PORT=81 # 默认为 81,更改请参考文档 最后,在 compose.yaml 同级目录下执行 docker compose up -d 命令即可启动编排的容器。 配置说明 初始账户密码: Email: admin@example.com Password: changeme 获取 Docker 的 IP 地址: ip addr show docker0 注:自托管服务尽量通过反代,绑定二级域名访问(80/443 端口),并在公网服务器管理控制台防火墙中关闭其他端口,这样可以提高安全性。 参考与致谢 官网 文档 GitHub repo Docker Hub 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Homelab - 在线代码编辑器 code-server

Homelab - 在线代码编辑器 code-server code-server 是一个能在浏览器中运行的 VS Code。相比于桌面端的优势是,你可以用任意设备在线码字,包括手机与平板这一类无法直接安装 VS Code 的设备。 部署(Docker Compose) 首先创建 compose.yaml 文件,并粘贴以下内容: compose.yaml version: "2.1" services: code-server: container_name: ${STACK_NAME}_app image: ghcr.io/linuxserver/code-server:${APP_VERSION} ports: - ${APP_PORT}:8443 volumes: - ${STACK_DIR}/config:/config - ${DATA_DIR_LOCAL}:/DATA environment: # 需要以 root 权限运行,否则无法读取其他 docker 目录或宿主机 root 目录 - PUID=0 - PGID=0 - TZ=Asia/Shanghai - PASSWORD=${APP_PASSWORD} #optional - SUDO_PASSWORD=${APP_SUDO_PASSWORD} #optional #- SUDO_PASSWORD_HASH= #optional #- PROXY_DOMAIN=code.wiki-power.com #optional #- DOCKER_MODS=linuxserver/mods:code-server-python3 #可选,如果你想添加一个 python 环境 restart: unless-stopped (可选)推荐在 compose.yaml 同级目录下创建 .env 文件,并自定义你的环境变量。如果不想使用环境变量的方式,也可以直接在 compose.yaml 内自定义你的参数(比如把 ${STACK_NAME} 替换为 code-server)。 .env STACK_NAME=code-server STACK_DIR=xxx # 自定义项目储存路径,例如 ./code-server DATA_DIR_LOCAL=xxx # 自定义挂载本地目录,例如 /DATA # code-server APP_VERSION=latest APP_PORT=xxxx # 自定义访问端口,选择不被占用的即可 APP_PASSWORD=xxx # 登录密码 APP_SUDO_PASSWORD=xxx # 超级用户权限密码 最后,在 compose.yaml 同级目录下执行 docker compose up -d 命令即可启动编排的容器。 配置说明 配置 git 安装完成后,如果需要使用 Git,对用户名和邮箱初始化配置,请参考文章 Git 学习笔记。 读写权限问题 如果在操作文件时遇到 Error: EACCES: permission denied 错误,可以打开终端,输入以下命令赋予当前用户所有权: sudo chown -R 用户名 文件夹路径 例如,以下是给 abc 用户赋予当前目录的所有权的操作: sudo chown -R abc . 设置 root 账户密码 如果需要用到 root 账户,可以使用以下命令初始化其密码: sudo passwd root 参考与致谢 官网 文档 / GitHub repo Docker Hub 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Homelab - 多功能 PDF 工具箱 Stirling-PDF

Homelab - 多功能 PDF 工具箱 Stirling-PDF Stirling-PDF 是一个自托管 PDF 工具包,功能包括 PDF 的分割、合并、旋转、提取页面、图像互转、重新排序、添加 / 提取图像、添加删除密码、设置权限、添加水印、将其他文件转换为 PDF、OCR 文字识别、元数据编辑,支持暗黑模式。 部署(Docker Compose) 首先创建 compose.yaml 文件,并粘贴以下内容: compose.yaml version: "3.3" services: s-pdf: container_name: ${STACK_NAME}_app image: frooodle/s-pdf:${APP_VERSION} ports: - ${APP_PORT}:8080 restart: always (可选)推荐在 compose.yaml 同级目录下创建 .env 文件,并自定义你的环境变量。如果不想使用环境变量的方式,也可以直接在 compose.yaml 内自定义你的参数(比如把 ${STACK_NAME} 替换为 s-pdf)。 .env STACK_NAME=s-pdf STACK_DIR=xxx # 自定义项目储存路径,例如 ./s-pdf # s-pdf APP_VERSION=latest APP_PORT=xxxx # 自定义访问端口,选择不被占用的即可 最后,在 compose.yaml 同级目录下执行 docker compose up -d 命令即可启动编排的容器。 参考与致谢 文档 / GitHub repo Docker Hub 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Homelab - 容器应用管理平台 Portainer

Homelab - 容器应用管理平台 Portainer Portainer 是一个容器应用(包括 Docker / Docker compose / Swarm / Kubernetes)的图形化管理工具,可通过 web 界面管理 Docker 环境。它也提供了许多功能如日志查看、容器启动和停止、镜像管理、网络、卷管理等。 部署(Docker Compose) 首先创建 compose.yaml 文件,并粘贴以下内容: compose.yaml version: "3.3" services: portainer: container_name: ${STACK_NAME}_app image: portainer/portainer-ce:${APP_VERSION} ports: - ${APP_PORT_HTTP}:9000 # HTTP # - ${APP_PORT_HTTPS}:9443 # HTTPS(可选) volumes: - /var/run/docker.sock:/var/run/docker.sock - ${STACK_DIR}/portainer_data:/data restart: always (可选)推荐在 compose.yaml 同级目录下创建 .env 文件,并自定义你的环境变量。如果不想使用环境变量的方式,也可以直接在 compose.yaml 内自定义你的参数(比如把 ${STACK_NAME} 替换为 portainer)。 .env STACK_NAME=portainer STACK_DIR=xxx # 自定义项目储存路径,例如 ./portainer # portainer APP_VERSION=latest APP_PORT=xxxx # 自定义访问端口,选择不被占用的即可 最后,在 compose.yaml 同级目录下执行 docker compose up -d 命令即可启动编排的容器。 配置说明 需注意社区版的镜像是 portainer/portainer-ce,与商业版(portainer-be)区分开。 参考与致谢 官网 文档 GitHub repo Docker Hub 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Homelab - 开源的远程桌面方案 RustDesk

Homelab - 开源的远程桌面方案 RustDesk RustDesk 是一套开源的远程桌面方案,在内网可直接使用各平台的客户端进行远程,本文章主要讲解公网下如何搭建自己的服务器。 部署(Docker Compose) 首先创建 compose.yaml 文件,并粘贴以下内容: compose.yaml version: "3" networks: rustdesk-net: external: false services: hbbs: container_name: ${STACK_NAME}_hbbs ports: - 21115:21115 - 21116:21116 - 21116:21116/udp - 21118:21118 image: rustdesk/rustdesk-server:${APP_VERSION} command: hbbs -r ${STACK_DOMAIN}:21117 -k _ volumes: - ${STACK_DIR}/data:/root networks: - rustdesk-net depends_on: - hbbr restart: unless-stopped hbbr: container_name: ${STACK_NAME}_hbbr ports: - 21117:21117 - 21119:21119 image: rustdesk/rustdesk-server:${APP_VERSION} command: hbbr -k _ volumes: - ${STACK_DIR}/data:/root networks: - rustdesk-net restart: unless-stopped 在这个 docker compose 中,编排了两个服务: hbbs: RustDesk ID 注册服务器 hbbr: RustDesk 中继服务器 (可选)推荐在 compose.yaml 同级目录下创建 .env 文件,并自定义你的环境变量。如果不想使用环境变量的方式,也可以直接在 compose.yaml 内自定义你的参数(比如把 ${STACK_NAME} 替换为 rustdesk-server)。 .env STACK_NAME=rustdesk-server STACK_DIR=xxx # 自定义项目储存路径,例如 ./rustdesk-server STACK_DOMAIN=xxx # 部署 RustDesk 服务器的域名或 IP # rustdesk-server APP_VERSION=latest 最后,在 compose.yaml 同级目录下执行 docker compose up -d 命令即可启动编排的容器。 配置说明 如果遇到错误 Registered email required (-m option). Please pay and register on https://rustdesk.com/server...,说明可能下载的不是最新版本的包,解决方法如下: 在 https://hub.docker.com/r/rustdesk/rustdesk-server/tags 上找到最新版本的 DIGEST 编号(比如 83e259792b50)。 在本地使用命令 docker image pull rustdesk/rustdesk-server:latest@sha256:83e259792b50 下载最新的包,注意把最后的字符替换为你自己的。 参考与致谢 官网 文档 GitHub repo Docker Hub 使用 docker 自建 rustdesk 服务器 self-host 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Homelab - 影视媒体服务器 Jellyfin

Homelab - 影视媒体服务器 Jellyfin Jellyfin 是一个开源的流媒体影视服务器,可以用于管理电影、电视节目等,并在不同设备上浏览观看。它可作为闭源软件 Emby 和 Plex 的替代。 部署(Docker Compose) 首先创建 compose.yaml 文件,并粘贴以下内容: compose.yaml version: "3.5" services: jellyfin: container_name: ${STACK_NAME}_app image: jellyfin/jellyfin:${APP_VERSION} #user: uid:gid #network_mode: 'host' ports: - ${APP_PORT}:8096 volumes: - ${STACK_DIR}/config:/config - ${STACK_DIR}/cache:/cache - ${DATA_DIR}:/media restart: "unless-stopped" # Optional - alternative address used for autodiscovery #environment: # - JELLYFIN_PublishedServerUrl=http://example.com # Optional - may be necessary for docker healthcheck to pass if running in host network mode #extra_hosts: # - "host.docker.internal:host-gateway" (可选)推荐在 compose.yaml 同级目录下创建 .env 文件,并自定义你的环境变量。如果不想使用环境变量的方式,也可以直接在 compose.yaml 内自定义你的参数(比如把 ${STACK_NAME} 替换为 jellyfin)。 .env STACK_NAME=jellyfin STACK_DIR=xxx # 自定义项目储存路径,例如 ./jellyfin DATA_DIR=xxx # 自定义播客储存路径,例如 ./video # jellyfin APP_VERSION=latest APP_PORT=xxxx # 自定义访问端口,选择不被占用的即可 如果你有个 NAS,也可以通过 NFS 协议挂载 NAS 上的储存空间,把音乐储存在 NAS 上以节省服务器空间,详情请参考 Linux 下挂载群晖 NAS 硬盘拓展空间(NFS)。 最后,在 compose.yaml 同级目录下执行 docker compose up -d 命令即可启动编排的容器。 配置说明 移动端 App 可选官方的 Jellyfin App。 参考与致谢 官网 文档 GitHub repo Docker Hub Demo site 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Homelab - 播客与有声书服务器 Audiobookshelf

Homelab - 播客与有声书服务器 Audiobookshelf Audiobookshelf 是一款自托管的播客与有声书服务器,可以方便地搜索播客、自动检测更新并下载播客、自动归档整理。 部署(Docker Compose) 首先创建 compose.yaml 文件,并粘贴以下内容: compose.yaml version: "3.7" services: audiobookshelf: container_name: ${STACK_NAME}_app image: ghcr.io/advplyr/audiobookshelf:${APP_VERSION} ports: - ${APP_PORT}:80 volumes: - ${STACK_DIR}/audiobooks:/audiobooks - ${STACK_DIR}/config:/config - ${STACK_DIR}/metadata:/metadata - ${DATA_DIR}:/podcasts restart: unless-stopped (可选)推荐在 compose.yaml 同级目录下创建 .env 文件,并自定义你的环境变量。如果不想使用环境变量的方式,也可以直接在 compose.yaml 内自定义你的参数(比如把 ${STACK_NAME} 替换为 audiobookshelf)。 .env STACK_NAME=audiobookshelf STACK_DIR=xxx # 自定义项目储存路径,例如 ./audiobookshelf DATA_DIR=xxx # 自定义播客储存路径,例如 ./podcast # audiobookshelf APP_VERSION=latest APP_PORT=xxxx # 自定义访问端口,选择不被占用的即可 如果你有个 NAS,也可以通过 NFS 协议挂载 NAS 上的储存空间,把播客储存在 NAS 上以节省服务器空间,详情请参考 Linux 下挂载群晖 NAS 硬盘拓展空间(NFS)。 最后,在 compose.yaml 同级目录下执行 docker compose up -d 命令即可启动编排的容器。 配置说明 移动端 App:在 iOS 与 Android 端都有官方的 App,可直接使用。 参考与致谢 官网 文档 GitHub repo Docker Hub 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Homelab - 支持公有云的图床系统 Cloudreve

Homelab - 支持公有云的图床系统 Cloudreve Cloudreve 是一个支持多家云存储驱动的公有云文件系统,支持用本地、从机、七牛、阿里云 OSS、腾讯云 COS、又拍云、OneDrive、S3 兼容协议作为储存端,可对接 Aria2 离线下载,多用户,拖拽上传 / 管理,在线预览 / 编辑,WebDAV 等。典型的使用场景是个人图床或网盘文件管理。 部署(Docker Compose) 我们首先需要创建目录结构。切换到存放 Cloudreve 的目录下(例如 /DATA/AppData/cloudreve)并执行: mkdir -vp cloudreve/{uploads,avatar,data} \ && touch cloudreve/conf.ini \ && touch cloudreve/cloudreve.db \ && mkdir -p aria2/config \ && mkdir -p cloudreve/data/aria2 \ && chmod -R 777 cloudreve/data/aria2 \ && mkdir data 首先创建 compose.yaml 文件,并粘贴以下内容: compose.yaml version: "3.8" services: cloudreve: container_name: ${STACK_NAME}_app image: cloudreve/cloudreve:${APP_VERSION} ports: - "${APP_PORT}:5212" volumes: - temp_data:/data - ${STACK_DIR}/cloudreve/uploads:/cloudreve/uploads - ${STACK_DIR}/cloudreve/conf.ini:/cloudreve/conf.ini - ${STACK_DIR}/cloudreve/cloudreve.db:/cloudreve/cloudreve.db - ${STACK_DIR}/cloudreve/avatar:/cloudreve/avatar restart: unless-stopped depends_on: - aria2 aria2: container_name: ${STACK_NAME}_aria2 image: p3terx/aria2-pro:${ARIA2_VERSION} volumes: - ${STACK_DIR}/aria2/config:/config - ${STACK_DIR}/data:/var/lib/docker/volumes/cloudreve_temp_data/_data environment: - RPC_SECRET=${ARIA2_RPC_SECRET} - RPC_PORT=${ARIA2_RPC_PORT} restart: unless-stopped volumes: temp_data: driver: local driver_opts: type: none device: ${STACK_DIR}/temp_data o: bind (可选)推荐在 compose.yaml 同级目录下创建 .env 文件,并自定义你的环境变量。如果不想使用环境变量的方式,也可以直接在 compose.yaml 内自定义你的参数(比如把 ${STACK_NAME} 替换为 cloudreve)。 .env STACK_NAME=cloudreve STACK_DIR=xxx # 自定义项目储存路径,例如 ./cloudreve # cloudreve APP_VERSION=latest APP_PORT=xxxx # 自定义访问端口,选择不被占用的即可 # aria2 ARIA2_VERSION=latest ARIA2_RPC_SECRET=xxx # ARIA2 密码 ARIA2_RPC_PORT=6800 最后,在 compose.yaml 同级目录下执行 docker compose up -d 命令即可启动编排的容器 配置说明 首次启动时,会自动创建初始的管理员账号,可以在 log 中找到。如果错过了,请删除目录下的 cloudreve.db,重新启动主程序以初始化新的管理员账户。 我采用的图像命名规则:{year}{month}{day}{hour}{minute}{second}{ext}。 参考与致谢 官网 文档 论坛 GitHub repo Docker Hub Demo site 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Homelab - 支持多存储的文件列表程序 Alist

Homelab - 支持多存储的文件列表程序 Alist Alist 是一个文件列表程序,支持多种储存方式如本地、阿里云盘、OneDrive、GoogleDrive、百度网盘、夸克网盘、蓝奏云、S3、FTP / SFTP 等等,带在线视频播放器与各类文件预览(兼容 Office、PDF、Markdown 等),还有离线下载功能。 部署(Docker Compose) 首先创建 compose.yaml 文件,并粘贴以下内容: compose.yaml version: "3.3" services: alist: container_name: ${STACK_NAME}_app image: "xhofe/alist:${APP_VERSION}" volumes: - ${STACK_DIR}:/opt/alist/data ports: - ${APP_PORT}:5244 environment: # 需要以 root 权限运行,否则无法读取其他 docker 目录或宿主机 root 目录 - PUID=0 - PGID=0 - UMASK=022 restart: always (可选)推荐在 compose.yaml 同级目录下创建 .env 文件,并自定义你的环境变量。如果不想使用环境变量的方式,也可以直接在 compose.yaml 内自定义你的参数(比如把 ${STACK_NAME} 替换为 alist)。 .env STACK_NAME=alist STACK_DIR=xxx # 自定义项目储存路径,例如 ./alist # alist APP_VERSION=latest APP_PORT=xxxx # 自定义访问端口,选择不被占用的即可 最后,在 compose.yaml 同级目录下执行 docker compose up -d 命令即可启动编排的容器。 配置说明 接入各类网盘的方法,官方的文档写得非常详细,一步步按着配置就可以了。 参考与致谢 官网 文档 GitHub repo Docker Hub Demo site 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Homelab - 支持多种协议的堡垒机 Next Terminal

Homelab - 支持多种协议的堡垒机 Next Terminal Next Terminal 是一个简单好用的跳板机(堡垒机),集成了 Apache Guacamole 无客户端的远程桌面网关的堡垒机方案,支持 RDP、SSH、VNC、TELNET、Kubernetes 多协议,能直接通过 web 访问内网资源,跨平台兼容性佳。它支持 MFA 多因子认证登录,也有审计录像功能和其他记录。 部署(Docker Compose) 首先创建 compose.yaml 文件,并粘贴以下内容: compose.yaml version: "3.3" services: guacd: container_name: ${STACK_NAME}_guacd image: dushixiang/guacd:${GUACD_VERSION} volumes: - ${STACK_DIR}/data:/usr/local/next-terminal/data restart: always next-terminal: container_name: ${STACK_NAME}_app image: dushixiang/next-terminal:${APP_VERSION} environment: DB: sqlite GUACD_HOSTNAME: ${APP_GUACD_HOSTNAME} GUACD_PORT: ${APP_GUACD_PORT} ports: - ${APP_PORT}:8088 volumes: - /etc/localtime:/etc/localtime - ${STACK_DIR}/data:/usr/local/next-terminal/data restart: always (可选)推荐在 compose.yaml 同级目录下创建 .env 文件,并自定义你的环境变量。如果不想使用环境变量的方式,也可以直接在 compose.yaml 内自定义你的参数(比如把 ${STACK_NAME} 替换为 next-terminal)。 .env STACK_NAME=next-terminal STACK_DIR=xxx # 自定义项目储存路径,例如 ./next-terminal # next-terminal APP_VERSION=latest APP_PORT=xxxx # 自定义访问端口,选择不被占用的即可 APP_GUACD_HOSTNAME=guacd # 默认 APP_GUACD_PORT=4822 # 默认 # guacd GUACD_VERSION=latest 最后,在 compose.yaml 同级目录下执行 docker compose up -d 命令即可启动编排的容器。 配置说明 初始账户 / 密码:admin。 参考与致谢 官网 文档 GitHub repo Docker Hub Demo site(账号:test,密码:test) Next Terminal | 开源 轻量 简单的堡垒机 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Homelab - 智能家居服务器 Home Assistant

Homelab - 智能家居服务器 Home Assistant Home Assistant 是一个开源的智能家居服务器,能够监控家里的所有设备,功能类似米家,界面友好美观,部署也相对简单。 部署(Docker Compose) 首先创建 compose.yaml 文件,并粘贴以下内容: compose.yaml version: "3" services: homeassistant: container_name: ${STACK_NAME}_app image: ghcr.io/home-assistant/home-assistant:${APP_VERSION} ports: - ${APP_PORT}:8123 volumes: - ${STACK_DIR}:/config - /etc/localtime:/etc/localtime:ro privileged: true #network_mode: host restart: unless-stopped (可选)推荐在 compose.yaml 同级目录下创建 .env 文件,并自定义你的环境变量。如果不想使用环境变量的方式,也可以直接在 compose.yaml 内自定义你的参数(比如把 ${STACK_NAME} 替换为 audiobookshelf)。 .env STACK_NAME=homeassistant STACK_DIR=xxx # 自定义项目储存路径,例如 ./homeassistant # homeassistant APP_VERSION=latest APP_PORT=xxxx # 自定义访问端口,选择不被占用的即可 最后,在 compose.yaml 同级目录下执行 docker compose up -d 命令即可启动编排的容器。 配置说明 移动端可直接使用官方的 Home Assistant App。 如果你通过外网访问时提示 400 Bad Request,你可以在配置文件 configuration.yaml 中加入以下语句: http: use_x_forwarded_for: true trusted_proxies: - 10.0.0.200 # 代理服务器的 IP 地址 - 172.30.33.0/24 # 也可也提供带掩码的 IP 地址 如果你不知道代理服务器的 IP 地址,可以试着从外网访问 Home Assistant,从 log 中的 error 信息就能看到了。 参考与致谢 官网 文档 GitHub repo Docker Hub Demo site 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Homelab - 极简个人书签导航站 Flare

Homelab - 极简个人书签导航站 Flare Flare 是一个轻量、快速、美观的个人导航页面,无任何数据库依赖,应用数据完全开放透明,支持在线编辑,内置 Material Design Icons 6k+ 图标。 部署(Docker Compose) 首先创建 compose.yaml 文件,并粘贴以下内容: compose.yaml version: "3.6" services: flare: container_name: ${STACK_NAME}_app image: soulteary/flare:${APP_VERSION} # 更多启动参数请参考文档 https://github.com/soulteary/docker-flare/blob/main/docs/advanced-startup.md ports: - ${APP_PORT}:5005 volumes: - ${STACK_DIR}:/app command: flare --nologin=0 # 开启用户登录模式,需要先设置 `nologin` 启动参数为 `0` environment: - FLARE_USER= ${APP_USER} # 如开启用户登录模式,且未设置 FLARE_USER,则默认用户为 `flare` - FLARE_PASS= ${APP_PASS} # 如开启用户登录模式,且未设置 FLARE_USER,则会默认生成密码并展示在应用启动日志中 restart: always (可选)推荐在 compose.yaml 同级目录下创建 .env 文件,并自定义你的环境变量。如果不想使用环境变量的方式,也可以直接在 compose.yaml 内自定义你的参数(比如把 ${STACK_NAME} 替换为 flare)。 .env STACK_NAME=flare STACK_DIR=xxx # 自定义项目储存路径,例如 ./flare # flare APP_VERSION=latest APP_PORT=xxxx # 自定义访问端口,选择不被占用的即可 APP_USER=xxxx # 自定义用户名 APP_PASS=xxxx # 自定义密码 最后,在 compose.yaml 同级目录下执行 docker compose up -d 命令即可启动编排的容器。 配置说明 可在修改 ${DIR}/flare 内的 apps.yml 与 bookmarks.yml 配置应用和书签的地址。容器会实时更新。也可在 url 后面加上以下参数进行调试: 引导操作:/guide 设置页面:/settings 在线编辑:/editor 图标获取:/icons 帮助页面:/help 参考与致谢 官网 文档 / GitHub repo Docker Hub

2025/9/17
articleCard.readMore

Homelab - 电子书管理服务器 calibre-web

Homelab - 电子书管理服务器 calibre-web calibre-web 是一个一站式电子书解决方案,它基于 Calibre,可在网页上阅读电子书,集成了 calibre-server 服务,也带电子书格式转换。 部署(Docker Compose) 首先创建 compose.yaml 文件,并粘贴以下内容: compose.yaml version: "3" services: calibre-web: container_name: ${STACK_NAME}_app image: johngong/calibre-web:${APP_VERSION} ports: - ${APP_PORT_WEB}:8083 - ${APP_PORT_SERVER}:8080 volumes: - ${STACK_DIR}:/config - ${DATA_DIR}:/library - ${DATA_DIR}/autoaddbooks:/autoaddbooks restart: unless-stopped (可选)推荐在 compose.yaml 同级目录下创建 .env 文件,并自定义你的环境变量。如果不想使用环境变量的方式,也可以直接在 compose.yaml 内自定义你的参数(比如把 ${STACK_NAME} 替换为 audiobookshelf)。 .env STACK_NAME=calibre-web STACK_DIR=xxx # 自定义项目储存路径,例如 ./calibre-web DATA_DIR=xxx # 自定义播客储存路径,例如 ./book # calibre-web APP_VERSION=latest APP_PORT_WEB=xxxx # 自定义 Web UI 的访问端口,选择不被占用的即可 APP_PORT_SERVER=xxxx # 自定义 calibre-server 的访问端口,选择不被占用的即可 如果你有个 NAS,也可以通过 NFS 协议挂载 NAS 上的储存空间,把音乐储存在 NAS 上以节省服务器空间,详情请参考 Linux 下挂载群晖 NAS 硬盘拓展空间(NFS)。 最后,在 compose.yaml 同级目录下执行 docker compose up -d 命令即可启动编排的容器。 配置说明 默认的账号是 admin,密码是 admin123。 书籍上传功能 系统默认是没有书籍上传功能的,需要依次点击右上角 管理权限 - 编辑基本配置 — 启用上传,这样才能启用书籍上传功能。 移动端使用 Android 上可使用 Librera,通过 OPDS 协议连接 calibre-web。添加书库的 url 是在原 url 最后加上/opds,例如calibre.xxx.com/opds。 忘记密码 如果忘记密码,可以将 calibre-web 中的 app.db 数据库下载下来,使用 SQLite 查看软件(或在线工具如 Sqlite 查看器 | 修改器),分别执行以下语句: SELECT * FROM 'user' LIMIT 0,30 --也可也手动切换到名为 user 的表 UPDATE user SET password='pbkdf2:sha256:150000$ODedbYPS$4d1bd12adb1eb63f78e49873cbfc731e35af178cb9eb6b8b62c09dcf8db76670' WHERE name='xxx'; -- 需要修改xxx为你当前的用户名 把修改的 app.db 替换掉原来的,随后使用新的密码 hello 登录即可。 参考与致谢 GitHub repo Docker Hub 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Homelab - 碎片笔记工具 memos

Homelab - 碎片笔记工具 memos memos 是一个开源的自托管 memos 工具。支持 Markdown 语法、公开分享、iframe 嵌入、标签管理、日历视图、简单的数据迁移与备份功能。 部署(Docker Compose) 首先创建 compose.yaml 文件,并粘贴以下内容: compose.yaml version: "3.0" services: memos: container_name: ${STACK_NAME}_app image: neosmemo/memos:${APP_VERSION} ports: - ${APP_PORT}:5230 volumes: - ${STACK_DIR}:/var/opt/memos restart: always (可选)推荐在 compose.yaml 同级目录下创建 .env 文件,并自定义你的环境变量。如果不想使用环境变量的方式,也可以直接在 compose.yaml 内自定义你的参数(比如把 ${STACK_NAME} 替换为 memos)。 .env STACK_NAME=memos STACK_DIR=xxx # 自定义项目储存路径,例如 ./memos # memos APP_VERSION=latest APP_PORT=xxxx # 自定义访问端口,选择不被占用的即可 最后,在 compose.yaml 同级目录下执行 docker compose up -d 命令即可启动编排的容器。 配置说明 移动端 iOS/Android App:Moe Memos。还有更多第三方客户端(如微信小程序、浏览器扩展、Telegram Bot 等)请参考文档 contribution·memos。 用户数据的导入导出,可使用 VS Code 插件 SQLite,下载并打开 ${DIR} 下的 memos_prod.db 即可进行增删改查、导入导出备份等操作。注意,只有在 docker 容器关闭 / 重启的时候才会更新 memos_prod.db 文件。 参考与致谢 官网 文档 GitHub repo Docker Hub Demo site 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Homelab - 网站 favicon 抓取工具 iconserver

Homelab - 网站 favicon 抓取工具 iconserver iconserver 是一个网站 favicon 图标抓取工具。支持抓取 favicon.ico 与 apple-touch-icon.png,拥有简单的 URL API 与 web 操作页面,如果抓取失败则会生成首字母开头的 favicon。 部署(docker-compose) 首先创建 compose.yaml 文件,并粘贴以下内容: compose.yaml version: "3" services: iconserver: container_name: ${STACK_NAME}_app image: matthiasluedtke/iconserver:${APP_VERSION} ports: - ${APP_PORT}:8080 restart: always (可选)推荐在 compose.yaml 同级目录下创建 .env 文件,并自定义你的环境变量。如果不想使用环境变量的方式,也可以直接在 compose.yaml 内自定义你的参数(比如把 ${STACK_NAME} 替换为 iconserver)。 .env STACK_NAME=iconserver # iconserver APP_VERSION=latest APP_PORT=xxxx # 自定义访问端口,选择不被占用的即可 最后,在 compose.yaml 同级目录下执行 docker compose up -d 命令即可启动编排的容器。 参考与致谢 文档 GitHub repo Docker Hub Demo site 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Homelab - 网站状态监控工具 Uptime Kuma

Homelab - 网站状态监控工具 Uptime Kuma Uptime Kuma 是一个支持多种网络协议的状态监控工具,可监控多个自定义网站的实时可用状态、响应时长、证书有效期等,并提供了多种通知推送方式。 部署(Docker Compose) 首先创建 compose.yaml 文件,并粘贴以下内容: compose.yaml version: "3" services: uptime-kuma: container_name: ${STACK_NAME}_app image: louislam/uptime-kuma:${APP_VERSION} ports: - ${APP_PORT}:3001 volumes: - ${STACK_DIR}:/app/data restart: always (可选)推荐在 compose.yaml 同级目录下创建 .env 文件,并自定义你的环境变量。如果不想使用环境变量的方式,也可以直接在 compose.yaml 内自定义你的参数(比如把 ${STACK_NAME} 替换为 uptime-kuma)。 .env STACK_NAME=uptime-kuma STACK_DIR=xxx # 自定义项目储存路径,例如 ./uptime-kuma # uptime-kuma APP_VERSION=latest APP_PORT=xxxx # 自定义访问端口,选择不被占用的即可 最后,在 compose.yaml 同级目录下执行 docker compose up -d 命令即可启动编排的容器。 配置说明 注:如使用反向代理,请开启 Websockets Support 功能。 参考与致谢 官网 文档 GitHub repo Docker Hub 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Homelab - 自动更新 Docker 容器的工具 Watchtower

Homelab - 自动更新 Docker 容器的工具 Watchtower Watchtower 是一个自动化更新全部或选定 Docker 容器的工具。 部署(Docker Compose) 首先创建 compose.yaml 文件,并粘贴以下内容: compose.yaml version: "3" services: watchtower: container_name: ${STACK_NAME}_app image: containrrr/watchtower:${APP_VERSION} volumes: - /var/run/docker.sock:/var/run/docker.sock restart: always (可选)推荐在 compose.yaml 同级目录下创建 .env 文件,并自定义你的环境变量。如果不想使用环境变量的方式,也可以直接在 compose.yaml 内自定义你的参数(比如把 ${STACK_NAME} 替换为 watchtower)。 .env STACK_NAME=watchtower # watchtower APP_VERSION=latest 最后,在 compose.yaml 同级目录下执行 docker compose up -d 命令即可启动编排的容器。 参考与致谢 官网 / 文档 GitHub repo Docker Hub 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Homelab - 自托管 RSS 聚合器 FreshRSS

Homelab - 自托管 RSS 聚合器 FreshRSS FreshRSS 是一个托管的 RSS 聚合器,支持订阅多个 RSS 源,并自动刷新。提供 web 在线阅读和 API 供移动端 app 使用。 部署(Docker Compose) 首先创建 compose.yaml 文件,并粘贴以下内容: compose.yaml version: "2.4" services: freshrss: container_name: ${STACK_NAME}_app image: freshrss/freshrss:${APP_VERSION} hostname: freshrss logging: options: max-size: 10m ports: - "${APP_PORT}:80" volumes: - ${STACK_DIR}/data:/var/www/FreshRSS/data - ${STACK_DIR}/extensions:/var/www/FreshRSS/extensions environment: TZ: Asia/Shanghai CRON_MIN: "*/60" # 每 60 分钟拉取一次文章更新 restart: unless-stopped (可选)推荐在 compose.yaml 同级目录下创建 .env 文件,并自定义你的环境变量。如果不想使用环境变量的方式,也可以直接在 compose.yaml 内自定义你的参数(比如把 ${STACK_NAME} 替换为 freshrss)。 .env STACK_NAME=freshrss STACK_DIR=xxx # 自定义项目储存路径,例如 ./freshrss # freshrss APP_VERSION=latest APP_PORT=xxxx # 自定义访问端口,选择不被占用的即可 最后,在 compose.yaml 同级目录下执行 docker compose up -d 命令即可启动编排的容器。 配置说明 RSS 源可推荐 saveweb 的中文博客列表 rss-list。 移动端 App 推荐使用 FeedMe(Android),NetNewsWire(iOS)。 更多 RSS 相关的内容可参考文章 RSS - 高效率的阅读方式。 参考与致谢 官网 文档 GitHub repo Docker Hub Demo site 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Homelab - 自托管密码管理器 Vaultwarden

Homelab - 自托管密码管理器 Vaultwarden Vaultwarden 是一个第三方自托管的 Bitwarden 服务器,通过一个主密码保护并管理各个网站的密码,可生成随机的密码供不同网站使用。 部署(Docker Compose) 首先创建 compose.yaml 文件,并粘贴以下内容: compose.yaml version: "3" services: vaultwarden: container_name: ${STACK_NAME}_app image: vaultwarden/server:${APP_VERSION} ports: - ${APP_PORT}:80 volumes: - ${STACK_DIR}:/data/ restart: always (可选)推荐在 compose.yaml 同级目录下创建 .env 文件,并自定义你的环境变量。如果不想使用环境变量的方式,也可以直接在 compose.yaml 内自定义你的参数(比如把 ${STACK_NAME} 替换为 vaultwarden)。 .env STACK_NAME=vaultwarden STACK_DIR=xxx # 自定义项目储存路径,例如 ./vaultwarden # vaultwarden APP_VERSION=latest APP_PORT=xxxx # 自定义访问端口,选择不被占用的即可 最后,在 compose.yaml 同级目录下执行 docker compose up -d 命令即可启动编排的容器。 配置说明 Vaultwarden 默认需要使用 https 登录,推荐通过反向代理使用(反向代理服务器的搭建可参考文章 Homelab - 反代证书管理面板 Nginx Proxy Manager。 使用浏览器扩展、桌面与移动端 App 时,需要在登录页面点击设置,并配置服务器的 URL,才能正常使用自托管的服务。 另外,旧版本(低于 1.27.0)的 Vaultwarden 与 Bitwarden 的浏览器拓展不兼容,会导致无法登录。详见 issue:Client fails to connect or login。 因为是自托管的服务,所以需要自己留意数据安全。记得定期备份密码数据库。 参考与致谢 官网 文档 GitHub repo Docker Hub 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Homelab - 跨设备同步工具 Syncthing

Homelab - 跨设备同步工具 Syncthing Syncthing 是一款免费开源的文件同步应用程序,可在多个设备间同步文件和文件夹,支持增量同步。我用它将服务器的数据备份到 NAS 上做统一管理。 部署(Docker Compose) 首先创建 compose.yaml 文件,并粘贴以下内容: compose.yaml version: "3" services: syncthing: container_name: ${STACK_NAME}_app image: syncthing/syncthing:${APP_VERSION} hostname: my-syncthing environment: # 需要以 root 权限运行,否则无法读取其他 docker 目录或宿主机 root 目录 - PUID=0 - PGID=0 volumes: - ${APP_SYNC_DIR}:/DATA - ${STACK_DIR}/config:/var/syncthing/config/ ports: - ${APP_PORT}:8384 # Web UI - 22000:22000/tcp # TCP file transfers - 22000:22000/udp # QUIC file transfers - 21027:21027/udp # Receive local discovery broadcasts restart: unless-stopped (可选)推荐在 compose.yaml 同级目录下创建 .env 文件,并自定义你的环境变量。如果不想使用环境变量的方式,也可以直接在 compose.yaml 内自定义你的参数(比如把 ${STACK_NAME} 替换为 syncthing)。 .env STACK_NAME=syncthing STACK_DIR=xxx # 自定义项目储存路径,例如 ./syncthing # syncthing APP_VERSION=latest APP_PORT=xxxx # 自定义访问端口,选择不被占用的即可 APP_SYNC_DIR=xxxx # 自定义需要同步的路径,比如 /DATA 最后,在 compose.yaml 同级目录下执行 docker compose up -d 命令即可启动编排的容器。 配置说明 如果提示权限不足,可尝试将 PUID 与 PGID 值都修改为 0,用 root 权限启动。 参考与致谢 官网 文档 论坛 GitHub repo Docker Hub 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Homelab - 轻量服务器管理面板 CasaOS

Homelab - 轻量服务器管理面板 CasaOS CasaOS 是一个简单易用、优雅的开源个人面板,功能包含了文件管理器、服务器状态监测、终端、Docker 容器管理、内置 Docker 应用商店等。 部署(shell) curl -fsSL https://get.casaos.io | sudo bash 默认面板访问地址:http://localhost:80 注:如果是部署在有分配反向代理的服务器上,最好在设置内更换面板访问端口,把 80 端口留给 Nginx。 参考与致谢 官网 文档 GitHub repo 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Homelab - 高质量图片压缩工具 TinyPNG-docker

Homelab - 高质量图片压缩工具 TinyPNG-docker TinyPNG-docker 是一个调用 TinyPNG API 进行图片高质量压缩的工具,可以自动压缩指定路径下的 WEBP、JPEG 和 PNG 图片,然后输出到你想要的路径下。它能有效减少网站的带宽占用、流量和加载时间。顺带说一句,这是我借助 ChatGPT 开发的一个 Docker 应用。 部署(Docker Compose) 首先创建 compose.yaml ,并将以下的 ${DIR} 替换为本地的目录(例如 /DATA/AppData);将 ${API} 替换为自己申请的 TinyPNG 密钥: compose.yaml version: "3" services: tinypng-docker: image: linyuxuanlin/tinypng-docker environment: - TINYPNG_API_KEY=${API} - INPUT_DIR=/app/input - OUTPUT_DIR=/app/output volumes: - ${DIR}/tinypng-docker/input:/app/input - ${DIR}/tinypng-docker/output:/app/output 配置说明 使用这个 Docker 容器前,你需要先在 TinyPNG 官网上注册一个账户,并申请获取一个 API 密钥。 使用方法很简单,把需要压缩的图片贴进 ${DIR}/tinypng/input 文件夹中,就能在 ${DIR}/tinypng/output 文件夹找到压缩后的图片了。 如果容器无法正常使用,可以用以下的方法排除: 确保 compose.yaml 文件中指定的 input 和 output 文件夹路径正确。 检查你的 TinyPNG 账户,是否已达到 API 密钥允许的最大压缩次数。 检查 input 文件夹是否包含正确格式的图像文件(WebP, PNG, JPEG)。注意,此容器只会检测并压缩 created 事件,因此如果文件已经存在,则需要手动将其移到 input 目录当中。 检查压缩的图片是否在失真度上高于 API 的压缩设置,可能导致 API 解码失败(例如压缩前的图片已经压缩过)。 尝试手动使用 tinify 官网提供的 API 压缩工具,上传压缩后的图片以进一步确定问题的所在,同时你可以在控制台输出调试信息定位问题。 Docker 镜像开发流程 准备工作 如还未注册 Docker Hub 账户,则需要先在 Docker Hub 上创建一个账户。 登录 Docker Hub: docker login 根据提示输入用户名和密码,登录到 Docker Hub。 创建容器 创建 Dockerfile 文件: Dockerfile FROM python:3.8-slim-buster RUN pip install tinify watchdog WORKDIR /app COPY . /app ENV TINYPNG_API_KEY=<your_tinypng_api_key> ENV INPUT_DIR=/app/input ENV OUTPUT_DIR=/app/output CMD ["python", "main.py"] 在相同路径下创建 main.py: main.py import tinify import os import time import sys from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler class MyHandler(FileSystemEventHandler): def on_created(self, event): if event.is_directory: return None elif event.event_type == 'created': print("Received created event - %s." % event.src_path) source_path = event.src_path output_path = os.path.join(os.environ['OUTPUT_DIR'], os.path.basename(source_path)) compress_image(source_path, output_path) def compress_image(source_path, output_path): tinify.key = os.environ['TINYPNG_API_KEY'] source = tinify.from_file(source_path) source.to_file(output_path) print(f"{source_path} compressed and saved to {output_path}") if __name__ == "__main__": print("Watching for new images...") event_handler = MyHandler() observer = Observer() observer.schedule(event_handler, path=os.environ['INPUT_DIR'], recursive=False) observer.start() try: while True: time.sleep(1) except KeyboardInterrupt: observer.stop() observer.join() 这里首先导入必需的 Python 库:tinify,os,time,sys,watchdog。随后定义了一个名为 MyHandler 的类,继承自 watchdog.events.FileSystemEventHandler。这个类包含一个 on_created 方法,当监测到指定文件夹下有新文件被创建时会被调用。on_created 函数获取源图像的路径,并将其压缩到指定的输出路径。最后开始监测输入文件夹,一旦检测到指定文件夹下有新文件被创建,就会自动执行压缩操作,并将压缩后的图像输出到指定的输出文件夹。 编译容器 在 Dockerfile 相同路径下执行以下命令编译容器: docker build -t tinypng-docker . 其中,tingpng-docker 为要构建的镜像名称,. 为 Dockerfile 文件所在的路径。 为镜像打标签 使用以下命令为镜像打标签: docker tag <image-name> <dockerhub-username>/<repository-name>:<tag> 例如: docker tag tinypng-docker linyuxuanlin/tinypng-docker:latest 推送镜像到 Docker Hub 使用以下命令将镜像上传到 Docker Hub: docker push <dockerhub-username>/<repository-name>:<tag> 例如: docker push linyuxuanlin/tinypng-docker:latest 拉取镜像 上传完成后,其他人便可以通过以下命令拉取镜像: docker pull linyuxuanlin/tinypng-docker:latest 参考与致谢 文档 GitHub repo Docker Hub 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Hugo 极简搭建指南

Hugo 极简搭建指南 Hugo 是一个搭建网页的框架,有极高的构建和部署速度。至于在 Windows 下的安装配置,官方文档并未详细说明,第三方教程也参差不齐,所以我写了这一篇教程。 下载安装 打开 Hugo 官方 GitHub 的 ** Releases** 页面 选择最新的版本下载(选择 hugo_xxx_Windows-64/32bit.zip) 将压缩包内的 hugo.exe 文件解压至 D:\hugo 文件夹目录下 在 文件资源管理器(即 我的电脑)中空白处点击鼠标右键,打开属性 依次点击 高级系统设置 - 环境变量 ,双击打开系统变量中的 Path 在环境变量界面中双击空白行,添加 D:\hugo,点击确定 打开命令提示符,输入语句: hugo version 以确认 Hugo 是否安装成功(如果安装成功就能看到版本号) 创建站点 切换至相应目录下,使用如下语句: hugo new site quickstart 这将在一个叫 quickstart 的文件夹内创建一个新的 Hugo 站点。 添加主题 主题的挑选可以到官方的 主题页面 直接跳转至 GitHub 下载主题文件夹,解压至站点的 theme 目录下即可。 执行如下命令,将主题添加至站点的配置文件中: echo 'theme = "主题文件夹的名字"' >> config.toml 创建文章 使用如下命令,创建一篇文章: hugo new posts/my-first-post.md 然后打开文章,将 front matter 中的 draft: true 改为 draft: false,以移出草稿区,正常呈现出来。 启动 Hugo 服务 使用以下命名启动 Hugo 本地预览服务: hugo server -D 打开 http://localhost:1313/ ,即可看到实时预览的站点(在本地的任何修改,将即时更新)。 本地部署 使用如下命令: Build static pages 将站点部署进行本地部署(输出于 public 文件夹目录下)。 参考与致谢 Quick Start · Hugo 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

IDD Test

IDD Test This post was originally written in English. Power supply current (IDD) indicates the current flows from Drain to Drain in a CMOS circuit (named ICC in TTL circuit, means Collector to Collector). IDD can be equivalent as: Static IDD Test Static IDD is a measurement of current from DUT's VDD pin, when the DUT is in static state (the DUT is not active during the test). The value of static IDD indicates the lowest current consumption of the DUT, which is important for battery operated devices, also help to indicate marginal defects. Test Method Static IDD test is performed with applying a voltage of VDDmax and measuring the current value, while the DUT is preconditioned to its lowest current consumption logic state. Apply VDDmax to VDD pin (with current clamp). Precondition DUT to its lowest current consumption logic state. Measure the current flowing into VDD pin: Higher than spec value(>10uA): FAIL Lower than spec value(<10uA): PASS Dynamic IDD Test Dynamic IDD is a measurement of current from DUT's VDD pin, when the DUT is constantly performing some function. Dynamic IDD is also important for battery operated devices. Test Method Static IDD test is performed with applying a voltage of VDDmax and measuring the current value, while the DUT is preconditioned to a continuously working state. Apply VDDmax to VDD pin (with current clamp). Precondition DUT to a continuously working state. Measure the current flowing into VDD pin: Higher than spec value(>50mA): FAIL Lower than spec value(<50mA): PASS Quiescent IDD Test (IDDQ) Quiescent IDD is a measurement of IDD in the quiescent states (the circuit is not switching and inputs are held at static values). As processors shrink , the defect of leakage current becomes much more higher, and IDDQ test may detect minor defects within the core of the circuit that could not other wise be detected. Test Method Apply VDDmax to VDD pin (with current clamp). Precondition DUT to a certain working state (toggle certain function part to on/off such as Bluetooth and Wi-Fi). Measure the current flowing into VDD pin: Higher than spec value: FAIL Lower than spec value: PASS Repeat to test with different working states. References & Acknowledgements The Fundamentals Of Digital Semiconductor Testing Fundamentals of Testing Using ATE Original: https://wiki-power.com/ CC BY-NC-SA 4.0 agreement, should be reproduced with attribution.

2025/9/17
articleCard.readMore

JavaScript 学习笔记

JavaScript 学习笔记 调用外部 JS <!DOCTYPE html> <html> <head> <script src="xx1.js"></script> </head> <body> <script src="xx2.js"></script> </body> </html> 输出 弹出警告框 window.alert("Hello"); 操作 HTML 元素 <!DOCTYPE html> <html> <body> <h1> 我的第一个 Web 页面 </h1> <p id="demo"> 我的第一个段落 </p> <script> document.getElementById ("demo").innerHTML = "段落已修改。"; </script> </body> </html> 数据类型 创建变量: var carname = "Volvo"; 值类型 \(基本类型、):字符串(String)、数字 \(Number\)、布尔 \(Boolean\)、对空(Null)、未定义(Undefined)、Symbol。 引用数据类型:对象 \(Object\)、数组 \(Array\)、函数 \(Function\)。 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Keil MDK 配置指南

Keil MDK 配置指南 1. 下载 进入 Keil 官网下载页面: https://www.keil.com/demo/eval/arm.htm 如图填写相关信息并点击 Submit 按钮: 点击下载安装包: 2. 安装 打开下载完成的安装包,按如下步骤操作: 安装芯片包(我们需要 STM32 F1 和 F4 系列): 3. 破解 点击下载 破解器 关闭 MDK,右键以管理员身份打开: 打开菜单栏 - File - License Management : 复制这一串 CID: 在破解器中粘贴,并在 Target 下拉框中选择 Arm ,然后点击 Generate 生成激活码: 拷贝激活码,到 MDK 中粘贴,后点击 Add LIC: 参考与致谢 Keil 保护视力背景颜色设置 keil 代码格式化 个人界面配置 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Leakage Test

Leakage Test This post was originally written in English. Leakage test contains input leakage test (IIL & IIH) and output tristate leakage test (IOZL & IOZH). Input Leakage Test (IIL & IIH) Input leakage occurs in a input pin's buffer circuit. IIH is the leakage path from input pin to GND when the DUT is driven to "1", and IIL is the leakage path from VDD to input pin when driven to "0": Actually, the measurement of IIL is the resistance from input pin to VDD, and IIH is the resistance from input pin to GND. Input leakage test is to ensure the pin's input buffer will not source or sink more unwanted current than specified. Test Method (Serial) Serial input leakage test (IIL & IIH) is performed with applying a voltage of VDDmax, and force the specific input pin to VDDmax (for IIH) or 0V (for IIL), while other input pins are forced to oppisite side of the Pin under Test. IIL Test (Serial) Apply VDDmax to VDD pin (with current clamp). Force VDDmax to all input pins except for the Pin under Test. Force 0V to the Pin under Test, and measure the current flow out: Higher than spec value(>-10uA): PASS Lower than spec value(<-10uA): FAIL Repeat to test next pin. IIH Test (Serial) Apply VDDmax to VDD pin (with current clamp). Force 0V to all input pins except for the Pin under Test. Force VDDmax to the Pin under Test, and measure the current flow into: Higher than spec value(>10uA): FAIL Lower than spec value(<10uA): PASS Repeat to test next pin. Test Method (Parallel) Since serial method can identify the leakage between input pins, but it's too inefficient. Parallel test method is more commonly used actually. PPMU is used in parallel method, to drive all input pins to VDDmax (for IIH) or 0V (for IIL) and measure the current of per input pin. The only disadvantage of parallel method is pin to pin leakage will not be detected, because all the pins are forced to the same voltage level at the same time. Output Tristate Leakage Test (IOZL & IOZH) Tristate also named as High-Z or floating state, indicates appear to be high impedance externally of DUT's pin. Output tristate leakage occurs in HIGH or LOW voltage level is applied on the DUT's output pin, while the pin is preconditioned to be disabled. IOZL means the current flow out when the LOW level is applied, and IOZH means the current flow into when the HIGH level is applied. Essentially, IOZL indicates the resistance from an output pin to VDD when disabled, and IOZH indicates the resistance to GND. The test insures the pin will not source or sink more unwanted current than specified. Additionally, a control input (enable signal) is required in this test , to controls the specific output pin to LOW, HIGH or High-Z (disable) state. Test Method (Serial) IOZL Test (Serial) Apply VDDmax to VDD pin (with current clamp). Precondition the specific out pin to Hi-Z (disable) state. Force 0V to the Pin under Test, and measure the current flow out: Higher than spec value(>-10uA): PASS Lower than spec value(<-10uA): FAIL Repeat to test next pin. IOZH Test (Serial) Apply VDDmax to VDD pin (with current clamp). Precondition the specific out pin to Hi-Z (disable) state. Force VDDmax to the Pin under Test, and measure the current flow into: Higher than spec value(>10uA): FAIL Lower than spec value(<10uA): PASS Repeat to test next pin. Test Method (Parallel) Parallel method is more commonly used actually with PPMU, to drive all output pins to VDDmax (for IOZH) or 0V (for IOZL) and measure the current of per output pin. References & Acknowledgements The Fundamentals Of Digital Semiconductor Testing Fundamentals of Testing Using ATE Original: https://wiki-power.com/ CC BY-NC-SA 4.0 agreement, should be reproduced with attribution.

2025/9/17
articleCard.readMore

Level Threshold Test 🚧

Level Threshold Test 🚧 This post was originally written in English. Level threshold test includes Output Level Threshold (VOL & VOH) and Input Level Threshold (VIL & VIH). They are originated from typical TTL and CMOS level threshold: VCC VOL VOH VIL VIH GND TTL (5V) 5.00V 0.40V 2.40V 0.80V 2.00V 0.00V LVTTL (3.3V) 3.30V 0.40V 2.40V 0.80V 1.50V 0.00V CMOS (5V) 5.00V 0.50V (0.1 VCC) 4.50V (0.9 VCC) 1.50V (0.3 VCC) 3.50V (0.7 VCC) 0.00V CMOS (3.3V) 3.30V 0.33V (0.1 VCC) 2.97V (0.9 VCC) 0.99V (0.3 VCC) 2.31V (0.7 VCC) 0.00V CMOS (2.5V) 2.50V 0.40V 2.00V 0.70V 1.70V 0.00V CMOS (1.8V) 1.80V 0.45V 1.35V 0.63V 1.170V 0.00V Output Level Threshold Test (VOL/IOL & VOH/IOH) VOL represents the maximum output voltage when output LOW voltage level, IOL represents the maximum sinking current capability in LOW output state. They actually measures the resistance of the output pin when provide the logic 0, insures it can provide current of IOL without exceeding the voltage of VOL, examining the capability of sink current and stay in a correct logic state. VOH represents the minimum output voltage when output HIGH voltage level, IOH represents the maximum source current capability in HIGH output state.They actually measures the resistance of the output pin when provide the logic 1, insures it can provide current of IOH without less than the voltage of VOH, examining the capability of source current and stay in a correct logic state. Test Method (Serial) VOL/IOL Test (Serial) Apply VDDmin to VDD pin (with current clamp). Precondition specific output pin to logic '0'. Force IOLmax to the Pin under Test (flow into DUT), and measure the voltage on it: Higher than spec value(>0.4V): FAIL Lower than spec value(<0.4V): PASS Repeat to test with different output pins. VOH/IOH Test (Serial) Apply VDDmin to VDD pin (with current clamp). Precondition specific output pin to logic '1'. Force IOHmax to the Pin under Test (flow out of DUT), and measure the voltage on it: Higher than spec value(>2.4V): PASS Lower than spec value(<2.4V): FAIL Repeat to test with different output pins. Input Level Threshold Test(VIL & VIH) References & Acknowledgements The Fundamentals Of Digital Semiconductor Testing Fundamentals of Testing Using ATE Original: https://wiki-power.com/ CC BY-NC-SA 4.0 agreement, should be reproduced with attribution.

2025/9/17
articleCard.readMore

Linux 下挂载群晖 NAS 硬盘拓展空间(NFS)

Linux 下挂载群晖 NAS 硬盘拓展空间(NFS) 如果你的服务器储存空间有限,可以尝试挂载群晖 NAS 上的硬盘,作为拓展的储存空间。 在群晖 NAS 上配置 开启 NFS 服务 打开群晖的 设置 - 文件服务 - NFS,把 NFS 服务勾选上,协议选最新即可。 配置文件夹的 NFS 权限 在 设置 - 共享文件夹 下,选择需要开启 NFS 的共享文件夹,点击 编辑,切换到 NFS 权限 的标签栏下,点击 新增,添加新的 NFS 规则。 服务器或IP地址,填写需要访问群晖的服务器的 IP(比如我的服务器和群晖在同一局域网下,那么填我的服务器的内网 IP 192.168.1.2 即可)。勾选 允许来自非特杈端口的连接 和 允许用户访问已装载了文件夹,其他设置保持默认即可。 在服务器上执行挂载 首先,安装 nfs 服务: apt update apt install nfs-common 随后,在服务器上创建挂载的路径,比如: sudo mkdir /DATA/nfs/music 最后执行挂载命令: mount -t nfs NAS的IP地址:共享文件夹的路径 /NFS客户端路径 比如: sudo mount -t nfs 192.168.1.3:/volume1/music /DATA/nfs/music 如果没有报错,使用 df 命令即可查看挂载情况。 参考与致谢 Linux(Ubuntu)通过 NFS 服务挂载群晖 NAS 为虚拟磁盘 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Linux 如何配置开机自动运行脚本

Linux 如何配置开机自动运行脚本 适用于使用 SysV init 的系统 注:以下方法适用于使用 SysV init 系统的 Linux 发行版(如 Ubuntu 18.04 及更新版本,或 Debian)。对于使用 Systemd 的发行版(如 Ubuntu 18.04 及更新版本),请使用 systemctl 方法来管理启动服务。 假如我们需要开机自动执行的脚本是 xxx.sh。首先在 /etc/init.d 目录下创建一个用于启动的脚本,例如名为 autorun.sh: sudo nano /etc/init.d/autorun.sh 在其中添加你需要开机自动执行的脚本: autorun.sh #!/bin/bash /path/to/xxx.sh # 修改为具体路径 将 autorun.sh 脚本添加到系统的启动服务中: sudo update-rc.d autorun.sh defaults 将 autorun.sh 脚本设置为开机启动: sudo update-rc.d autorun.sh enable 这样,当重新启动后,autorun.sh 脚本将会自动运行。 适用于使用 Systemd 的系统 如果你的 Linux 发行版使用 Systemd 作为启动管理器(例如 Ubuntu 18.04 及更高版本),你可以使用 systemctl 命令来设置自动启动。 假如我们需要开机自动执行的脚本是 xxx.sh。首先创建一个描述你想自启动服务的 Unit 文件,比如 autorun.service: sudo nano /etc/systemd/system/autorun.service 在 Unit 文件中,定义你的服务的配置。以下是一个示例: autorun.service [Unit] Description=My Service After=network.target [Service] ExecStart=/path/to/xxx.sh [Install] WantedBy=default.target 其中的参数分别为: Description:描述你的服务。 After:指定你的服务在哪些其他服务之后启动。例如,network.target 表示在网络服务启动后才启动你的服务。 ExecStart:指定你要执行的脚本或命令的路径。 WantedBy:指定你的服务应该被启动的目标(target)。default.target 表示在默认目标启动时启动你的服务。 保存并关闭文件,运行以下命令以重新加载 systemd 配置: sudo systemctl daemon-reload 使用以下命令使能你的服务: sudo systemctl enable autorun.service 最后,使用以下命令启动: sudo systemctl start autorun.service 现在,你的服务已经设置为在系统启动时自动运行。你可以重新启动系统来验证服务是否正常启动。 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Linux 学习笔记 - 基础知识

Linux 学习笔记 - 基础知识 连接远程主机 使用 ssh: ssh user@IP 根目录结构 目录 目录放置的内容 bin binary 二进制文件,存放系统命令,如 cat,cp,mkdir boot 存放开机启动过程所需的内容,如开机管理程序 grub2 dev 所有设备文件的目录(如声卡、硬盘、光驱) etc etcetera,存放系统的主要配置文件 home 用户家目录数据的存放目录 lib library,存放 sbin 和 bin 目录下命令所需的库文件,避免重复 lib32/lib64 存放二进制函数库,支持 32/64 位 lost+found 在 EXT3/4 系统中,当系统意外崩溃或意外关机时,会产生一些碎片文件在这个目录下面,系统启动 fcsk 工具会检查这个目录,并修复已损坏的文件。 media 用于挂载光盘,软盘和 DVD 等设备 mnt mount,同 media 作用一样,用于临时挂载存储设备 opt 第三方软件安装存放目录。 proc 进程及内核信息存放目录,不占用硬盘空间。 root root 用户的家目录 run 是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。 sbin system bin,存放 root 用户使用的命令,如格式化命令 mkfs srv 一些网络服务所需要的数据文件 sys 同 proc 目录,用于记录 CPU 与系统硬件的相关信息 tmp 存放程序运行时产生的临时文件 usr 系统存放程序的目录,类似于在 windows 下的文件夹 programefiles var 存放内容常变动的文件目录,如系统日志文件 文件类型 在 Linux 下,一切皆文件。 常见的文件拓展名如下: 后缀.tar、.tar.gz、.tgz、.zip、.tar.bz 表示压缩文件,创建命令一般为 tar,gzip,zip 等。在压缩文件中的后缀名来通常表示自身由什么压缩格式打包的,以便解压时方便选择要使用的命令。 .sh 表示 shell 脚本文件,通过 shell 语言开发的程序。 .pl 表示 perl 语言文件,通过 perl 语言开发的程序。 .py 表示 python 语言文件,通过 python 语言开发的程序。 .html、.htm、.php、.jsp、.do 表示网页语言的文件。 .conf 表示系统服务的配置文件。 .rpm 表示 rpm 安装包文件。 文件主要有以下类型: 普通文件 文本文件,bin 文件等。 可执行文件 包括脚本和应用程序,这些文件可被系统加载运行,类似 Windows 下的 bat 脚本、exe 程序文件等。 链接文件 链接文件分为硬链接和软链接: 硬链接是指同一个文件的不同别名。 软链接类似于 Windows 的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。 目录文件 在 Linux 下,目录也是文件。 设备文件 硬件设备也是文件,通过打开对应的设备文件可以初始化设备,部分设备还可以通过读写设备文件实现对硬件的控制。 用户与文件权限 用户权限 Linux 是多用户操作系统,其中具有管理其他用户和计算机的全部资源的用户,称为 root 账户。在 Linux 中,每个用户都有一个特定的编号 —— UID,用于标识一个系统用户。root 账户的 UID 是标号 0。我们可以用命令 id 以查看当前用户的 UID 值。一个用户可以归属于多个 GID(组),以获得不同的文件权限。 文件权限 Linux 的文件属性,分为读权限、写权限、执行权限(可以加载到内存中,并由操作系统加载程序执行的文件)。 可以通过 chmod 命令修改文件权限。 命令行 终端提示符 当我们打开终端的时候,会出现一串提示符如: power@Linuxbook:~$ 这代表当前的用户是 power,运行的主机名称是 Linuxbook,~ 表示当前的目录是家目录(即 /home/power),而 $ 为命令提示符,代表这是个普通用户,如果是超级用户则为 #。 命令 命令的基本格式(其中后两项代表非必须): command [-options] [argument] 可使用 Tab 键进行自动补全,在命令行执行中可以用 Ctrl + C 终止运行。 command:命令名,如 cd、ls 等。 -options:命令的附加选项,如 ls -l。命令会根据具体的选项执行不同的操作。 argument:命令参数,比如 cd /home 中,/home 作为参数名。 常用的命令有: ls:列出目录及文件名 -a:显示隐藏文件(文件名前带 .) -l:将文件型态、权限、拥有者、文件大小等信息详细列出 -t:将文件依建立时间之先后次序列出 -A:同 -a,但不列出 . 和 ..(当前目录与父目录) -R:若目录下有文件,则该目录下的文件也会列出,即递归显示 cd:切换目录 特殊路径 ~:当前用户的 home 目录 /:根目录 .:当前目录 ..:上层目录 -:切换上一次 cd 的目录 pwd:显示目前的目录 mkdir:创建目录 -p 可创建不存在的目录下的目录 rmdir:删除一个空的目录 touch:创建文件 cp:复制文件或目录 rm:移除文件或目录 -r:将目录包含的子目录和文件全部删除 -f:强制删除 mv:移动文件与目录,或修改文件与目录的名称 cat:查看文件 echo:将内容输出到终端 输出重定向到文件:将命令执行结果保存到文件 命令 > 文件名 ,如文件不存在则会创建,如重复则覆盖 命令 >> 文件名 ,如文件不存在则会创建,如重复则追加到末尾 sudo:switch user do,在需要 root 权限的命令前添加 sudo,从而使当前用户获得 root 权限, 并执行其后的命令。如果在普通用户下没权限执行失败,那么可以用 sudo !! 重新加权执行上一条命令。 clear:清屏 reboot/poweroff:重启 / 关机 包管理 包管理简单来说就是使用命令来安装软件。在 Linux 操作系统中,最常见的两种包分别是 deb 和 rpm。 参考与致谢 Linux 教程 [野火]i.MX Linux 开发实战指南 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Linux 学习笔记 - 用户操作

Linux 学习笔记 - 用户操作 基本操作 添加用户 useradd -m 用户名 设置密码 passwd 用户名 删除用户 userdel  -r  用户名 删除用户目录 rm -rf 用户名 切换当前用户 su 用户名 参考与致谢 linux 创建用户、设置密码 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Lora 通信 - 基于正点原子 ATK-LORA-01 模块

Lora 通信 - 基于正点原子 ATK-LORA-01 模块 ATK-LORA-01 一款体积小、微功率、低功耗、高性能远距离 LORA 无线串口模块。模块设计是采用高效的 ISM 频段射频 SX1278 扩频芯片,模块的工作频率在 410Mhz~441Mhz,以 1Mhz 频率为步进信道,共 32 个信道。可通过 AT 指令在线修改串口速率,发射功率,空中速率,工作模式等各种参数,并且支持固件升级功能。 模块基本参数 工作频率:410-441 MHz,32 个信道 工业频段:出厂默认 433Mhz 免申请频段 无线速率:6 级可调(0.3、1.2、2.4、4.8、9.6、19.2Kbps) 通信方式:串口 TTL,UART 串口,8N1、8E1、8O1,从 1200-115200 共 8 种波特率(默认 9600、8N1) 发射功率:100mW(20dB),4 级可调(0-3),每一级增减约 3dBm 工作电压:3.3-5V 工作电流:2.3uA-118mA 发射:118ma(20dbm 100mw 电压 5V) 接收:17ma(模式 0、模式 1),最低约 2.3uA(模式 2+2S 唤醒) 工作温度:-40~85℃ 接收灵敏度达-136dBm,传输距离 3000 米 双 512 环形 FIFO 接口定义 名称 IO 模式 说明 MD0 输入 配置进入参数配置;上电时与 AUX 引脚配合进入固件升级模式 AUX ① 输出;② 输入 ① 用于指示模块工作状态,用户唤醒外部 MCU;② 上电时与 MD0 引脚配合进入固件升级模式 RXD 输入 TTL 串口输入,连接到外部 TXD 输出引脚 TXD 输出 TTL 串口输出,连接到外部 RXD 输入引脚 GND 接地 VCC DC3.3~5V 电源输入 注意事项: 模块的引脚电平是 3.3V,与 5V 的单片机通信需要做电平转换适配 无线串口模块为 TTL 电平,请与 TTL 电平的 MCU 进行连接 模式配置 MD0 与 AUX 引脚有两个功能,根据两者配合进入不同状态。模块在初次上电时,AUX 引脚为输入状态模式,若 MD0 与 AUX 引脚同时接入 3.3V TTL 高电平,并且保持 1 秒时间(引脚电平不变),则模块会进入固件升级模式,等待固件升级。否则进入无线通信模式(AUX 引脚会变回输出状态模式,用于指示模块的工作状态) MD0、AUX 引脚内部下拉,悬空为低电平。拉高为 3.3V TTL 高电平 功能 介绍 进入方法 配置功能 模块参数配置(AT 指令) 上电后,AUX 悬空,MD0 拉高 通信功能 用于无线通信 上电后,AUX 悬空,MD0 悬空 固件升级功能 用于固件升级 上电后,AUX 拉高,MD0 拉高,保持 1s 无线通信模式下,AUX 引脚为输出,用于指示模块的工作状态。 功能配置 在“配置功能”下,串口需设置 ASDASD:波特率“115200”、停止位“1”、数据位“8”、奇偶校验位“无”,通过 AT 指令设置模块的工作参数。通过配置软件,参考以下 AT 指令表: 指令 作用 AT 测试模块响应情况 AT+MODEL? 查询设备型号 AT+CGMR? 获取软件版本号 AT+UPDATE 查询设备是否处于固件升级模式 ATE1 指令回显 ATE0 指令不回显 AT+RESET 模块复位(重启) AT+DEFAULT 恢复出厂设置 AT+FLASH= 参数保存 AT+ADDR=? 查询设备配置地址范围 AT+ADDR? 查询设备地址 AT+ADDR= 配置设备地址 AT+TPOWER=? 查询发射功率配置范围 AT+TPOWER? 查询发射功率 AT+TPOWER= 配置发射功率 AT+CWMODE=? 查询配置工作模式范围 AT+CWMODE? 查询工作模式 AT+CWMODE= 配置工作模式 AT+TMODE=? 查询配置发送状态范围 AT+TMODE? 查询发送状态 AT+TMODE= 配置发送状态 AT+WLRATE=? 查询无线速率和信道配置范围 AT+WLRATE? 查询无线速率和信道 AT+WLRATE= 配置无线速率和信道 AT+WLTIME=? 查询配置休眠时间范围 AT+WLTIME? 查询休眠时间 AT+WLTIME= 配置休眠时间 AT+UART=? 查询串口配置范围 AT+UART? 查询串口配置 AT+UART= 配置串口 当退出配置功能(MD0=0),模块会重新配置参数,在配置过程中,AUX 保持高电平,完成后输出低电平,模块返回空闲状态。 休眠时间 休眠时间对接收方来说是监听间隔的时间;对发射方来说,是持续发射唤醒码的时间。当模块工作模式在“唤醒模式”时,会在用户数据前自动添加配置休眠时间的唤醒码,当模块工作模式在“省电模式”时,以配置的休眠时间为监听间隔的时间。 设备模式 一般模式(模式 0) 发射:模块接收来自串口的用户数据,模块发射无线数据包长度为 58 字节,当用户输入数据达到 58 字节时,模块将启动无线发射,此时用户可以继续输入需要发射的数据,当用户需要传输的字节小于 58 字节时,模块等待 1 个字节时间,若无用户数据继续输入则认为数据终止,此时模块将所有数据都包经无线发出,当模块开始发送第一包用户数据时,AUX 引脚将输出高电平,当模块把所有数据通过 RF 芯片并启动发射后,AUX 输出低电平。此时表明最后一包无线数据已经发射完毕,用户可以继续输入长达 512 字节的数据,通过一般模式 发出的数据包,只能被处于一般模式、唤醒模式的接收模块收到。 接收:模块一直打开无线接收功能,可以接收来自一般模式、唤醒模式发出的数据包。收到数据包后,模块 AUX 输出高电平,2-3ms 延迟后,开始将无线数据通过串口 TXD 引脚发出,所有无线数据都通过串口输出后,模块将 AUX 引脚输出低电平。 唤醒模式(模式 1) 发射:模块启动数据包发射的条件与 AUX 功能等于一般模式,唯一不同的是:模块会在每个数据包前自动添加唤醒码(休眠时间),唤醒码的长度取决于用户参数中设置的休眠时间。唤醒码的目的是用于唤醒工作省电模式的接收模块。所以,唤醒模式发射的数据可以被一般模式、1、2 接收到。 接收:与一般模式相同。 省电模式(模式 2) 发射:模块处于休眠状态,串口将关闭,无法接收来自外部 MCU 的串口数据,所以该模式不具有无线发射的功能。 接收:在省电模式下,要求发射方必须工作在唤醒模式,无线模块定时监听唤醒码,一旦收到有效的唤醒码后,模块将持续处于接收状态,在等待整个有效数据包接收接收完毕,然后模块将 AUX 输出高电平,并延迟 2-3ms 后,打开串口将收到的无线数据通过 TXD 发出,完毕后将 AUX 输出低电平。无线模块将继续进制“休眠-监听”的工作状态,通过设置不同的唤醒时间,模块具有不同的接收响应延迟和功耗,用户需要在通讯延迟时间和平均功耗之间取得一个平衡点。 信号强度模式(模式 3) 信号强度模式可查看通讯双方的信号强度,评估双方的通信质量提供参考。 发射:与一般模式相同。 接收:输出信号强度的信息。 SNR:信噪比(越大越稳定),RSSI:接收信号的强度指示(越大越稳定) 通信方式 透明传输:例如 A 设备发 5 字节数据 AA BB CC DD EE 到 B 设备,B 设备就收到数据 AA BB CC DD EE。(透明传输,针对设备相同地址、相同的通信信道之间通信,用户数据可以是字符或 16 进制数据形式)。 点对点 点对多 广播监听 定向传输:例如 A 设备(地址为:0x1400,信道为 0x17(23 信道 433Mhz))需要向 B 设备(地址为 0x1234,信道为 0x10(16 信道、426Mhz))发送数据 AA BB CC,其通信格式为:12 34 10 AA BB CC,其中 1234 为模块 B 的地址,10 为信道,则模块 B 可以收到 AA BB CC。同理,如果 B 设备需要向 A 设备发送数据 AA BB CC,其通信格式为:14 00 17 AA BB CC,则 A 设备可以收到 AA BB CC。(定向传输,可实现设备间地址和通信信道不同之间通信,数据格式为 16 进制,发送格式:高位地址+低位地址+信道+用户数据)。 点对多 广播监听 广播与数据监听:将模块地址设置为 0xFFFF,可以监听相同信道上的所有模块的数据传输;发送的数据,可以被相同信道上任意地址的模块收到,从而起到广播和监听的作用。 透明传输方式 点对点 地址相同、信道相同、无线速率(非串口波特率)相同的两个模块,一个模块发送,另外一个模块接收(必须是:一个发,一个收)。 每个模块都可以做发送/接收。 数据完全透明,所发即所得。 发送模块 接收模块 个数 1 1 传输内容 数据 数据 例如: 设备 A、B 地址都为 0x1234,信道都为 0x12,速率相同。 透传的方式很简单,把 Lora 模块当串口用就行,设备 A 通过串口发数据,设备 B 就可以从串口接收到,反之如此。 点对多 地址相同、信道相同、无线速率(非串口波特率)相同的模块,任意一个模块发送,其他模块都可以接收到。 每个模块都可以做发送/接收. 数据完全透明,所发即所得。 发送模块 接收模块 个数 1 N 传输内容 数据 数据 与点对点的区别是,接收模块可以多个。 例如: 设备 A~F 地址为 0x1234,信道为 0x12,速率相同。 广播监听 模块地址为 0xFFFF,则该模块处于广播监听模式,发送的数据可以被相同速率和信道的其他所有模块接收到(广播);同时,可以监听相同速率和信道上所有模块的数据传输(监听)。 广播监听无需地址相同。 发送模块 接收模块 个数 1 N 传输内容 数据 数据 与点对多的区别是,地址可以不同。 例如: 设备 A 地址为 0xFFFF,设备 B~F 地址不全部一样,设备 B 与 C 地址为 0x1234,设备 D、E、F 地址为 0x5678。设备 A~F 速率全部相同。 定向传输方式 点对点 模块发送时可修改地址和信道,用户可以指定数据发送到任意地址和信道。 可以实现组网和中继功能。 发送模块 接收模块 个数 1 1 传输内容 地址+信道+数据 数据 与点对点透传的区别是,模块地址可变,信道可变,但速率仍然相同。 例如: 设备 A 发送:AB CD 01 AA BB CC DD 设备 A 发送:12 56 13 AA BB CC DD 无代码测试 准备 2 个 USB 转 TTL,2 个 LoRa 模块。分别接在 USB 转 TTL 上(电源、共地、TX/RX 对接),将两个 LoRa 的 MD0 接 VCC 后,插入电脑 USB,打开配置软件,配置以下参数: 设备 A: 一般模式 定向传输 波特率:115200(必须是 115200) 校验位:无 空中速率:19.2k 休眠时间:1s 模块地址:0 通信信道:0 发射功率:20dBm 设备 B: 一般模式 定向传输 波特率:115200(必须是 115200) 校验位:无 空中速率:19.2k 休眠时间:1s 模块地址:65534 通信信道:10 发射功率:20dBm 配置后,点击 保存配置,拔掉 MD0 再断电。 将两个模块重新上电,打开配置软件,收发都勾选 HEX(16 进制) 在 A 的发送区填入 FF FE 0A 11 12 13 14,点击发送,就能在 B 的接收区收到 11 12 13 14 了;或者在 B 的发送区填入 00 00 00 11 12 13,就能在 A 的接收区收到 11 12 13 了。 其中,FF FE 是 B 地址 65534 的 16 进制数,信道是 10(16 进制数就是 0A),发送的内容数据是 11 12 13 14。同理,B 发出的数据包含 A 的地址 00 00,信道 00,内容 11 12 13。发送数据的格式是 高位地址 + 低位地址 + 信道 + 用户数据。 使用代码测试 点对点定传仅仅是比点对点透传多了地址字节。可以这样定义: main.c /* USER CODE BEGIN PV */ uint8_t B_Addr[2] = { 0xFF, 0xFE }; uint8_t B_Chan[1] = { 0x0A }; /* USER CODE END PV */ 配置了串口的代码(HAL 库环境)后,在每次发送数据之前发送地址字节: main.c HAL_UART_Transmit(&huart1, B_Addr, 2, 0xFFFF); HAL_UART_Transmit(&huart1, B_Chan, 1, 0xFFFF); 这样,接收的设备(B 设备)就能接收到 A 发出的一帧数据(不含地址字节)。 广播监听 模块地址为 0xFFFF,则该模块处于广播监听模式,发送的数据可以被具有相同速率和信道的其他所有模块接收到(广播);同时,可以监听相同速率和信道上所有模块的数据传输(监听); 广播监听无需地址相同。 信道地址可设置。当地址为 0xFFFF 时,为广播模式;为其他时,为定向传输模式。 发送模块 接收模块 个数 1 N 传输内容 0xFFFF+信道+数据 数据 例如: 设备 A 地址 0xFFFF 信道 0x12; 设备 A 广播:FF FF 13 AA BB CC DD 设备 A 发送:AB 00 01 11 22 33 44 设备 E 发送:AB 02 12 66 77 88 99 参考与致谢 LORA 模块 ATK-LORA-01 正点原子 LORA 模块 ATK-LORA 使用教程 【正点原子产品资料】LORA 模块 ATK-LORA-01 资料下载和技术讨论链接 两个 LORA 模块工作在一般模式定向传输数据的测试方法(使用上位机测试) ATK-LORA-01 无线串口模块只接收到 00 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

MSI 主板开启虚拟化的方法

MSI 主板开启虚拟化的方法 重启进入 BIOS shutdown.exe /r /o 重启后,点击 疑难解答(Troubleshoot) - 自定义设置(Advanced options) - UEFI 固件设置(UEFI Firmware Settings),进入主板 BIOS 找到相关设置 F7 进入高级选项 依次点击 OC - CPU 特征(CPU Features) 找到 SVM Mode / Intel Virtualization(视 CPU 而定) 修改设置 把 Disabled(禁用) 修改为 Enabled(启用) 保存退出 按 F10 保存并退出 参考与致谢 如何进入 BIOS? 微星(MSI)电脑、主板开启 VT 的方法 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

MkDocs 测试实验室

MkDocs 测试实验室 MkDocs-Lab Mermaid graph TD a1("Collect Voltage vs. QUOT data across skew and temperature") a2("Select RO and define Target QUOT (fix value)" ) a1-->a2 graph LR A[Square Rect] -- Link text --> B((Circle)) A --> C(Round Rect) B --> D{Rhombus} C --> D graph LR A[Start] --> B{Error?}; B -->|Yes| C[Hmm...]; C --> D[Debug]; D --> B; B ---->|No| E[Yay!]; sequenceDiagram Alice->>John: Hello John, how are you? loop Healthcheck John->>John: Fight against hypochondria end Note right of John: Rational thoughts! John-->>Alice: Great! John->>Bob: How about you? Bob-->>John: Jolly good! stateDiagram-v2 state fork_state <<fork>> [*] --> fork_state fork_state --> State2 fork_state --> State3 state join_state <<join>> State2 --> join_state State3 --> join_state join_state --> State4 State4 --> [*] References & Acknowledgements The best MkDocs plugins and customizations MkDocs Plugins Diagrams Original: https://wiki-power.com/ CC BY-NC-SA 4.0 agreement, should be reproduced with attribution.

2025/9/17
articleCard.readMore

Node.js 和 npm 的安装与卸载(MacOS)

Node.js 和 npm 的安装与卸载(MacOS) 安装 http://nodejs.cn/download/ 卸载 通过 homebrew 安装的: brew uninstall node 通过 .pkg 安装包安装的: sudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,share/man/*/node.*} 疑难解答 Q:MacOS 修改用户名后,提示权限不足:EACCES: permission denied A:sudo npm install -g appium --unsafe-perm=true --allow-root ,以非安全模式运行。 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

OSD335x 最小系统的设计

OSD335x 最小系统的设计 TI 的 OSD335x-SM 芯片,是一颗将 Cortex-A8 AM335x 处理器、DDR3 内存、TPS65217C PMIC(电源管理芯片)、TL5209 LDO、所需的被动器件、以及 4KB 的 EEPROM 集成在 BGA 封装内的 SIP(System-in-Package)模组。 OSD335x 的最小系统包括 4 个部分:电源、时钟、复位、烧录调试接口。为了让其更易于使用,还可以加上一对按钮、几颗 LED 和一些外设排针。 电源 输入 VIN_AC:主电源输入(DC5V@2A),根据需要加保险丝、磁珠、二级管、输入保护等。 VIN_USB:USB 电源输入(DC5V@0.5A,通过内部 PMIC 可提高至 1.3A),也作为 USB 2.0 host 的参考电压电流 VIN_BAT:可作为电池输入(使用电池电源,2.75-5.5V)或输出(为电池充电),不可作为事件输入。 输出 SYS_VOUT:等于输入 PMIC 的电压,要注意接在这个引脚上的元器件是能在 3-5V 区间内使用的,因为当电池充电的时候,PMIC 切换不同的电源输入。 SYS_VDD1_3P3V:3.3V 输出,由 TL5209 LDO 提供,并由 PMIC 的 LDO4 使能,作为主电源输出。 SYS_VDD2_3P3V:3.3V 输出,由 PMIC 的 LDO2 提供。 SYS_RTC_1P8V:1.8V 输出,由 PMIC 的 LDO1 提供,也用于驱动 AM335x 内部 RTC。 SYS_VDD_1P8V:1.8V 输出,由 PMIC 的 LDO3 提供。 SYS_ADC_1P8V:1.8V 输出,由 PMIC 的 LDO3 提供,为模拟应用做了滤波,在内部也为 AM335x ADC 供电。 推荐为所有电源输出添加测试点,方便调试。 还有一些为内部供电的引脚:VDDSHV_3P3V、VDDS_DDR、VDD_MPU、VDD_CORE、VDDS_PLL。他们仅供引出测试点测量,但不要引出给外部电路使用。 模拟参考输入与地 OSD335x 有 ADC 接口,如果要使用 ADC,则必须正确使用模拟电源和模拟地。ADC 接口能承受最高 1.8V 的模拟输入(参照 VREFP 引脚)。通常来说,VREFP 可直接连接 SYS_ADC_1P8V,但如果有需要,可以分压到一个更低的电压。 电源管理 在 OSD335x 内部,AM335x 通过 I2C0 与 TPS65217C PMIC 进行通信。 I2C0 内部有 4.7k 上拉电阻,但如果要带设备的话,最好在外部额外添加上拉电阻。 TPS65217C PMIC 可通过 I2C 来设置以下参数: 电池充电电压 充电安全时间控制 Buck/Boost 输出电压 LDO 输出电压 上电 / 掉电时序 过流过温阈值 除了通过 I2C 连接,PMIC 还有些功能引脚需要连接 OSD335x: PMIC_POWER_EN:用于 AM335x 控制 PMIC 上电时序 PMIC_IN_PWR_EN:使能 PMIC 的 buck 和 LDO,给高电平会开始进入上电时序控制 RTC_PWRONRSTN:AM335x RTC 的独立电源复位脚 PMIC_OUT_LDO_PGOOD:LDO1 和 LDO2 的输出状态,高电平输出良好,低电平代表任意一个 LDO 输出异常。 EXT_WAKEUP:外部事件唤醒引脚 PMIC_OUT_NWAKEUP:Host 外部事件唤醒引脚(低电平有效) EXTINTN:AM335x 外部中断输入引脚 PMIC_OUT_NINT:PMIC 终端输出引脚(低电平有效) 电源按键 TPS65217C PMIC 内部有一个低电平有效的复位输入,通过 PMIC_IN_PB_IN 引脚连接在 OSD335x,也可以外接按键。这个输入引脚有 50ms 的去抖动时间,和一个内部上拉电阻。除此之外,这个电源按钮还有以下功能: 当 PMIC_IN_PB_IN 检测到下降沿输入时,PMIC 将会从关闭或睡眠模式中唤醒 当 PMIC_IN_PB_IN 保持低电平超过 8 秒时,PMIC 会重新上电/复位 如果 PMIC_IN_PB_IN 引脚长时间保持低电平,器件将继续在 ACTIVE 和 RESET 状态之间循环,每 8 秒进入复位。 电源指示灯 我们使用 SYS_VDD2_3P3V(150mA) 作为电源指示灯的输出。 复位 OSD335x 有几种复位方式: 冷复位(上电复位):在设备上电和电源域上电时进行 热复位 是部分复位,不影响全局逻辑 是为了减少复位恢复时间 OSD335x 有 3 个复位输入(与 AM335x 上的复位输入同名): PWRONRSTN:冷复位;在上电期间需要保持低电平,直到所有输入电源线都稳定为止;不可阻塞,除了 RTC 外,整个系统都会收到影响。 WARMRSTN:热复位;一些 PRCM(电源、复位和时钟管理)和控制模块寄存器对热复位不敏感 RTC_PWRONRSTN:RTC 模块专用的上电复位输入不受冷复位影响,RTC_PWRONRSTN 也不会对设备其他部分产生影响。 时钟 OSC0 与 OSC1 OSD335x 有两个时钟输入: OSC0:高速时钟输入(主时钟),在 19.2MHz、24MHz(推荐)、25MHz 或 26MHz 频率下工作。此时钟源为所有非 RTC 功能提供参考。OSC0 时钟输入拥有 OSC0_IN、OSC0_OUT 和 OSC0_GND 引脚。 OSC1:低速时钟输入,运行在 32.768kHz 下,为 RTC 供电。OSC1 时钟输入拥有 OSC1_IN、OSC1_OUT 和 OSC1_GND 引脚。此时钟源默认失能,非必要输入,如果需要的话,可以接收内部 32kHz RC 晶振信号。 上图中,Rbias 与 Rd 是可选的。如果不能提供准确的频率,Rbias 可用于灵活校准,可以 DNP(可不加进原理图或留空位)。但如果不需要 Rd 的话,必须用导线替代,否则会造成断路。 在参考设计中,OSC0 选用 7A-24.000MAAJ-T 24MHz 晶振,18pF 电容,1MΩ 电阻作为 Rbias。 RTC_KALDO_ENN 引脚默认外部下拉(10k 电阻),用于使能内部 RTC LDO。 烧录调试接口 在参考设计中,使用 JTAG 接口。 https://octavosystems.com/octavosystems.com/wp-content/uploads/2017/07/JTAG.jpg 其他外设 启动配置 启动配置表可参考 AM335x Technical Reference Manual (TRM) 的 SYSBOOT Configuration Pins 章节 在参考设计中,我们这样接: 配置以下参数: 设置时钟频率为 24Mhz 通过 XDMA_EVENT_INTR0 禁用 CLKOUT1 输出,该引脚仅用于 JTAG 仿真。 将启动顺序设置为 SPI0 -> MMC0 -> USB0 -> UART0 用户按键与 LED 外设排针 参考与致谢 SO YOU WANT TO BUILD AN EMBEDDED LINUX SYSTEM? OSD335x-SM System-in-Package Smallest AM335x Module, Quickest Design OSD335x Reference Design Tutorial Series 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

OrCAD 配置与技巧

OrCAD 配置与技巧 注:本文基于 Cadence OrCAD Capture CIS。 基础 绘制原理图使用 OrCAD Capture CIS(开始菜单-》Cadence-》Capture CIS) 一般来说,使用一个 .DSN 文件即可涵括整个工程,打开会自动生成 .opj 等原理图文件。如果使用 git 做版本管理,可以添加以下 gitignore: # From original gitignore  ############# ## Allegro ############# # Ignore log file *.log *.log,1 *.log,2 *.log,3 *.dml *.lst #ignore 记录操作allegro的事件 *.jrl *.jrl,1 *.tag #报告文件 *.rpt #报告文件 *.cfg *.cfg,1 *.lck #报表文件 *.txt *.txt,1 *.txt,2 #XY数据除外 !place_txt.txt #DXF导入文件 *.cnv #Gerber param file除外 !art_param.txt #Folder #过滤整个文件夹 /signoise.run/  ############# ## OrCAD ############# *.dbk *.opj *.DRC *.DSNlck #ignore netlist allegro/  一些设置 DRC 设置: 复制元器件时自动重命名位号: 移动字符时贴近栅格: 坑:当使用 CIP 库,显示 not found in the configured librarie lists 时,要检查路径内空格的编码。 鼠标滚轮缩放:Options - Preferences… - Pan and Zoom - 左右两个 Zoom Factor 设置为 1.1 倍 放置元件时刷新原理图:Options - Preferences… - Miscellaneous - Place Part – 勾选 Refresh part on selection 设置栅格大小:Options - Preferences… - Grid Display - Grid Spacing - 设置为 1/2 快捷键 拉线:W 取消:ESC 拉排线:F4 放置网络标号:N 旋转 / 水平镜像 / 垂直镜像元件:R / H / V 打开 CIS 面板:Z 放置电源 / 地:F / G No connect:X 筛选器:Ctrl + I 多选元素:按住 Ctrl 进行选择 复制并自动增加标号:按住 Ctrl 拖动元器件 以鼠标为重心移动原理图:按住 C,拖动鼠标 放置总线:E 放置文字:T 错误与解决 无法拖动元器件:一般来说,重启能解决问题。 技巧 off-page 与 port 的区别 off-page 一般用于平坦式原理图,而 port 一般用于层次原理图。 DRC 检查 在文件树点击选择整个项目 点击工具栏 Tools - Design Rules Check... 附加勾选 Run Physical Rules、View Output 点击确定,会生成报告并自动打开 参考与致谢 【Cadence 快速入门】一文总结版 OrCAD Capture Tutorial cadence 软件用于高分屏笔记本时候显示字体模糊问题解决

2025/9/17
articleCard.readMore

Pattern Syntax Notes 🚧

Pattern Syntax Notes 🚧 This post was originally written in English. A digital pattern file contains mainly 3 parts: Header Statement, Setup Statement and Pattern Module. (Preprocessing statements and Comments are optional). Below is an mostly used example pattern file in .atp format: // example.atp digital_inst = HSDMQ; opcode_mode = single; pinmap_workbook = "..\xx.igxl"; import tset tset1 ; instruments = { (TIC_DATABUS):DigCap 32:format=twos_complement:auto_trig_enable; } vm_vector cpr_test($tset TIC_CLK, TIC_ACK, TIC_REQ_A, TIC_DATABUS) { cpr_test: > tset1 0 X 0 0 .d000000 ; repeat 100 > tset1 0 X 1 1 .rFFFFFF ; > tset1 0 X 0 0 .X ; ((TIC_DATABUS):DigCap = Store) > tset1 0 X 0 0 .V ; // capture HALT > tset1 0 X 0 0 d000000 ; // end } Header Statement Header Statement contains these statements: digital instrument, pin map, compiler control, import tset or label. Here is an example: digital_inst = HSDMQ; // Digital instrument statement opcode_mode = single; // Compile statement import tset tset1, tset1; // import Time sets import subr xxx; // import Subroutines Frequently used parameters: Digital Instrument Statements digital_inst: hsdm(HSD1000, UltraPin800), hsdmq(UltraPin1600), hsdp(UltraPin2200) ... Pin Map Specifications: pinmap_workbook: IG‑XL workbook name, such as "xxx.igxl" sheetname: Pin Map sheet name, such as "pinmap" Compiler Control Statements compressed: yes or no opcode_mode: single or dual or quad(UltraPin1600), every 1/2/4 vectors can include an opcode. save_comments: yes or no version: such as V1.0 Tset and Label Tset: import tset tset1, tset2, ... ; Label: import label label1, label2, ... ; Setup Statement Setup Statement contains pin setup, instruments, scan pin. pin_setup = { gpio_1 2x; //Pin setup: gpio_1 set to 2X mode } instruments = { vcc:DCVS 1; // DCVS instrument tdo:DigCap 32:format=twos_complement:auto_trig_enable; // DigCap instrument } scan_pins = { tdi, tdo; // tdi - scan in, tdo - scan out } Frequently used parameters: Pin State Characters and Microcodes Pin State Characters: 0(Drive Low), 1(Drive High), 2(Drive High Voltage only for UP800), L(Expect Low), H(Expect High), M(Expect Mid-band), V(Expect Valid), X(Mask), W(Window Strobe), D(Drive ADS (DigSrc/MTO)), I(Drive inverse ADS (DigSrc/MTO)), E(Expect ADS (DigSrc/MTO)), C(Expect inverse ADS (DigSrc/MTO)), -(Repeat previous state). DigCap Microcodes: Trig(Start a capture), Store(Store a data sample), Trig, Store(Combination of Trig and Store), Store, Inst_Cond_Strobe(Store and gate the internally generated condition signal to be acted on). Pattern Module A pattern module contains pin list and a set of vectors. There are 2 types of it: vector memory (VM) and memory (SRM): vm_vector [module-name] (pin-list) { vectors } srm_vector [module-name] (pin-list) { vectors } At least 1 pattern module is required in a pattern file. If more than 1, their colummns and pin lists need to be the same. Frequently used parameters: pin-list Pin Items: pin-or-group[.modifier][:radix], radix could be :S(Symbolic, default), :B(Bin), :D(Dec), :O(Oct), :H(Hex) Label: tbd

2025/9/17
articleCard.readMore

Personal Onboarding Workflow (Windows)

Personal Onboarding Workflow (Windows) This post was originally written in English. Settings Initialization Bring up Windows without Microsoft account. Open diagnosis (for dev version). Check for system and driver update System Settings System Multitasking Don't show Edge tabs Display Night Light Remote Desktop - on Personalization Dark theme Background & Lockscreen Taskbar Privacy & security Search permissions - off For developers - on Windows Update Other Settings Ultimate Performance (powershell - powercfg -duplicatescheme e9a42b02-d5df-448d-aa00-03f14749eb61) File Explorer Sidebar NVIDIA and Intel driver settings Language format / time / typing Edge: enable parallel downloading Disable hibernate: powercfg /hibernate off frp Software Install Executable HuoRong Security Synology Drive (with settings) Visual Studio Code Insiders (with settings) (Only for Matebook) Huawei PC Manager (with settings) Logi Options+ (with settings) Powertoys (with backup) Wechat (with settings) Git GitHub Desktop Portable (Sync with Synology Drive) 0_init Clash HiBitUninstaller Win10Apps DriverBooster Altsnap WPD Dism++ HEU KMS Activator OInstall Snipaste PicGo Bamboo SumatraPDF JPEGView Telegram Peazip (with File associations and system menu integration) DeepL Microsoft Store (Only for Matebook) Intel® Graphics Command Center (Beta) Software Uninstall Onedrive (by HiBit Uninstaller) Unnecessary Windows apps (by Win10Apps) Original: https://wiki-power.com/ CC BY-NC-SA 4.0 agreement, should be reproduced with attribution.

2025/9/17
articleCard.readMore

PlatformIO — 一站式嵌入式开发工具

PlatformIO — 一站式嵌入式开发工具 —— 搭建一站式开发环境,替代 Keil / Arduino IDE 背景 PlatformIO 是一个强大的一站式工具,来看看它的特点: 跨平台,仅需 Python 环境(意味着可以在 Windows/MacOS/Linux 上使用) 在 VSCode 内可作为插件安装使用(终于可以抛弃 Keil 了) 强大的生态: 800+ 常用的开发板:你能买到的通用开发板,这儿基本上都有 35+ 开发平台:覆盖 Atmel AVR(Arduino)/ ESP / NXP / 8051 / PIC32 / FPGA / FreeRTOS / ARM(STM32) 等等 20+ 框架:Arduino / CMSIS / STM32Cube 等等 带编译 / 下载 / 调试 / 串口监视器功能,且支持各式各样的编译器 / 调试器 提供各式各样的功能库 代码自动补全、语法检查、多项目管理、适配主题 远程开发功能(未尝试) 单元测试(未尝试) 命令行和 GUI 环境都有 总之,是时候抛弃各类 IDE(如 Arduino IDE / Keil / IAR),享受一条龙服务了。 下载安装 首先,确保你的电脑有 VSCode(VSCode 的下载安装可以跳转 这篇文章 在 拓展 (Ctrl + Shift + X) 内搜索并安装 Python 和 PlatformIO IDE. 插件安装成功后,点击 重新加载 启动插件,然后泡一杯咖啡,待其自动安装核心组件 platformIO-core(首次安装时间可能会比较长) 安装完成后,单击侧边栏相关的按钮,即可启动 PlatformIO. 参考与致谢 PlatformIO PlatformIO Docs ussserrr/stm32pio 用 VS Code 作为 STM32 开发平台(platformIO) PlatformIO IDE(VSCode) - stm32cube 框架的工程 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

PlatformIO 搭配 CubeMX 食用

PlatformIO 搭配 CubeMX 食用 背景 在 上一篇文章 中,我们可以看到,PlatformIO 用起来比 Keil 优雅多了。 在这篇文章中,我将介绍一种独特的方法,让 PlatformIO 配合 CubeMX 食用起来更加美味。 初始化项目 太长不看:我把以下步骤创建的项目文件夹放在 这个仓库,直接克隆即可。 CubeMX 的初始化操作 新建项目 选择 MCU 型号 配置 Pinout & Configuration 配置 RCC(选外部 / 内部时钟,视情况可略) 配置 SYS(将 DEBUG 选项由 No Debug 修改为 Serial Wire) 配置 Clock Configuration 配置 Project Manager Project 页面 1. 填写项目名称 (Project Name) e.g. Template_of_PlatformIO_with_CubeMX 2. 修改项目路径 (Project Location) e.g. D:/Desktop 3. 将工具链(Toolchain / IDE)修改为 Other Toolchains Code Generator 页面 1. 将软件包选项(STM32Cube Firmware Library Package)选择为 Copy only the necessary library files 2. 在文件生成选项(Generated files)勾选 Generate peripheral initialization as a pair of '.c/.h' files per peripheral 终于配置完成了,我们点击右上角 Generate Code 生成代码吧。 PlatformIO 的初始化操作 打开 PlatformIO 的主页 点击 New Project 新建工程 填写工程的名字。注意:一定要与 CubeMX 中配置的相同!(e.g. Template_of_PlatformIO_with_CubeMX) 选择板子 / MCU 型号。这儿可以直接选择 MCU 的型号(e.g. STM32F103C8),也可以直接选择版型(e.g. BluePill F103C8)。注意:一定要与 CubeMX 中配置的相同! 代码框架 Framework 选择 STM32Cube 将路径 Location 下 Use default location 取消掉,我们自定义路径。注意:一定要与 CubeMX 中配置的相同!(e.g. D:/Desktop) 打开项目中 platformio.ini 文件,添加如下几行: [platformio] include_dir=Inc src_dir=Src 这里是因为 PlatformIO 与 CubeMX 默认生成的框架文件夹不一样,为了兼容性,我们顺从 CubeMX. 可以将项目中的 include 文件夹删了。而因为 Windows 文件命名不区分大小写,所以 src 文件夹顺理成章变为 Src. 尽情享用吧! 项目中, .c 存放于 Src 文件夹中,.h 在 Inc 中。 /* USER CODE BEGIN */ 与 /* USER CODE END */ 之间的代码,后续从 CubeMX 生成的过程中,都将得以保留,不会被覆盖掉。 PlatformIO 可以用快捷键 Ctrl + Alt + B 编译,用 Ctrl + Alt + U 编译并上传,按 F5 开启调试。 接下来的探索,就是 HAL 库的学习了。未完待续 ~ 参考与致谢 STM32CubeMX 系列教程 03_创建并生成代码工程 STM32CubeMX 系列教程 06_Project Manager 工程管理器详细说明 用 VS Code 作为 STM32 开发平台(PlatformIO) 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

ROS入门笔记

ROS入门笔记 本教程基于 ROS2 Foxy,Ubuntu20.04。 ROS 环境安装 设置 UTF-8 编码 sudo locale-gen en_US en_US.UTF-8 sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 export LANG=en_US.UTF-8 设置软件源 sudo apt update && sudo apt install curl gnupg2 lsb-release curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add - sudo sh -c 'echo "deb [arch=$(dpkg --print-architecture)] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" > /etc/apt/sources.list.d/ros2-latest.list' 安装 ROS2 sudo apt update sudo apt install ros-foxy-desktop 设置环境变量 source /opt/ros/foxy/setup.bash 安装自动补全工具 sudo apt install python3-argcomplete 安装成功后的测试 运行 Talker: source /opt/ros/foxy/setup.bash ros2 run demo_nodes_cpp talker 打开一个新的命令行窗口,运行 Listener: source /opt/ros/foxy/setup.bash ros2 run demo_nodes_py listener 如果想卸载 ROS sudo apt remove ros-foxy-* && sudo apt autoremove 随后检查~/.bashrc  以及/opt / 目录是否有 ros 文件夹存在。 ROS2 环境配置 source /opt/ros/foxy/setup.bash 设置完成后的检查: printenv | grep -i ROS 小海龟仿真器 安装 sudo apt update sudo apt install ros-foxy-turtlesim 检查是否安装成功: ros2 pkg executables turtlesim 启动海龟模拟器 ros2 run turtlesim turtlesim_node 想要让小海龟动起来,可以打开一个新的命令行窗口,输入命令: ros2 run turtlesim turtle_teleop_key 按命令行中的提示即可实现操控。 安装 rqt 工具 sudo apt update sudo apt install ~nros-foxy-rqt* 启动 rqt 工具 首先,要确保有一只小海龟在后台运行。在命令行输入: rqt 唤醒 rqt 工具,依次打开 Plugins > Services > Service Caller,点击刷新按钮,即可看到所有服务。 选择 /spawn 服务,填写小海龟的名字(例如 'GuaiGuai')和位置,就可以多生成一只海龟。如果要修改其轨迹的颜色形状,可以修改 /set_pen 服务的内容。 控制新生成海龟的运动,可以通过以下命令(注意海龟的名字): ros2 run turtlesim turtle_teleop_key --ros-args --remap turtle1/cmd_vel:=guaiguai/cmd_vel 参考与致谢 ROS2 入门教程 ——2. Ubuntu20.04 安装 ROS2 Foxy ROS2 入门教程 ——3. ROS2 环境配置 ROS2 入门教程 ——4. 小海龟仿真器基础使用

2025/9/17
articleCard.readMore

RSS - 高效率的阅读方式

RSS - 高效率的阅读方式 RSS 的全称是「简易内容聚合」(Really Simple Syndication),是一个能让你在一个地方订阅各种感兴趣网站的工具。 简单地说,当关注的作者在自己的平台(可以是博客、公众号、知乎等)写了一篇文章,RSS 就会将其推送给我阅读。 一个网站支持 RSS,就意味着每当它新发布一篇新文章,就会往一个位于特定网址的文件中,以特定的语法(具体而言是 XML 标记语言或 JSON)增加一条记录,列明这篇文章的标题、作者、发表时间和内容(可以是全文,也可以是摘要)等信息。这样,用户只要搜集所有他感兴趣的网站提供的这种文件的网址,并不时检查这些文件内容的更新,就能知道这些网站是否、何时发布了什么内容。RSS 阅读器的核心功能,就是存储用户订阅的 RSS 地址,以固定的频率自动检查更新,并将其内容转换为易读的格式呈现给用户。 为什么用 RSS 1. 方便 当我关注的人变多了,我不必一一点开知乎、简书、甚至翻看博客去主动获取更新,而是在一个统一的终端内阅读。 2. 信息权 RSS 的对立面是算法推荐,像微信公众号、知乎、微博、今日头条等平台。 且不说算法推送平台广告多,迁移麻烦的问题。算法推荐的特点是,你不需要刻意选择,算法会根据你的喜好,给你推送内容。这样一来,你几乎没有选择的余地,在不断被「喂饱」中逐渐失去判断的能力。更可怕的地方在于,它替你定义了你的画像,然后把你潜移默化中变成了它所认为的你。「大数据杀熟」的东窗事发绝非偶然,用算法窥视用户隐私是当今互联网公司的通配。 做信息的主人,而不是奴隶。RSS 是一种公开的协议,可自由更换平台与客户端。重要的一点是,获取信息的权力完全自治。RSS 相比算法推荐,拥有了可控性和安全感,隐私完全掌握在自己手里。 3. 去中心化 发布在需要备案的平台的文章(公众号、微博、知乎等),常常会因为涉敏而被删除。为了信息的自由流动,我们有必要采用去中心化的方式,即作者们自建的平台。而 RSS 会将分散的内容收集起来,并呈现给你阅读。 开始 RSS 阅读 1. 获取内容的 RSS 源 以 Inoreader 为例,最简单的方法是,拷贝博客的地址,并粘贴进 Inoreader 的搜索框,一般可以直接订阅。 判断一个网站是否有 RSS,如果打开就看到这个标识: 则可以直接点击此图标,并直接订阅 RSS 链接。 这时候我们可以用一款叫 RSS+ 的浏览器插件: 先安装 油猴插件 ,这里需要科学上网。 再安装 RSS+ 脚本 此时,如果网站有 RSS,可在右下角小圆圈里发现。 而对无 RSS 的网站,可以自己制作 RSS,这里推荐几个工具: feed43 RSSHub FeedOcean 以上的工具,不仅可以订阅无 RSS 的博客,还能直接订阅知乎专栏、公众号、微博、贴吧等。具体方法参见文档。 2. 选择一个 RSS 阅读器 Inoreader 免费版基础功能完善,抓取时间大概 15 分钟,符合要求。有网页版、iOS(需要美区 App Store 账户)、Android 版本。 Reabble 基于 Inoreader API ,为电子墨水屏阅读而生。建议升级收费版(年费 ¥21,免费版 7 篇文章 / 天,且不支持推送) 我设置每天 9 点定时推送新文章至 Kindle 阅读,也方便标注 & 导出书摘。 若想在电脑上阅读,也可以直接打开 reabble.com ,创建桌面快捷方式,界面比 Inoreader 简洁且无广告。 订阅一些有意思的源 注:RSS 并不适合订阅新闻类网站,刷新太快、内容繁琐反而导致阅读体验不佳。所以 RSS 更适合订阅高质量博客之类的网站。订阅源并不是越多越好,应该小而精。过多的订阅源会引起「信息过载」,你会发现自己每天都收到数以百计的新资讯,却无暇阅读。 我导出了自己的订阅源,可以参考一下: 我的订阅 .opml 文件。 2023 年 4 月补充:搭建自托管 RSS 聚合器的方法:Homelab - 自托管 RSS 聚合器 FreshRSS。 FAQ Q:RSS 阅读会不会被时代淘汰? 总结 引用「notajerk」的话结尾: 在网上获取信息时,可以中二一点把自己想象成古代听取群臣意见的帝王。对于皇帝来说,最危险和最不该做的事情就是暴露自己的喜好,这是被臣下蒙蔽乃至最后被夺权篡位的基础。英明的皇帝会保持内心的虚静无为(客观中立),坚持单独听取各方意见而不暴露自己的感想,并将各方意见与客观事实一一验证来确认各自的可信度。这也是几千年后每个人获取信息时应该坚守的原则。挑选信息来源也是最值得花时间的地方。 参考与致谢 使用 RSS 可以做什么你未曾想过的事 怎样查找一个网站的 RSS 地址?用 RSS + ! RSS 工具大全 【RSS】我的 RSS 使用介绍 自制全文 RSS 汇总(附 推荐工具) 论 RSS 的「复兴」 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

RaptorDVR - 集成稳压的 30 A 双电机驱动 🚧

RaptorDVR - 集成稳压的 30 A 双电机驱动 🚧 RaptorDVR 是一款能驱动 30 A 电流的直流减速双电机驱动板,上面也集成了 5 V/5 A 稳压电源,供树莓派和单片机主控板等外设使用。 特性 驱动类型:双路全桥 MOS 管驱动 外部输入电压:3.5-28 V(待测试) 电机驱动电流(单路):15 A 电路保护:30 A 保险丝(LED 显示保险丝状态) 硬件设计 全桥驱动 电源稳压 示例程序 参考与致谢 Hercules Dual 15A 6-20V Motor Controller 105010000 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

RobotCtrl - STM32 通用开发套件

RobotCtrl - STM32 通用开发套件 项目仓库:linyuxuanlin/RobotCtrl RobotCtrl - STM32 通用开发套件包含三块板子: RobotCtrl_Core - 核心板 RobotCtrl_Core - 外设拓展板 RobotCtrl_Power - 电源供电板 设计需求 注:以下为设计摘要,具体内容请跳转相关文章。 RobotCtrl_Core 的设计思路 RobotCtrl_Core 核心板的原理图设计包括供电电路、单片机最小系统、USB 通信、B2B 连接器、用户按键与 LED 部分。 供电电路采用的是 LDO,其优势是电路相对简单、输出纹波小、低成本、layout 面积小。加上相应的去耦电容与电源指示灯,将 USB 端口或 B2B 连接器输入的 5V 电压稳压转换为 3.3V(最大电流为 1A)。 在最小系统的设计中,电源为 3.3V 电源输入,并加相应的电容去耦。另外,ADC 专用电源 VDDA 通过一个 120Ω 的磁珠连接至 VDD,并增加额外的去耦电容。复位电路增加外部按键,触发 NRST 引脚低电平使系统复位。时钟电路增加 HSE 外部高速时钟,从 OSC_IN 与 OSC_OUT 引脚外接无源晶振。启动模式默认选择从片上 Flash 存储器启动,即 BOOT0 为低,BOOT1 为任意电平,使用 10k 电阻将 BOOT0 拉低至地。下载调试电路直接将 SW 接口(DIO/CLK)引出。 USB 通信电路的设计,STM32F4 有内置 USB 外设。外部选用的是 USB Micro 座子,数据线上串联 10Ω 的限流电阻,分别在信号线和电源线上加 TVS 和 ESD 二极管,满足 EMC 需求。 B2B 连接器用于与 RobotCtrl_Func 之间的电源供应与数据通信。在本设计中,两个 B2B 连接器足够将 STM32F407ZE 单片机的所有 IO 都引出,增强了后期的拓展性。 RobotCtrl_Func 的设计思路 RobotCtrl_Func 的原理图设计主要包含串口通信(RS-232/TTL)、CAN 通信、以太网通信、姿态传感器、超声波接口、红外测距接口(带光耦隔离)、蜂鸣器、SW 下载调试接口、用户按键与 LED、通用 GPIO 接口、电源、B2B 连接器等模块。 串口通信电路提供 TTL 和 RS-232 电平接口。其中,TTL 直接引出 USART1 和 UART5 的 TX/RX 引脚使用,而 RS-232 通信电路是采用 TTL 转 232 电平的芯片,将单片机的 TTL 转换为 RS-232 电平。为提高 EMC 性能,DB9 座子外壳连接引脚可对地接 TVS 二极管,TTL 转 232 芯片需要外加电源去耦与自举电容。 CAN 通信电路基于 CAN 收发芯片搭建,通过 CAN 差分电平传输。CAN 总线上需加 120Ω 末端电阻,以匹配阻抗,减少信号的反射。 以太网通信基于以太网 PHY 芯片,使用 RMII 接口与单片机通信,通过内置隔离变压器的 RJ45 网口外接网线通信。以太网电路的时钟采用外部 25M 无源晶振,且需要独立供电以减小电源干扰,这里使用了与核心板相同的低压差线性稳压器供电方案,为以太网电路单独供电。 四路红外测距传感器接口电路因红外传感器使用的是 12V 供电与信号(NPN 常开型),所以从 RobotCtrl_Power 引出 12V 为其供电,并加上四路光耦隔离芯片,以传输高低电平信号。光耦隔离电路的设计,需要根据电流的大小,计算限流电阻的阻值,确保在数据手册规定的触发电压范围内即可。姿态传感器模块的设计,采用 MPU6050 模块,预留 I2C 接口与单片机进行通信。 RobotCtrl_Power 的设计思路 RobotCtrl_Power 原理图设计主要由 XT60 双电源输入、24V 转 12V、24V 转 5V 稳压电路,以及使能开关与电源指示灯、防反接、防过压电路等部分组成。 电源输入采用两个 XT60 座子并联,其中一个端子用于电源输入,另一个端子可外接备用电源,也可以作为电池电源输出供外部使用。 防反接电路采用 MOS 管防反接设计。正常连接电源的情况下,MOS 导通;反接则截止,保护电路。在本设计中,选用了国产 P-MOS 做防反接,并用电阻分压和稳压二极管锁定正向导通时的门极电压。为实现防过压与 ESD 防护,在电源输入端并联 TVS 二极管。 稳压 12V/5V 电路的设计,选用了基于 LMR14050 的 Buck 非隔离开关稳压方案。根据 Buck 拓扑的原理与稳压芯片数据手册的参考,分别挑选反馈电阻的阻值,计算比例使输出保持为 12V/5V。在选择电感的型号时,需要注意最大饱和电流需要大于脉动电流,且留足余量;二极管选择肖特基二极管以实现高速开关,其电压和电流也需要满足电路的需求。此外,输入和输出都需要并联大小去耦电容,以滤除纹波。 使能开关可控制稳压输出的开启与关闭,接入 Buck 芯片的使能引脚以实现稳压输出的软开启与软关断。电源指示灯可向用户指示 12V/5V 稳压的输出状态。 参考与致谢 本项目是我个人的毕业设计,在项目的设计焊接调试中遇到了诸多大大小小的问题,在导师、同事、朋友们的鼎力相助下,最终得以成功完坑,也拿到了优秀毕设的荣誉,谢谢你们! 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

RobotCtrl_Core - 核心板

RobotCtrl_Core - 核心板 项目仓库:linyuxuanlin/RobotCtrl/RobotCtrl_Core 项目在线预览: 注:项目包含于 RobotCtrl - STM32 通用开发套件。 原理图设计 RobotCtrl_Core 的主要功能如下: 供电稳压电路(5V 转 3.3V,引出测试点) 单片机最小系统 电源电路(供电去耦、ADC 模拟电源) 复位电路(外部复位按键) 时钟电路(HSE 无源晶振) 下载调试接口(SW) 启动模式(选择从主闪存存储器启动) USB 供电与通信电路(USB-Micro) B2B 连接器(引出所有 IO) 板载外设 供电电路 RobotCtrl_Core 可由 USB 接口或 B2B 连接器输入 5V 电源,并转换为 3.3V 供单片机核心及板载外设使用。稳压电路使用了 LDO(AMS1117-3.3,最大电流为 1A),附带了一颗电源指示灯,并预留了关键测试点。 LDO 的基础原理可以参考文章 电源拓扑 - 线性稳压。 单片机最小系统 单片机最小系统的设计,分为几个部分:供电、复位、下载调试、时钟、启动模式。基础知识可参考文章 如何设计一款单片机的最小系统 和 STM32F4 硬件开发。 电源电路 去耦电容: VDD:总的一个 10 μF 的陶瓷电容,外加每个 VDD 引脚旁接一个 100 nF 陶瓷电容。 VDDA:100 nF 陶瓷电容 + 1 µF 陶瓷电容。 VCAP 电容 各对地接一个 2.2 µF 陶瓷电容。 复位电路 启用电源监控器,即 PDR_ON 通过 120Ω 电阻上拉。除此之外,也添加了复位按键,带硬件防抖。 时钟电路 外部高速时钟(HSE)选用村田 8M 无源晶振。 下载调试接口 本设计直接引出下载调试接口,不需要外部上拉/下拉电阻(因为 STM32 内部有集成)。 启动模式 选择从主闪存存储器启动,即 BOOT0 串接 10 K 的下拉电阻,BOOT1 任意。 USB 供电与通信电路(USB-Micro) STM32 有内置 USB 外设,只需要直接引出接口(在 STM32F07ZE 芯片上是 PA11 和 PA12)就可以实现 USB 通信。 USB 接口也支持了外部供电功能(VUSB)。 B2B 连接器 B2B 连接器选用正点原子的 3710 系列,RobotCtrl_Core 核心板使用一对 3710M060037G3FT01(公座),RobotCtrl_Func 拓展板使用一对 F060037G0FR01(母座)进行配合。一对 B2B(共 120 pin)足以将 STM32F407ZE 的所有 IO 完全引出使用,最大化利用了系统资源。 B2B 连接器的相关资料请参考 3710F 端子资料 用户按键与 LED 为了能够进行简单的验证调试,RobotCtrl_Core 板载了一颗用户按键与一颗用户 LED,按键配置为 GPIO 输入模式、内部上拉,并加一个 MLCC 电容以硬件抖动。LED 配置为 GPIO 输出模式,引脚置高电平点亮,中间串联一个电阻以限流。 具体引脚请参考原理图。 硬件测试 电源测试需要在 USB 座子接入 5V 供电(或者通过 B2B 连接器通过外设拓展版供电),在 3.3V 的测试点测得相应电压即可。实际测试为 3.32V,验证通过。 功能测试通过烧录初始程序(用户按键控制用户 LED),测试上电及程序的烧录、复位按键与用户按键、电源 LED 与用户 LED、USB 功能。在实际的测试中,初始程序可正常通过 ST-Link 烧录进单片机核心板。复位按键可正常复位系统;在测试程序中,可以通过用户按键点亮/关闭用户 LED;上电时,电源 LED 正常亮起。USB 功能测试,使用的是 USB 虚拟串口的程序,打开串口工具(波特率任意),发送任意字符,将返回相同字符,测试通过。 参考与致谢 STM32 的 PDR_ON 引脚,比较好的解释(转载+补充) 正点原子【STM32-F407 探索者】第五十六章 USB 读卡器(Slave)实验 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

RobotCtrl_Func - 外设拓展板

RobotCtrl_Func - 外设拓展板 项目仓库:linyuxuanlin/RobotCtrl/RobotCtrl_Func 项目在线预览: 注:项目包含于 RobotCtrl - STM32 通用开发套件。 原理图设计 RobotCtrl_Func 的主要功能如下: 12V 电源输入,5V 电源输入 / 输出,3.3V 电源输出(引出测试点) 5V 转 3.3V 供电稳压电路 * 2(供传感器 / 以太网,引出测试点) 以太网通信电路 CAN 通信电路 * 2 串口通信电路(RS-232 与 TTL 电平) 蜂鸣器电路 用户按键 * 2 用户 LED * 3 MPU6050 姿态传感器模块 红外测距传感器接口 * 4 超声波接口 * 5 用户 GPIO 接口 * 6 B2B 连接器(引出所有 IO) SW 下载接口 电源 RobotCtrl_Func 板载 2 路 LDO,原理与 RobotCtrl_Core 中相似,其中一路供外设传感器使用,另一路供以太网电路单独使用。 以太网通信电路 以太网通信基于以太网 PHY 芯片,使用 RMII 接口与单片机通信,通过内置隔离变压器的 RJ45 网口外接网线通信。以太网电路的时钟采用外部 25M 无源晶振,且需要独立供电以减小电源干扰,这里使用了与核心板相同的低压差线性稳压器供电方案,为以太网电路单独供电。以太网通信的原理可以参考文章 HAL 库开发笔记 - 以太网通信(LwIP)。 CAN 通信电路 CAN 通信电路基于 CAN 收发芯片搭建,通过 CAN 差分电平传输。CAN 协议控制器(例如单片机)通过串行线(RX/TX)连接到收发器,在收发器上转换为 CAN 信号(CANH/CANL),并通过 RS 引脚来选择高速 / 静音模式。CAN 总线上需加 120Ω 末端电阻,以匹配阻抗,减少信号的反射。CAN 通信的原理可参考文章 通信协议 - CAN 与 HAL 库开发笔记 - 串口通信。 串口通信电路 RobotCtrl_Func 板载了 RS-232 电平的串口通信电路,并额外引出了 TTL 电平的 USART1/UART5。串口通信的原理可参考文章 通信协议 - 串口通信 与 HAL 库开发笔记 - 串口通信。 RS-232 通信电路是采用 TTL 转 232 电平的芯片,将单片机的 TTL 转换为 RS-232 电平。为提高 EMC 性能,DB9 座子外壳连接引脚可对地接 TVS 二极管,TTL 转 232 芯片需要外加电源去耦与自举电容。 蜂鸣器电路 蜂鸣器电路选用的是 12V 蜂鸣器,用一个三极管即可控制。 用户按键与 LED 用户按键与 LED 原理可参考 RobotCtrl_Core,此处不多赘述。 姿态传感器模块 直接贴装 MPU6050 模块使用,预留 I2C 接口与单片机进行通信。I2C 通信的原理可参考文章 通信协议 - I2C 与 HAL 库开发笔记 - I2C 通信(MPU6050)。 红外测距传感器接口 四路红外测距传感器接口电路因红外传感器使用的是 12V 供电与信号(NPN 常开型),所以从 RobotCtrl_Power 引出 12V 为其供电,并加上四路光耦隔离芯片,以传输高低电平信号。光耦隔离电路的设计,需要根据电流的大小,计算限流电阻的阻值,确保在数据手册规定的触发电压范围内即可。光电耦合器的原理可以参考文章 基本元器件 - 光电耦合器。 电源输入接口与 B2B 连接器 外设拓展板的电源输入接口为 4 个排针,用于与底部的电源供电板相连接。B2B 连接器用于为主控板供电及数据通信。 硬件测试 电源测试 电源输入(以下测试项目都需按照此操作连接电源): VCC_12V:通过 P1 输入。 VCC_5V:通过 P2 或 J1_1/2 输入。 GND:通过 P3、P4、J1_31/32 或 J2_30/31 与外界共地。 5V 转 3.3V 稳压(供传感器): VCC_3V3S:测量 C30 两端电压是否为 3.3V。 5V 转 3.3V 稳压(供以太网): VCC_3V3E:测量 C26 两端电压是否为 3.3V。 板载传感器测试 用户按键: 配置 PE2/PE3 为 GPIO 上拉输入模式,按下按键读取到低电平,松开为高。 用户 LED: 配置 PC6/PC7/PC8 为 GPIO 输出模式,输出高电平,LED 依次点亮;输出低电平熄灭。 MPU6050 姿态传感器模块: 测量 M1 模块 1 号引脚对地是否为 VCC_3V3S 电压。 测试 IO 引脚连通性。 蜂鸣器: 测量 BUZZER1 正极对地是否为 VCC_12V 电压。 配置 PC9 为 GPIO 输出模式,输出高电平,蜂鸣器发出声音;输出低电平不发出声音。 串口转 RS232: 测量 C3 两端是否为 VCC_3V3S 电压。 运行测试程序,通过 PB10/PB11 引脚进行测试。 CAN 总线通信: 测量 C10/C13 两端是否为 VCC_5V 电压。 运行测试程序(回环测试),通过 PD0/PD1、PB12/PB13 引脚进行测试。 以太网通信: 测量 IC2_9 对地是否为 VCC_3V3S 电压。 测量 VDD1A/VDD2A 对地是否为 VCC_3V3E 电压。 运行测试程序,通过 RMII 接口对以太网通信进行测试。 接口测试 红外测距传感器接口: 分别测量 J16/J17/J18/J19 座子的 1 号引脚对地是否为 VCC_12V 电压。 配置 PF2/PF3/PF4/PF5 为 GPIO 下拉输入,外部使得 IR1/IR2/IR3/IR4 分别为高电平(VCC_12V),则 PF2/PF3/PF4/PF5 读取到高电平;反之为低电平。 超声波接口: 分别测量 J3/J4/J5/J6/J7 座子的 4 号引脚对地是否为 VCC_3V3S 电压。 测试 IO 引脚连通性。 用户 GPIO 接口: 分别测量 J9/J10/J11 座子的 4 号引脚对地是否为 VCC_3V3S 电压。 测试 IO 引脚连通性。 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

RobotCtrl_Power - 电源供电板

RobotCtrl_Power - 电源供电板 项目仓库:linyuxuanlin/RobotCtrl/RobotCtrl_Power 项目在线预览: 注:项目包含于 RobotCtrl - STM32 通用开发套件。 原理图设计 RobotCtrl_Power 的主要功能如下: 24V 电源输入(理论可以 15-40V) 电池电源转 12V/5A 稳压器(带使能开关与指示灯) 电池电源转 5V/5A 稳压器(带使能开关与指示灯) 防反接保护(P-MOS) 过压保护(大于 30V 开始保护) 电池电源输出、12V 电源输出、5V 电源输出接口 电源输入 电源输入选用了两个 XT60PW-M 座子,做双电源备份输入(也可以作为一个输入一个输出使用),并提供两排排针供输出测试。 防反接功能使用 P-MOS 实现,虽然 XT60 是防呆设计,但还是需要防止正负电源线焊反的情况。反接时,P-MOS 不会导通,电源不会灌入系统。防反接功能的设计可参考文章 防反接电路的设计。 瞬时过压保护与 ESD 防护,使用的是 TVS 管,当接入大于 30V 时,它将分走多余的电压保护后置系统。 12V 与 5V 稳压电路 12V 与 5V 稳压电路选用的是两路 TI 的 LMR14050 DC-DC Buck 方案,每一路最高能带 5A 电流。具体设计可参考文章 电源方案(Buck)- LMR14050。 另外,每一路都增加了使能开关和电源指示灯。 电源输出端口 VBAT、12V、5V 输出各自使用一对 4pin 排针,12V 输出额外增加 KF2EDGR-3.81 座子为特殊传感器提供供电。 PCB 设计 RobotCtrl_Power 的 PCB layout,需要注意反馈网络的上下分压电阻需要尽量靠近芯片的 FB 引脚,Vout 采样路径应尽量原理噪声产生路径(电感二极管环路),最好是通过过孔走屏蔽层后的层;电感应该靠近 SW 引脚放置,以降低磁噪声和静电噪声;二极管、输入和输出电容的接地节点应尽可能小,最好是仅在一个点连接到系统阶地层,以最大限度减少系统接地层中的传导噪声;输出电容应尽量靠近电感和二极管的节点放置,且走线尽可能短而粗,以降低传导和辐射噪声,提高效率。 RobotCtrl_Power 的 PCB 顶层和底层走信号和电源,中间插入两层地平面以增强信号与电源完整性。 硬件测试 防反接测试:输入电压反接时是否可不开启系统。 使能开关与电源指示灯:测试是否可以正常运行。 输出:测试 12V/5V 输出是否达标,以及纹波大小。 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

STM32CubeIDE 串口重定向(printf)及输出浮点型

STM32CubeIDE 串口重定向(printf)及输出浮点型 重定向 printf 至串口 usart.c /* USER CODE BEGIN 0 */ #include "stdio.h" /* USER CODE END 0 */ /* USER CODE BEGIN 1 */ //_write 函数在 syscalls.c 中, 使用 __weak 定义, 所以可以直接在其他文件中定义 _write 函数 __attribute__((weak)) int _write(int file, char *ptr, int len) { int DataIdx; for (DataIdx = 0; DataIdx < len; DataIdx++) { while ((USART1->SR & 0X40) == 0); //等待发送完毕 USART1->DR = (uint8_t) *ptr++; } return len; } /* USER CODE END 1 */ STM32CubeIDE 串口输出浮点型 在 STM32CubeIDE 侧栏选中工程,右键选择 Properties - C/C++ Build - Settings - MCU GCC Linker - Miscellaneous。 在 Other flags 栏添加一个项目,填 -u_printf_float。 重新编译即可。 HAL_UART_Receive_IT 乱码问题 将 HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer, 10,0xFFFF); 的字长(10)改为 1 即可。 参考与致谢 STM32CubeIDE 实现 printf 重定向输出到串口 STM32CubeIDE 之 printf 重定向及串口(uart)输出浮点型数据的修改 再次质疑 HAL_UART_Receive_IT 函数 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

STM32F4 硬件开发

STM32F4 硬件开发 本篇文章将会对 STM32F4 的 MCU 最小系统(电源、时钟、复位、启动模式、调试管理)展开讲解。 电源 STM32F4 的正常工作电压是 1.8-3.6 V(在某些情况下可降至 1.7 V 以下,在数据手册有说明),有内置稳压器提供内部 1.2 V 的数字电源。 当主电源 VDD 断电时,可通过 VBAT 的电压为 RTC 和备份寄存器供电。 各引脚的介绍 ADC 电源和参考电压 为了提高转换精度,ADC 配有独立的电源引脚,可单独滤波并屏蔽 PCB 上的噪声。 ADC 电压源从单独的 VDDA 引脚输入。在电路设计时,应该把 VSSA 接到同个供电地,而非 VSS。 如果芯片的封装是 100 引脚以上的,就会有 VREF+ 和 VREF- 引脚,它们的作用是给 ADC 输入外部参考电压。VREF- 要接至内部 VSSA。如果芯片引脚小于 100,那么这两个引脚没有引出,在内部接在了 VDDA 和 VSSA。 后备电池电源 如果需要在 VDD 断电后保留备份寄存器内容,可将 VBAT 连到电池或其他电源。 VBAT 也可为 RTC 供电,由复位模块中内置的掉电复位 (PDR)电路进行控制。 内置稳压器 内置稳压器在复位后始终处于使能态,有三种工作模式: 运行:稳压器为 1.2 V 域(内核、存储器和数字外设)提供全功率电源供应。 停止:稳压器为 1.2 V 域提供低功率电源供应,同时保留寄存器和 SRAM 中的内容。 待机:稳压器掉电。除待机电路和备份域,寄存器和 SRAM 的内容都将丢失。 电路设计 以下是电源引脚的设计方法: VDD 去耦电容:总的一个 10 μF 的陶瓷/钽电容,外加每个 VDD 引脚旁接一个 100 nF 陶瓷电容。 VDDA 去耦电容:100 nF 陶瓷电容 + 1 µF 陶瓷/钽电容。 过滤模拟噪声:可通过磁珠接至 VDD。 VREF+ 去耦电容:如果启用 VREF+ 功能,则需接一个 100 nF 和一个 1 µF 的电容。 过滤模拟噪声:可通过 47 Ω 电阻连至 VDDA。 VBAT:接外部电池(1.65 V-3.6 V)。如果不需要电池电源,则接至 VDD 引脚。 VCAP1/VCAP2:各对地连接一个 2.2 µF 陶瓷电容(ESR < 2 Ω);如果只有 VCAP1,则连一个 4.7 µF 陶瓷电容(ESR < 1 Ω)。 复位与电源监控 上电复位(POR)/ 掉电复位(PDR) STM32F4 芯片中集成 POR/PDR 电路,具体上电 / 掉电复位的特征见上图。如需禁用此功能,可通过 PDR_ON 引脚实现。 系统复位 系统复位的触发条件: NRST 引脚低电平(外部复位) 窗口看门狗计数结束(WWDG 复位) 独立看门狗计数结束(IWDG 复位) 软件复位(SW 复位) 低功耗管理复位 可通过查看控制 / 状态寄存器 (RCC_CSR)中的复位标志确定复位源。 即使不需要外部复位电路,也建议外加一个下拉电容以提高 EMS 性能。 时钟 在 STM32F4 上,可使用三种不同的时钟源来驱动系统时钟(SYSCLK): HSI(高速内部时钟信号) HSE(高速外部时钟信号) PLL 时钟 也有两种次级时钟源: LSI RC(32 kHz 低速内部 RC),用于驱动独立看门狗,也可用于 RTC 停机 / 待机模式下自动唤醒。 LSE(32.768 kHz 低速外部晶振),用于驱动 RTC。 如果需要降低功耗,每个时钟在未使用时都可以单独关闭。 外部高速时钟(HSE) HSE 时钟源可以有两种提供方式:外部源(有源)、外部晶振 / 陶瓷谐振器(无源)。 外部源(HSE 旁路) 如果选择有源外部时钟信号输入,则需提供 1-50 MHz 的时钟源,OSC_IN 连接占空比约为 50% 的外部时钟信号(方波、正弦波或三角波),OSC_OUT 保持高阻态。 外部晶振 / 陶瓷谐振器(HSE 晶振) 如果选用外部晶振,那么频率范围为 4-26 MHz。设计电路时,谐振器和负载电容必须尽可能地靠近振荡器的引脚,以尽量减小输出失真和起振稳定时间。负载电容值必须根据所选振荡器的不同做适当调整。 CL1 和 CL2 应选用大小相同(5-25 pF,典型值 25 pF)的陶瓷电容。 外部低速时钟(LSE) LSE 时钟源可以有两种提供方式:外部源(有源)、外部晶振 / 陶瓷谐振器(无源)。 外部源 (LSE 旁路) 如果选择有源外部时钟信号输入,则需提供 1 MHz 以下的时钟源,OSC32_IN 连接占空比约为 50% 的外部时钟信号(方波、正弦波或三角波),OSC32_OUT 保持高阻态。 外部晶振 / 陶瓷谐振器(LSE 晶振) 如果选用外部晶振,那么频率范围为 32.768 kHz,可作为 RTC 的时钟源。设计电路时,谐振器和负载电容必须尽可能地靠近振荡器的引脚,以尽量减小输出失真和起振稳定时间。负载电容值必须根据所选振荡器的不同做适当调整。 启动模式 启动模式也叫自举模式。可通过 BOOT0 和 BOOT1 引脚来共同选择三种不同的启动模式:从主闪存存储器启动、从系统存储器启动、从内置 SRAM 启动。 启动模式的详细介绍请见文章 STM32 的启动模式 一般情况下,我们在 BOOT0 串接 10 K 的下拉电阻,BOOT1 任意即可。如果需要模式切换,那么可以参照以下的设计: 调试管理 STM32 一般使用 SWJ 协议进行下载调试。 SWJ 调试端口 STM32F4 内置 SWJ(SW/JTAG)接口。其中,SW-DP 是 2 引脚(时钟 + 数据),JTAG-DP 是 5 引脚,他们有些引脚是复用的。详细区别请见文章 SWD 与 JTAG 的区别与联系 在 STM32F4 中,SWJ 的引脚分配如下: JTAG 的内部上下拉 JTAG 引脚不能悬空(因为他们直接连着用于模式调试控制的触发器),所以在芯片内部有集成了对他们的上下拉: JNTRST:内部上拉 JTDI:内部上拉 JTMS/SWDIO:内部上拉 TCK/SWCLK:内部下拉 软件释放 JTAG 的 I/O 后,可以作为普通的 I/O 口使用。 连接标准 JTAG 座的硬件设计 参考设计 参考与致谢 AN4488: Getting started with STM32F4xxxx MCU hardware development 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

STM32 的启动模式

STM32 的启动模式 STM32 提供了 BOOT1 与 BOOT0 引脚,可以通过设置引脚的状态,以选择上电复位后的启动模式。 以下为三种启动模式: 1. 从主闪存存储器启动 BOOT0 BOOT1 低 任意 从片上 Flash 存储器启动(就是参数为 64K / 128K / 256K 的 Flash),一般正常情况下是这样配置的。 2. 从系统存储器启动 BOOT0 BOOT1 高 低 使用串口 / ISP 下载程序时,需要配置这种模式。 3. 从内置 SRAM 启动 BOOT0 BOOT1 高 高 从内置 SRAM 启动,用途有两个: 用于反复下载调试时,提高效率(因为下载到 Flash 相对慢)。需要注意的是,断电程序将丢失 用于解除芯片的读保护功能 / 擦除 Flash 恢复出厂 补充 以上图表中 高 低 表示接 10K 电阻上拉 / 下拉,而非直连 VCC / GND 参考与致谢 STM32 BOOT0、BOOT1 的配置 STM32 BOOT 模式配置以及作用 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

SWD 与 JTAG 的区别与联系

SWD 与 JTAG 的区别与联系 众所周知,SWD 和 JTAG 是单片机下载程序与调试的常用接口。其共同之处: 供电电压范围: 1.2 V - 5.5 V 时钟速率: 可配置高达 10 MHz SWO 跟踪捕获: 数据速率高达 50 Mbit/s(UART/NRZ 模式) 隔离电压: 1 kV 热插拔:支持 JTAG JTAG,全名为 Joint Test Action Group(联合测试行动小组)。截至本文最新的标准为 IEEE Standard 1149.1-1990. 其拓扑图(菊花链)如下: JTAG 一般使用 5 个引脚: TDI(Test Data In):串行输入引脚 TDO(Test Data Out):串行输出引脚 TCK(Test Clock):时钟引脚,一般附加 100k 下拉电阻 TMS(Test Mode Select):模式选择(控制信号)引脚 TRST(Test Reset):复位引脚 JTAG 的优势: 不限于 ARM 系列芯片 具有更多用于编程,调试和生产测试的用途 SWD 全称为 Serial Wire Debug(串行线调试),是 ARM 专门设计的协议,仅支持 ARM(所以在 ARM 系列单片机中性能表现较佳)。 SWD 一般使用 2 个引脚: SWDIO(Serial Wire Data Input Output):串行数据输入输出引脚 SWCLK(Serial Wire Clock):串行线时钟引脚 SWD 的优势: 使用引脚更少,只需 SWDIO 和 SWCLK 两个引脚 SWD 具有特殊功能,例如打印调试信息 与 JTAG 相比,SWD 在速度上具有更好的整体性能 JTAG 与 SWD 的兼容性 一般来说,单片机板子上会有以下这些烧录座,可同时兼容 JTAG 与 SWD: TCK 兼容 SWCLK TMS 兼容 SWDIO (TDO 兼容 SWO) 选用 SWD 而非 JTAG 的理由: 电路原理图设计需要足够简单,且可以在没有 JTAG 功能的情况下进行测试 PCB 在尺寸方面有限制,SWD 可以节省空间 MCU 已经没有多余的引脚给 JTAG 用了 参考与致谢 下载调试接口 SWD 和 JTAG 的区别 Cortex JTAG,SWD Debug Port Sharing JTAG/SWD Interface JTAG 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

StyleTransferCam - 基于 ESP32-S3 的风格迁移相机

StyleTransferCam - 基于 ESP32-S3 的风格迁移相机 当艺术与技术交汇,一幅新的世界在我们面前展开,这是一场视觉上的奇妙盛宴,也是一份无限可能的探索。StyleTransferCam 是一个基于 ESP32-S3 的风格迁移相机。它使用的是一种叫「风格迁移」的机器学习技术,当你按下板载按钮时,它将拍下当前的景色,并与一张预设的风格模板照片混合(可以是梵高的「星空」),生成一张别具匠心的作品。 StyleTransferCam 大致由以下几个流程组成: 按下板载按钮 - 拍摄照片 - 上传到后端服务器上(也可以是 PC 或旧手机)。 自动启动风格迁移的 Python 程序,对照片进行处理,并输出风格化的照片。 如果 ESP32-S3 有附带 TFT 屏幕的话,也可以回传屏幕显示出来。 测试板载按钮与 LED 首先是一个简单的 Arduino 程序,用于测试板载按钮与 LED 能否正常使用。程序中设置了硬件中断,捕捉按钮按下的事件,点亮 LED 半秒后自动熄灭。 Onboard-Key-ctrl-LED_interrupt.ino #define ONBOARD_KEY 47 // 板载按钮 #define ONBOARD_LED 21 // 板载 LED volatile bool buttonPressed = false; // 按钮下降沿中断标志位 void setup() { pinMode(ONBOARD_LED, OUTPUT); pinMode(ONBOARD_KEY, INPUT); Serial.begin(115200); attachInterrupt(digitalPinToInterrupt(ONBOARD_KEY), buttonInterrupt, FALLING); } void loop() { if (buttonPressed) { digitalWrite(ONBOARD_LED, HIGH); delay(500); digitalWrite(ONBOARD_LED, LOW); Serial.println("buttonPressed"); buttonPressed = false; // 重置中断标志位 } } void buttonInterrupt() { buttonPressed = true; // 设置下降沿中断标志位 } 使用按钮拍摄照片并上传 接下来,我们编写一个 Arduino 程序,使用板载按钮控制 ESP32-S3 拍摄一张照片,并将其上传到指定的网络位置。这个网络位置在代码中的 serverName = "http://192.168.31.2:9000/upload" 进行设置,需要修改为你后端服务器的地址。我们用的是一个后端 Python 文件上传服务(会在接下来的步骤中说明),而这里需要修改为运行这个服务的机器 IP 地址。(9000 与 /upload 在下文的 receive-photo.py 程序中设置) Capture-and-Upload.ino #include "esp_camera.h" #include <WiFi.h> #include <HTTPClient.h> // 用于上传照片的服务器地址 const char *serverName = "http://192.168.31.2:9000/upload"; // // WARNING!!! PSRAM IC required for UXGA resolution and high JPEG quality // Ensure ESP32 Wrover Module or other board with PSRAM is selected // Partial images will be transmitted if image exceeds buffer size // // You must select partition scheme from the board menu that has at least 3MB APP space. // Face Recognition is DISABLED for ESP32 and ESP32-S2, because it takes up from 15 // seconds to process single frame. Face Detection is ENABLED if PSRAM is enabled as well // =================== // Select camera model // =================== #define PWDN_GPIO_NUM -1 #define RESET_GPIO_NUM -1 #define XCLK_GPIO_NUM 45 #define SIOD_GPIO_NUM 1 #define SIOC_GPIO_NUM 2 #define Y9_GPIO_NUM 48 #define Y8_GPIO_NUM 46 #define Y7_GPIO_NUM 8 #define Y6_GPIO_NUM 7 #define Y5_GPIO_NUM 4 #define Y4_GPIO_NUM 41 #define Y3_GPIO_NUM 40 #define Y2_GPIO_NUM 39 #define VSYNC_GPIO_NUM 6 #define HREF_GPIO_NUM 42 #define PCLK_GPIO_NUM 5 #define ONBOARD_KEY 47 // 板载按钮 #define ONBOARD_LED 21 // 板载 LED volatile bool buttonPressed = false; // 按钮下降沿中断标志位 #include "DFRobot_AXP313A.h" DFRobot_AXP313A axp; // =========================== // Enter your WiFi credentials // =========================== const char *ssid = "WiFi_SSID"; const char *password = "********"; void startCameraServer(); void setup() { pinMode(ONBOARD_KEY, INPUT); pinMode(ONBOARD_LED, OUTPUT); attachInterrupt(digitalPinToInterrupt(ONBOARD_KEY), buttonInterrupt, FALLING); Serial.begin(115200); Serial.setDebugOutput(true); Serial.println(); while (axp.begin() != 0) { Serial.println("init error"); delay(1000); } axp.enableCameraPower(axp.eOV2640); // 设置摄像头供电 camera_config_t config; config.ledc_channel = LEDC_CHANNEL_0; config.ledc_timer = LEDC_TIMER_0; config.pin_d0 = Y2_GPIO_NUM; config.pin_d1 = Y3_GPIO_NUM; config.pin_d2 = Y4_GPIO_NUM; config.pin_d3 = Y5_GPIO_NUM; config.pin_d4 = Y6_GPIO_NUM; config.pin_d5 = Y7_GPIO_NUM; config.pin_d6 = Y8_GPIO_NUM; config.pin_d7 = Y9_GPIO_NUM; config.pin_xclk = XCLK_GPIO_NUM; config.pin_pclk = PCLK_GPIO_NUM; config.pin_vsync = VSYNC_GPIO_NUM; config.pin_href = HREF_GPIO_NUM; config.pin_sscb_sda = SIOD_GPIO_NUM; config.pin_sscb_scl = SIOC_GPIO_NUM; config.pin_pwdn = PWDN_GPIO_NUM; config.pin_reset = RESET_GPIO_NUM; config.xclk_freq_hz = 20000000; config.frame_size = FRAMESIZE_UXGA; // 照片分辨率。这里默认为 FRAMESIZE_UXGA config.pixel_format = PIXFORMAT_JPEG; // for streaming // config.pixel_format = PIXFORMAT_RGB565; // for face detection/recognition config.grab_mode = CAMERA_GRAB_WHEN_EMPTY; config.fb_location = CAMERA_FB_IN_PSRAM; config.jpeg_quality = 0; // 63; // 照片质量。这里默认为 12 config.fb_count = 1; /* FRAMESIZE_QVGA (320 x 240) FRAMESIZE_CIF (352 x 288) FRAMESIZE_VGA (640 x 480) FRAMESIZE_SVGA (800 x 600) FRAMESIZE_XGA (1024 x 768) FRAMESIZE_SXGA (1280 x 1024) FRAMESIZE_UXGA (1600 x 1200) */ // if PSRAM IC present, init with UXGA resolution and higher JPEG quality // for larger pre-allocated frame buffer. if (config.pixel_format == PIXFORMAT_JPEG) { if (psramFound()) { config.jpeg_quality = 0; // 63; // 照片质量。这里默认为 10 config.fb_count = 2; config.grab_mode = CAMERA_GRAB_LATEST; } else { // Limit the frame size when PSRAM is not available config.frame_size = FRAMESIZE_UXGA; // 照片分辨率。这里默认为 FRAMESIZE_SVGA config.fb_location = CAMERA_FB_IN_DRAM; } } else { // Best option for face detection/recognition config.frame_size = FRAMESIZE_UXGA; // FRAMESIZE_240X240; #if CONFIG_IDF_TARGET_ESP32S3 config.fb_count = 2; #endif } #if defined(CAMERA_MODEL_ESP_EYE) pinMode(13, INPUT_PULLUP); pinMode(14, INPUT_PULLUP); #endif // camera init esp_err_t err = esp_camera_init(&config); if (err != ESP_OK) { Serial.printf("Camera init failed with error 0x%x", err); return; } sensor_t *s = esp_camera_sensor_get(); // initial sensors are flipped vertically and colors are a bit saturated if (s->id.PID == OV3660_PID) { s->set_vflip(s, 1); // flip it back s->set_brightness(s, 1); // up the brightness just a bit s->set_saturation(s, -2); // lower the saturation } // drop down frame size for higher initial frame rate if (config.pixel_format == PIXFORMAT_JPEG) { s->set_framesize(s, FRAMESIZE_QVGA); } #if defined(CAMERA_MODEL_M5STACK_WIDE) || defined(CAMERA_MODEL_M5STACK_ESP32CAM) s->set_vflip(s, 1); s->set_hmirror(s, 1); #endif #if defined(CAMERA_MODEL_ESP32S3_EYE) s->set_vflip(s, 1); #endif WiFi.begin(ssid, password); WiFi.setSleep(false); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); startCameraServer(); Serial.print("Camera Ready! Use 'http://"); Serial.print(WiFi.localIP()); Serial.println("' to connect"); digitalWrite(ONBOARD_LED, LOW); } void loop() { // Do nothing. Everything is done in another task by the web server // delay(10000); // 按钮按下后的逻辑 if (buttonPressed) { digitalWrite(ONBOARD_LED, HIGH); delay(300); digitalWrite(ONBOARD_LED, LOW); // 拍摄照片 camera_fb_t *fb = esp_camera_fb_get(); if (!fb) { Serial.println("获取摄像头帧缓冲失败"); return; } // 建立HTTP客户端 HTTPClient http; // 将照片上传到服务器 http.begin(serverName); http.addHeader("Content-Type", "image/jpeg"); int httpResponseCode = http.POST(fb->buf, fb->len); if (httpResponseCode > 0) { Serial.printf("照片上传成功,服务器返回代码:%d\n", httpResponseCode); // 再闪一下提示上传成功 digitalWrite(ONBOARD_LED, HIGH); delay(300); digitalWrite(ONBOARD_LED, LOW); } else { Serial.printf("照片上传失败,错误代码:%s\n", http.errorToString(httpResponseCode).c_str()); } http.end(); // 释放帧缓冲 esp_camera_fb_return(fb); // delay(1000); // 等待 1 秒后才可再次拍摄和上传 buttonPressed = false; // 重置中断标志位 } } void buttonInterrupt() { buttonPressed = true; // 设置下降沿中断标志位 } 接收照片上传的服务 在这里我们使用 Python 的 flask 库搭建一个接收照片上传的 HTTP 服务器。 receive-photo.py from flask import Flask, request import subprocess app = Flask(__name__) @app.route('/upload', methods=['POST']) def upload(): try: image = request.data # 保存照片到指定目录 with open('base.png', 'wb') as f: f.write(image) print("照片已保存,正在渲染中……") # 启动风格迁移的 python 脚本 subprocess.run(['python', './style_transfer.py']) return "照片上传成功", 200 except Exception as e: print("照片上传失败:", str(e)) return "照片上传失败", 500 if __name__ == '__main__': app.run(host='0.0.0.0', port=9000) 先不要急着运行程序,style_transfer.py 是风格迁移的程序,将会在下一个步骤展示。这个程序的逻辑是,如果成功接收了 ESP32-S3 传回来的照片,就会使用 subprocess 自动调起运行风格迁移的脚本。 需要注意的是,如果程序出现异常,提示端口被占用,你可以试试将 port=9000 换一个值。 风格迁移的程序 在 receive-photo.py 相同的目录下,我们使用 TensorFlow 编写一个风格迁移的 Python 程序。首先安装程序所需的依赖(国内的网络环境导致 TensorFlow 很难下载,需要多一些耐心),然后在相同目录下准备一张待风格化的照片,将其命名为 base.png;还有一张风格参考的图片,命名为 style_reference.png,这副图片可以是一副艺术画,比如梵高的「星空」: 接下来,编写风格迁移的程序: style_transfer.py from IPython.display import Image, display import numpy as np import tensorflow as tf from tensorflow import keras from tensorflow.keras.applications import vgg19 base_image_path = "./base.png" # 待风格迁移的图片地址 style_reference_image_path = "./style_reference.png" # 风格样式图片地址 result_prefix = "img_generated" # 各部分损失的权重设置 total_variation_weight = 1e-6 style_weight = 1e-6 content_weight = 2.5e-8 # 生成图片的尺寸 width, height = keras.preprocessing.image.load_img(base_image_path).size img_nrows = 400 img_ncols = int(width * img_nrows / height) # 通过下面命令查看要进行风格迁移的基本图片和样式参考图片 display(Image(base_image_path)) display(Image(style_reference_image_path)) # 图像预处理 def preprocess_image(image_path): # 利用Keras库函数的来打开图片,调整图片大小并将其格式化为适当的张量 img = keras.preprocessing.image.load_img( image_path, target_size=(img_nrows, img_ncols) ) img = keras.preprocessing.image.img_to_array(img) img = np.expand_dims(img, axis=0) img = vgg19.preprocess_input(img) return tf.convert_to_tensor(img) def deprocess_image(x): # 再利用函数将张量转换为有效图像 x = x.reshape((img_nrows, img_ncols, 3)) # 通过平均像素去除零中心 x[:, :, 0] += 103.939 x[:, :, 1] += 116.779 x[:, :, 2] += 123.68 # 'BGR'->'RGB' x = x[:, :, ::-1] x = np.clip(x, 0, 255).astype("uint8") return x # 图像张量的gram矩阵(特征矩阵和特征矩阵转置的乘积) def gram_matrix(x): x = tf.transpose(x, (2, 0, 1)) features = tf.reshape(x, (tf.shape(x)[0], -1)) gram = tf.matmul(features, tf.transpose(features)) return gram # “风格损失”旨在保持生成图像中参考图像的样式。 # 它基于的gram矩阵(样式提取)来自样式参考图像 # 和从它生成的图像的特征图 def style_loss(style, combination): S = gram_matrix(style) C = gram_matrix(combination) channels = 3 size = img_nrows * img_ncols return tf.reduce_sum(tf.square(S - C)) / (4.0 * (channels ** 2) * (size ** 2)) # 辅助损失函数设计来是为了 # 维护生成的图像中的基本图像的内容 def content_loss(base, combination): return tf.reduce_sum(tf.square(combination - base)) # 第三个损失函数是总变化损失, # 设计此函数是为了使生成的图像保持局部连贯。 def total_variation_loss(x): a = tf.square( x[:, : img_nrows - 1, : img_ncols - 1, :] - x[:, 1:, : img_ncols - 1, :] ) b = tf.square( x[:, : img_nrows - 1, : img_ncols - 1, :] - x[:, : img_nrows - 1, 1:, :] ) return tf.reduce_sum(tf.pow(a + b, 1.25)) # 接下来,让我们创建一个特征提取模型,该模型检索VGG19的中间激活(根据名字制成字典)。 # 替换为你本地下载的权重文件路径 weights_path = "./dependencies/vgg19_weights_tf_dim_ordering_tf_kernels_notop.h5" # 建立一个加载了已经训练好的ImageNet的权重的VGG19模型 model = vgg19.VGG19(weights=weights_path, include_top=False) # 获取每个“关键”层的符号输出(我们给它们指定了唯一的名称)。 outputs_dict = dict([(layer.name, layer.output) for layer in model.layers]) # 建立一个模型,以返回VGG19中每层的激活值(以字典的方式)。 feature_extractor = keras.Model(inputs=model.inputs, outputs=outputs_dict) # 最后,这是计算样式转移损失的代码。 # 用于样式丢失的图层列表。 style_layer_names = [ "block1_conv1", "block2_conv1", "block3_conv1", "block4_conv1", "block5_conv1", ] # 用于内容丢失的层。 content_layer_name = "block5_conv2" def compute_loss(combination_image, base_image, style_reference_image): input_tensor = tf.concat( [base_image, style_reference_image, combination_image], axis=0 ) features = feature_extractor(input_tensor) # 初始化损失 loss = tf.zeros(shape=()) # 加入内容丢失 layer_features = features[content_layer_name] base_image_features = layer_features[0, :, :, :] combination_features = layer_features[2, :, :, :] loss = loss + content_weight * content_loss( base_image_features, combination_features ) # 加入风格损失 for layer_name in style_layer_names: layer_features = features[layer_name] style_reference_features = layer_features[1, :, :, :] combination_features = layer_features[2, :, :, :] sl = style_loss(style_reference_features, combination_features) loss += (style_weight / len(style_layer_names)) * sl # 加入总变化损失 loss += total_variation_weight * total_variation_loss(combination_image) return loss # 将tf.function装饰器添加到损耗计算和梯度计算中,使在编译过程中能运行更快 @tf.function def compute_loss_and_grads(combination_image, base_image, style_reference_image): with tf.GradientTape() as tape: loss = compute_loss(combination_image, base_image, style_reference_image) grads = tape.gradient(loss, combination_image) return loss, grads # 重复执行批量梯度下降步骤,以最大程度地减少损失,并每100次迭代保存生成的图像。 # 每100步将学习率降低0.96。 optimizer = keras.optimizers.SGD( keras.optimizers.schedules.ExponentialDecay( initial_learning_rate=100.0, decay_steps=100, decay_rate=0.96 ) ) base_image = preprocess_image(base_image_path) style_reference_image = preprocess_image(style_reference_image_path) combination_image = tf.Variable(preprocess_image(base_image_path)) iterations = 4000 for i in range(1, iterations + 1): loss, grads = compute_loss_and_grads( combination_image, base_image, style_reference_image ) optimizer.apply_gradients([(grads, combination_image)]) if i % 100 == 0: print("Iteration %d: loss=%.2f" % (i, loss)) img = deprocess_image(combination_image.numpy()) fname = result_prefix + "_at_iteration_%d.png" % i keras.preprocessing.image.save_img(fname, img) # 经过 4000 次迭代,输出结果: display(Image(result_prefix + "_at_iteration_4000.png")) 现在,你可以试试单独运行这个 Python 程序,如果程序没有报错,等上一小会儿(具体时间取决于你电脑的性能),你就可以在当前目录下找到阶梯次风格迁移迭代后的照片了。 如果这个程序能正常运行,你可以直接运行 receive-photo.py,使用自动化的方式接收来自 ESP32-S3 拍摄的照片,直接生成风格化的照片。 参考与致谢 风格迁移 TensorFlow 实现 神经风格迁移 摄像头使用 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

SwiftCtrl - 蓝牙手柄

SwiftCtrl - 蓝牙手柄 SwiftCtrl 是一款基于 Arduino 的蓝牙(HC-06)遥控手柄,提供双摇杆、两个按钮的控制,以及 OLED 显示的功能。 项目仓库:linyuxuanlin/SwiftCtrl 项目在线预览: 基本参数 主控:基于 Arduino Nano(ATmega328) 传感器电压:3.3V 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

T-Clock 桌上小钟

T-Clock 桌上小钟 准备材料 NodeMCU:基于 ESP8266 OLED:128x64 分辨率,I2C 接口(SPI 请见参考链接) 接线 OLED NodeMCU GND GND VCC 3.3V SCL D1 SDA D2 例程 API 配置 在 心知天气 注册账户 在控制台内添加新产品(选择免费版即可) 复制 API 私钥 包含库文件 Adafruit_SSD1306.h 最终例程 T-Clock/Software/Codes/Weather_Clock_OLED_I2C 注:需将 WiFi 名称及密码、城市、私钥改为你自己的。 #error("Height incorrect, please fix Adafruit_SSD1306.h!");,则需打开库文件 Adafruit_SSD1306.h,将 #define SSD1306_128_32 改为 #define SSD1306_128_64。 注:定制硬件项目正在路上~ 参考与致谢 T-Clock 桌上小钟(旧) 心知天气 ESP8266 接入心知天气 API【程序+详细讲解】 ESP8266 + OLED = 网络时钟和未来 3 日天气预报 My_ESP8266/心知天气 OLED Graphic Display Interfacing with NodeMCU adafruit/Adafruit_SSD1306 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

THE Hack 2019 黑客马拉松

THE Hack 2019 黑客马拉松 前言 THE Hack 2019 创客马拉松比赛在上交大举办,我和小伙伴们参加了这次比赛,在经历了 36 小时的艰难构想后,最终取得全场第 8 名和 Ruff 单项奖的成绩。 项目历程 今年的比赛有不同的 topics,我们一开始选择了智能家居的方向,打算做宿舍相关的智能家居套件,后来还是选择了 如何让科技上的弱势群体也能享受科技的乐趣 这个 topic。有负责产品的小哥哥和小姐姐一起组队,我们今年的视角变得更广,不只是从技术,而是从心理学和用户需求出发,分析 topic,思考评委和赞助商更看重的是什么。 我们今年的项目名称是 AIO - Care,是一款基于主动学习模型的智慧助老平台。我所负责的是硬件部分的简单实现,通过一些传感器的联动,为服务端采集数据,用以分析并服务于老年人,为他们提供更舒适的居家养老体验。 产品的理念和方向由作为产品经理的 Amihua Lau 和 Ada 负责,他们在这个方面做得很棒。除此之外,Amihua Lau 还负责了机器学习的算法和 PPT 的制作;而 Ada 作为 Human Resource,也为我们小队拉到了许多的帮助和建议(这直接决定了我们产品的方向),也为我们薅来了数不清的零食和饮料,为我们提供了强大的后勤保障。他们负责的方面我望尘莫及,作为团队的 Leader 当之无愧。除此之外,也感谢隔壁朋友队里的翁艺林,为我们产品建了 3D 模型。 我负责产品硬件的简单实现,代码已开源至 GtiHub ,基于 Arduino ,很简单的一个 Demo,就不展开说了。 相较前年的比赛,只是从技术出发;这一次的项目,我们把完整的商业模型和盈利模式都做了出来。我们开始了解这种比赛的套路,并从优秀的团队项目中吸取了很多经验。这只是一个开始,相信明年的 Hackathon 我们能取得更好的成绩。 在这类型的比赛里,人文关怀的方向永远吃香;从赞助商的角度出发,永远比技术的高级程度重要得多。36 个小时的比赛历程,技术开发只能做出简单的 Demo;而对产品的渲染与包装,才能够独树一帜。薄积而厚发,把产品的创意和理念展现在赞助商面前,这才是这类比赛拿奖的套路。 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Test Interface 与 TIC 基础

Test Interface 与 TIC 基础 在半导体测试中,TIC(Test Interface Controller,测试接口控制器) 是一个总线主控器,它遵循的是 AMBA(Advanced Microcontroller Bus Architecture,高级微控制器总线架构) 规范中的 Test Interface 协议。AMBA 是嵌入式微控制器的片上通信标准,囊括三类总线协议: AHB(the Advanced High-performance Bus,高性能总线) ASB(the Advanced System Bus,系统总线) APB(the Advanced Peripheral Bus,外设总线) 因 AMBA 的理念在于对系统中的单个模块进行隔离测试,每个模块的测试仅依赖于总线接口,需要一种测试方法来对未连接到总线的外设的输入输出进行测试。 这种测试方法可通过 Test Interface 实现。它采用简单的三线握手机制,以控制 Vector 的读写;同时,它使用 EBI(External Bus Interface,外部总线接口) 作为数据路径,以将外部的 Vector 导入内部总线。 Test Interface 的引脚 由上图可见,Test Interface 的引脚由三个部分组成: 一个时钟引脚 TCLK 三个控制引脚 TREQA,TREQB 和 TACK 一个 32 位的测试总线 TBUS[31:0] 在最小配置下,Test Interface 只需要 TREQA 和 TACK 作为 专用引脚,用于控制测试模式的进入与退出。其他引脚可以通过复用设备上的引脚来实现。 TREQA/TREQB(Test Bus Request,测试总线请求) 是 输入 信号。在系统正常运行其间,TREQA 用于请求进入测试模式,从而允许 Vector 被加载进来。在测试过程中,TREQA 与 TREQB 一同使用,以指示下一个 Cycle 将使用的 Vector 类型。 TACK(Test Bus Acknowledge,测试总线确认) 是一个 输出 信号,用于表示总线的状态,也指示一个测试项何时完成。当 TACK 输出低电平时,表示当前 Vector 需要更多时间,直到 TACK 变为高电平。只有当 TACK 为高电平时,TREQA/TREQB 才会对外部控制信号进行读取。 TCLK(Test Clock) 是一个时钟信号输入。Test Interface 的测试时钟是由外部提供的。在普通模式与测试模式之间切换时,要求 TCLK 时钟无毛刺。 TBUS[31:0](Test Bus) 是一个 32 位双向测试接口总线。在输入状态下,它用来传入 Vector Address、Control 信息和执行 Write 操作;在输出状态下,可以用来执行 Read 操作。当需要改变 TBUS 输入输出状态时,测试总线协议确保提供一个用于换向的 Cycle。 当系统正常运行时, Test Interface 受三线控制的真值表如下: TREQA TREQB TACK 状态 0 0 0 正常运行,未进入测试模式 1 0 0 请求进入测试模式 0 1 0 预留,用于外部主机请求 - - 1 已进入测试模式 最初,TREQA 为低电平,表示尚未进入测试模式。当 TREQA 被设置为高电平时,将请求进入测试模式。接着,当 TACK 输出高电平时,表示 TIC 允许进入测试模式。此时,TCLK 成为内部时钟源。一旦进入测试模式,三线上的值与对应的系统状态如下: TREQA TREQB TACK 状态 - - 0 当前操作尚未完成 1 1 1 Address/Control/TurnAround Vector 1 0 1 Write Test Vector 0 1 1 Read Test Vector 0 0 1 退出测试模式 接下来可将 TREQB 设置为高电平,以加载 Address Vector。随后可进行读写操作。当需要退出测试模式时,应先传入一个 Address Vector,确保所有内部传输都已经完成。随后将 TREQA 与 TREQB 都设置为低电平,表示退出测试模式。最终,TACK 会输出低电平,表示已经退出测试模式。 Vector 的类型 Test Interface 中,Vector 有 5 种类型: Address Vector:声明地址的 Vector Write Test Vector:写入的 Vector(0/1) Read Test Vector:读取的 Vector(L/H) Control Vector:控制的 Vector TurnAround Vector:换向 Vector 其中,Address/Control/TurnAround Vector 的触发,均由相同的 TREQA/TREQB 共同值决定。判断 Vector 的类型,可以参考以下的规则: 只出现单条 Address/Control/TurnAround Vector:它就是 Address Vector。 出现连续一串 Address/Control/TurnAround Vector:除了最后一条是 Control Vector,其他全是 Address Vector。 一条 / 多条 Read Vector 之后:总会跟一个 TurnAround Vector。(在 ASB 中是单个,AHB 中需要两个) 除此之外,Burst Vector 是将多个 Write/Read Test Vector 串在一起(注意是同一种类型串,不是混着串)。这样只需要应用一次 Address,可以提高测试速度。这个 Address 可以是一直保持静态的(所有 Vector 使用最初传入的同一个 Address),也可以是递增的 Address(取决于 TIC 是否有已启用的 Address 递增器)。在没有递增器的情况下,将默认采用静态 Address。 Address Vector 在任何 Read/Write 操作之前,必须先传入 Address Vector。它遵循以下规则: 必须将 TREQA/TREQB 都置 1,以指示下一个 Cycle 为 Address Vector。 在下一个 Cycle 时,Address 被加载到 TBUS[31:0] 上。此时 TREQA/TREQB 上的值将共同决定下一个 Cycle 的状态。 在某些高速信号系统中,可能需要连续加载多个 Address Vector(增加足够的时间让 Address 从外部传输到内部 Address 总线)。在这种情况下 TIC 会在第一个 Address Vector 的 TACK 输出 0,以强制加载第二个 Address Vector Cycle。 Control Vector Control Vector 总会跟在一条或一串 Address Vector 之后,它用于更新 TIC 内部的 Control 信息。它遵循以下的规则: 必须将 TREQA/TREQB 都置 1,以指示下一个 Cycle 为 Address Vector。 在下一个 Cycle 时,Address 被加载到 TBUS[31:0] 上。此时 TREQA/TREQB 都仍然保持为 1,Control Vector 将在下一个 Cycle 中出现。 在接下来一个 Cycle 时,Control 信息将被加载到 TBUS[31:0] 上。此时 TREQA/TREQB 上的值将决定下一个 Cycle 的状态。 如果需要设置一个无效的 Control Vector,可以将其第 0 位设置为 0,这样就可以保留但不应用 Control Vector 的信息。 Write Test Vector 在成功进入测试模式并指定 Address 后,就可以进行读写操作了。Write 操作使用的 Address 由前面的 Address Vector 定义。Write Test Vector 可以跟随在以下 Vector 之后: 单一条 Address Vector。 Address/Control Vector 组成的序列。 另一条 Write Test Vector。组成一串 Write Burst。 单次/多次 Read 操作后的 TurnAround Vector。 当传输状态需要延迟时,TACK 会变为低电平。在等待的这段时间内,TREQA/TREQB 需要变化以指定下一个 Vector 的类型,但在 TBUS[31:0] 执行的 Write 操作仍然需要持续,在此时不应进行 Read 操作。 Read Test Vector 与 Write Test Vector 相似,Read 操作使用的 Address 取决于前面的 Vector,可以跟随在以下 Vector 之后: 单一条 Address Vector。 Address/Control Vector 组成的序列。 另一条 Read Test Vector。组成一串 Read Burst。 单次/多次 Write 操作。 在单次或多次 Read 操作后,必须始终要有一个 TurnAround Vector,以防止外部 TBUS 信号发生总线冲突。 TurnAround Vector TurnAround Vector 可用于在 Write/Read 操作间切换时,改变 TBUS 传输的方向。在 Read 操作变为 Write 时,有必要插入 TurnAround Vector。这个操作不会写入新的 Address。 以上是 Test Interface 与 TIC 的一些基础知识。关于 TIC 在 AHB 上的具体运行情况,请参考下一篇文章 AHB 上的 TIC (撰写中……)。 参考与致谢 IHI0011 - ARM advanced microcontroller bus architecture (AMBA) specification.Rev 2.0 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Tester Alarms

Tester Alarms This post was originally written in English. DCVI Alarms Mode (0010) The V/I is programmed to force voltage mode, and reached the current clamp; or is programmed to force current mode, and reached the voltage clamp. Solution: In force voltage mode: check if circuit shorted or has a capacitive load. In force voltage mode: check if circuit opend. Capture (0016) An alarm occurred during a capture. Solution: Check the operation related to the capture.

2025/9/17
articleCard.readMore

TheExec (The Executive) 🚧

TheExec (The Executive) 🚧 This post was originally written in English. TheExec(The Executive) is one of the highest-level objects, which gives access to test executive related properties. Flow TheExec.Flow TestLimit TheExec.Flow.TestLimit(resultVal, lowVal, hiVal, lowCompareSign, highCompareSign, scaletype, unit, formatStr, TName, compareMode, pinName, forceVal, forceunit, customUnit, customForceunit, ForceResults, TNum) Parameters most used: resultVal (required): Which the result value will been written. lowVal, hiVal : The low and high limits. Default is lowVal <= resultVal <= hiVal. unit: The unit of measurement unitAmp unitVolt unitDb unitHz unitTime . TName: A test name to be datalogged. If left blank, test instance's name will be used. pinName: The pin name to be datalogged. forceVal, forceunit: The test condition value and unit. ForceResults: Whether to force a pass or fail or to use the limits specified in a flow table. For an example: TheExec.Flow.TestLimit resultVal:=Vout_Measure, _ unit:=unitVolt, _ Tname:="Output_Voltage", _ pinName:=vout_pin, _ forceval:=vin_pin_voltage, _ forceunit:=unitVolt, _ forceresults:=tlForceFlow, _ lowval:=VOT_LowLimit, _ hival:=VOT_HiLimit

2025/9/17
articleCard.readMore

TheHdw (The Hardware) 🚧

TheHdw (The Hardware) 🚧 This post was originally written in English. TheHdw is an object to access properties and methods related to test system hardware. DCVI TheHdw.DCVI Pins TheHdw.DCVI.Pins(PinList) TheHdw.PPMU 🚧 TheHdw.Digital ApplyLevelsTiming To load the level and timing data. Usage TheHdw.Digital.ApplyLevelsTiming(ConnectAllPins, LoadLevels, LoadTiming, RelayMode, InitPinsHi, InitPinsLo, InitPinsHiZ, PinLevelsSheet, DCCategory, DCSelector, TimeSetSheet, ACCategory, ACSelector, EdgeSetSheet) Parameters ConnectAllPins: Optional Boolean, default as False. True: Connect all device pins. False: Do not connect. LoadLevels: Optional Boolean, default as False. True: Load level values. False: Do not Load. LoadTiming: Optional Boolean, default as False. True: Load timing values. False: Do not Load. RelayMode: Optional tlRelayMode, default as tlUnpowered. Controls the relays' hot switching. tlPowered: Hot switching. Not power down the DUT before setting levels and connecting. tlUnpowered: Avoid hot switching. Power down the DUT before setting levels and connecting. InitPinsHi: Optional String. Set the pins start with high driver state. InitPinsLo: Optional String. Set the pins start with low driver state. InitPinsHiZ: Optional String. Set the pins start with impedance driver state. PinLevelsSheet: Optional String. A Pin Levels sheet. DCCategory: Optional String. DCSelector: Optional String. TimeSetSheet: Optional String. ACCategory: Optional String. ACSelector: Optional String. EdgeSetSheet: Optional String.

2025/9/17
articleCard.readMore

TinyDVR - 小巧身材,满载动力

TinyDVR - 小巧身材,满载动力 —— 基于 TinyDVR Master V1.1 & Slave V7.2 Release TinyDVR 是一款电机驱动套件,包含母板(Master)与子板(Slave),供电部分与驱动部分分离,相比前身 ZenDriver 大幅度缩减了体积,极大提升了可拓展性。你可以根据自己的需求,堆叠不同数量的子板,驱动 n 个电机。 项目仓库:linyuxuanlin/TinyDVR 项目在线预览: TinyDVR_Master: TinyDVR_Slave: 基本参数 输入电压:7.2 ~ 20 V 输出电流:0 ~ 68 A 提供 5V / 3A 的电源输出,可供控制器及其他模块使用 保护装置:集成防反接、光耦隔离电路 电机简便接插:对市面上通用的直流减速电机(带编码器),可直接用 6 pin 排线接插(免对线) 可拓展:一块母板可堆叠 n 块子板,实现 n 路电机驱动 接口定义 TinyDVR Master TinyDVR Slave 背面引脚详解: + :提供 5V / 3A 的电源输出 1 :IN1 端口,输入 PWM 信号 1 2 :IN2 端口,输入 PWM 信号 2 A : 编码器 A 相信号端口 B : 编码器 B 相信号端口 - :GND 使用指南 测试方法 接入 7.2 ~ 20 V 电池供电 在对应的子板处接上电机 用 5V 供电口分别接 IN1/ IN2 端口,此时电机将 正 / 反转 连接单片机 接入 7.2 ~ 20 V 电池供电 在对应的子板处接上电机 共地(驱动板 GND 接单片机 GND) IN1,IN2 端口接单片机对应 PWM 端口(代码内设置) 测试方法:请见项目仓库内的测试例程 花絮 早期子板: 批量焊接: 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

TinyMonitor - 小巧的服务器状态监视器

TinyMonitor - 小巧的服务器状态监视器 TinyMonitor 是一个小巧极简的服务器状态监视终端,它仅由一个 ESP32 主控加上 OLED 显示屏,就可以将服务器的实时状态参数展示出来,方便观察调试。 前期准备 本项目用到的硬件物料非常简单,一个自带 Wi-Fi 蓝牙的 Beetle ESP32-C3,还有一块 128x64 的 OLED 屏。 Beetle ESP32-C3 的引脚定义如下。 因为可以使用软件 I2C 的方式(即自定义 I2C 引脚)驱动 OLED 屏,所以我将 Beetle ESP32-C3 的 0/1 引脚定义为 SCL/SDA 功能。这样一来,接线十分简单,相互贴着把 4 个引脚焊上就完成了。 注:给 Beetle ESP32-C3 烧录程序前,需要先添加 ESP32 的包,以正常识别板子型号。详见其 Wiki 页面。 点亮屏幕 可以使用这个简单的程序,测试能否在 OLED 上正常显示信息: OLED_SoftwareI2C_HelloWorld.ino #include <U8g2lib.h> #define OLED_SDA 1 #define OLED_SCL 0 U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R2, OLED_SCL, OLED_SDA, U8X8_PIN_NONE); void setup(void) { u8g2.begin(); } void loop(void) { u8g2.clearBuffer(); u8g2.setFont(u8g2_font_ncenB08_tr); u8g2.drawStr(0,10,"Hello World!"); u8g2.sendBuffer(); delay(1000); } MQTT 代理服务 MQTT 是一种基于客户端 - 服务器的消息发布 / 订阅传输协议。在本项目中,MQTT 是服务器与 ESP32 通信的桥梁,为了方便,我将 MQTT 服务部署在需要监控的服务器上;如果有需要,你也可以部署在其他的机器上。 部署 Mosquitto 服务 Mosquitto 是一款实现了消息推送协议 MQTT v3.1 的开源消息代理软件,在这里我用的是 Docker 方式部署的 eclipse-mosquitto 作为 MQTT 代理服务器。如果不熟悉 Docker 部署的方式,可以参考文章 Docker 简易指南 与 Docker Compose - 更优雅的打开方式。 根据官方的说明,首先需要创建以下目录和文件供 Mosquitto 使用,并赋予足够的权限:(请将 ${STACK_DIR} 修改为本地存放数据的路径,例如 /DATA/AppData/mosquitto,下文同) mkdir -vp ${STACK_DIR}/{config,data,log} \ && touch ${STACK_DIR}/config/mosquitto.conf \ && chmod -R 755 ${STACK_DIR} \ && chmod -R 777 ${STACK_DIR}/log \ 随后,在 mosquitto.conf 文件中写入以下内容: mosquitto.conf persistence true persistence_location /mosquitto/data log_dest file /mosquitto/log/mosquitto.log # 关闭匿名模式 allow_anonymous false # 指定密码文件 password_file /mosquitto/config/pwfile.conf 使用 docker-compose 方式部署容器: compose.yaml version: "3" services: mosquitto: container_name: mosquitto_app image: eclipse-mosquitto:1.6.14 # 2.x 版本可能兼容性不佳 ports: - "1883:1883" - "9001:9001" volumes: - ${STACK_DIR}/config/mosquitto.conf:/mosquitto/config/mosquitto.conf - ${STACK_DIR}/data:/mosquitto/data - ${STACK_DIR}/log:/mosquitto/log #privileged: true restart: always 进入容器并修改密码: cd 存放compose.yaml的路径 docker compose up docker compose ps # 找到运行的容器的ID docker exec -it 容器ID sh # 进入容器 shell touch /mosquitto/config/pwfile.conf chmod -R 755 /mosquitto/config/pwfile.conf # 创建用户与密码,用户名:test,密码:123 mosquitto_passwd -b /mosquitto/config/pwfile.conf test 123 exit # 退出容器 shell docker restart 容器ID # 重启容器生效 测试 MQTT 服务器的可用性 正常启动了 mosquitto 服务后,我们可以使用 MQTTBox 测试 MQTT 代理服务器的可用性。 安装软件后,点击 Create MQTT Client 新建连接,按照下图填写相关参数: 其中,HOST 为 MQTT 服务所在的服务器的地址(例如,我的服务器在局域网内的地址是 192.168.1.2);用户名和密码需要与上文配置 Mosquitto 时设置的值对应。 点击 Save 保存后,如果在顶部状态栏看到绿色的 Connected,则表示已经连接上服务器。 服务端监控脚本 我们可通过在服务端运行以下 Python 程序,实现对设备实时信息的抓取,并推送到 MQTT 服务器的相应主题上。首先需要安装以下依赖包: pip install paho-mqtt psutil 创建并运行 Python 程序: status-collector.py import paho.mqtt.client as mqtt import psutil import time # 连接到 MQTT 代理服务器 client = mqtt.Client() client.username_pw_set("MQTT用户名", "MQTT密码") client.connect("MQTT服务器地址", 端口号) # 例:client.connect("192.168.1.2", 1883) # 收集服务器状态并发送到 MQTT 主题 while True: client.publish("USAGE_CPU", psutil.cpu_percent()) client.publish("USAGE_MEM", psutil.virtual_memory().percent) client.publish("USAGE_DISK", psutil.disk_usage('/').percent) time.sleep(1) # 每隔一秒发布一次 成功运行后,我们可以在 MQTTBox 顶部状态栏上点击 Add subscriber 添加对这三个主题的订阅,例如: 如果一切正常的话,应该可以在 MQTTBox 中看到不断回传的服务器的状态信息。 Arduino ESP32 显示端 创建以下 Arduino 代码,修改其中的参数,并烧录进 ESP32。如果一切正常的话,应该可以看到不断更新的状态信息。 Received-from-MQTT-and-Display.ino #include <Wire.h> #include <U8g2lib.h> #include <WiFi.h> #include <PubSubClient.h> // 使用软件 I2C 方式连接 OLED,重新定义引脚 #define OLED_SDA 1 #define OLED_SCL 0 // MQTT 定义 #define WIFI_SSID "Wi-Fi名称" #define WIFI_PASSWORD "Wi-Fi密码" #define MQTT_BROKER "MQTT服务器地址" // 例如 192.168.31.2 #define MQTT_PORT MQTT端口 //例如 1883 #define MQTT_USERNAME "MQTT用户名" //test,应与上文配置对应 #define MQTT_PASSWORD "MQTT密码" //123,应与上文配置对应 #define MQTT_TOPIC_CPU "USAGE_CPU" //订阅的主题 #define MQTT_TOPIC_MEM "USAGE_MEM" #define MQTT_TOPIC_DISK "USAGE_DISK" char msg_cpu_usage[10]; char msg_mem_usage[10]; char msg_disk_usage[10]; // 定义 OLED 屏幕对象 U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R2, OLED_SCL, OLED_SDA, U8X8_PIN_NONE); // WIFI 客户端对象 WiFiClient wifiClient; PubSubClient mqttClient(wifiClient); // MQTT 回调函数 void mqttCallback(char* topic, byte* payload, unsigned int length) { if (strcmp(topic, MQTT_TOPIC_CPU) == 0) { // 记录 CPU 使用率 for (int i = 0; i < length; i++) msg_cpu_usage[i] = (char)payload[i]; } else if (strcmp(topic, MQTT_TOPIC_MEM) == 0) { // 记录内存使用率 for (int i = 0; i < length; i++) msg_mem_usage[i] = (char)payload[i]; } else if (strcmp(topic, MQTT_TOPIC_DISK) == 0) { // 记录磁盘使用率 for (int i = 0; i < length; i++) msg_disk_usage[i] = (char)payload[i]; } } void setup() { u8g2.begin(); // 初始化 OLED 屏幕 Wire.begin(); // 开始 I2C 传输 // 连接 WIFI WiFi.begin(WIFI_SSID, WIFI_PASSWORD); while (WiFi.status() != WL_CONNECTED) { delay(1000); } // 连接 MQTT 代理服务器 mqttClient.setServer(MQTT_BROKER, MQTT_PORT); mqttClient.setCallback(mqttCallback); if (mqttClient.connect("ESP32", MQTT_USERNAME, MQTT_PASSWORD)) { mqttClient.subscribe(MQTT_TOPIC_CPU); mqttClient.subscribe(MQTT_TOPIC_MEM); mqttClient.subscribe(MQTT_TOPIC_DISK); } } void loop() { mqttClient.loop(); // 处理 MQTT 消息 u8g2.firstPage(); do { u8g2.setFont(u8g2_font_9x15_tf); // 显示 CPU 使用率 u8g2.setCursor(0, 12); u8g2.print("CPU: "); for (int i = 0; i < 9; i++) u8g2.print(msg_cpu_usage[i]); u8g2.print(" %"); // 显示内存使用率 u8g2.setCursor(0, 35); u8g2.print("Mem: "); for (int i = 0; i < 9; i++) u8g2.print(msg_mem_usage[i]); u8g2.print(" %"); // 显示磁盘使用率 u8g2.setCursor(0, 58); u8g2.print("Disk: "); for (int i = 0; i < 9; i++) u8g2.print(msg_disk_usage[i]); u8g2.print(" %"); } while (u8g2.nextPage()); } 更多扩展玩法 以下的想法有待实现: 增加电池和 3D 打印的外壳,做成更精致的桌面小摆件 增加内网穿透,打造为小挂件,不在家也可观察服务器状态 将 Python 监测程序封装为 Docker 方式部署 优化 UI 布局,实现更多参数监控 增加多服务器状态监控功能 增加某些参数超出阈值报警的功能 附:Beetle ESP32-C3 与 Seeed XIAO ESP32C3 的合照。 参考与致谢 DFRobot Wiki · Beetle ESP32 C3 基于 Arduino 和 MQTT 打造一款树莓派性能监控系统 eclipse-mosquitto Docker - 通过容器安装部署 Mosquitto 服务教程(MQTT 服务器) MQTT 系列教程 3(客户端工具 MQTTBox 的安装和使用) linyuxuanlin/TinyMonitor 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

TinyTimelapseCam - 基于 ESP32-S3 的迷你延时相机

TinyTimelapseCam - 基于 ESP32-S3 的迷你延时相机 这是一个基于 ESP32-S3 的迷你延时相机,你可以用它来拍摄白天的云层飘动、一整晚的斗转星移,也可以用来抓取城市街道上形形色色的人群。 部署网络摄像头 请参考 摄像头使用 章节进行部署,此处不赘述。 测试使用 Python 调用推流 StreamViewer.py # 调用 OpenCV 库 import cv2 # 定义摄像头地址 camera_url = "http://192.168.31.203:81/stream" # 创建VideoCapture对象 cap = cv2.VideoCapture(camera_url) # 检查摄像头是否成功打开 if not cap.isOpened(): print("无法连接到摄像头。请检查摄像头地址或网络连接。") exit() while True: # 读取帧 ret, frame = cap.read() # 检查帧是否成功读取 if not ret: print("无法获取帧。") break # 显示预览画面 cv2.imshow('Camera Preview', frame) # 按下 'q' 键退出预览 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放资源 cap.release() cv2.destroyAllWindows() 需要注意的是,推流的地址是在原 IP 的基础上,加上 :81/stream 后缀。你也可以在网页端显示的实时画面上点击右键,复制推流的地址。 延时相机 如果前面的推流测试成功,就可以尝试以下延时相机的程序了: TimelapseCam.py import cv2 import numpy as np import time import os nframes = 500 # 拍摄多少张照片 interval = 0.00001 # 间隔时间(秒) # 需要改为你的 ESP32 的 IP 地址 cap = cv2.VideoCapture('http://192.168.31.203:81/stream') print("延时相机启动") for i in range(nframes): # 捕获图像帧 ret, img = cap.read() # 保存图像文件 if img is None: print("无法获取图像") else: cv2.imwrite('temp_destination/photos/img_' + str(i + 1000).zfill(4) + '.png', img) # 等待一段时间 time.sleep(interval) print("照片编号:", i) # 定义照片文件夹路径 photos_path = "temp_destination/photos/" # 如果文件夹不存在,则创建文件夹 os.makedirs(photos_path, exist_ok=True) # 获取照片文件名列表 photos = os.listdir(photos_path) # 按名称对照片进行排序 photos.sort() # 创建视频写入对象 video = cv2.VideoWriter("temp_destination/video.avi", cv2.VideoWriter_fourcc(*"MJPG"), 100, (1280, 720)) # 遍历照片 for photo in photos: # 读取照片作为图像 image = cv2.imread(photos_path + photo) # 调整图像大小以适应视频帧大小 image = cv2.resize(image, (1280, 720)) # 将图像写入视频 video.write(image) # 释放视频写入对象 video.release() print("延时摄影视频生成完成") 运行程序后,你可以在 temp_destination 文件夹下找到生成的视频。你也可以修改 nframes 和 interval 参数,使延时相机可以适用于不同的拍摄场景。 疑难解答与建议 如果网页端可以显示实时画面,但本地无法抓取推流,这是因为同一时间只能开一个推流,请尝试把网页关掉。 如果你打算拍一整天的视频,可以把 Python 程序运行在低功耗的服务器或旧手机上,这样就不用一直开着电脑。 参考与致谢 ESP32-CAM Python stream OpenCV Example Live Security Camera with UNIHIKER & FireBeetle 2 ESP32S3 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

TinyWeatherStation - 简约而不简单的桌面天气站

TinyWeatherStation - 简约而不简单的桌面天气站 【文章编辑中……】 资料 GitHub 仓库:linyuxuanlin/TinyWeatherStation 杂项 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Troubleshooting of ADC and DAC

Troubleshooting of ADC and DAC This post was originally written in English. Why AC Source should be 2-4 bits more resolution than the ADC under test? As an often used definition of ENOB: \[ ENOB=\frac{SINAD-1.76}{6.02} \] So if the ENOB of DAC (in AC Source) get lower, the SINAD will become lower too, means that the noise and distortions will increase relatively, which will affect the accuracy of measurement. Another point is, the resolution of AC Source lower than 2-4 bits will induce higher harmonic distortions, the digital signal at the output of the ADC is deteriorated by both DAC's and ADC's harmonic distortions, and the amplitude of 2nd-harmonic (for an example) could be summed. Cause AC Source with higher resolution will bring lower harmonic distortions, the test output results will become more accurate. Refer to this article: ADC Production Test Technique Using Low-Resolution Arbitrary Waveform Generator Are there other ways to improve measurement accuracy with the AC input in the test of ADC? Reducing the slope of the input ramp wave can improve measurement accuracy. What to do with high base noise in the test of ADC? Increase the number of samples (N) and the number of test signal periods sampled (M), both will also result in more test time. Increase sampling frequency (Fs). It's not possible to distinguish between noise and harmonics if only sample only 1 period of signal. 有这条公式吗?噪声精度=采样频率/M How to measure the gain error of ADC practically? Histogram method is used practically to measure the gain error, because the theoretical transition edge is hard to detect. Do we need an AC Digitizer with 2-4 bits more resolution in the test of the DAC? No, it's no necessary for a very high resolution AC Digitizer. AC Digitizer that satisfied Nyquist resolution will meet the test standard.

2025/9/17
articleCard.readMore

Ubuntu 配置笔记

Ubuntu 配置笔记 双系统时间问题 装完双系统,会出现时间问题(Windows 与 Ubuntu 时间不同步),使用下面命令可解决: timedatectl set-local-rtc 1 --adjust-system-clock 安装软件 Chrome VS Code Qv2ray Git sudo apt install git git config --global user.name "John Doe" git config --global user.email johndoe@example.com 技巧 查看隐藏文件 使用快捷键:Ctrl + H 打开终端 使用快捷键:Ctrl + Alt + T 命令 注: <xx> 表示必须, (xx) 表示可选 cd 切换工作目录 cd <目录路径> pwd 查看当前绝对路径 pwd mkdir 创建目录 mkdir (选项) <目录名称> ls 列出目录下的内容 ls (选项) (目录名称) touch 改变文件 / 目录时间 touch (选项) <文件名称> mv 剪切 mv (选项) (源文件/目录) <目的地文件/目录> cp 复制 cp (选项) (源文件名/目录名) <目的地文件名/目录名> rm 删除 rm (选项) <文件名/目录名> 参考与致谢 ROS 安装教程 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

VS Code 生产力指南 - Jupyter Notebook

VS Code 生产力指南 - Jupyter Notebook 用 VS Code 打造高效率的生产力工具。 Jupyter Notebook 是一个很强大的工具,它允许我们在一个文档环境内编写、运行代码、查看输出、将数据可视化并查看结果……总之,有了它,我们写含代码的文档就方便多了。 在上一篇文章中,我们完成了 VS Code 基本环境的搭建。这篇文章我将对 Jupyter with VS Code 进行详细讲解。 环境配置 众所周知,Jupyter Notebooks 依赖 Python 环境。 Ctrl + Shift + P)内键入 Python: Select Interpreter,如果看到有可以选择的 Python 版本,那就没问题。 如果没有 Python 环境,可以通过以下方法安装: 在 Python 官网 下载最新版本安装包(尽量选择 web-based installer 版本) 配置完本地 Python 环境后,我们还需要在 VS Code 内安装 Python 插件。在近期的一次更新中,Jupyter Notebooks 已经被包含在这个插件内,不用再单独安装了。 创建笔记本 环境配置完成后,我们可以在 VS Code 命令面板(Ctrl + Shift + P)输入 Python: Create Blank New Jupyter 创建一个空白的 Jupyter 笔记本(.ipynb 文件)。如下图简单测试一下: 可以看到,代码正常运行。 基本操作 Jupyter Notebook 使用 代码单元(code cells) 的形式来创建、编辑和运行代码。 添加 code cells 运行单个 code cell 运行多个 code cells 移动 code cell 删除 code cell 在代码与 Markdown 之间切换 图表查看器 通过图表查看器,你可以轻松查看代码输出的图表,也可以将图标导出各种格式的图片: 数据与变量查看器 变量的类型、数量与值可以通过变量查看器实时查看: 也可以通过数据查看器浏览更具体的数据: 参考与致谢 Working with Jupyter Notebooks in Visual Studio Code VS Code Python 全新发布!Jupyter Notebook 原生支持终于来了! 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

VS Code 生产力指南 - 环境配置

VS Code 生产力指南 - 环境配置 —— 如何用 VS Code 打造高效率的生产力工具。 背景 工欲善其事,必先利其器。创造是一件美好的事情,如有利器相辅,这个过程将会变得更加舒适。 为什么选用 VS Code ? 开源免费,颜值出众 完善的编辑功能(自动补全、语法突出等) 可直接在编辑器内调试代码 集成 Git 丰富的插件支持与自定义项 软件安装 你可以在 VS Code 官网下载最新的版本:https://code.visualstudio.com/ 一般我们选择下载 Stable 版本。如果你不惧 bug,想体验最新的特性,也可以试试 Insiders 版本。 下载安装完成后,我们打开软件,首先看到的是启动页面: 插件安装 为了精简体积,VS Code 仅保留一些最基础的功能。但如果想提高效率,这些功能是远远不够的。 下面推荐一些好用的插件(可直接点击链接安装): 基本 Chinese (Simplified) Language Pack:汉化 VS Code Settings Sync:备份设置项和插件,多设备同步 配置项:配置相应的 GitHub Gist ID 和 GitHub Access Token 用法:Shift + Alt + U 上传,Shift + Alt + D 下载 (最新版本 VS Code 已自带同步功能,但如果需要版本管理还是可以用这个插件) Markdown Markdown All in One:提供更强大的 Markdown 语法支持 Markdown Paste Image:将图片粘贴到 Markdown,并拷贝至 /res 文件夹内 Pangu-Markdown:规范 Markdown 格式(中英文间加空格、替换规范标点等) 配置项:启用保存时自动格式化 vscode-pandoc:增加 Pandoc 支持,将 Markdown 导出为 PDF/Word/HTML 等格式 配置项:确保 Pandoc 已经安装 美化 Indenticator:高亮代码缩进深度 vscode-icons:为不同的文件格式添加好看的图标 编程语言 C/C++ Python 前端 Prettier - Code formatter:HTML/CSS/JavaScript 等前端语言自动格式化工具 用法:Ctrl + Shift + P Color Manager:直接预览色值对应的颜色 Live Server:在 VS Code 内运行本地网页 其他 Google Translate:在 VS Code 内提供翻译 用法:Ctrl + Alt + T Start git-bash:将 bash 添加至 VS Code 的终端 TinyPNG:压缩图片 配置项:设置正确的 TinyPNG API Key 用法:右键文件树内的图片 - TinyPNG:Compress Zhihu Daily:摸鱼必备,在 VS Code 内刷知乎日报 坤坤鼓励师:连续打代码一小时,会有蔡徐坤专属篮球舞提醒你休息 主题 你可以通过 文件 - 首选项 - 颜色主题 来选择自己喜欢的主题,例如我选的是 Monokai Dimmed 主题: 如果你觉得默认提供的主题不够用,也可以在插件商店内,用关键词 theme 搜索并下载自己喜欢的主题。 常用设置 初次使用,可以修改一些常用的设置,使 VS Code 用起来更加顺手。 通过 文件 - 首选项 - 设置 即可打开设置页面。 自动保存 可将 Files: Auto Save 设置为除 off 外其他 3 个选项。日常使用,自动保存还是很有必要的。 字体 等宽字体是写代码的必备,我个人推荐 雅黑等宽 (Microsoft YaHei Mono) 字体。 下载 .ttf 字体文件后安装,重启 VS Code,并在 设置 - 文本编辑器 - 字体 - Font Family 选项中将 'Microsoft YaHei Mono' 添加至头部,即可启用字体。 常用快捷键 操作 快捷键 命令面板 F1 或 Ctrl + Shift + P 终端 Ctrl + ` 资源管理器 Ctrl + Shift + E 全局搜索 Ctrl + Shift + F 源代码管理器 Ctrl + Shift + G 运行 Ctrl + Shift + D 插件管理 Ctrl + Shift + X 快速切换文件 Ctrl + D 源代码控制 提交 Github 每次都需要输入用户名及密码? 输入命令: git config --global credential.helper store 重启 VS Code 即可。 总结 以上为 VS Code 基本的环境配置,下一篇将详细讨论 Git,Jupyter NoteBook 及用户代码片段等操作方法,敬请期待。 参考链接 Docs · Visual Studio Code 为什么我选择使用 VS Code 进行前端开发? vscode git 提交总让输入用户名及密码 Vscode 编辑 markdown 代码块(snippets) 在 Visual Studio Code 中添加自定义的代码片段 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

VS Code 的便携模式

VS Code 的便携模式 VS Code 原生支持便携模式,不过拓展设置等资源还是储存在本机默认位置。本教程将介绍 VS Code 完全便携化的方法。 在 下载页面 下载 .zip 形式的 VS Code。 解压后先别打开软件,在软件根目录内创建 data 文件夹,并在其中创建 tmp 目录(可选,用于保存 TMP 数据)。 再打开软件就可以了。 参考与致谢 vscode 便携式模式

2025/9/17
articleCard.readMore

Vue.js 小技巧

Vue.js 小技巧 去除 url 中的 # 问题:使用 Vue.js 搭建的项目,url 中会包含 #,影响观感。 解决方法: 在项目中全局搜索 const router = new VueRouter({}) 函数 在函数内添加语句:mode: 'history' 参考与致谢 如何去除 vue 项目中的 # --- History 模式 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

WeChat

WeChat My WeChat: linyuxuanlin

2025/9/17
articleCard.readMore

Windows 初始化与软件推荐(旧)

Windows 初始化与软件推荐(旧) 更新的文章请见 Personal Onboarding Workflow (Windows) 你刚刚刷了一个 Windows 系统,有哪些设置项和软件是必须的呢? 一些个人设置 不使用微软账户初始化 开启诊断(预览版系统需要) 重命名电脑名称 设置 - 更新和安全 - 开发者选项 - 开启开发人员模式 预览版模式 卓越性能 安装 Synology Drive Client 安装 火绒安全(防止 Windows Defender 误删文件) 登录 Microsoft 账户 激活 Windows:HEU_KMS_Activator 更新系统、驱动 配置浏览器(Edge Canary) 拓展 开启 Chrome(Edge)多线程下载 用户账户控制设置:设为从不通知 定制任务栏 配置个性化设置 配置显示设置 配置剪切板历史记录及同步 配置鼠标触摸板键盘等 启动隐藏设置:GodMode 关闭休眠:powercfg /hibernate off 解决英文环境下的中文字体显示问题 安装软件 工作软件 VS Code insiders Setting Sync Logitech Options:罗技鼠标专用(自动弹出下载安装) Python 微信(测试版) Git winget Powertoys:WinGet install powertoys 修改版 QQ DiskDenius:磁盘工具 预留 10 GB 空闲(SSD) NTFS,4096 扇区(4k 对齐) KMS: 激活 Windows(已失效) 关闭 Windows Defender GitHub Desktop Win10Apps Geek Uninstaller Bandizip:无广告版本 Dism++:系统工具 JPEGView 卡硬工具箱 Mem Reduct OInstall:Office 工具 PowerToys Snipaste SpaceSniffer Sumatra PDF PotPlayer PicGo Bamboo:基于 TinyPNG 的图像压缩软件 DeskGo:桌面整理 Wise Driver Care:驱动安装管理工具 NDM:下载器 AltDrag:窗口拖动 / 缩放 / 更改透明度小工具 Raidrive:挂载远程硬盘的工具(无广告版),我通过 WebDAV 挂载 NAS 为本地磁盘。 选装软件 7-Zip:压缩率高 WPS 特供版:清爽无广告 备用链接:https://pan.baidu.com/s/1d_DVwbLScESe1Zh7um6YTA 提取码:y1xe SoftDownloader:能找到绝大部分的软件,一键安装 万彩办公大师:各类办公相关的小工具,很强大 IObit Unlocker:文件占用解锁工具 EmptyFolderNuker:检测并删除空文件夹的工具 参考与致谢 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Windows 常用命令

Windows 常用命令 Win+R 常用命令 control 控制面板 regedit 注册表编辑器 eventvwr 事件查看器 mmc Microsoft 管理控制台 gpedit.msc 组策略 devmgmt.msc 设备管理器 diskmgmt.msc 磁盘管理 services.msc 服务 certmgr.msc 证书 taskschd.msc 计划任务程序 wf.msc 高级安全 Windows 防火墙 %windir%\explorer.exe shell:::{4234d49b-0245-4df3-b780-3893943456e1} 打开 Applications 目录 参考与致谢 Windows

2025/9/17
articleCard.readMore

X86 平台的硬件测试 🚧

X86 平台的硬件测试 🚧 性能测试 SD 接口速率 测试方法:SD 座子接 TF 卡,使用 CrystalDiskMark 软件测试 SEQ1M-Q8T6(其他参数默认)。 EMMC 读写速率 测试方法:使用 CrystalDiskMark 软件测试 SEQ1M-Q8T6(其他参数默认)。 SATA 接口速率 测试方法:SATA 接 SATA SSD,使用 CrystalDiskMark 软件测试 SEQ1M-Q8T5(其他参数默认)。 M.2 M key NVME 接口速率 测试方法:M.2 M key 接 NVME SSD,使用 CrystalDiskMark 软件测试 SEQ1M-Q8T4(其他参数默认)。 M.2 B key USB2.0 接口速率 测试方法:M.2 B key 接 B key 测试模块,使用 CrystalDiskMark 软件测试 SEQ1M-Q8T3(其他参数默认)。 M.2 B key SATA 接口速率 测试方法:M.2 B key 接 SATA SSD,使用 CrystalDiskMark 软件测试 SEQ1M-Q8T2(其他参数默认)。 USB TYPE-C 接口速率 测试方法:USB TYPE-C 接高速 U 盘,使用 CrystalDiskMark 软件测试 SEQ1M-Q8T1(其他参数默认)。 USB3.0 接口速率 测试方法:USB3.0 接高速 U 盘,使用 CrystalDiskMark 软件测试 SEQ1M-Q8T1(其他参数默认)。 USB2.0 接口速率 测试方法:USB2.0 接高速 U 盘,使用 CrystalDiskMark 软件测试 SEQ1M-Q8T1(其他参数默认)。 以太网通信速率 测试方法:RJ45 通过网线直连一台主机,使用 Iperf3 软件测试。主机使用 iperf3 -s 命令;X86 使用 iperf3 -c <主机 IP> 命令。 功能测试 电源恢复模式 测试方法:在 BIOS 内将 Chipset - Restore on AC Power Loss 设置为 Last State。 预期结果:断电后再来电时,恢复到断电前电脑的状态。断电前如果电脑是处于开机状态,那么来电后就会自动开机;断电前是处于关机状态,那么来电后电脑不会自动开机。 启动选项优先级 测试方法:在 BIOS 内将 Boot - Boot Option Priorities 切换不同启动磁盘。 预期结果:可以修改保存启动项,并从选择的启动项启动。 安全启动 🚧 测试方法:切换至 BIOS,开启安全启动。 预期结果:开启后无法从非认证的设备启动。 3.5mm 耳机孔与板载麦克风 测试方法:使用网页在线工具 https://mymictest.com/zh 测试录音与播音。 预期结果:能正常录音与播音。 Wi-Fi 支持 测试方法:在 BIOS 内将 Chipset - WIFI Support 设置为 Disable。 预期结果:关闭后,在系统内无法启用 Wi-Fi 功能。 板载 LAN 测试方法:在 BIOS 内将 Chipset - OnBoard Lan 设置为 Disable。 预期结果:关闭后,在系统内无法启用有线网。 LAN 唤醒 🚧 测试方法:切换至 BIOS,关闭 Wake on LAN 预期结果:关闭后,网络灯关闭,开启后能被网络唤醒 CPU 信息识别 测试方法:切换至 BIOS,在首页检查 CPU 型号。 预期结果:CPU 型号正常识别。 PXE 启动 🚧 🚧 eMMC 支持 测试方法:在 BIOS 内将 Chipset - eMMC Support 设置为 Disable。 预期结果:关闭后,无法检测到 eMMC 磁盘。 风扇转速 测试方法:在 BIOS 内查看 Advanced - H/W Monitor。 预期结果:可正常显示实时风扇转速。 RTC 唤醒 🚧 测试方法:切换至 BIOS,启用 RTC 唤醒,设置唤醒时间 预期结果:设置时间能正常唤醒 USB TYPE-C 视频输出 测试方法:USB TYPE-C 接 4K/60Hz(可依据配置调整)显示器,观察显示器显示情况。 预期结果:能正常输出图像显示。 蓝牙功能 测试方法:查看系统蓝牙选项,尝试连接蓝牙设备。 预期结果:能正常发现并连接设备。 Wi-Fi 功能 测试方法:查看系统 Wi-Fi 选项,尝试连接 Wi-Fi。 预期结果:能正常连接 Wi-Fi。 安全性测试 USB3.0/2.0 过流保护 测试方法:使用 USB 转裸线,使用电子负载拉 2A 以上电流,观察是否发生保护;恢复低于 2A 电流,观察是否恢复供电。(具体电流值需看电路设计) 预期结果:过流下发生过流保护,正常电流下能恢复供电。

2025/9/17
articleCard.readMore

ZenDriver - 高性能的电机驱动

ZenDriver - 高性能的电机驱动 —— 基于 V5.1 Release 版本 项目仓库:linyuxuanlin/ZenDriver 基本参数 输入电压:7.2 ~ 20 V 输出电流:0 ~ 68 A 提供 5V 1.5A 的电源输出,可供控制器使用 保护装置:集成防反接、光耦隔离电路 接口定义 电机端 从左到右依次为:M-,5V,编码器 A,编码器 B,GND,M+ ,对应电机引脚,可以直接怼电机上去。 信号端 从右到左依次为:GND,编码器 B,编码器 A,IN2,IN1,5V 。注意:5V 端口 可提供电源给单片机用 (最大 1.5 A)。 电源输入端 三个接口通用,一般建议中间的接电池,旁边的两个接口用于拓展电源给其他的驱动板。 使用指南 直接供电测试 接入 7.2 ~ 20 V 电池供电 接上电机 用 信号端 上的 5V 分别接 IN1,IN2,此时电机将正、反转 连接单片机测试 接入 7.2 ~ 20 V 电池供电 接上电机 信号端 GND 接 单片机 GND,5V 端口 接 单片机 5V 引脚 IN1,IN2 接单片机 PWM 端口 用代码调试 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

npm 和 Yarn 换源加速国内访问

npm 和 Yarn 换源加速国内访问 背景 npm 和 Yarn 默认源地址在国外,国内访问速度慢。 yarn config get registry 解决方法 使用软件 cgr 快速切换 npm 和 Yarn 的镜像源。 安装 cgr npm install -g cgr 列出当前可用的镜像源 cgr ls 选择一个镜像源进行切换(淘宝) cgr use taobao 测试访问速度 cgr test taobao 参考与致谢 yarn 国内加速,修改镜像源 cgr -- change registry | yarn & npm registry manager 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

一个舵机的自我修养

一个舵机的自我修养 如何把一个舵机改装成 360° 连转舵机,以及用代码解决杂音? 背景 一般来说,舵机只能转 180°(网上也有卖也有连转舵机,只是价格贵了一截)。如果想用舵机来作为小车的驱动,可以把它改为连转舵机。 改装 360° 舵机 1. 准备工作 工具: 螺丝刀 热熔胶枪 斜口钳 2. 拆开舵机 注意记住每个齿轮的位置。 3. 修改齿轮 把最大的齿轮拣出来,用斜口钳把后面凸起的地方剪掉。 找一只比轴的直径大一点的螺丝刀,给这个齿轮扩大一下内径,使它能在轴上自由转动。 4. 封电位器 在做这一步之前,我们必须先把舵机回到中位。 找一块 Arduino 板子,给它烧进一段让舵机回到中位的程序: //by Lin #include <Servo.h> Servo myservo; void setup() { myservo.attach(9);//舵机连接 Arduino 的 D9 } void loop() { myservo.write(90); //让舵机回到中位 } 如图,接上舵机,你会发现它一直在转。 把右边的轴来回转几圈,找到一个让电机停下来的位置(把这里的电位器调到中间的值。 给电位器上胶,封死它。注意,这时候不要不小心把轴给转动了,如果这样,就得重新返回第三步了。 5. 组装 把齿轮组装回去,注意不要弄错齿轮位置。 把螺丝锁上,你就得到了一个 360° 连转舵机。 6. 调试 烧入以下代码: #include <Servo.h> Servo myservo; int pos = 0; void setup() { myservo.attach(9); } void loop() { for (pos = 0; pos <= 180; pos += 1) { // in steps of 1 degree myservo.write(pos); delay(15); } for (pos = 180; pos >= 0; pos -= 1) { myservo.write(pos); delay(15); } } 舵机状态:舵机加速—减速—反方向加速—减速。..... 消除杂音 背景 在使用舵机完成相关物联设备制作的时候,经常会遇到,舵机已经到达指定位置,但是仍然会有响声。不胜其烦,@张世博想出了一个方法,就是在舵机供电线路上串一个继电器,在不需要转动的情况下, Arduino 控制继电器断电。但是这个方法会增加硬件成本,而且增加代码复杂度。 解决方案 在需要舵机工作时,使用 attach() 函数,在舵机工作完毕后,使用 detach() 函数。 { servo.attach(9); servo.write(pos); delay(250); //断开舵机连接,防止发出声音 servo.detach(); } FAQ Q:这只是一种类型的舵机,对结构不太相同的金属舵机,该如何改装? 改装成连续旋转的伺服舵机 这篇文章。 参考与致谢 舵机的更多玩法 解决舵机滋滋响的简单软件方法 改装成连续旋转的伺服舵机 DIYer 修炼:舵机知识扫盲 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

一些观点

一些观点 关于创业 想法是否可行? 市场需求有多大? 定义用户是谁 发现用户的需求和渴望 定义你的价值主张 打造 MVP 产品 与用户一起测试 快速迭代直到找到 PMF 有多人在做? 为什么你能做? 价值可以有很多伪装——金钱、省时、享受等等。 做产品还是做项目? 对早期创业者来说 ,更多时候是 一边做产品,一边接项目 。 在不清楚应该选择什么方向的产品时,可以在做项目的过程中,去思考哪些需求具备通用性,变成产品的可能。最后要说的是,具体产品方向的选择是战术问题,你必须在战略层面,明白你的选择行业、技术领域的整体趋势。选择,比努力更重要。 产品 满足一定的标准化程度,具备通用性和可复制性 一般情况前期需要较大的投入 存在爆发性成长的可能 竞争激烈,一般一个赛道只能允许几家生存 相对于项目,资本市场更偏向于产品潜在的高成长性带来的高回报 项目 「有一单没一单,吃了上顿没下顿」 资金回流快,不需要较大的投入 一般情况下成长缓慢 允许很多小公司的存在 资本不会优先选择 关于投资理财 增长手段 不追求最佳,追求独家,例如专利 规模化,例如零售巨头和互联网公司 到商业环境恶劣的地方去,获取小市场大的份额 获得政府担保和合作 拥有产权,如地产或知识产权 利用法律手段挣钱 获得网络效应,如电信公司 投资 别人恐慌时买入,别人乐观时卖出 极度痴迷投资游戏并有极强的好胜心 从失败中吸取教训 对风险有直觉,不依赖机器 绝对的信心,即使面对批评 左右脑都很好用,左脑算账,右脑判断公司管理团队和趋势 大起大落中不改投资思路 关于写作 方法 公理与例子 将事物的本质抽象为一条公理之后,别忘了提供例子。就像物理或数学上的道理,公理一般很难直接用得上,用得上的是公理推导出来的定理,以及更具体的法则。 一些自己经历过的事情,往往自己印象深刻,但对于读者,需要以具体的案例或解释辅佐观点,使公理更加有说服力。 用户心理学 仅分析爆文对用户心理利用。 1. 情绪化 研究表明,引发悲伤等低能量情绪(low-energy emotions)的文章很少被分享,而激发敬畏、愤怒、焦虑等高能量情绪的文章则恰恰相反,能够获得更多分享,其中愤怒情绪最易被病毒式传播。 想要令读者产生愤怒,不用贬低或是辱骂,只需要写一些让人感到愤怒的内容。愤怒通常是针对这个话题,而不是针对作者或者出版商。煽动读者的愤怒情绪通常需要有足够的容量去处理具有争议性的话题。争议性的博客帖子收到的评论量平均是无争议帖子的两倍。 敬畏,则是一种更安全的情绪,尤其是对于想要避免激起愤怒的品牌来说。敬畏大于惊喜。这是为什么人们青睐大爆炸和富有传奇色彩的英雄人物电影的原因。 2. 长篇文章 长篇文章被分享得更多;文章篇幅与分享率的相关度,比其它变量都高。主持研究的 Ward 教授认为这其中存在因果关系。“如果我真的非常关心一个主题,我并不想把浅层表面的文章分享给我的朋友或者读者。” 另一项研究则表明,虽然长篇文章获得更多的分享,但它们的评论数往往很少。这或许是因为人们并没有从头到尾读完它。 3. 流露真实情感 充满情感的贴子更易被病毒式传播,人们都希望在阅读时能有情感体验。作家 Walter Kirn 说,优秀的个人散文和回忆录应该从作者最羞愧的内容开始,这部分是冲突和情感所在。如果能分享这部分内容,也能证明读者是真实的、有血有肉的、有缺点的人。 人们在写广告时可能并不愿意以羞耻为开头,但分享一些真实的感情能够让人解除戒备心。 4. 实用信息 令人吃惊、富有吸引力、实用性的内容能获得更多的分享。这也许是研究中最直观的一个发现。 Ward 认为互联网阅读最主要的动机是人们想寻求对于某些问题的答案,比如我应该怎么投资个人退休账户?清洁木地板的最佳方式是什么?对这些问题的解答自然会受到欢迎。 5. 名气 被读者熟知的作者对于文章能否被分享有着巨大的影响。名气是循环累计的,原本的名气能带来更大的名气,特别是在互联网上。 6. 首页 / 头条 刊登在首页上的帖子更有可能被广泛传播。人们每天都被海量信息包围着,只有把内容放在最显眼的地方,才能确保读者会看到。注意力稀缺的年代,躲藏在角落里的内容很难被注意到。 7. 幽默笑点、槽点、泪点 被广泛地病毒式传播的内容大多是幽默的。另外,60% 的病毒式广告是由小公司生产的。 幽默、恶搞、无节操,并不能解决所有的问题,但它是病毒式广告必不可少的先决条件。 8. 病毒式传播 如果希望内容能被病毒式传播,那么在发布之前,每一位内容生产者应该认真回答以下几个问题: 文章是否成功地详细介绍了主题?篇幅足够长吗? 这些内容能激发诸如愤怒、敬畏、焦虑等高能量情绪吗? 文章语气传达了情感吗? 这篇内容特别实用吗?有趣吗?又或者令人感到意外和惊喜吗? 作者有名气或是信誉吗? 这篇内容真的有趣吗? 如果你的回答是肯定的,那么恭喜你,这是一篇能够被病毒式传播的文章 关于个人发展 制造与销售 硅谷著名的风险投资家 Naval ,在推特说了一句金句,一万多人点赞。 他说:“既懂得制造,又懂得销售,你就是无敌的。” Learn to sell. Learn to build. If you can do both, you will be unstoppable. 他的意思是,一家成功的公司,必须同时具备两种能力:优秀的制造能力和优秀的销售能力。成功的公司,不仅要懂得如何创造出优秀的产品,还要懂得如何把产品卖出去。 这就是为什么公司会设置 CEO 和 CTO 两个角色。一般来说,CEO 负责销售(包括融资)和管理,CTO 负责制造。这两个角色里面,只要有一个没做好,公司就成功不了。 Naval 接着说,这个世界上,最厉害的人就是既懂得制造,又懂得销售的人。这样的人可以创造出一个行业。举例来说,马斯克(Elon Musk)就是这样的人,他懂得技术,可以让工程师为他造出想要的东西,他也懂得销售,能让整个世界为特斯拉汽车疯狂。乔布斯也是这样的人,懂得顾客想要什么,以及苹果公司能造出什么,几乎凭一己之力让苹果公司变成世界市值最高的公司。 如果我们把自己的人生看成是一个项目,人生成功也是如此,既要有真才实学,也要懂得推销自己。 Naval 说,通常情况下,Maker(制造者)学习 sales(销售)比较容易,Sales 学习 make 比较难。比如,程序员学习运营,要比运营人员学习编程容易。所以,我的想法是,大学最好主修一些跟 make 相关的课程(比如计算机),然后辅修一些跟 sales 相关的课程(比如经济),这样的搭配比较合理。 关于生存 生存是一种即时策略游戏,所有的人都是这场游戏的玩家。财务自由了,就是游戏赢家。 具体来说,又分成两种游戏:财富游戏和地位游戏。财富游戏的玩家追求更多的财富,地位游戏的玩家追求更高的地位。 古时候,地位越高,财富越多,当大官就是发大财,所以大家都玩地位游戏。现代社会,财富游戏和地位游戏慢慢脱离了关系,不当大官也可以发大财,财富游戏的玩家多了起来。 这两种游戏有本质的区别。地位游戏一定是零和的,有赢家就肯定有输家。比如,我当了部门主管,你就不能当了。所以,地位游戏很凶险,必须时刻提防其他玩家的冷枪。财富游戏不是零和的,我盖了一幢漂亮的房子,不影响你也盖一幢。我赚钱了,不影响其他人的利益,很可能还让其他人过得更好。比如,乔布斯创办了苹果公司,其他人就有了更好的电子产品可用。 创业是财富游戏,政治是地位游戏。 因为上面的原因,我认为,创业值得参与,政治不值得参与。有些创业项目也是零和的,比如抢票技术、秒杀技术、游戏外挂等等,那也不值得参与。 —— 阮一峰《科技爱好者周刊:第 66 期》 有待整理 第一次注册公司的注意事项 签合同时要注意什么 参考与致谢 https://github.com/yuzaishi/think 《财富的本质:1%的人如何实现爆炸式财富增长》 1007 - 过于精简的道理 让文章转发过百万的 9 个秘密 科技爱好者周刊:第 94 期

2025/9/17
articleCard.readMore

一般天线匹配电路的设计

一般天线匹配电路的设计 天线的匹配,最理想的情况是希望源端输出阻抗、传输线阻抗、负载端输入阻抗都是一致的(一般为 50Ω)。 但在实际情况下,比如连接器、焊接、天线阻抗的误差值等,源端之后电路的阻抗,可能与源端的阻抗不匹配。所以天线电路一般需要预留匹配电路,且一般会预留 π 型匹配电路,下文将以其展开说明。 测量原始阻抗 我们首先要知道没有匹配电路的情况。这时候 π 型匹配电路串联器件焊接 0Ω 电阻(不能直接使用焊锡短路,会导致寄生参数不同),对地并联的器件留空不焊。 使用网络分析仪进行测量,具体方法可参考文章 网络分析仪的使用。此时可测量出初始负载阻抗值,假设我们测出来的初始阻抗非常接近 50Ω,那么可以直接不用匹配电路,不仅可以降低成本,也可以降低器件导致的损耗;假设测出来为 (40.6-13j)Ω,接下来就在史密斯圆图上调节匹配,将负载阻抗调到 50Ω 上。 调节匹配 在史密斯圆图上调节匹配,可以使用 SimNEC 这个软件。史密斯圆图的原理可参考文章 史密斯圆图基础,通过从负载端往源端加器件,将负载阻抗调到 50Ω。 匹配的原则: 电感、电容值不应过小(减小误差值的影响),且尽量为常用值(增加可替换性)。 落地电容值不应过大(容值越大,容抗越小,导致大量信号流向地)。 尽可能设计为低通滤波器(顺便可抑制高频谐波)。 两个电感之间距离不要太近,否则可能会产生互感影响匹配效果。 整个频带的阻抗轨迹尽可能收敛。 在 PCB layout 时,匹配电路要尽可能靠近天线,才能尽量减少传输线的延时,使实际值更接近理论设定值。 参考与致谢 天线匹配电路总结 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

专业与分工

专业与分工 一个人不可能做所有事情;所以,把自己的事情做得专业,让专业的人帮你解决专业的事。 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

个人 PCB 设计规范

个人 PCB 设计规范 PCB 布局规范 分模块布局 按功能模块:完成同一功能的电路(指由分立元件组成,实现特定功能的模块),应尽量靠近放置。 按电气性能: 数字电路区:即怕干扰、又产生干扰 模拟电路区:怕干扰 功率驱动区:产生干扰 布局原则 较大的元器件优先排布 元器件全部放置于顶层(焊接方便) 时钟产生器 (晶振等) :尽量靠近用到该时钟的器件 在每个模块的电源输入端 增加去耦电容:滤除电源上的干扰信号。注意尽量靠近取电模块。 继电器线圈处加上放电二极管(如 1N4148 ) PCB 布线规范 布线原则 线之间 避免平行 勿出现一端浮空(可能产生天线效应) 走线总长度能短就短 走线拐弯角度应大于 90° 3W 规则:当线中心间距不少于 3 倍线宽时,则可保持 70% 的电场不互相干扰 环路最小规则,走线 尽量不要形成环路 关键信号处可预留测试点 元件焊盘两边的引线宽度要一致(用泪滴功能) 布线完成后开启 泪滴 功能(增加美观度,增强 EMC) 不在元件焊盘上打过孔(SMT 容易引起漏锡虚焊) 单片机芯片下面尽量不走线 / 不铺铜 布线顺序 电源线 一般走线 地线(铺铜) 在为 PCB 布线时,我们一般先布电源线,在绝大多数情况下,电源线要求 短、粗、直、较少过孔 ,所以布线优先权最高。 在完成一般信号线的布线之后,最终我们要铺铜。对于普通双层板,铺铜属性一般设置为 地。 规则设置 走线宽度: 电源线:30~50 mil 信号线:12 mil 过孔大小: 内径:0.45 mm 外径:0.75 mm 铺铜连接: 用 Direct 的方式 (有点解释不清,待有空补充说明 铺铜安全间距:10 mil 属性:GND 铺铜选择:Pour Over All Same Net Objectc, 去除死铜:Remove Dead Copper 字符大小: 最小线宽:6 mil 最小字符高:32 mil 小于以上值,印制在板子上的字符可能会不清晰。 PCB 线宽与电流的关系: 线宽/铜箔厚度 70µm(2 oz) 50µm(1.5 oz) 35µm(1 oz) 2.50mm(98mil) 6.00A 5.10A 4.50A 2.00mm(78mil) 5.10A 4.30A 4.00A 1.50mm(59mil) 4.20A 3.50A 3.20A 1.20mm(47mil) 3.60A 3.00A 2.70A 1.00mm(40mil) 3.20A 2.60A 2.30A 0.80mm(32mil) 2.80A 2.40A 2.00A 0.60mm(24mil) 2.30A 1.90A 1.60A 0.50mm(20mil) 2.00A 1.70A 1.35A 0.40mm(16mil) 1.70A 1.35A 1.10A 0.30mm(12mil) 1.30A 1.10A 0.80A 0.20mm(8mil) 0.90A 0.70A 0.55A 0.15mm(6mil) 0.70A 0.50A 0.20A 一般需多预留 15% 的余量。 参考与致谢 嘉立创 PCB 工艺加工能力范围说明 PCB 在走线时线宽为多大才合适?已经帮你整理好了! 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

个人文案排版规范

个人文案排版规范 有研究显示,打字的时候不喜欢在中文和英文之间加空格的人,感情路都走得很辛苦,有七成的比例会在 34 岁的时候跟自己不爱的人结婚,而其余三成的人最后只能把遗产留给自己的猫。毕竟爱情跟书写都需要适时地留白。 —— vinta/paranoid-auto-spacing 为何要讲究排版规范?良好的文案排版,能降低理解难度,增强内容的可读性,极大提升用户的阅读体验。 具体格式要求 段落 首行无需空格缩进,段与段之间空一行。 空格 以下是需要添加空格的场景: 中文与英文、数字之间: 错误:这里是一个Wiki站点,建立于2015年一个炎热的夏天 正确:这里是一个 Wiki 站点,建立于 2015 年一个炎热的夏天 数字与单位之间: 错误:其频率为 72MHz,占空比为 50 % 普通与特殊字符(链接、加粗、斜体等)之间: 这个 字体 使用了加粗样式 点击这里 进行订阅 英文半角标点之后: Hello, world 中文与破折号之间: Markdown- 一种高效的写作方式 不添加空格的场景: 数字与特殊单位: % ℃。 文本样式 中英文混排时,使用中文全角标点 中英文混排中,如果出现整句英文,则此句内使用英文半角标点 行内链接一般使用加粗,以提高阅读性 使用无序列表代替有序列表 使用准确的专有名词: 错误:使用 github 登录 中文使用直角引号,代替普通引号: 错误:华广机器人队,也称为“野狼队” 正确:华广机器人队,也称为「野狼队」 特殊单位可直接使用: ℃ Ω 等 不重复使用标点以强调: 写作风格 如无必要,勿增实体。 避免使用长句,尽量拆分为多个简单句。 论点要有论据支持,避免只说理不举例。 网站相关 固定链接。因为文章可能会以链接的形式被他人引用,如果文章链接变更,可能会跳转只 404 页面,从而制造障碍。 减少链接层级。对个人 Wiki 站点来说,推荐域名的样式为 xxx.com/文章名。 参考与致谢 译文排版规则指北 文案风格指南 為什麼你們就是不能加個空格呢?・vinta/pangu.js 中文技术文档的写作规范・ruanyf/document-style-guide 余光中:怎样改进英式中文?- 论中文的常态与变态 少数派写作排版指南 阿里设计师出品!B 端产品文案指南 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

个人知识库的搭建 - 基于 Docusaurus

个人知识库的搭建 - 基于 Docusaurus 续上一篇文章 为什么你需要一个知识库,本篇文章将基于 Docusaurus 框架,对知识库的搭建展开详细讲解。 在本文开始之前,请先确保你准备就绪: 科学上网的条件 随机应变的能力 一点儿英语基础 配置本地环境 安装 Node.js 访问 Node.js 官网,下载并安装 Node.js。 VS Code 的安装配置 我们用 VS Code 作为本地编辑器,用于修改网站框架、编写文章。 首先,到 VS Code 官网 下载安装 VS Code。 软件安装完成后,我们可以选装以下两个插件: Chinese (Simplified) Language Pack:汉化 VS Code 界面 Markdown All in One:提供更多 Markdown 语法支持 安装插件后,可能需要按提示重启 VS Code。 更加详细的配置说明可以参考 VS Code 生产力指南 - 环境配置 这篇文章。 安装 Docusaurus 框架 切换到需要建立网站项目的目录。 例如:我想要在电脑的 D 盘下建立一个名为 wiki 的文件夹,作为这个知识库项目。那么请在 VS Code 内选择 文件 - 打开文件夹,点击 D 盘,并点击 选择文件夹 使用 npx 初始化网站: npx @docusaurus/init@latest init [name] [template] 例如,如果我的网站项目文件夹的名字为 wiki,那就用 wiki 替换掉 [name],而根据 官方文档, [template] 指的是网站模板的主题,这里我们将其替换为 classic 即可。所以此处我们执行的命令为: npx @docusaurus/init@latest init wiki classic 我们在 VS Code 内使用快捷键 Ctrl + ` 打开终端,把上面的那行代码粘贴进来并敲击回车,耐心等待加载完成。 当加载完成后,我们在终端内使用命令切换到网站文件夹目录: cd [name] 其中,[name] 替换为你网站项目文件夹的名字,例如在上一步我们使用的是 wiki。 接着,执行以下命令: npm run start 执行网站的本地部署。等待部署进度完成后,它会自动在浏览器打开 localhost:3000 页面,如果一切顺利,你可以看到网站已经成功生成。 将网站部署至云端 上一个步骤,我们成功生成了网站,但它只是被部署在了本地,从互联网上是无法访问到这个站点的。我们需要将网站部署至云服务器,让别的用户也可以从互联网任意访问。 注册 GitHub 账户 在 GitHub 官网 注册 GitHub 账户。 安装 Git 我们从 Git 官网 下载 Git 软件,并完成安装。 重启 VS Code,召出终端,粘贴以下的命令初始化 Git: git config --global user.name "username" git config --global user.email "email@example.com" 此处需要把 "username" 替换为你的 Git 提交用户名,推荐与刚刚在 GitHub 注册的账户名一致,例如我将其替换为 linyuxuanlin。"email@example.com" 同理,替换为 GitHub 注册的邮箱即可。 更加详细的配置说明可以参考 Git 学习笔记 这篇文章。 在 VS Code 内配置项目仓库 为了接下来能推送到 GitHub 服务器上,我们需要在 VS Code 内配置项目 Git 仓库,并上传到 GitHub 上。 在 VS Code 内使用快捷键 Ctrl + Shift + G 切换到源代码管理界面,初始化项目 Git 仓库,并作出首次提交。 随后,使用快捷键 Ctrl + Alt + S 将本地 Git 仓库推送到 GitHub(按提示登录 GitHub 账户即可)。 使用 Vercel 云端部署网站 此处 Vercel 的功能,相当于 GitHub Action + GitHub Pages,即自动持续部署 + 静态网站展示。选择 Vercel 是因为其生成的静态网站,国内访问速度相比 GitHub Pages 会快很多。 首先,直接访问 Vercel 的 GitHub 登录页面 ,使用 GitHub 账户注册 Vercel 账户。 完成之后,点击网页上的 New Project,导入 GitHub 响应的仓库(例如我们之前建立的 wiki 仓库),此处可能需要根据提示,再进行一次 GitHub 的登录。导入之后,一路点击 Next 继续,很快网站就能部署成功了。 总结 这篇文章我们实现了基于 Docusaurus 的知识库的本地和云端部署。本文的过程中如果遇到问题,可以联系我 微信 反馈。在下一篇文章【待更新】中,我将对个性化的配置做详细的讲解。 参考与致谢 Docs·Docusaurus 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

中台的概念

中台的概念 什么是中台 我的理解:类似于面向对象的编程思想,也类似于 容器化 。将 基础资源统一配置(黑箱封装),留出 API 方便调用。 大中台,小前台。 强大的中台,能为各个小前台提供强有力的资源,使能够在基础支持之上快速开发。 中台的划分 万物皆可中台化。中台的具体划分有: 业务中台:下沉各项目的共通业务 技术中台:避免重复造轮子,提供底层框架、引擎、中间件等 数据中台:为各个项目进行各种数据采集和分析 算法中台:为各个项目提供算法能力,比如推荐算法、搜索算法、图像识别、语音识别等 适用场景 从 0 到 1 阶段:没必要搭建中台。首要任务是以最快速度打造出产品,证明市场价值,生存下去。 从 1 到 N 阶段:适合搭建中台。此阶段产品已得到市场认可,此时首要任务不是活下去,而是活得更好。趁着项目复杂度还不高,可以考虑把各项目的通用部分下沉,组建中台,以方便后续新项目的尝试和旧项目的迭代。 从 N 到 N+1 的阶段:势在必行。长痛不如短痛,为了长期的发展需求,还是需要尽早中台化,以免日后更难维护。 参考与致谢 漫画:什么是中台? 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

为什么你需要一个知识库

为什么你需要一个知识库 从 2015 年起,我开始尝试搭建个人网站。时至今日,在经历了各种平台的变迁之后,我在 Power's Wiki 上搭建了个人知识库,在此记录与分享知识。接下来,我将围绕本文主题展开详细阐述。 为什么你需要一个知识库? 知识需要归档沉淀。我们平时学习积累的知识,如果不及时进行整理归纳,很快就会忘记。合理的分类归档,既有利于日后检索与参考,又能避免在同一个地方踩坑。 用输出倒逼输入。若想快速掌握一门知识,最好的方法,就是用自己的话复述给别人听。如果你把能知识清晰地描述出来,那么你才算掌握它。有了持续的输出,当你不能清晰地描述知识时,就会通过主动学习来补充。从另一个方面来讲,这也促进了我们不断去进行阅读和输入。 赛博空间的桃源。在这一片自留地上,你可以避开主流互联网上的纷争(特指某些乌烟瘴气的言论)。我常把个人知识库当作世外桃源一样的存在,这是一个可以静下心来耕耘的地方。 为什么知识库要公开? 更加精致化的输出和整理。如果选择知识库不公开,那么要求就变低了。我们对知识的归纳整理,可能会慢慢变得随意,不会很注重规范和可阅读性。久而久之,知识库会慢慢变成草稿箱,甚至可能看不懂自己先前写了些什么。 分享让思想碰撞。知识需要分享,在碰撞中可能出现新的火花。当别人遇到一样的问题时,也可以直接发自己写过的教程,这样既方便又酷。 提升个人品牌,遇见志同道合的人。持续维护一个知识库,你会收获志同道合的读者和朋友。也许他们也对摄影、编程、搞电路、造机器人、读书等等感兴趣,也在经营着一个知识库或博客。另外,把知识库链接挂在各种社交平台首页或简历上,是绝对是可以展现个人实力的。 为什么选择自建知识库? 自建知识库的相对面,是在第三方平台上写作。第三方平台,指的是语雀、知乎、简书、公众号、CSDN 这一类平台。在这一类平台上,你不用去管底层是如何构建、基础功能怎么实现、文章图片如何存放、如何部署站点更新文章、如何去做 SEO 等等,你只需要写下文字,剩下的全部由平台帮你实现。简而言之,可以傻瓜式地写作,且平台附加巨大的流量。既然如此方便,为什么我们还是提倡自建知识库呢? 首先,是 数据安全 问题。你在第三方平台上留下的文字,所有权并不归属与你。 互联网发展到现今这个阶段,大多数平台都在筑墙。他们会接受数据导入,但你若想批量迁出数据,他们会设置障碍。另外,很多平台会阻止外链,其本意是留住用户、阻止流量流向别的平台,但这非常不利于知识的交流和碰撞。 特别提及微信公众号,截至目前,发出去的文章最多也只能删改 20 个字符。而我们都知道,很多知识并不是一成不变的,是要不断更新的,这就很不利于知识的迭代更新。 将数据完全托付给平台,是非常不保险的行为。当你的文章内出现了相对敏感的内容,或是对平台的负面言论,他们常用的手段是封禁和要求删改。假若平台的服务器遭受黑客攻击,或者平台某天倒闭了,他们也没有义务恢复并归还你的数据。说到底,托付给平台,你对自己的数据没有完全掌控的权利。 其次,是 可定制性 的问题。你选择了平台,就必须接受它的样式和 UI,有时候还得忍受文章边角的各种牛皮藓广告。相比之下,自建平台,UI 可完全自定义。清爽简洁的版面,对阅读体验的提升无疑是巨大的。 说到底,第三方与自建的关系,就像租房子与买房子的关系。选择租房子,你可以付出更少,入住更方便,可以在有限制的自由里装饰你租来的屋子。但是你所拥有的,是使用权而不是所有权;而买来的房子,你可以随意更换装修风格,可以随意在房间里堆放你想要的东西,你对其拥有所有权。 为什么要知识库而不是文章流? 文章流指的是博客、公众号及大部分平台的形式,即主要以时间线来归档文章。相对地,知识库(Wiki)的形式,主要是以类别来收纳文章,就像是在翻阅一本档案,更利于检索和分类阅读。 为什么要知识库而不是文章流呢?首先,一些琐碎但不可或缺的知识,并不适合单独成文、长篇大论。如果是以文章流的形式,其权重和其他文章是相同的,这样会冲淡整个站点的文章纯度。但是,体系化的文章,又是从这些零散的知识生长而来的。相对而言,以知识库的形式作为载体,以类别形式来做区分,就很合适了。 另一方面,我之前在 卡片式写作 这篇文章中曾经提及,每一份的基础知识,相当于一张小卡片,一层一层往上抽象,不同的顶层文章可以调用相同的底层卡片,既提高知识的复用率,也减少做重复的无用功。 工具的选择 至于知识库的选型,个人看重的主要是以下几点: 基础功能:侧边栏可显示文章标题及其归属类别,主版面显示文章内容,内容支持 Markdown 语法,内容与框架相互独立。 搜索功能:搜索功能是类别归档的补充,有时候以大类别查找一个特定的知识点并不方便,但有了全站搜索就能直接传送到点。 项目开源:知识库的平台一定要是开源的,因为闭源的项目,可能会因维护者个人或团队的原因停止更新或支持,遇到 bug 也未能及时处理解决(此处特指 GitBook 和 Bitcron)。 静态网站:静态网站能托管在 GitHub Pages 等平台,无需单独购买服务器,一方面省钱易维护,另一方面也对 SEO 友好。 应易于搭建,便于部署与更新:知识库的架设不应该花过多的时间,内容更新的流程也不应过于复杂。 UI 简洁美观:为了阅读体验,版面 UI 应尽量保持清爽美观,且最好有夜间模式。 自建知识库的局限性 当我看到他人对某个平台只有赞美,没有批评;对该平台的某些问题只字不提,选择性失明,过分赞美某些长处;所有的赞美都是热血澎湃,丧失理性…… 我便提高警惕,强迫自己不被带动情绪,理性看待这个平台的一切东西。 我不希望大家只了解自建知识库的优点,需要说明的是,自建知识库有一定的局限性。只有充分了解其利与弊,才能根据自己的目的去做出选择。 流量问题。依靠第三方平台,你产出的内容更容易被大家读到,也更容易被展示在搜索引擎结果的前十之内。相对来说,自建平台一般很大的流量,也就意味着没什么读者。不过,我们可以使用一文多发的方法来解决这个问题,简而言之,就是基于知识库,使用 Artipub 等工具,将内容同步发至各第三方平台,将流量引导至个人知识库。 自建知识库有一定的技术门槛。对于没有接触过 Jamstack(JavaScript,API & Markup)理念及其相关技术链的读者而言,可能需要经过一定的学习。这个问题我会在 个人知识库的搭建 - 基于 Docusaurus 这篇文章中逐一进行讲解。 静态网站无在线编辑器。换句话说,如果选择了静态网站,那么编辑器和网站本身是分离的,无法像知乎那样在其网页或 App 上直接编辑内容并发布。你需要一个本地的编辑器,例如 VS Code 或 Typora. 不过解决方法也是有的,可以跳转文章 如何在 iPad 上运行 VS Code 。 知识点同时隶属与多个类别。一般来说,知识库仅以类别收录文章,为了避免冗杂,单篇文章仅可属于于一个类别。但举个例子,如何设计一款单片机的最小系统 这篇文章,既属于 电路设计 一类,又属于 STM32 一类,那该如何收录?我的解决方法是根据文章的内容,收录于相关程度更高的类别。之所以不采用标签系统,是因为标签容易泛滥,泛滥之后检索起来不如类别分类加搜索功能方便。 我都用过哪些平台? WordPress:使用方便但底层过于庞大复杂,需要使用数据库,不利于迁出。 Hexo:较为冗杂,且没有比较好看的 Wiki 主题。 GitBook:CLI 版本已停止更新支持,V2 版本国内访问速度较慢。 Jekyll:技术相对较旧且缺少更新支持。 GitHub Issues/Gist/Wiki:国内访问速度较慢,UI 不可定制。 Bitcron:托管动态网站,可定制性较差,访问速度时快时慢。 DokuWiki:需自备服务器,且其本身过于老旧。 Gridea:部署简单,但可定制性较差,只能用其专用编辑器。 wiki.js:需自备服务器搭建,一般适用于团队知识库,存在部分小问题。 语雀:相对还不错的第三方知识库平台,缺点是 UI 不可定制,且数据迁出不方便。 Hugo:部署速度快,但没有比较好看的 Wiki 主题。 Gatsby:与 Hugo 相似。 Ghost:动态网站,UI 美观,需要自备服务器(或花钱买服务),可定制性较差。 docsify:比较推荐。部署简易,UI 美观,但因为其加载时渲染的特性,在某些设备上运行性能较差。 Docute:比较推荐。部署简易,UI 美观,也是加载时渲染内容,相比 docsify 少了很多插件。 VuePress:比较推荐。各方面相对都很不错,社区插件多,局限性是官方文档较乱,有些微小的 bug。 Docusaurus:比较推荐。各方面相对都不错,局限性是编译较慢,框架比较臃肿。 MkDocs(配合 Material 主题):比较推荐。各方面相对都很不错,编译也相对快,我的网站现在使用的方案。 之前我也写过一些关于自建博客和知识库的文章,有兴趣可以参考一下: 基于 docsify 搭建个人 Wiki 回归博客 浅谈 Bitcron 博客平台 博客转至 GitBook 个人知识库极简搭建指南 - VuePress 团队知识库搭建记录 - DokuWiki 构建知识管理系统 总结 临渊羡鱼,不如退而结网。在下一篇文章 个人知识库的搭建 - 基于 Docusaurus 中,我将对如何自建知识库展开详细讲解。 参考与致谢 Why Wiki 为什么要在老掉牙的独立博客上写东西 我为什么开这个博客 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

为什么要「站在巨人的肩膀上」

为什么要「站在巨人的肩膀上」 如果没有有效的指引,初学者往往会把大量的时间花在低水平试错上。 参考与致谢 如何安装 Python 运行环境 Anaconda?(视频教程)

2025/9/17
articleCard.readMore

产品经理的日常

产品经理的日常 一天的时间安排 最重要的事情就是确定今天要做什么。对于产品经理来说,最重要的事情就是确定团队成员以及自己今天要做什么。不光要顾及自己的时间安排,还要分配相当的注意力与时间在团队成员的工作上。毕竟 产品经理的工作成果都要依托于他人来实现。 所以我在上午到达公司以后,第一件事就是在 Todoist 上整理自己当天的日程,同时把需要其他人完成的事情分配到团队的协同工具中去;尽量在其它同事到达前完成整理。如果过程中有同事到达,我就会先停下手中的工作,先和这位同事确认他今天要做的事情;直到和所有我需要确定日程的同事沟通完为止。 产品经理必须对其它成员的工作现状和计划了如指掌。若非如此,有些认知是很难建立起来的: 产品从设计变为最终成品,具体经历了哪些阶段? 哪些功能放在一起做,设计与开发会更省心? 不同的功能在开发的时候分别耗费了多少时间? 为什么频繁变更需求会给同事带去极大的困扰? MVP 原则 MVP 原则,即最小化可行产品原则,最早由《精益创业》的作者 Eric Ries 提出。指的是,当你想要构建一个产品的时候,先用尽量简单的方式实现它,在确保用户会买账的情况下,你再继续去完善它。 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

使用 Bitwarden 搭建密码管理器(群晖 Docker)

使用 Bitwarden 搭建密码管理器(群晖 Docker) 注:由于 bitwarden_rs 镜像更名,且 Bitwarden 官方浏览器拓展与旧版本不兼容无法登录,请将下文出现的 bitwardenrs/server 替换为 vaultwardenrs/server,并确保版本不低于 1.27.0! 本文介绍如何在自己的群晖上使用 Docker 对全平台密码管理服务器 Bitwarden 进行私有部署。 目前的密码管理器方案有 1Password,Lastpass,KeePass,Bitwarden 等,这几种方案各有优劣。在这里我的需求是可多端同步使用,开源可自部署,且有自动填充的功能,同时兼顾界面美观,所以我选择了在自己的群晖上部署 Bitwarden 服务。 在群晖 Docker 上部署 建立存放数据的文件夹 我们在 docker 目录下建立存放 Bitwarden 数据的文件夹(比如 docker/bitwarden)。 下载镜像并配置容器 打开群晖 Docker 套件,下载 bitwardenrs/server 镜像,双击启动,勾选 启用自动重新启动,然后进入 高级设置。 在 卷 页面配置挂载的文件夹,点击 添加文件夹,选择本地的 docker/bitwarden 路径,装载路径填 /data(默认不可变): 在 端口设置 页面,手动设置容器端口 80 所对应的本地端口(比如我设置为 8003): 随后完成配置,启动容器。输入群晖本地 IP:8003,我们就能看到 Bitwarden 的登陆页面了。但是当我们创建账户后登录时,会看到这样一条提示: 这是因为,Docker 容器本身没有提供 https 端口配置,而 Bitwarden 又只能够通过 https 来进行登录(SSL 加密防止中间人攻击)。所以,在这里我们必须使用群晖自带的反向代理服务,通过 https 来访问内部 http 端口了。具体教程可以跳转文章 用群晖自带反向代理实现 HTTPS 访问 多设备使用 可以在 Bitwarden 官方的 下载页面,下载各版本的客户端 桌面端 推荐直接使用浏览器扩展 Bitwarden - 免费密码管理器 在登录的时候,先点击左上角的小齿轮,进入设置: 在 自托管环境 中的 服务器 URL 填入群晖 NAS 的 IP:外部端口,即可正常登录。 如果需要,也可以下载桌面客户端使用。 移动端 直接在 AppStore 或各应用商城下载 Bitwarden App,在登录页面也需要配置自托管环境,步骤与桌面端相同。 备份密码数据库 备份 Bitwarden 数据库的方法有两种: 在网页端或客户端内选择 导出密码库 直接备份 data 文件夹 参考与致谢 群晖 NAS 高级服务 - docker 部署 bitwarden 全平台密码管理器 使用群晖搭建第三方 Bitwarden 密码服务器 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

使用 Calibre 搭建在线书库(群晖 Docker)

使用 Calibre 搭建在线书库(群晖 Docker) 如何在群晖 NAS 用 calibre-web(Docker)搭建一个在线书库。 相比于传统用文件夹的方式,以开源的 Calibre 为代表的书库管理方式,能提供更丰富的功能诸如在线阅读、下载、格式转换、推送到邮箱、去除重复书籍等。calibre-web 是一个基于 Calibre 的 Docker 镜像,可以让我们很方便地将书库部署在像群晖这样的服务器上。 建立初始文件夹 首先,建立书库资源文件夹,这里我直接在磁盘根目录建立了一个名为 book 的共享文件夹: 相应地,在 docker 文件夹内创建一个名为 calibre-web 文件夹,专门用于存放 Docker 镜像的配置文件。 创建容器 打开群晖的 Docker 套件,在注册表中搜索 johngong/calibre-web,双击下载后,初始化容器,点进高级设置。 在 卷 页面添加映射文件夹,装载路径分别是 /library 和 /config: 在 端口设置 页面添加端口映射,主要将容器内部的 8083 端口映射出去,这里我选择 5004。 随后,创建并启动容器。 运行测试 打开群晖内网 IP:5004 打开管理界面,默认的账号是 admin,密码是 admin123 需要注意的是,默认是没有书籍上传功能的,需要依次点击右上角 管理权限 - 编辑基本配置 — 启用上传,才能启用书籍上传功能。 启用 HTTPS 使用群晖系统自带的反向代理(推荐) 具体教程可以跳转文章 用群晖自带反向代理实现 HTTPS 访问 直接添加证书方法 将申请到的证书和密钥文件复制一份到 docker/calibre-web/ 目录下。 随后在 calibre-web 内依次点击 管理权限 - 编辑基本配置 - 服务器配置,配置 SSL 证书及密钥文件的路径(例如我是 /config/wiki-power.com.cer 和 /config/wiki-power.com.key),随后点击保存。 这样就可以开启 HTTPS 访问了。 参考与致谢 群晖 Docker 安装 calibre-web 图书管理系统 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

使用 Markdown 高效写作

使用 Markdown 高效写作 如果你习惯使用 Word 之类的工具写作,你可能会常常遇到以下的场景: 加粗的按钮在哪里?列表的按钮在哪里?怎样才能正常地插图? 不同标题要用几号字体?正文用几号字体才合适? 用别的版本的 Word 打开,样式不是我想要的 当用于排版的时间超过了写作本身,足以证明,这种写作方式并不高效。 工具 首先,你需要一个支持 Markdown 的编辑器,我推荐使用 VS Code 或 Typora。 VS Code 生产力指南 - 环境配置 常用语法 Markdown 常用语法也就这么几种:标题、文本样式、引用、代码、链接、图片、列表、表格、分割线 ,掌握即可游刃有余了。 标题 要创建标题,请在标题文本前添加 1~6 个 # 符号。标题的层级数取决于 # 的数量。一般来说,文章的结构不应超出 4 个层级。 # 最大标题 ## 二级标题 ### 三级标题 #### 四级标题 …… 文本样式 在字符两侧添加符号,对文本进行样式化: 样式 键盘快捷键 语法 呈现样式 粗体 Ctrl/⌘ + B **粗体文本** 粗体文本 斜体 Ctrl/⌘ + I *斜体文本* 斜体文本 又粗又斜 ***又粗又斜的文本*** 又粗又斜的文本 删除线 ~~错误文本~~ ~~错误文本~~ 注意:斜体文本是专为英文设计的,为了易读性和规范性,请勿对中文使用斜体。 引用文本 你可以使用 > 符号来引用文段: 正如「海盗湾」的圣诞祝词: > 我们相信,我们已经改变了一些东西。不仅仅是我们,而是我们所有人。 我们不再想仅仅运行一个网站,而是想寻找一些意义。这离不开你的帮助。我们的历史还在书写中,请不要匆忙下结论。 正如「海盗湾」的圣诞祝词: 我们相信,我们已经改变了一些东西。不仅仅是我们,而是我们所有人。 我们不再想仅仅运行一个网站,而是想寻找一些意义。这离不开你的帮助。我们的历史还在书写中,请不要匆忙下结论。 引用代码 行内引用 你可以使用反引号 `(在键盘左上角)在行内引用代码。例如: 将压缩包内的 `hugo.exe` 文件解压至 `D:\hugo` 文件夹目录下。 将压缩包内的 hugo.exe 文件解压至 D:\hugo 文件夹目录下。 多行代码 如果需要多行代码,可以使用三个反引号 ``` 前后包围代码区块: int fputc(int ch,FILE *f) { HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,100); return ch; } 其中,```c 表示这段代码是 C 语言,即会按照 C 的语法来渲染高亮。 如果需要显示代码所在的文件,可以加上 ```c title="stm32f4xx_it.c",效果如下: stm32f4xx_it.c int fputc(int ch,FILE *f) { HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,100); return ch; } 链接 将链接文本包含在方括号 [ ] 内,然后将 URL 包含在括号 ( ) 内,可创建链接。例如: 本站点是使用 [Docusaurus](https://v2.docusaurus.io/) 构建的。 本站点是使用 Docusaurus 构建的。 图片 图片的格式仅仅比链接多加了个 ! 符号,例如: ![](https://cdn.jsdelivr.net/gh/linyuxuanlin/Wiki-WildWolf/static/uploads/b944219198103ea09f0f02bcb830e9b.png) 注:图片可不加显示文字,即 [ ] 内可留空。 列表 无序列表 在文本前面添加 - 或 *,可创建无序列表(注意:符号后应该带一个空格,否则可能渲染失败)。例如: - 列表子项 - 列表子项 - 列表子项 列表子项 列表子项 列表子项 有序列表 若想创建有序列表,请在每行前添加编号: 1. 列表项一 2. 列表项二 3. 列表项三 列表项一 列表项二 列表项三 TODO 列表 若要创建 TODO 列表,则按照以下的格式: - [x] 完成更改 - [ ] 推送提交到 GitHub - [ ] 打开拉取请求 完成更改 推送提交到 GitHub 打开拉取请求 列表嵌套 若想在列表内进行嵌套,可直接使用快捷键 Tab 缩进,Shift + Tab 取消缩进: 1. 列表项一 1. 列表子项一 2. 列表子项二 - 子子项 - 子子项 2. 列表项二 列表项一 列表子项一 列表子项二 - 子子项 - 子子项 列表项二 表格 使用 | 符号来分隔不同的单元格,使用 - 符号来分隔表头和其他行: | name | age | | ---------- | --- | | LearnShare | 12 | | Mike | 32 | name age LearnShare 12 Mike 32 若想对齐表格中的列,可以使用 : 符号: :--- 或 --- 代表左对齐 :--: 代表居中对齐 ---: 代表右对齐 | name | age | | :--------: | --: | | LearnShare | 12 | | Mike | 32 | name age LearnShare 12 Mike 32 分割线 你可以用 --- 符号生成分割线,以分隔不同内容的文段: --- 高级用法 段落与分行 在 Markdown 中,请以前后各空一行,来区分不同的段落。 导出其他格式 如需要导出 PDF,Word,图片等格式,可以使用 Pandoc 来实现。 Markdown PDF 以导出 PDF 文档。 用 Markdown 写公众号文章 微信公众号用的是富文本编辑器,我们可以使用网页工具 MD2WeChat 对 Markdown 进行解析渲染,并粘贴至公众号编辑器内。 详情请参考 使用 Markdown 进行高效写作 这篇文章。 参考与致谢 个人 Markdown 编辑方法 高效写作方式 Markdown,让你彻底摆脱排版的困扰 younghz/Markdown Learning-Markdown (Markdown 入门参考) 基本撰写和格式语法 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

使用 RSSHub 搭建 RSS 生成器(群晖 Docker)

使用 RSSHub 搭建 RSS 生成器(群晖 Docker) 在群晖 Docker 上搭建 RSSHub 服务,给各种奇奇怪怪的内容生成 RSS 订阅源。 在群晖 Docker 上部署 打开群晖 Docker 套件,下载 diygod/rsshub 镜像,双击启动,勾选 启用自动重新启动,然后进入 高级设置。 在 端口设置 页面,手动设置容器端口 1200 所对应的本地端口(比如我设置为 8004): 随后完成配置,启动容器。输入群晖本地 IP:8004,如果能看到 RSSHub 的页面,就算安装成功了。 使用步骤 详细的使用方法请参考 RSSHub 官方文档 举个简单的例子,在官方文档中查到,豆瓣 正在上映的电影 生成方法如下: 那么,使用 你的域名/douban/movie/playing 就可以使用自己的服务器来生成 RSS 源了。 建议使用群晖系统自带的反向代理,实现 HTTPS 加密访问。具体教程可以跳转文章 用群晖自带反向代理实现 HTTPS 访问 使用 RSSHub Radar 自动检测路由 RSSHub Radar 是一个可以帮助你快速发现和订阅当前网站 RSS 和 RSSHub 的浏览器扩展。 在其设置页面填入自定义地址即可使用。 参考与致谢 RSSHub 官方文档 在群晖中使用 Docker 安装 RSSHub 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

使用 Rclone 同步网盘数据

使用 Rclone 同步网盘数据 Rclone 是一个用于管理网盘文件的命令行工具,支持 40 余种网盘(包括 S3 类)。Rclone 也有衍生的图形化界面的软件 RcloneBrowser,方便一般用户使用。本文介绍如何通过 Rclone 同步腾讯云对象储存。 软件安装 Rclone:下载后将 .exe 解压,记下路径。 RcloneBrowser:GUI 工具。安装后选择 Rclone 的路径。 (可选)WinFsp:依赖库,如果挂载虚拟硬盘就需要安装) 配置流程 打开 Rclone Browser,点击左下角的 Config...,接下来根据提示输入: 输入 n 以新建远程连接: Name Type ==== ==== rclone config s3 e) Edit existing remote n) New remote d) Delete remote r) Rename remote c) Copy remote s) Set configuration password q) Quit config e/n/d/r/c/s/q> n 给远程连接取个名字(例如 test): name> test 选择服务商(以下我以腾讯云 COS 为例,选择 4): Choose a number from below, or type in your own value 1 / 1Fichier \ "fichier" 2 / Alias for an existing remote \ "alias" 3 / Amazon Drive \ "amazon cloud drive" 4 / Amazon S3 Compliant Storage Providers including AWS, Alibaba, Ceph, Digital Ocean, Dreamhost, IBM COS, Minio, and Tencent COS \ "s3" ... Storage> 4 Choose a number from below, or type in your own value 1 / Amazon Web Services (AWS) S3 \ "AWS" 2 / Alibaba Cloud Object Storage System (OSS) formerly Aliyun \ "Alibaba" 3 / Ceph Object Storage \ "Ceph" 4 / Digital Ocean Spaces \ "DigitalOcean" 5 / Dreamhost DreamObjects \ "Dreamhost" 6 / IBM COS S3 \ "IBMCOS" 7 / Minio Object Storage \ "Minio" 8 / Netease Object Storage (NOS) \ "Netease" 9 / Scaleway Object Storage \ "Scaleway" 10 / StackPath Object Storage \ "StackPath" 11 / Tencent Cloud Object Storage (COS) \ "TencentCOS" 12 / Wasabi Object Storage \ "Wasabi" 13 / Any other S3 compatible provider \ "Other" provider> 11 选择认证类型。因为我们是第一次配置,所以选择 1: Choose a number from below, or type in your own value 1 / Enter AWS credentials in the next step \ "false" 2 / Get AWS credentials from the environment (env vars or IAM) \ "true" env_auth> 1 输入云服务的账号,这里相当于腾讯云 COS 的 SecretId: AWS Access Key ID. access_key_id> ****** 输入密码,相当于 SecretKey: AWS Secret Access Key (password) secret_access_key> ****** 选择云服务的地区: Endpoint for Tencent COS API. 1 / Beijing Region. \ "cos.ap-beijing.myqcloud.com" 2 / Nanjing Region. \ "cos.ap-nanjing.myqcloud.com" 3 / Shanghai Region. \ "cos.ap-shanghai.myqcloud.com" 4 / Guangzhou Region. \ "cos.ap-guangzhou.myqcloud.com" ... endpoint> 4 选择读写类型,图床一般是公读私写: Canned ACL used when creating buckets and storing or copying objects. 1 / Owner gets Full_CONTROL. No one else has access rights (default). \ "default" 2 / Owner gets FULL_CONTROL. The AllUsers group gets READ access. \ "public-read" / Owner gets FULL_CONTROL. The AllUsers group gets READ and WRITE access. ... acl> 2 选择储存类型(选择 1 默认即可): The storage class to use when storing new objects in Tencent COS. 1 / Default \ "" 2 / Standard storage class \ "STANDARD" 3 / Archive storage mode. \ "ARCHIVE" 4 / Infrequent access storage mode. \ "STANDARD_IA" storage_class> 1 是否编辑高级设置(选择 n 否): Edit advanced config? (y/n) y) Yes n) No (default) y/n> n 最后确认,检查无误后输入 y: Remote config [Txcos] type = s3 provider = TencentCOS env_auth = false access_key_id = xxx secret_access_key = xxx endpoint = cos.ap-guangzhou.myqcloud.com acl = public-read y) Yes this is OK (default) e) Edit this remote d) Delete this remote y/e/d> y 输入 q 退出: Current remotes: Name Type ==== ==== Txcos s3 e) Edit existing remote n) New remote d) Delete remote r) Rename remote c) Copy remote s) Set configuration password q) Quit config e/n/d/r/c/s/q> q 接下来,双击打开配置好的远程连接,选择文件夹并点击 Download 下载到本地,在弹出的窗口选择以下配置: Mode 选择 Copy 模式(单向从云端到本地同步),只拷贝新增和变化的文件,备份的时候使用。 在 Skip files 区域勾选 Skip all files that exist,避免重复下载消耗流量。 在 Task description 区域输入任务名称,方便下次同步使用。 配置完成后,切换到 Tasks 标签页,选择相应的任务,点击 Run 即可开始下载。 在群晖 NAS 上配置 注:在群晖上建议使用 CloudSync,不要对底层代码进行修改。 准备工作: 开启 ssh 启用用户家目录(homes) 创建用于同步的文件夹(比如我是 /volume1/wiki-media) 安装 Rclone: curl https://rclone.org/install.sh | sudo bash 配置服务: rclone config 按照上面的步骤就行。 同步的命令: # 本地到网盘 rclone [功能选项] <本地路径> <网盘名称:路径> [参数] [参数] ... # 网盘到本地 rclone [功能选项] <网盘名称:路径> <本地路径> [参数] [参数] ... # 网盘到网盘 rclone [功能选项] <网盘名称:路径> <网盘名称:路径> [参数] [参数] ... 例如我是: rclone sync COS_backup:/wiki-media-1253965369 /volume1/wiki-media -P 在选定的路径新建一个自动化脚本(如 rclone-sync.sh),将上面的命令放进脚本文件内。 在群晖 控制面板 - 任务计划 - 新增 - 计划的任务 - 用户定义的脚本,在 计划 和 任务设置 标签页配置周期运行时间,和脚本的路径 控制面板 - 任务计划 - 新增 - 计划的任务 - 用户定义的脚本,在 计划 和 任务设置 标签页配置周期运行时间,和运行脚本的命令(比如 bash /volume1/stash/permanent/rclone-sync.sh) 可在 设置 内配置输出结果,后选择任务,点击 运行,可测试运行,可打开配置的输出路径看运行结果 参考与致谢 Rclone 安装配置使用教程,附 Rclone 常用命令参数详解 基于 [对象存储] 的低成本全功能私有云搭建 使用 Rclone 和 WinFsp 将阿里云 oss / 腾讯云 cos 挂载为 windows 磁盘 使用 rclone 在 Windows 下挂载 Google 个人 / 团队云盘 使用 rclone 每天定时备份 typecho 博客网站内容及 mysql 数据库到 Google Drive/Onedrive 等网盘' 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

使用 R 语言进行数据分析

使用 R 语言进行数据分析 软件安装 R-software 如果是在 Windows 上使用,请在网站主页点击 Download R for Windows,然后点击 install R for the first time,最后点击 Download R 4.0.4 for Windows,下载软件后请自行完成安装。 R 语言支持软件仅在后台运行,没有图形化界面。 RStudio 直接点击蓝色的 Download 按钮,或者在页面下方选择其他系统版本下载。下载软件后请自行完成安装。 教学资源 在线资源(推荐) R-tutorial 零基础学 R 语言 书籍 The R-book R for Data Science 基本数据类型 R 语言的数据类型,主要有以下这几种: 数值型(numerics) 整数型(integer) 复数型(complex) 逻辑型(logical) 字符型(characters) 数值型(numerics) 数值型是 R 语言中最基本的数据类型。当我们把一个数字值赋给变量,那变量的类型就是数值型: > x = 11.15 # 把 11.15 这个数值赋给变量 x > x # 输出出 x 的值 [1] 11.15 > class(x) # 输出 x 的类型 [1] "numeric" 整数或小数都可以是数值型变量。但如果按照以上的方法创建,那么整数变量也会被视为小数变量。 整数型(integer) 如果要创建整数型变量,就得使用函数 is.integer: > y = as.integer(3) > y # 输出 y 的值 [1] 3 > class(y) # 输出 y 的类型 [1] "integer" > is.integer(y) # y 是否为整数? [1] TRUE 除了使用 is.integer 函数,你也可以附加 L 后缀来实现: > y = 3L > is.integer(y) # y 是否为整数? [1] TRUE 如果要对小数进行取整,我们可以使用函数 as.integer: > as.integer(3.14) # 对变量进行强制数值转换 [1] 3 也可以对字符串类型进行解析并取整: > as.integer("5.27") # 对变量进行强制数值转换 [1] 5 但如果解析的字符串不是数值,那就会出错: > as.integer("Joe") # 解析一个非数值型的字符串 [1] NA Warning message: NAs introduced by coercion R 语言像 C 语言一样,把整数 1 0 与逻辑 TRUE FALSE对应了起来: > as.integer(TRUE) # TRUE 的数值型变量 [1] 1 > as.integer(FALSE) # FALSE 的数值型变量 [1] 0 复数型(complex) 在 R 语言中,复数变量通过 i 来定义: > z = 1 + 2i # 创建一个复数变量 z > z # 输出 z 的值 [1] 1+2i > class(z) # 输出 z 的类型 [1] "complex" 如果我们单纯对 -1 开方,那将会出错: > sqrt(−1) # 对 -1 开方 [1] NaN Warning message: In sqrt(−1) : NaNs produced 但是对复数 −1+0i 开方,那就没问题: > sqrt(−1+0i) # 对 −1+0i 开方 [1] 0+1i 也可以用强制类型转换来进行运算: > sqrt(as.complex(−1)) [1] 0+1i 逻辑型(logical) 逻辑型通常通过比较变量而产生: > x = 1; y = 2 # 样本变量 > z = x > y # x 比 y 大吗? > z # 输出逻辑变量 [1] FALSE > class(z) # 输出 z 的类型 [1] "logical" 基本逻辑操作有 &(与),|(或), !(非): > u = TRUE; v = FALSE > u & v # 对 u,v 进行 "与" 运算 [1] FALSE > u | v # 对 u,v 进行 "或" 运算 [1] TRUE > !u # 对 u 进行 "非" 运算 [1] FALSE 字符型(character) 字符型可通过函数 as.character 进行强制类型转换得到: > x = as.character(3.14) > x # 输出字符串 [1] "3.14" > class(x) # 输出 x 的类型 [1] "character" 要合并两个字符型变量,可以使用函数 paste: > fname = "Joe"; lname ="Smith" > paste(fname, lname) [1] "Joe Smith" 像 C 语法一样,可以用格式输出以增加可读性,用函数 sprintf 即可: > sprintf("%s has %d dollars", "Sam", 100) [1] "Sam has 100 dollars" 如果要从字符串中提取子串,可以使用函数 substr(示例中把第 3 到第 12 个字符之间的字符截取了下来): > substr("Mary has a little lamb.", start=3, stop=12) [1] "ry has a l" 如果要把第一个遇见的字符替换成另外一个,可以使用函数 sub(示例中把 little 替换成了 big): > sub("little", "big", "Mary has a little lamb.") [1] "Mary has a big lamb." 向量 R 语言中的向量 向量是一个包含相同类型元素的数组,向量中的成员被官方称为 components。 以下是一个示例向量(包含三个数值变量 2 3 5): > c(2, 3, 5) [1] 2 3 5 也可以全部由逻辑型构成: > c(TRUE, FALSE, TRUE, FALSE, FALSE) [1] TRUE FALSE TRUE FALSE FALSE 也可以由字符型构成: > c("aa", "bb", "cc", "dd", "ee") [1] "aa" "bb" "cc" "dd" "ee" 如果想知道一个向量内有多少个成员,可以使用函数 length: > length(c("aa", "bb", "cc", "dd", "ee")) [1] 5 合并向量 如果要合并两个向量,可以使用函数 c: > n = c(2, 3, 5) > s = c("aa", "bb", "cc", "dd", "ee") > c(n, s) [1] "2" "3" "5" "aa" "bb" "cc" "dd" "ee" 注意在上面的例子中,如果合并两个不同数据类型的向量,那合并后的类型将会是向下兼容的(即将比较严格的类型,进行强制类型转换为比较宽松的类型,例如将数值型变成字符型) 向量基本运算 我们先假定两个向量 a b: > a = c(1, 3, 5, 7) > b = c(1, 2, 4, 8) 以下就是向量的基本运算: > a + b [1] 2 5 9 15 > a - b [1] 0 1 1 -1 > 5 * a [1] 5 15 25 35 > a * b [1] 1 6 20 56 > a / b [1] 1.000 1.500 1.250 0.875 如果相加的两个向量成员数量不一致,那么结果将会向下兼容,即输出变量的长度取决于较长的那个: > u = c(10, 20, 30) > v = c(1, 2, 3, 4, 5, 6, 7, 8, 9) > u + v [1] 11 22 33 14 25 36 17 28 39 检索向量 如果要从向量中取出成员,可以使用在 [ ] 中声明索引的方法,也就是 [第几个成员] : > s = c("aa", "bb", "cc", "dd", "ee") > s[3] # 取出第三个成员的值并输出 [1] "cc" 如果索引前加一个负号,比如 [-3],就意味着取出除第三个成员外的其他成员: > s[-3] [1] "aa" "bb" "dd" "ee" 如果索引超出了向量的长度,那就会报错: > s[10] [1] NA 【更新中】

2025/9/17
articleCard.readMore

使用 VS Code 进行远程开发

使用 VS Code 进行远程开发 —— 将 VS Code 作为 SSH 工具,连接远程服务器进行开发。 背景 尝试了各类 SSH 工具,最终还是回到界面好看又强大的 VS Code. VS Code 基础配置篇:VS Code 生产力指南 - 环境配置 配置扩展 点击安装扩展:Remote - SSH 点击左下角 Remote 按钮即可使用。 其他配置 VS Code 无法监视大型工作区的文件变化 运行此命令查看当前限制: cat /proc/sys/fs/inotify/max_user_watches 编辑 /etc/sysctl.conf 文件: sudo vim /etc/sysctl.conf 增加如下代码,将此限制增加到最大值: fs.inotify.max_user_watches=524288 保存,启用设置: sudo sysctl -p 无法使用自定义的用户名登录 在 VS Code 的设置中找到 Remote.SSH: Config File,填写覆盖值为 C:\Users\你需要的用户名\.ssh\config,并在本地创建相应的配置文件即可。 连接失败,但使用其他 SSH 客户端可以连上 有可能是远程服务器上的 sshd 的版本低于 7.6.0,缺失了显示远程端口的特性所导致的。解决这个问题需要升级 sshd 的版本: 对于 Debian 或 Ubuntu:sudo apt-get update && sudo apt-get install openssh-server 对于 Red Hat 或 CentOS:sudo yum update openssh-server 也有可能是代理设置的问题,请切换或关闭代理试试看。 参考与致谢 VSCode Remote 体验 | 远程 Linux 环境开发真香 VSCode 报警处理:VisualStudioCode 无法监视这个大型工作区的文件变化 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

使用 Watchtower 自动更新容器(群晖 Docker)

使用 Watchtower 自动更新容器(群晖 Docker) 使用 Watchtower 自动更新群晖 Docker 上的容器。 在群晖 Docker 应用中下载镜像 打开群晖 Docker 套件,下载 containrrr/watchtower 镜像即可。 在任务计划中配置 Watchtower 打开群晖的 控制面板 - 任务计划 - 新增 - 计划的任务 - 用户定义的脚本,随后按以下图片填写配置: 其中的脚本: docker run --rm --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --cleanup --run-once calibre-web freshrss code-server 注意,脚本的最后 calibre-web freshrss code-server 是需要更新的容器名,请替换为你需要更新的;或者留空表示更新全部容器。 保存,运行脚本即可实现 Docker 容器批量定时更新。 参考与致谢 如何优雅地使用一条命令更新群晖 docker 容器 - Watchtower 教程 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

使用 acme.sh 自动申请域名证书(群晖 Docker)

使用 acme.sh 自动申请域名证书(群晖 Docker) 本文介绍如何使用 Docker 镜像 acme.sh,实现名证书自动申请和续签功能。 acme.sh 可以从 letsencrypt 生成免费的证书,支持 Docker 部署,支持 http 和 DNS 两种域名验证方式,其中包括手动,自动 DNS 及 DNS alias 模式方便各种环境和需求。可同时申请合并多张单域名,泛域名证书,并自动续签证书和部署到项目。 准备 DNS API 本文以腾讯云为例申请 DNS API,其他解析平台请参考官方文档 dnsapi。 首先,打开 DNSPOD,点击右上角头像 - 密钥管理 接着,创建一个新的密钥,并拷贝 ID 与 Token。 在群晖 Docker 上部署 本教程介绍的是 Docker 的 daemon 守护模式,一直挂着容器,实现证书到期自动续期的功能。 创建配置文件夹 我们先创建 /docker/acme.sh 文件夹,再手动创建 account.conf 文件: 接着,我们编辑这个文件,手动添加这几行: export DP_Id="刚刚申请的 ID" export DP_Key="刚刚申请的 TOKEN" AUTO_UPGRADE='1' 随后保存并关闭文件。 下载镜像并配置容器 打开群晖 Docker 套件,下载 neilpang/acme.sh 镜像,双击启动并进入 高级设置 在 卷 页面配置挂载的文件夹,点击 添加文件夹,选择本地的 docker/acme.sh 路径,装载路径填 /acme.sh(默认不可变): 在 网络 页面,勾选 使用与 Docker Host 相同的网络。 接着,切换到 环境 页面,在 命令 框里填入 daemon 命令: 随后创建并运行容器。双击已运行的容器,切换到 终端机 页面,点击 通过命令启动,输入 sh 后点确定。 输入以下命令实现自动更新: acme.sh --upgrade --auto-upgrade 然后输入以下命令申请证书: acme.sh --issue --dns dns_dp -d wiki-power.com -d *.wiki-power.com 其中,dns_dp 代表腾讯云 DNSPod,如果是阿里云请填写 dns_ali,CLoudflare 填写 dns_cf,其他请参考官方手册 dnsapi。另外,其中 *.wiki-power.com 代表申请的是泛域名证书。如果需要同时申请多域名,可以按照以下的方式: acme.sh --issue --dns dns_dp -d aaa.com -d *.aaa.com -d bbb.com -d *.bbb.com -d ccc.com -d *.ccc.com 在 daemon 守护模式下,acme.sh 会根据申请记录,每 60 天自动更新证书。 生成证书 如果一切顺利,你可以在 docker/acme.sh/域名命名的文件夹 内发现 域名.cer 和 域名.key,这就是证书和密钥文件,可以拷贝至需要用到的地方。 参考与致谢 群晖 NAS 高级服务 - docker 部署 acme.sh 自动申请域名证书 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

使用 frp 访问群晖 NAS

使用 frp 访问群晖 NAS 使用 frp 在任意网络下访问群晖 NAS。 为什么要通过 frp 访问群晖 无公网 IP QuickConnect 服务太慢 花生壳等服务需要单独买流量 服务端配置 跳转文章 如何实现外网 RDP 远控(frp)· 服务端配置。需要注意的是,frpc.ini 配置文件中的 vhost_http_port / vhost_https_port 参数必须保留。 绑定域名 在域名解析处以服务器 IP 添加 A 记录 在云服务器处配置域名绑定 群晖 NAS 配置 编辑配置文件 在任意位置新建 frpc.ini 文件,填入以下内容: frpc.ini [common] server_addr = 服务器 IP server_port = 服务端 frp 端口,默认为 7000 token = 密钥,需与服务端配置的相同 [dsm-http] type = tcp local_ip = localhost local_port = 群晖 DSM http 端口,默认为 5000 custom_domains = 绑定的域名 remote_port = 自定义远程端口 [dsm-https] type = tcp local_ip = localhost local_port = 群晖 DSM https 端口,默认为 5001 custom_domains = 绑定的域名 remote_port = 自定义远程端口 [ssh] type = tcp local_ip = localhost local_port = 默认为 22 custom_domains = 绑定的域名 remote_port = 自定义远程端口 使用 Docker 方法 在群晖的 Docker 内安装 stilleshan/frpc 映像,使用以下参数初始化容器: 勾选 使用高权限执行容器 勾选 启用自动重新启动 在 卷 标签页添加文件,选择本地的 frpc.ini 文件,对应装载路径为 /frp/frpc.ini 勾选 使用与 Docker Host 相同的网络 启动容器,稍等片刻,就可以通过域名 + http 端口号的形式访问群晖 DSM 了。 参考与致谢 群晖 NAS 使用 Docker 安装配置 frpc 内网穿透教程 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

使用 gitignore 忽略特殊文件

使用 gitignore 忽略特殊文件 有些文件我们不想纳入 Git 版本管理,也不希望它们总出现在未跟踪列表,例如 node_modules、一些开发依赖、编译日志等等。 这时,我们可以创建一个 .gitignore 文件,列出需要忽略的清单。 规范 空行或者以注释符号 # 开头的行会被忽略 标准的 glob 模式匹配 匹配模式最后跟反斜杠(/)说明要忽略的是目录 要忽略指定模式以外的文件和目录,可以在模式前加上 ! 取反 示例 # 此行为注释,将被 Git 忽略 # 忽略所有 .a 格式的文件 *.a # 不忽略 lib.a !lib.a # 忽略根目录下的 TODO 文件 /TODO # 忽略 build 文件夹 build/ # 忽略 doc 目录下的所有 txt 文件(不包含次级目录) doc/*.txt # 忽略doc目录下的所有 txt 文件(包含所有次级目录) doc/**/*.txt 参考与致谢 zxhfighter/git-ignore.md github/gitignore

2025/9/17
articleCard.readMore

保险丝的选型

保险丝的选型 通用选型 耐压值(最大电压):需大于电源的电压,并留合适的余量。 额定电流:需大于正常使用时的工作电流(额定电流非熔断电流)。 工作温度:留余量 25% 以上。 电压降/冷电阻:一般越小越好(功率损耗小) 熔断特性:保险丝最主要的电性能指标。表示当电流超额时,熔体温度逐渐上升,直至最后保险丝被烧断。根据熔断特性不同,可以把保险丝分为快速型和延时型。延时型常用在电路状态变化时有较大浪涌电流的感性或容性电路中,能承受开关机时浪涌脉冲的冲击;快速型常用在阻性电路中,保护一些对电流变动特别敏感的元器件。 分断能力:表示在规定的电压下,保险丝能安全地切断的最大电流。 PPTC 选型 自恢复保险丝(PPTC,Polymeric Positive Temperature Coefficient)正常工作时电阻很小(压降很小),当电路出现过流使其温度升高时,电阻急剧增大几个数量级,使电路中的电流减小到安全值以下,从而使后面的电路得到保护,过流消失后自动恢复为低阻,免除电流保险丝经常更换的麻烦。 参数: 最大电压 \(V_{max}\)(Rated Voltage):额定电流下可承受的最大电压。 最大电流 \(I_{max}\)(Maximum Current):额定电压下可承受的最大电流。 保持电流 \(I_{hold}\)(Hold Current):不动作(不会使电阻值突变)的最大电流。 触发电流 \(I_{trip}\)(Trip Current):发生动作(使电阻值突然变大)的最小电流,一般为保持电流的两倍。 动作功率 \(P_d\)(Typical power):动作状态下的消耗功率。 最大动作时间 \(T_{trip}\)(Max Time to Trip):规定电流下的最大的动作时间。 静态电阻 \(R_{i_{min/max}}\)(Resistance Tolerance):焊接前初始阻值。 焊接一小时后电阻 \(R_{1_{max}}\):焊接 / 跳闸一小时后的最大阻值。 参考与致谢 贴片自恢复保险丝的额定电压参数值所代表什么意思? 什么?!选保险丝还有技巧? 自恢复保险丝 PPTC 的参数 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

信号地与机壳地间的 EMC 设计

信号地与机壳地间的 EMC 设计 通常,在 PCB 的信号地与机壳地之间,我们会使用一个高压电容(1~100nF/2kV)与大电阻(1MΩ)并联连接,以提高 EMC 性能: 其中,电容的作用是通交阻直。从 EMI 角度看,可将电路内部产生的高频干扰会经过机壳流入大地,避免产生天线辐射;从 EMS 角度看,可抑制高频干扰源和电路之间的瞬态共模压差,因电路有时不可直连(220VAC 过整流桥后的 GND 不可直连机壳地)或直连不够安全。 电阻的作用是泄放电荷,防 ESD 损害电路。假如只有电容连接信号地与机壳地,那么信号地是浮空的。ESD 测试时,信号地会逐渐积累高压电荷,一旦超过两个地之间最近的地方所能耐受的电压,就会发生电弧放电,将在几纳秒之内产生很大的电流,损害电路。并联了这个电阻,即可缓慢泄放掉电荷。 参考与致谢 PCB 地与金属机壳用阻容连接,什么说法? 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

信号完整性 - 串扰 🚧

信号完整性 - 串扰 🚧 一根信号线上有信号通过时,在 PCB 板上与之相邻的信号线上就会感应出相关的信号,我们称之为串扰。串扰通常表现为毛刺。串扰是传输线之间相互的寄生电感产生耦合引发的,带来的危害是使信号畸变。 串扰分为近端(NEXT)串扰与远端串扰(FEXT)。 如图可见,上方信号线传过来了一个跳变的信号,在粉色的区域内,两根导线靠得很近(不符合 3W 原则),所以会产生串扰。下方的导线是受干扰的线。 在跳变信号进入干扰区域(粉色区域)时,开始发生串扰: 可以观察到,由于干扰源在移动,且同时向两个方向发出,所以随着时间的推进,与信号同向的干扰波形会叠加,而与信号反向波形高度保持不变。 当跳变信号传出干扰区域后,受干扰线上的凸起波形开始消失,并向各自的方向推进: 最终,在近端 / 远端接收的干扰如下: 减少串扰的方法: 增加走线间距:3W 原则 信号线距离地线距离拉近 减小平行走线的耦合长度 增大信号的上升时间或下降时间:在时序条件允许的情况下,这可以减少高频信号所带来的影响 合理采用端接匹配技术:减弱甚至消耗信号的反射,从而减弱串扰强度。 参考与致谢 《信号完整性与电源完整性分析》 《信号完整性揭秘-于博士 SI 设计手记》 What Every PCB Designer Should Know - Crosstalk Explained (with Eric Bogatin) 《硬件信号质量 SI 测试规范》 传输线串扰分析 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

信号完整性 - 传输线 🚧

信号完整性 - 传输线 🚧 传输线是一种理想元件,由任意两条一定长度的导线组成,分别称为 信号路径 和 返回路径(参考路径)。传输线有两个重要的特征:特性阻抗 与 时延。 信号的传输方式 观察信号的传输,需要同时看信号路径与返回路径。如何确定信号路径和返回路径呢?如果两根线是一模一样的(例如双绞线),则没有严格的区分;如果是微带线,一般会指定平面为返回路径。需要注意的是,在信号完整性的范畴中,我们会用「返回路径」这个概念代替「接地」,因为需要分析的情况远比单纯「接地」复杂得多。 信号进入传输线后,将在其中以介质中的光速传输。我们可将信号表示为信号路径和返回路径上,相邻两点间的电压差: 如果假设一对足够长且末端开路的传输线,分别在源端和末端都串接电流表,检测信号电流。在实际实验中可以观察到,当信号刚开始进入信号路径时,在返回路径上就已经开始检测到电流了。所以,电流的回路并非从从头到尾从源端到末端、再从返回路径流回来,而是通过信号和返回路径产生的电位差而产生电流(类似电容的充电)。随着信号的传播,产生电流的位置也不断向前。 均匀传输线与平衡传输线 对传输线进行分类,如果按它的几何结构,则可通过这两个特征:沿线横截面的均匀程度、两条导线的相似与对称程度。 如果沿着导线,任一位置横截面都相同,则称为 均匀传输线,也称 可控阻抗传输线,例如双绞线、微带线带状线等: 信号完整性设计的一个目标,就是把所有高速互连都设计成均匀传输线,并努力减小所有非均匀传输线的长度。 另一个分类的特征,是看两条导线的相似 / 对称程度。如果两条导线形状大小都一模一样,那么它是 平衡传输线,例如双绞线(twisted pair)。而非平衡传输线的例子是同轴电缆(coax),因为它中间导线比外面一圈的横截面小。 信号传播的速度 传输线上信号传播的速度,并不取决于导体中电子的速度。 如果可知每秒通过导线截面的电子数、导线中的电子密度、导线的横截面积,就能算出导线中电子的速度。因为导体中电流(\(I\))可由以下公式计算: \[ I=\frac{\Delta Q}{\Delta t}=\frac{qnAv\Delta t}{\Delta t}=qnAv \] 其中,\(\Delta Q\) 表示 \(\Delta t\) 内流过导线的电量(单位为 \(C\)),\(q\) 表示一个自由电子所带的电量,为常数 \(1.6\times 10^{-19}C\),\(n\) 表示自由电子的密度(单位为 \(\#/m^3\)),\(A\) 表示导线的横截面积(\(m^2\))。所以可得到电子的速度(\(m/s\)): \[ v=\frac{I}{qnA} \] 在常见的介质中,电子的运动速度是很低的。例如一条直径为 \(1mm\) 的铜导线(铜原子间隔约为 \(1nm\),每个铜原子能提供两个自由电子,可算出自由电子密度约为 \(10^{27}/m^3\)),通过 \(1A\) 电流时电子的速度约为 \(1cm/s\)。可见,电子的速度是远低于信号传播速度的。 不仅如此,减少互连的电阻,并不能提高信号传播的速度。只有在非常极端的情况下,互连线的电阻才会轻微影响到信号传播的速度。一般情况下,导线电阻小并不意味着信号传输速度快。 信号通过电子传输的原理,是靠电子之间的相互作用。 可以把导线想象为一个装满弹珠的长管子,若在一端推动一个弹珠,在另一端将会有一个弹珠几乎同时被挤出。这里弹珠传递信号的速度,比弹珠实际运动速度要快得多。同理,导线中电子受相邻电子推动时,信号传播的快慢并不取决于电子本身的运动速度,而是受电子之间的相互扭结影响。 当信号在传输时,会在信号与返回路径之间的导体中、导体周围的空间中产生交变电磁场。而决定信号传播速度的因素,就是电磁场的建立和传播速度。 电磁场变化(场链)的速度可以由以下公式计算得到: \[ v=\frac{1}{\sqrt{\varepsilon_0\varepsilon_r\mu_0\mu_r}} \] 其中,\(\varepsilon_0\) 表示自由空间中的介电常数,取 \(8.89\times 10^{-12}F/m\);\(\varepsilon_r\) 表示材料的相对介电常数,在空气中为 1;\(\mu_0\) 表示自由空间的磁导率,取 \(4\pi\times10^{-7}H/m\);\(\mu_r\) 表示材料的相对磁导率,几乎所有互连介质都取值为 1。将以上常量代入后可得: \[ v=\frac{2.99\times 10^8}{\sqrt{\varepsilon_r}} m/s =\frac{12}{\sqrt{\varepsilon_r}}inch/ns \] 相比空气,其他材料的介电常数 \(\varepsilon_r\) 总大于 1,而光速约为 \(12 inch/ns\),则可说明互连中的光速总小于 \(12 inch/ns\),其实际的速度为: \[ v=\frac{12}{\sqrt{\mu_r}}inch/ns \] 相对介电常数也常简称介电常数,绝大多数聚合物的值为 4。一般来说,介电常数会随着频率的升高而降低,但在常用的 PCB 板材中变化比较小。比如,FR4 的介电常数在 3.5~4.5 之间浮动,高速板材则在 3~4 之间浮动。根据公式可以模糊推出,信号在 FR4 中的速度约为 \(6 inch/ns\)(未考虑空气介质的电磁场影响)。 前沿的空间延伸 信号的上升沿 RT,通常表示从最大电压的 10% 变化到 90% 的时间长度。当信号在传输线上传播的时候,会把这个边沿往前推,产生一个空间延伸: 这个延伸的长度取决于信号的速度与上升沿的时间: \[ Len=RT\times v \] 我们假设信号的速度为 \(6inch/ns\),信号上升沿时长为 \(1 ns\),则前沿的空间延伸长度为 \(6 inch\)。信号就推着这个 \(6 inch\) 长的边沿向前传播。 传输线的分布电容 当存在多个导体时,两两之间都会存在电容。对于 PCB 上的走线,因为空间结构长,走线导体每一部分与周围的导体都存在电容,分布在走线的整个长度区间之内,所以说传输线的电容是分布式的。当信号前进的时候,每走一步都能感受到电容的存在。 在高速互连模型中,许多现象如阻抗不连续、反射、串扰等,都与导体间的分布电容有关系。 单位长度电容 PCB 上的传输线,如果横截面积不变,那么可以使用集总电容模型,用单位长度电容来表示电容参数,这样总电容就与传输线长度成比例,这样会方便建模。 集总元件:指元件大小远小于电路工作频率相对之电磁波波长时,对所有元件之统称。对于信号而言,不论任何时刻,元件特性始终保持固定,与频率无关。 使用单位长度电容来表示传输线的电容效应的前提是:电场沿传输线的方向没有分量,即电磁波的传播近似为均匀平面波。PCB 的走线刚好满足这个条件。 传输线的分布电感 阻抗不连续、反射、串扰、地弹噪声等,也与分布电感有关。PCB 上的走线每一部分都存在自感,且和周围的导体之间都存在互感。电感分布在走线的整个长度区间内,是分布式的,信号每走一步都能感受到电感的存在。 回路电感 因为传输线可以把信号和返回路径当成一个整体看待,信号电流与返回电流同时存在且构成一个完整的电流回路,使用回路电感分析会更方便。回路电感的计算公式: \[ L_{loop}=L_{Ss}+L_{Fs}-2L_{SFm} \] 其中,\(L_{SS}\) 表示信号路径的自感,\(L_{FS}\) 表示返回路径的自感,\(L_{SFm}\) 信号与返回路径间的互感。 把回路当成一个整体,那么回路电感描述的是回路本身的电感特性,相当于回路本身的自感。 单位长度电感 为了建模方便,传输线的电感也可以等效成多个电感串联的形式。把传输线划分为许多小段的单位电感(每个小段包括信号和返回路径),长度为 \(\Delta Z\),那么 \(\Delta Z\) 越长,该区域信号和返回路径构成的区域面积越大,磁通量也越大。因为磁通量与 \(\Delta Z\) 区域面积成线性关系,进而与 \(\Delta Z\) 也称线性关系。因此只要知道单位长度的回路电感,就可以得到任意长度的回路电感。 瞬态阻抗与特性阻抗 √ 根据前面的定义,我们知道阻抗是指传输线上某一位置上的电压与电流的比值。因为传输线不一定均匀,信号每走一步遇到的阻抗可能都不一样,这是一种 瞬时阻抗。 如果传输线是均匀的,那么用一个阻抗值就可以表示整个传输线的阻抗特性,这个阻抗值就称为传输线的 特性阻抗,可以用单位长度电感和单位长度电容来表示: \[ Z_0=\sqrt{\frac{L}{C}} \] 我们在设计 PCB 时常用的 50Ω 阻抗,指的就是特性阻抗。对 FR4 板材,当线宽为介质厚度两倍时,微带线的阻抗就为 50Ω。传输线间距相同时,特性阻抗越高,串扰的问题就越严重;而特性阻抗越低,功率损耗则越严重。所以 50Ω 是一个相对平衡的取值,后来也沿用为一般的标准,但并不意味着所有的互连都必须是 50Ω,仍可按照需求定制阻抗的大小。 特性阻抗的影响因素 √ 特性阻抗的影响因素主要有 4 种:线宽、介质厚度、介电常数、走线铜箔厚度。 线宽通过影响单位长度电感和电容,从而影响特性阻抗。对电感来说,线宽越大,电感就越小,电流越分散;反之线宽越小,电流越集中,电感越大。对电容来说,线宽越大,走线和平面间的电力线越多集中在介质区域,单位长度电容也越大(类比平行板电容器,面积越大,电容越大);线宽越小,电容越小。综上所述,线宽越大,特性阻抗就越小。 介质厚度增大会导致两个导体的间距增大,从而导致互感减小,单位长度的电感就会增加,会导致传输线的特性阻抗增大。 介电常数会通过影响单位长度的电容而影响特性阻抗。节点常数增加,电容会变大,特性阻抗就越小。 铜箔厚度越大,电感越小,电容增大,因此阻抗越小。 传输线的驱动与内阻 驱动器可以等效为高速开关的电压源加上内阻: 当开路时,加到传输线上的电压非常接近于源电压。内阻大小取决于器件的工艺,通常在 5-60Ω 范围内。内阻串联接入电路,可等效为一个分压器,会产生一部分压降。 所以,为了更好驱动传输线,就要使驱动器的内阻与传输线的特性阻抗尽可能小。举个例子,如果传输线的特性阻抗为 50Ω,则内阻应小于 10Ω。如果驱动器的内阻很低,那么它称为线驱动器,可以把绝大部分电压加到传输线上。 计算驱动器的内阻,可以不加传输线,驱动器直接端接外部电阻,分别测量接大电阻和小电阻时电阻两端的电压,根据等式就可计算出内阻大小。 返回路径与参考平面 电流总是在回路中流动,有去路必有回路。 按照传输线的零阶模型,传输线信号与返回路径间是一连串小电容。电压就像浪头,边沿经过的地方,电压发生改变,就有电流经过电容流到返回路径。 一旦有信号进入传输线,就会以波的形式向外传播。电流会在信号路径、线电容、返回路径构成的回路中流动。这个电流回路的波前与电压前沿同时向外传播。所以,信号受到的瞬时阻抗就是信号电压与电流的比值。 如果返回路径是一个平面(与走线不同层),那么称为参考平面。对于表层信号线,只能与相邻的内层平面构成传输线,也可以说表层走线只有一个参考平面。而对于内层走线,有上下两个相邻平面,所以有两个参考平面。位于不同层且与信号走线重叠的平面都可以作为参考平面,构成传输线。 参考平面的返回电流并非均匀分布在整个参考平面内,而是有趋肤效应,会集中在走线正下方附近。表层微带线参考平面上的返回电流与信号电流的大小相等。对于带状线,因为有上下两个参考平面,所以返回电流会集中于信号线上下方附近,且根据到平面的距离按比例分配。信号频率越高,电流越挤近。 传输线的延时 🚧 信号需要经过一段时间才能从源端传到末端,有一定的延迟。 理想传输线的一阶模型 🚧 理想传输线有两个重要的特征:恒定的瞬时阻抗和相应的时延。一阶模型在零阶模型的基础上,把信号和返回路径导线的每一小节都抽象为回路电感: 当电容和电感无穷小,LC 电路节数趋向于无穷时,单位长度电容 \(C_L\) 和单位长度电感 \(L_L\) 都趋向于常数,为传输线的线参数。如果传输线的总长为 \(Len\),那么总电容电感为: \[ C_{total}=C_L*Len \] \[ L_{total}=L_L*Len \] 所以,传输线的特性阻抗 \(Z_0\) 和时延 \(T_D\) 如下: \[ Z_0=\sqrt{\frac{L_L}{C_L}} \] \[ T_D=\sqrt{C_{total}*L_{total}}=Len*\sqrt{C_L*L_L} \] \[ v=\frac{Len}{T_D}=\frac{1}{\sqrt{C_L*L_L}} \] 又因为传输线的特性阻抗和时延必须与零阶模型的结果相一致,所以关联起来可以得到一些等式。 因为信号的速度取决于材料的介电常数 \(\varepsilon_r\)(音 varepsilon),又取决于单位长度电容和电感,所以得出等式: \[ \because v=\frac{c}{\sqrt{\varepsilon_r}}=\frac{Len}{T_D}=\frac{1}{\sqrt{C_L*L_L}} \] 参考与致谢 《信号完整性与电源完整性分析》 《信号完整性揭秘 - 于博士 SI 设计手记》 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

信号完整性 - 基础概念

信号完整性 - 基础概念 信号完整性(Signal Integrity, SI)是指信号在传输线上的质量。信号完整性良好的表现,是指 传输线上的电平能按预期、不多不少地达到预设值。 信号完整性问题产生的原因是,真实世界的数字电平(0/1)并不是理想的,信号本身是个模拟量。在低速电路中,信号完整性问题并不明显,因为互连线对于电信号来说是通畅透明的,模拟电路效应可被忽略;但如果往高速走(超过 100Mhz 或上升沿小于 1ns),数字电平的电压或电流波形就会开始出现畸变,从而导致接收的信息与发出的信息差别太大,出现错误。因此,在设计高速电路时,就需要考虑信号完整性问题。 广义的信号完整性,涵盖了这三类问题: 信号完整性(Signal Integrity, SI):指信号波形的失真。 电源完整性(Power Integrity, PI):指供电网络的互连线,相关元件上的噪声。 电磁兼容性(Electro Magnetic Compatibility, EMC):电子设备在电磁场中能够正常工作的能力,不会受到电磁场干扰或对其他设备造成电磁干扰。 信号完整性的基本原则 任何信号互连,都是由信号路径和返回路径构成的传输线。信号在传输线上前进的每一步,都会感受到瞬时阻抗。想要让信号传输质量最佳,则应让瞬时阻抗恒为常量,比如让传输线有均匀的横截面。 每一路信号都有返回路径,并非仅仅是接地。可通过分析返回路径去解决问题。 对于电容而言,变化较快的边沿,会使其有很低的阻抗。此电容不仅指外部电容,也包括传输线上的寄生电容。 对于电感而言,只要电流大小或磁力线匝数发生突变,其两端就会产生电压,将有可能导致反射噪声、串扰、开关噪声、地弹、轨道塌陷、电磁干扰等。当流经接地回路电感上的电流发生突变时,在接地回路上产生的电压称为地弹,是造成开关噪声和电磁干扰的原因。 信号带宽指的是有效正弦波分量的最高频率值(参照的是同频率方波)。互连模型的带宽指的是,在此最高正弦频率上,模型仍能准确预估互连的实际性能。 大多数情况下,信号完整性的公式计算出来都是定义值或近似值。 有损传输线引起的问题是上升沿退化。由于趋肤效应和截止损耗,信号的损耗会随着频率的升高而增大。 信号完整性的基本问题 广义的信号完整性归根到底,可分为以下四类问题: 单一网络的信号失真 反射(瞬时阻抗突变导致) 信号质量问题(频率相关损耗造成互连线中的上升沿退化) 时序错误(互连线电气特性差异、或长度差异引起的多个信号之间的时延差错位,会导致差分信号失真) 两个或多个网络之间的串扰(包括电源弹和地弹两种特殊形式) 电源和地分配中的轨道塌陷(PI) 来自整个系统的电磁干扰和辐射(EMC) 参考与致谢 《信号完整性与电源完整性分析》 《信号完整性揭秘-于博士 SI 设计手记》 《硬件信号质量 SI 测试规范》 传输线串扰分析 Understanding Signal Integrity What Every PCB Designer Should Know - Crosstalk Explained (with Eric Bogatin) 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

信号完整性 - 失真 🚧

信号完整性 - 失真 🚧 单一网络上的信号失真问题分为三个方面:反射、信号质量问题、时序错误。 反射 反射产生的根本原因,是 信号前进方向的瞬时阻抗发生改变。有可能造成阻抗发生改变的源头:互连线的末端、走线横截面积改变、换层、返回路径平面上的间隙、附加元件如接插件、布线拓扑结构。 反射的来源 阻抗突变处的反射 当传输线上的瞬时阻抗发生突变,部分信号将沿着相反方向反射,另一部分将继续传输,但幅度有改变。反射信号的量值取决于瞬时阻抗的变化量,假设第一个区域瞬时阻抗为 \(Z_1\),第二个区域为 \(Z_2\),则反射与入射信号幅值之比(反射系数)为: \[ \rho=\frac{V_{reflected}}{V_{incident}}=\frac{Z_2-Z_1}{Z_2+Z_1} \] 可见,两个区域阻抗相差越多,反射的信号量就越大。举个例子,如果 1V 的信号沿着特性阻抗为 50Ω 的传输线传播,进入特性阻抗为 75Ω 的区域时,反射系数算出来是 20%,则反射的电压为 0.2V。 阻性负载的反射 传输线的端接匹配有三种特殊情况:开路、短路、匹配。以下假设传输线特性阻抗为 50Ω,信号由源端到远端,入射电压为 1V。 终端为开路的情况下,末端瞬时阻抗无穷大,反射系数无限逼近 1,意味着入射的信号全部按照源路径反射回去,开路处入射波和反射波的电压之和为 2V。 终端为短路的情况下(与返回路径相短路),末端阻抗为 0,此时反射系数为 -1。入射信号到达远端时,将产生 -1V 的反射信号,向源端传播,所以此处电压为 0。 终端阻抗与特性阻抗相匹配的情况下(即终端阻抗也为 50Ω),反射系数为 0,此时不会存在反射电压,终端上的电压仅仅是入射信号的。 一般情况下(50Ω 阻抗),区域 2 阻抗与反射系数之间的关系大致如下图: 当区域 2 的阻抗小于区域 1 时,反射系数为负值,反射电压是负电压。假设终端阻性负载为 25Ω,那么反射系数为 -0.33,所以有 -0.33V 的电压被反射回源端,终端实际电压为 1+(-0.33)=0.67V。 反弹图 如果知道传输线的时延、信号通过各区域的阻抗与驱动器的初始电压,就可以计算处每个反射面的电压 / 任意一时间的电压。 假设驱动器源电压 1V,内阻 10Ω,传输线末端为开路,那么可以根据反射公式得出下面的反弹图与曲线: 反射的表现形式 反射通常表现为过冲、下冲、振铃。 过冲 过冲指的是振荡的第一个峰值,分为正过冲和负过冲。危害是可能会冲击损伤器件(大于 VCC 或小于 GND)。另外,正过冲会形成干扰源,对其他器件造成串扰;负过冲导致管脚上的负电压使器件 PN 衬底(寄生二极管)前向偏置,大电流会熔断产生开路。 振荡(回冲 / 振铃) 回冲指多次跨越电平临界值,而振铃指经过多次反复才回归正常电平。 回冲 / 振铃的危害类似于多次过冲,在高低电平之间是一种不确定的状态。其产生原因是阻抗匹配不当(过大或过小)。 反射的解决方法 反射的解决办法,是尽量让互连线的阻抗保持恒定。具体有以下措施: 使用可控阻抗互连 增加电阻匹配,参考做法是始端串电阻或者末端并电阻 采用沿线拓扑的阻抗维持恒定的布线规则,最小化支路长度 对线的几何特征进行精细设计,比如避免直角或锐角 PCB 布线避开干扰源和耦合路径 时序错误 两个或以上信号路径间的时延差称为错位。当信号线与时钟线存在超出预期的错位时,可能产生误触发和逻辑错误;当差分线存在错位时,部分查问信号可能会变成共模信号,造成失真。 参考与致谢 《信号完整性与电源完整性分析》 《信号完整性揭秘-于博士 SI 设计手记》 What Every PCB Designer Should Know - Crosstalk Explained (with Eric Bogatin) 《硬件信号质量 SI 测试规范》 传输线串扰分析 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。 未完成草稿 🚧: 信号边沿缓慢的产生原因也有可能是是驱动能力不够,或者负载过大(例如链路阻抗太大)。 解决信号边沿缓慢的方法是: 提高驱动能力; 减小负载。 由于驱动不足或者负载过大,信号边沿缓慢也常伴随着信号幅度较低的现象。 上升沿退化 有损线的不良影响 边沿快速变化的信号经过一段实际的传输线后,上升沿将被拉长: 上升沿退化导致的信号质量问题,是因为导线 / 介质中与频率相关的损耗,这种损耗高频比低频更大,会导致信号边沿缓慢。当上升沿退化到接近信号的单位间隔时,1bit 的信息将会泄露到下一个甚至下几个 bit,会造成数据采样错误。这种效应称为符号间干扰(ISI),在数据率大于或等于 1Gbps 时是引起问题的主要原因。 如果上升沿的退化使得上升沿拉长到接近单位间隔,那么就可能产生符号间干扰: 对高速信号质量的评估可以用眼图,可测量误码率(左图为有少许损耗,右图损耗较大): 传输线中的损耗 当信号沿传输线传播时,接收端有以下 5 种能量损耗的方式: 辐射损耗 耦合到相邻走线 阻抗不匹配 导线损耗 介质损耗 导线损耗(导线电阻与趋肤效应)

2025/9/17
articleCard.readMore

信号完整性 - 时域与频域

信号完整性 - 时域与频域 一般来说,我们会从时域和频域两个角度,分别对信号进行分析。 时域 时域是真实世界存在的域,按时间顺序呈现。例如,在某个时钟信号的时域图中,可以观察到两个重要的参数,波形的周期和上升沿: 时钟周期即信号循环重复一次所花的时间,通常它的单位是纳秒级,时钟频率就是 1s 内循环的次数,即周期的倒数。例如,周期为 1ns 的时钟信号,频率就是 1/10ns=0.1GHz。 上升沿,通常定义为信号以最高点为标准的 20% 跳变到 80% 所花的时间(有时也会定义为 10% 到 90%)。下降沿通常比上升沿要短,这是因为典型 CMOS 结构中,N-MOS 比 P-MOS 导通速度要快,所以下降沿通常比上升沿短,也更容易产生信号完整性问题。 频域 频域是一个存在于数学定义中的域。通常在频域中使用正弦波,因为时域中的任何波形,都能用正弦波合成出来。 频域可以用更简洁的语言描述相同的信息。如下图可见,左边是时域中对正弦波的描述,正弦波可以用频率、幅度、相位这 3 个参数完全表示出来;而右边是频域中的描述,频率和幅度可以仅用一个点表示出来(在大多数场合会忽略相位的使用): 这样,在频域中表示一个正弦波就只需要一个点。如果有若干个频率点,那么这个集合就称为频谱。 将一般互连的电气问题放在频域中,并使用正弦波描述,会变得更容易理解并解决。 时域到频域的变换 从时域到频域,转换方法就是傅里叶变换。傅变有三种类型:傅里叶积分(FI)、离散傅里叶变换(DFT)、快速傅里叶变换(FFT)。 傅里叶积分用于将时域内的理想数学表达式变换为频域表示,是将时域时间轴从负无穷到正无穷积分,得出从零到正无穷上连续的频域函数。 但实际上时域的波形是由一系列离散点组合而成的。这时候使用离散傅里叶变换,可以把波形转换到频域中(前提是时域为周期性的)。不比傅里叶积分,傅里叶变换只需要通过求和就可以实现转换。 快速傅里叶变换使用了快速矩阵代数学的方法,只应用于时域中数据点个数是 2 的整数次幂的情况(如 256、512、1024 点)。根据计算点个数的数量,计算速度可以比普通离散傅里叶变换快很多。 需要注意的是,快速傅里叶变换要求信号是周期重复的,所以需要对原始信号进行相干采样,或在采样后加窗处理。 频域到时域的逆变换 频域包含波形中所有正弦波的频率和幅度,如果要获取它的时域波形,那么只需要将每个频率分量逆变换乘它的时域正弦波,再叠加起来即可,这个过程称为傅里叶逆变换。 方波就是正弦波的多次谐波分量叠加,叠加次数越多,上升沿越陡,越接近于理想方波: 带宽与上升沿 带宽表示频谱中最高 有效 正弦波频率分量值(因为在数字信号中,最低频永远是直流),表示信号频谱中的频率范围。带宽的选择对时域波形的最短上升沿有直接的影响。以理想方波为例,带宽越大,上升沿就会越短,波形就越接近理想方波。 注意,「有效」表示信号谐波幅度高于相同基频理想方波中对应谐波幅度的 70%。 例如,如果只用第 0、1、3 次谐波合成时域波形,那么波形的带宽为第 3 次谐波的值即 3GHz。 根据实验得出的经验法则,带宽与上升沿的关系为 \(BW=\frac{0.35}{RT}\),其中 BW 为带宽(GHz),RT 为 10%-90% 上升沿(ns)。举个例子,如果信号的上升沿为 0.1ns,那么信号的带宽就是 0.35GHz,反之也成立。(注意单位对应,GHz 对应 ns,MHz 对应 us) 参考与致谢 《信号完整性与电源完整性分析》 图解傅里叶级数&傅里叶变换 傅立叶变换基础系列 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

信号完整性 - 电阻的物理基础 🚧

信号完整性 - 电阻的物理基础 🚧 参考与致谢 《信号完整性与电源完整性分析》 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

信号完整性 - 阻抗与电气模型

信号完整性 - 阻抗与电气模型 阻抗(Electrical Impedance, Z)是电路中电阻、电感、电容对交流电的阻碍作用的统称,定义为电压与电流之比(\(Z=V/I\))。阻抗是一个复数,实部称为电阻,虚部称为电抗。其中电容在电路中对交流电所起的阻碍作用称为容抗,电感在电路中对交流电所起的阻碍作用称为感抗,容抗和感抗合称为电抗。 对于恒定的电压,阻抗越高,流经电流就越小,反之同理。极端情况下,开路的阻抗是无穷大的,短路的阻抗为零。在互连线中,阻抗是影响信号的关键因素。信号传播时,会不断根据瞬时阻抗做出相应的反应。 基本电气模型 在建立基本电气模型的过程中,我们会构想以下这几种理想的两端口元件: 理想电阻器 理想电容器 理想电感器 理想传输线 其中,理想阻容感的特性可以集中到一个点上,故称为 集总电路元件;而理想传输线的特性是沿着线分布的。目标是建立一个等效电路模型,使其阻抗尽可能贴近实际元件测得的阻抗。 时域中理想电阻器的阻抗 理想电阻器的阻抗是恒定的,数值大小与其电阻值相等,与电压、电流无关。 时域中理想电容器的阻抗 对理想电容器而言,两块极板之间储存的电荷与电压差有一定的关系,其容值的定义如下: \[ C=\frac{Q}{V} \] 其中,C 表示电容值(单位 F),Q 表示极板间储存的电荷(C,库伦),V 表示两极板间电压(单位 V)。 电容的阻抗是通过其两端电压与流过的电流求得。实际上,电流并非真正流过电容,只是在电容两极板电压改变时,看似有电流在流动。 如上图所示,上极板增加了一些正电荷,下极板增加了一些负电荷的同时,把下极板原来存在的正电荷从推出去,这样看起来就像有电流穿过电容。这种在极化电介质中由束缚电荷位移形成的电流,称为 位移电流,它并不是真正的电流,而只是电荷的移动。其定义如下: \[ I=\frac{dQ}{dt}=C\frac{dV}{dt} \] 从上式可看出,只有在电容两端电压发生变化时,才会有电流流过,如果电压固定不变,就不会有位移电流。 因此,理想电容的阻抗可以表示为: \[ Z=\frac{V}{I}=\frac{V}{C\frac{dV}{dt}} \] 电容的阻抗与其两端电压波形有关。如果电压变化快(波形斜率大),则流过电流就大,阻抗也会越小;同理,当电压变化速率相同时,容值越大,阻抗就越小。 时域中理想电感器的阻抗 对理想电感器而言,其两端的电压定义如下: \[ V=L\frac{dI}{dt} \] 其中,\(V\) 表示电感两端电压,\(L\) 表示电感值,\(I\) 表示流过电感的电流。可以看出,电感两端电压与流过电流变化的快慢有关,而电流快慢取决于两端电压差。两端电压差与电流变化速度谁是因谁是果,则取决于哪个是驱动源。电感的阻抗,可以表示为其两端电压与流经电流之比: \[ Z=\frac{V}{I}=L\frac{\frac{dI}{dt}}{I} \] 如果流过电感的电流迅速增大,则阻抗就变得很大,反之同理;而如果电流为直流,则阻抗接近为 0。当然,电感的实际阻抗与电流的具体波形有着密切的关系。 频域中的阻抗 在上文可以看出,在时域中,电感器、电容器阻抗的计算公式都是相对复杂的函数,但是放在频域中分析,则会简单得多。 在频域中进行分析,正弦波是唯一存在的波形,所以只能通过研究它与理想元件的相互作用进行分析。正弦波的 3 个特征是:频率、幅度和相位。一般我们用弧度描述,角频率(\(rad/s\))与频率(\(f\))的关系为: \[ \omega=2\pi f \] 我们在理想元件两端加上正弦电压,观察流经电流情况。阻抗仍定义为电压与电流之比,只不过现在是电压正弦波和电流正弦波之比了。而因为理想元件和理想传输线都是线性元件,所以呈现的电流与输入电压的频率是一致的。 根据阻抗的定义,阻抗的幅值可以表示为: \[ |Z|=\frac{|V|}{|I|} \] 同时,需要计算两个波形之间的相位差。在频域中,可以这样表示阻抗:在 10MHz 下,阻抗幅值为 20Ω,相位是 30°(电压比电流超前 30°)。这三个要素缺一不可,因为阻抗幅值和相位都与频率相关,会随着频率的变化而变。除此之外,也可用复数表示频域中的阻抗,把相位信息囊括进复数中,以此简化计算。 频域中理想电阻器的阻抗 我们接着分析在频域中理想元件的阻抗。因为频域中仅需处理正弦电压与电流,所以如果使用电流源,施加正弦电流流过电阻器,就会在其两端产生一个正弦电压,可以表示为: \[ V=I_0 sin(\omega t) \cdot R \] 正弦电压为 R 与正弦电流的乘积。根据上面的公式,理想电阻器的阻抗可以表示为: \[ Z=\frac{V}{I}=\frac{I_0 sin(\omega t) \cdot R}{I_0 sin(\omega t)}=R \] 其实理想电阻器的阻抗就是其电阻值,且与频率无关,相位差为零。此结果与在时域中的结论一致。 频域中理想电容器的阻抗 分析频域中理想电容器的阻抗,需要在其两端加一个正弦电压,所以流经的电流可以表示为: \[ I=C\frac{d V_0sin(\omega t)}{dt}=C\omega V_0 cos(\omega t) \] 可以看出,即使电压不变,电流也会随频率而变,频率越高,流经电流幅度越大。也就是说,电容器的阻抗会随频率升高而减小,可以表示为: \[ Z=\frac{V}{I}=\frac{V_0 sin(\omega t)}{C\omega V_0 cos(\omega t)}=\frac{1}{\omega C}\cdot \frac{sin(\omega t)}{cos(\omega t)} \] 可见,阻抗幅值为 \(\frac{1}{\omega C}\),角频率增加时,阻抗会减小。 因为阻抗的相位是电压正弦波与电流正弦波的相位差,在电容器中就是正弦与余弦之间的相位差 \(-90°\),在复数中就是 \(-i\),所以用复数形式表示电容器阻抗就是 \(\frac{-i}{\omega C}\)。 举个实际的例子,如果有一个理想的 10nF 去耦电容器,则在 \(1kHz\) 下其阻抗就是 \(\frac{1}{2\pi \cdot 1kHz \cdot 10nF}\approx 16kΩ\)。如果频率降为 \(1Hz\),则阻抗约为 \(16MΩ\)。 频域中理想电感器的阻抗 对频域中理想电感器,我们施加正弦电流,则产生电压为: \[ I=L\frac{d I_0sin(\omega t)}{dt}=L\omega I_0 cos(\omega t) \] 当电流幅度固定不变时,频率越高,两端电压就越大。也就是说,随着频率升高,需要更高的电压,才能维持电流幅度不变。电感器的阻抗随频率升高而增大,根据阻抗的定义可表示为: \[ Z=\frac{V}{I}=\frac{L\omega I_0 cos(\omega t)}{\omega I_0 sin(\omega t)}=\omega L \cdot \frac{cos(\omega t)}{sin(\omega t)} \] 可见,由于电感器的特性,频率越高,交流电流流经电感器就变得越困难。 与电容器同理,对于电感器的阻抗,其相位是 \(+90°\),用复数 \(i\) 表示。电感器阻抗复数表现形式为 \(Z=i\omega L\)。 在实际去耦电容器中,其自身形状和封装会带来寄生电感,大约为 \(2nH\)。如果视其为理想电感器,那么在 \(1GHz\) 下,会带来 \(Z=2\pi \cdot 1GHz \cdot 2nH=12Ω\) 的阻抗。因为在相同频率下,理想电容器的阻抗仅为 \(0.01Ω\),故可解释为在高频下,实际电容器表现为感性。 参考与致谢 《信号完整性与电源完整性分析》 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

共模信号与差模信号

共模信号与差模信号 差模信号又称串模信号,指的是两根线之间的信号差值;而共模信号又称对地信号,指的是两根线分别对地的信号。 差模信号:大小相等,方向相反的信号。 共模信号:大小相等,方向相同的信号。 对于两输入系统来说,共模是两输入端的算术平均值,差模是两输入端的差值。 对于一对信号线 A、B,差模干扰相当于在 A 与 B 之间加上一个干扰电压,共模干扰相当于分别在 A 与地、B 与地之间加上一个干扰电压;像平常看到的用双绞线传输差分信号就是为了消除共模噪声,原理很简单,两线拧在一起,受到的共模干扰电压很接近,Ua - Ub 的值依然没什么变化。实际应用中,温度的变化各种环境噪声的影响都可以视作为共模干扰,但如果在传输过程中,两根线的对地噪声哀减的不一样大,使得两根线之间存在了电压差,这时共模噪声就转变成了差模噪声。 参考与致谢 共模与差模的理解 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

关于复盘

关于复盘 对棋结束之后,双方把决出胜负的局面再重复、回顾一遍。 重定义 不管进程是遇到问题,还是顺利完成,复盘回顾能增长经验,为未来的进程提供经验支持、也提升效率。 表现在日常生活中,就是吃一堑长一智。踩过的坑要及时记录总结,以后的路才能越走越顺。就像指数型增长的函数图像。 复盘中,当熟悉的局面出现在眼前的时候,你往往能够根据经验判断应该如何应对,在多个路口中选择相对合理的走。 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

出展活动 - 经验总结

出展活动 - 经验总结 注意事项 尽早发通知,保证出展物资不被占用 机械和硬件上的问题必须至少提前一天,软件问题必须至少提前半天。平时保留稳定版本,可随时回滚 接到活动通知后,要马上出活动策划,经管理层一致审核通过。策划应包含以下内容: 具体时间安排 向活动负责人员(如带队老师)索要完整活动流程 / 时间表 人员安排 选好机器人负责人员,一台机器人至少需要两个人负责 先分好组(包括轮值的分组),确定出行负责人(负责打车、运货) 一旦固定下来,就算顶替也尽量不要在名单上增减人员 出行安排 上车地点、目的地都需提前列出纸面文件 货物运输 先估计货拉拉车车厢体积 叫货拉拉的人要跟车,扎带剪线钳等工具跟车 人员出行 操作手和搬车负责先坐滴滴,去到达地接货 其他人在货车之后打车 物资清单 赛事物资:车、电池、充电器、电脑、下载器等,由赛事队长整理 其他物资:扎带剪线钳等工具、口罩、药物、伞、手推车、航空箱、电工胶布、铁丝等,由杂物队长整理 出行前照着清单清点 行程中每转场就清点,物资分配到人(特殊:每台车两个人,一个拿遥控器一个搬车),转场过程中需要头尾负责防丢 突发情况预案 确定两三个负责人 确定突发情况最终决定权 出问题先想着解决,责任回来再定性并改进 模板 物资准备及负责 电控工具:笔记本电脑、电源、烧录器 基本工具:扎带、剪线钳、电烙铁、热熔胶枪、排插 机器人物资:机器人本体、遥控器、电池与充电器 宣传物料:展板、宣传单 其他物资:雨伞、排插、手推车 人员安排及职责 xxx:负责 xxx 物资负责人: xxx:负责 xxx 物资 时间地点安排 日期:xxxx 年 xx 月 xx 日 去程出发 出发时间:xx:xx 出发地点:xx 注意事项: 提前预约货拉拉 出行前照着清单清点 跟车人到校门口,凭放行条带货拉拉到 B4 一楼装货 机器人车轮需要用扎带固定,保证运输过程中的安全 装货之后,剩余随行人员步行至校门口打车 去程到达 到达时间:预计 xx:xx 到达地点:xx 注意事项: 到达目的地后,跟车人负责卸货,并将具体位置告知剩余随行人员 回程出发 出发时间:xx:xx 出发地点:xx 注意事项: 提前预约货拉拉 清点物资 机器人车轮需要用扎带固定,保证运输过程中的安全 装货之后,剩余随行人员打车 回程到达 到达时间:预计 xx:xx 到达地点:xx 注意事项: 到校门口凭放行条带货拉拉到 B4 一楼卸货 到达目的地后,跟车人负责卸货,并将具体位置告知剩余随行人员 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

函数思想在电路设计中的应用

函数思想在电路设计中的应用 以构建一个系统的角度去设计项目,而不是单单是画一块电路板、设计一种方案。 背景 在程序设计中,我们会遇到各种各样复杂的数据和情况,如果放任不管,随着开发的推进,代码熵值将急剧增加。函数和库正是为了解决这类问题而出现的。将代码一层一层封装起来,我们将得到一个井然有序的系统,从全局的视角出发,而不用关心任何我们不需要关注的细节。 类比到硬件电路设计中,底层构成元素即分立元件,实现特定功能的模块即函数封装,到了全局层面,可以调用各类模块,组成一类电路解决方案。封装复用的思想,可以帮助我们更系统性地、自上而下设计电路,如同构建一个王国一般。 注:首段「封装」一词为计算机程序术语,后文「封装」为电路术语。 元件层 在元件层面,每个元素(元件)的规格也应该尽量做到统一。我个人的解决方案是,所有出现在我电路方案中的元件符号 / PCB 封装,皆调用于我个人整理的原理图库 / 封装库。 有人可能会问,大部分元器件符号和封装都可以在网上轻易地找到,甚至有人将 90% 以上元器件都整理成库了,为什么还要做重复的工作? 功能模块层 基于底层的分立元件,我们可以构建不同的功能模块。功能模块的用途是方便快捷开发。举个例子,我在许多项目中都会用到稳压电路,那我可以挑出比较优秀的方案,按照数据手册,封装成一个个模块,留出函数接口(输入 / 输出端口),标注好属性(稳压电流 / 效率等)。在需要用到的时候,不必管功能模块内部的实现,就像搭积木一般,从顶层进行项目方案的堆叠。 Altium Designer 为我们提供了片断摘录的功能。我们可以将日常接触的功能模块封装起来,方便日后调用。 项目层 到了项目方案设计层面,模块化的思想已经显而易见了。通过 Altium Designer 层次化原理图设计功能,我们可以将注意力集中于每个模块的接口,直接操作接口,即可实现整体电路的功能。在这种设计模式下,每个模块之间的耦合度并不高,我们可以随时轻易替换实现某一类功能的模块;也可以通过多通道的功能,对模块进行复用。条理清晰的项目,对接下来的 PCB 模块化布局、多通道布线复用都大有益处,更方便了日后的排错与更新。 参考与致谢 编程的几个思想 linyuxuanlin/Power_Lib_Altium(个人整理的原理图库 / 封装库) linyuxuanlin/Modularity_of_Functional_Circuit(个人绘制的功能电路模块) Multi-Sheet and Multi-Channel Design 详论单片机固件模块化架构设计 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

删除 GitHub 仓库中某个文件夹

删除 GitHub 仓库中某个文件夹 问题来源 在本地仓库上传到 GitHub 时,忘记忽略某个文件夹,直接 push 到远程仓库了。 解决方法 git pull origin master # 先将远程仓库里面的项目拉取下来 dir # 查看有哪些文件夹 git rm -r --cached target # 删除名字为 target 的文件夹 git commit -m '删除了 target' # 添加操作说明并提交 参考与致谢 删除 GitHub 中某个文件夹 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

前端开发 - 环境搭建

前端开发 - 环境搭建 编辑器 编辑器我用的是 VS Code,推荐一些扩展: Live Server - 实时重载静态和动态页面(甚至支持 PHP) 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

动员大会 - 经验总结

动员大会 - 经验总结 出现的问题 整场大会时间控制不合理,总时间过长 演讲者没有事先打稿 未能很好地调动气氛 设备问题,未能正常投屏 如何改进 【施工中】 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

半导体测试基础 - AC 参数测试

半导体测试基础 - AC 参数测试 AC 测试确保 DUT 的时特性序满足其规格需求。 基本 AC 参数 建立时间(Setup Time) 建立时间指的是在参考信号(图中为 WE)发生变化(取中间值 1.5V)前,为了确保能被正确读取,数据(图中为 DATA IN)必须提前保持稳定不变的最短时间。在最小建立时间之前,数据可以随意变化,但如果超过了最小建立时间(保持稳定得太晚),就有可能无法被识别,导致错误。在规格书中的表示如下: Parameter Description Min Max Unit \(t_{SD}\) Data Set-Up to Write End 11 ns 保持时间(Hold Time) 保持时间指的是参考信号(图中为 WE)发生变化(到达一定电压阈值)后,为了确保无误,数据(图中为 DATA IN)必须保持稳定持续的最短时间(或者说在时钟信号触发前多久要保持稳定电平)。如果保持时间太短,数据有概率不能被正确识别。在规格书中的表示如下: Parameter Description Min Max Unit \(t_{HD}\) Data Hold from Write End 1 ns 传播时延(Propagation Delay) 传播时延指的是一个信号的传输和另一个相关信号的传输之间的时间间隔。大多时候测量的是输入信号(图中为 ADDR)发生变化,到相应输出(图中为 DATA OUT)反应之间的时间间隔(从输入端到输出端所需的时间)。它保证了输出信号可在输入信号出现后多久内出现。在规格书中的表示如下: Parameter Description Min Max Unit \(t_{AA}\) Address to Data Valid 15 ns 最小脉宽(Minimum Pulse Widths) 最小脉宽通常包含最小低脉冲宽度和最小高脉冲宽度,用于确保脉冲定时时的最小可操作的值。在规格书中的表示如下: Parameter Description Min Max Unit \(t_{WL}\) Minimum clock low time 20 ns \(t_{WH}\) Minimum clock high time 25 ns 最大频率(Maximum Frequency) 最大工作频率通俗地讲,就是设备可运行的最大速度。在规格书中的表示如下: Parameter Description Min Max Unit \(f_{MAX}\) Maximum clock frequency 22.2 MHz 输出使能时间(Output Enable Time) 指的是引脚从高阻状态(关断失能)切换到有效驱动电平(高低电平)状态所需的时间,确保输出 Buffer 可以在规定的时间内改变引脚状态。测量时计算从控制信号发出到检测到开关输出的时间间隔。在规格书中的表示如下: Parameter Description Min Max Unit \(t_{DOE}\) OE LOW to Data Valid 10 ns 输出失能时间(Output Disable Time) 指的是引脚从有效驱动电平(高低电平)状态切换到高阻状态(关断失能)所需的时间,确保输出 Buffer 可以在规定的时间内改变引脚状态。测量时计算从控制信号发出到检测到开关输出的时间间隔。在规格书中的表示如下: Parameter Description Min Max Unit \(t_{HZOE}\) OE High to Data Valid 8 ns 时序参数 读取周期时序(Read Cycle Timing) 一个 256 x 4 静态 RAM 的读取周期示例: Parameter Description Min Max Unit \(t_{RC}\) Read Cycle Time 15 ns \(t_{AA}\) Address to Data Valid 15 ns \(t_{ACS}\) Chip Select to Data Valid 10 ns \(t_{DOE}\) OE LOW to Data Valid 10 ns \(t_{HZCS}\) Chip Select to High Z 8 ns \(t_{HZOE}\) OE HIGH to High Z 8 ns \(t_{LZCS}\) Chip Select to Low Z 2 ns \(t_{LZOE}\) OE LOW to Low 2 ns 首先由 \(t_{RC}\) 参数确定写入周期的长度。 确定哪个信号控制读取的功能。在上图的示例中,RAM 的数据输出是由 OE 的下降沿控制的。 写入周期时序(Write Cycle Timing) 一个 256 x 4 静态 RAM 的写入周期示例: Parameter Description Min Max Unit \(t_{WC}\) Write Cycle Time 15 ns \(t_{HZWE}\) WE LOW to High Z 8 ns \(t_{LZWE}\) WE HIGH to Low Z 2 ns \(t_{PWE}\) WE Pulse Width 11 ns \(t_{SD}\) Data Set-Up to Write End 11 ns \(t_{HD}\) Data Hold from Write End 1 ns \(t_{SA}\) Address Set-Up to Write Start 2 ns \(t_{HA}\) Address Hold from Write End 2 ns \(t_{SCS}\) CS LOW to Write End 11 ns \(t_{AW}\) Address Set-Up to Write End 13 ns 首先由 \(t_{WC}\) 参数确定写入周期的长度。 确定哪个信号控制写入的功能。在上图的示例中,RAM 的数据读入是由 WE 的上升沿控制的。 参考与致谢 《The Fundamentals Of Digital Semiconductor Testing》 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

半导体测试基础 - DC 参数测试

半导体测试基础 - DC 参数测试 DC 参数测试,测的主要是器件上单个引脚的一些特性。对大多数的 DC 参数来说,实质上是在测半导体的电阻率,而解释电阻率用的是欧姆定律。如需验证 DC 测试流程的可行性,也可以借电阻器来等效 DUT,以排除 DUT 之外的问题。比方说,在芯片规格书里出现的参数 VOL: Parameter Description Test Conditions Min Max Units VOL Output LOW Voltage VDD = Min, IOL = 8.0mA 0.4 V 我们可以看出,VOL 最大值为 0.4V,IOL 为 8mA,即当输出逻辑低电平的情况下,必须是在不大于 0.4V 的电压下产生 8mA 的电流,所以我们可以得出,这个器件的最大电阻不超过 50Ω。所以,可以借用不大于 50Ω 的电阻替代 DUT,以验证测试流程。我们的目的是把问题聚焦在 DUT 上,而非 DUT 以外的问题。 IDD & Gross IDD IDD 表示的是 CMOS 电路中从漏极(D)到漏极(D)的电流(I),如果是 TTL 电路则称为 ICC(从集电极到集电极的电流)。Gross IDD 指的是流入 VDD 管脚的总电流(在 Wafer Probe 或成品阶段都可测试)。IDD 是看芯片总电流会不会超标,一般要看最低功耗和最大工频下的电流。 测试 Gross IDD 是为了判断能否继续测 DUT。通常这个测试紧接 OS 测试,是 DUT 通电后的第一个测试。如果 Gross IDD 测试不通过(如电流过大),那就不能接着测下去了。 在 Gross IDD 测试阶段时,还不知道预处理是否可以正常进行,所以需要放宽 IDD 规范。待 Gross IDD 测试通过之后进行预处理程序,才可以准确定义出 IDD 规范电流。 Gross IDD 测试需要先通过重置,以将所有输入引脚设低 / 高电平,通常 VIL 设置为 0V、VIH 设置为 VDD,所有输出引脚空载(防止悬空产生漏电流,使 IDD 变大)。测试的示意图如下: 需要注意的事项: 需要设置电流钳,防止电流过大损坏测试设备。 如果出现负电流,也代表测试不通过。 如果测试发生错误,可以先排除是测试设备的问题,不加芯片空着 socket 跑测试,其电流应该是 0,否则意味着 DUT 以外的设备也在消耗电流。 IDD 测试 - 静态法 静态 IDD 测试,测量的是流入 VDD 引脚的总电流一般需要 DUT 运行在最低功耗的模式下。静态 IDD 与 Gross IDD 测试的区别是,Gross IDD 还没有预处理程序,只是一种粗测,而静态 IDD 测试是已有预处理模式,通过预处理后再进行的测试。 举个例子,下表是一个 IDD 参数样本: Parameter Description Test Conditions Min Max Units IDD Static Power Supply Current VDD = 5.25V, inputs = VDD, Iout=0 +22 µA IDD 静态测试的示意图如下: 测试流程如下: 用测试矢量将 DUT 设置为消耗电流最少、保持在静态的状态。 检测引脚电流值 高于 IDD Spec:Fail 其他区间:Pass 测试时,通常需要在上电与采样之间加延时,让寄生电容充满电,避免造成干扰。 如果需要测试不同逻辑下的静态电流,可以测 IDDQ 参数,增加测试覆盖率(IDDQ 是测某个静止逻辑状态下的电流,比如说开一部分 MOS 管进行某个状态下的测试)。 IDD 测试 - 动态法 IDD 动态测试的目的,是测试 DUT 在 动态执行功能 时(通常为 DUT 最大工频)消耗的电流,确保其不会超过标称值。 举个例子,下表是一个动态 IDD 参数样本: Parameter Description Test Conditions Min Max Units IDD Dynamic Power Supply Current VDD = 5.25V(commercial), f=f_max(66MHz) +18 mA 测试的示意图: 测试流程与静态法相似。 VOL/IOL & VOH/IOH VOL 表示低电平(L)输出(O)时的最高电压(V)限制(不会被识别成逻辑 1)。IOL 表示低电平(L)输出(O)时灌电流(I,sink)的驱动能力。它们共同衡量的是引脚 Buffer 在输出低电平时的阻抗,保证在适当输出的电压下能吸收恒定的电流值。 VOH 表示高电平(H)输出(O)时的最低电压(V)限制(不会被识别成逻辑 0)。IOH 表示高电平(H)输出(O)时拉电流(I,source)的驱动能力。它们共同衡量的是 Buffer 在输出高电平时的阻抗,保证在适当输出的电压下能输出恒定的电流值。 举个例子,下表是 256 x 4 Static RAM 的 VOL/IOL & VOH/IOH 参数: Parameter Description Test Conditions Min Max Units VOL Output LOW Voltage VDD = 4.75V, IOL = 8.0mA 0.4 V VOH Output HIGH Voltage VDD = 4.75V, IOH = -5.2mA 2.4 V 对 VOL/IOL & VOH/IOH 的测试,主要是验证当施加拉或灌电流时,VOL/VOH 是否处于正确的电平(在输出一定的电流下能不能达到电平阈值)。测试方法有静态法与动态法。静态法是对引脚施加电流,再逐一测电压;动态法是在功能测试中提供 VREF,形成动态负载电流再测电压的。。 VOL/IOL 测试 - 串行静态法 使用串行静态法测量 VOL/IOL 的测试示意图如下: 测试流程如下: 需要先通过预处理,将待测引脚设置为低电平输出。 向引脚施加恒定的 IOH,等待 1-5 毫秒再测量(在 PMU 设 delay)。 检测引脚电压 高于 VOL(+0.4V):Fail 其他区间:Pass 需要注意的事项: IOL 是一个正电流值,因为它是从 PMU 流向 DUT。 因为施加的是恒流,所以需要设置电压钳,如果测出电压比钳位电压还低,有可能是逻辑设成了高电平,触发了对电源保护二极管正偏。 VDDmin 参数表示能使 DUT 正常进行测试的最小供电电压,再小将无法得出准确的测试结果。 VOH/IOH 测试 - 串行静态法 使用串行静态法测量 VOH/IOH 的测试示意图如下: 测试流程如下: 需要先通过预处理,将待测引脚设置为高电平输出。 向引脚施加恒定的 IOH,等待 1-5 毫秒再测量(在 PMU 设 delay)。 检测引脚电压 低于 VOH(+2.4V):Fail 其他区间:Pass 需要注意的事项: 因为 IOL 是从 PMU 流向 DUT,所以它是一个负值。 因为施加的是恒流,所以需要设置电压钳,如果测出电压比钳位电压还高,有可能是引脚逻辑设成了低电平,触发了对地保护二极管正偏。 VDDmin 参数表示能使 DUT 正常进行测试的最小供电电压,再小将无法得出准确的测试结果。 IIL/IIH IIL 指的是输入引脚(I)逻辑为低电平(L)时,允许的最大拉电流(I,source,从外部经引脚往 DUT 的 VSS 漏),用来看引脚对电源的漏电流会不会超标,也是看隔离的程度,IIH 指的是输入引脚(I)逻辑为高电平(H)时,允许的最大灌电流(I,sink,从 DUT 的 VDD 经引脚往外漏)。举个例子,下表是 256 x 4 Static RAM 的 IIL 和 IIH 参数: Parameter Description Test Conditions Min Max Units IIL, IIH Input Load Current Vss ≤ Vin ≤ VDD(5.25V) -10 +10 µA IIL 衡量的是输入引脚到 VDD 的电阻值;IIH 衡量的是输入引脚到 VSS 的电阻值。该测试是为了确保输入阻抗满足设计需求、输入电流不会超标。IIL/IIH 可用串行 / 并行 / 合并法测试,也可用功能测试的方法。串行法对引脚一个一个测试,准确但相对耗时间。 另外,IIL/IIH 测试通常仅能在纯输入引脚上执行。如果遇到双向引脚,则需要加输出负载,将其电平稳定拉高或拉低,避免在保护器件上产生电流,影响测试结果。 IIL/IIH 测试 - 串行静态法 使用串行法测试输入引脚 IIL 的示意图如下: 测试流程如下: 首先要供 VDDmax(最差情况)的电源给 DUT。 将 DUT 所有输入引脚设高电平(VIH)。 使用 PMU 将单个输入引脚拉低到 VSS。 等待 1~5 微秒,检测电流值。 低于 IIL(-10µA):Fail(灌进 DUT 的电流超标) 其他区间:Pass 使用串行法测试输入引脚 IIH 的示意图如下: 测试流程如下: 首先要供 VDDmax 的电源给 DUT。 将 DUT 所有输入引脚设低电平(VIL)。 使用 PMU 将单个输入引脚拉高到 VDDmax。 等待 1~5 微秒,检测电流值。 高于 IIH(+10µA):Fail(流出 DUT 的电流超标) 其他区间:Pass IIL/IIH 测试 - 并行静态法 在一些测试系统上,能对漏电流进行并行测量(Parallel Test Method)。并行测漏电流是用多个 PMU 对多个 pin 分别进行测量,所有输入引脚都被强制拉高,并且同时并行测量每个引脚的电流,随后将测试结果与标称值做比较得出结论。 首先要供 VDDmax 的电源给 DUT。 使用多个 PMU 对每个输入引脚强制拉高到 VDDmax(测 IIH)。 等待 1~5 微秒,检测电流,对比得出结论。 随后再拉低至 VSS,重复以上步骤测 IIL。 并行法的特点是可以同时测量每个引脚单个电流,快速完成 IIL/IIH 测试;缺点是输入引脚间的泄露更难检测到,因为所有输入都保持在相同的水平。 IIL/IIH 测试 - 合并静态法 合并测试(Ganged Method)指的是将所有输入引脚合并为一个引脚,用一个 PMU 测漏电流的总和。测试示意图如下: 组合测试方法与以上类似。其电流总限额是单个引脚的标称值,如果测试结果超限,则必须换回串行测试重测,这种测试对 CMOS 器件(高阻抗输入)测试效果比较好。 IOZL/IOZH 高阻电流 IOZ 指输出引脚(O)高阻态(Z)下的漏电流(I)。其中,IOZL 指引脚低电平(L)状态时的漏电流;IOZH 指高电平(H)状态时的漏电流。用来看引脚关断时漏电流会不会超标。 此参数是确保 双向或高阻输出引脚能正常关断(输出高阻态)。IOZL 测的是输出高阻状态时,引脚对 VDD 的阻值;IOZH 测的是引脚对 VSS 的阻值。通常在规格书内是这么表示的: Parameter Description Test Conditions Min Max Units IOZ Output Current High-Z VSS ≤ Vout ≤VDD(5.25V), Output Disabled -2.0 +2.0 µA IOZL/IOZH 测试 - 串行静态法 串行静态测试 IOZL/IOZH 的示意图如下: 测试流程如下: 首先需要给器件供 VDD 的电源。 将器件引脚预设为高阻状态,使用 PMU 强制将引脚拉高 / 拉低。 测量引脚的电流值 低于 -IOZ(-2µA):Fail 高于 +IOZ(+2µA):Fail 其他区间:Pass 串行测试的优点是可以准确测量单个引脚的电流值,缺点是慢。另外,此测试需要设置钳位电流。 IOZL/IOZH 测试 - 并行静态法 并行静态法即多个 PMU 同时对多个引脚进行,此处不多赘述,其优点是快。 VI(Input Clamp,输入电压钳) 输入电压钳 VI 指的是当在 TTL 器件(非 CMOS)输入引脚(I)上施加负电流(抽取电流)时,在引脚上测得的电压(V)。此测试的目的是 验证三极管发射极和地之间钳位二极管的完整性。它在规格书上是这样表示的: Parameter Description Test Conditions Min Max Units VI Input Clamp Voltage VCC = Min, Iin = -18mA +1.5 V VI 测试 - 串行静态法 串行静态法测 VI,测试示意图如下: 测试流程如下: 首先要确保这是个 TTL 器件的输入引脚,然后供 VCCmin 的电源。 在设置了电压钳后,使用 PMU 抽取 -15mA~-20mA 的电流。 测量引脚上的电压值 低于 VI(-1.5V):Fail 其他区间:Pass IOS(短路输出电流) 短路输出电流表示的是当输出引脚(O)在短路条件(S)下产生的电流(I)。目的是 衡量当引脚输出高电平,但被短路至零电压时的输出阻抗,确保在最坏的负载条件下,输出电流也不会太大;也表示了 DUT 引脚可提供容性负载充电的最大瞬时电流,可据此计算上升时间。IOS 在规格书中是这样表示的: Parameter Description Test Conditions Min Max Units IOS Output Short Circuit Current Vout = 0V, VDD = 5.25V, *Short only 1 output at a time for no longer than 1 sec -85 -30 mA IOS 测试 - 串行静态法 测试示意图如下: 测试流程如下: 供 VDDmax 的电源,对器件预处理,使得引脚输出高电平。 用 PMU 将引脚拉低至 0V,测量输出电流并与标称值对比,得出结论。 在对 IOS 的测试中,需要有合理的逻辑以避免热切换。需要首先将 PMU 设置为强制零电流的电压测量模式,连接到 DUT 输出,测量并保存 DUT 的 VOH 电压,随后断开连接并设定 PMU 为拉高至刚刚的 VOH 电压,然后重新连接 DUT(此时两端电压都是 VOH),随后再让 PMU 拉低为 0V,测量电流值。测量完成后,PMU 要恢复拉高到 VOH 才能断开连接。这样可以确保继电器在开关切换时,两端的电压是一致的。 导致测试不通过的因素: 超过上限值 输出阻抗太高,导致电流绝对值不足。 夹具本身有电阻。 没有经过正确的预处理。 低于下限值 输出阻抗太低,导致电流绝对值过大。 Resistive Inputs(上下拉阻性输入) 有些输入引脚可能有主动上拉、下拉结构,需要保证 输入 Buffer 的上下拉电阻路径正常。只能串行测试,因为不同引脚内部上下拉结构可能不一样。引脚结构的示意图: Output Fanout(输出扇出能力) 扇出(Fanout)能力是指输出引脚根据其电压电流参数,驱动多个输入引脚的能力。也就是 引脚的带驱能力,是衡量一个输出引脚可以带得动多少个输入引脚的指标。 如上图,这个 TTL 输出可以拉高大约 17 个输入引脚,或者拉低 30 个输入引脚。在规格书中,引脚的参数会这样表示出来: Parameter Description Test Conditions Min Max Units VOH Output HIGH Voltage VCC = 4.75V, IOH = -2.6mA 2.4 V VOL Output LOW Voltage VCC = 4.75V, IOH = 24mA 0.4 V IIL Input LOW Load Current Vin = 0.4V -800 µA IIH Input HIGH Load Current Vin = 2.4V 150 µA 扇出能力在 TTL 和 CMOS 器件之间差别很大,因为 CMOS 输入阻抗高,所以理论上一个 CMOS 输出可驱动任意多个 CMOS 输入。但 CMOS 输入引脚有寄生电容,连接越多输入,电容越大,在高低电平切换时会存在电容充放电效应,产生延时。 参考与致谢 《The Fundamentals Of Digital Semiconductor Testing》 《DC Test Theory》 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

半导体测试基础 - OS 测试

半导体测试基础 - OS 测试 开路与短路测试(OS,Open-Short Test,也称连续性或接触测试),用于 验证测试系统与器件所有引脚的电接触性,且不会与其他引脚、与电源(地)发生短路。OS 测试能快速检测出 DUT 是否存在电性物理缺陷,如引脚短路、bond wire 缺失、引脚的静电损坏、以及制造缺陷等;也能检测出与测试配件有关的问题,如 ProbeCard 或器件的 Socket 接触有问题。 OS 测试的过程是借用对 VDD 和对地保护二极管进行的。一般有两种测试方法,一种是用 PMU 灌入电流测电压;一种是用功能测试的方法提供 VREF,形成动态负载电流再测电压的。 OS 测试 - 静态法 串行 / 并行静态法测试 OS,实际上就是灌入电流测电压,因为这个电流会让上下某个保护二极管发生正偏,所以可以通过检测正偏压降来测出开短路异常。施加正电流使对电源二极管正偏 的测试示意图如下: 测试流程如下: 将 DUT 所有引脚(包括电源和地)接地。 PMU 给引脚施加电流(约 100µA)。 检测引脚电压 高于 VOH(+1.5V):Fail(Open) 低于 VOL(+0.2V):Fail(Short) 其他区间(正偏电压,比如 0.65V):Pass 施加负电流使对地二极管正偏 的测试示意图如下: 测试流程如下: 将 DUT 所有引脚(包括电源和地)接地。 PMU 给引脚施加电流(约 -100µA)。 检测引脚电压 高于 VOH(-0.2V):Fail(Short) 低于 VOL(-1.5V):Fail(Open) 其他区间(正偏后的压降约 -0.65V):Pass 因 PMU 提供的是恒流,所以需要设置电压钳,以钳制住开路引脚测试时产生的电压,否则电压会无穷大。如果钳制电压设置为 3V,那么当一个引脚为开路时,其测试结果就是 3V。 这种方法仅限于测试信号 IO 引脚,不能用于测试电源引脚。电源引脚虽然也可在开路条件下进行测试,但因其内部结构不同,需要设定不同的测试限度。 综上,OS 静态测试的特点是: 串行法一次只测一个引脚,步骤简单但效率低,适用于引脚少的 DUT。 并行法需要测试系统有 PPMU,缺点是检测不出相邻引脚短路,解决方法是分两次测试(比如第一次测 1357 引脚,第二次测 2468 引脚)。 施加电流,测量电压。 参考与致谢 《The Fundamentals Of Digital Semiconductor Testing》 《DC Test Theory》 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

半导体测试基础 - 功能测试

半导体测试基础 - 功能测试 功能测试(Functional Test)主要是验证逻辑功能,是运用测试矢量和测试命令来进行的一种测试,相比于纯 DC 测试而言,组合步骤相对复杂且耦合度高。 在功能测试阶段时,测试系统会以周期为单位,将测试矢量输入 DUT,提供预测的结果并与输出的数据相比较,如果实际的结果与测试矢量预测值不相符,则认为不通过。 基本概念 测试矢量(Test Vectors) 测试矢量也称测试模式(Test Pattern),可以理解为器件被设计逻辑功能的输入输出真值表。Test Vectors 强调时序,一般是一系列输入输出的组合。一般用 0/1 表示输入低 / 高电平,用 L/H/Z 表示输出低电平 / 高电平 / 高阻态,用 X 表示既无输入也无输出。 总功能测试 各种参数的功能测试法 OS 测试 - 功能测试法 开短路不属于功能,但也可以用功能测试的方法进行测试,关闭 PMU 和 Driver,用 Current Load 和 Voltage Receiver 进行测试。测试示意图如下: 测试流程如下: 将除待测引脚外的所有引脚接地(电源和信号引脚)。 定义 VOL/VOH(比如 0.2V/1.5V)。 将待测引脚设置为输出模式,并关断此引脚(高阻 Z)。 提供 VREF(3V),形成动态负载电流(约 400µA),检测引脚上的电压 高于 VOH(+1.5V):Fail(Open) 低于 VOL(+0.2V):Fail(Short) 高阻态(正偏后的压降约 0.65V):Pass 复位引脚状态,接着测下一个引脚。 本测试的矢量模式示例如下: 00000 /* cycle 1 将所有引脚接地 */ Z0000 /* cycle 2 测试第 1 个引脚的保护二极管 */ 0Z000 /* cycle 3 测试第 2 个引脚的保护二极管 */ 00Z00 /* cycle 4 测试第 3 个引脚的保护二极管 */ 000Z0 /* cycle 5 测试第 4 个引脚的保护二极管 */ 0000Z /* cycle 6 测试第 5 个引脚的保护二极管 */ /* 下一个周期将会被单独执行 */ ZZZZZ /* cycle 7 关断所有引脚并测试它们 */ 正常引脚电压变化与采样的示意图如下。采样窗口设置在 0.9µs、持续时长 0.01µs 是为了让电压上升到稳定再采样: 接下来测对地保护二极管。只需要测是否开路(如果由短路的情况,那必然过不了前面的测试)。功能测试法测对地二极管的示意图如下: 这次的矢量测试,只需跑一次前面的第 7 个周期(ZZZZZ),即可并行测试所有对地二极管。 (拉低引脚和地用的是 DPS;如果 Fail Open 的话,测出来的电压是 VREF 而非钳位电压,不要跟 DC 方法搞混了。) VOL/IOL & VOL/IOH 测试 - 功能测试法 测试示意图如下: 测试流程如下: 供电 VDDmin(??)。 设置 VREF(量程中间值),将形成动态负载电流。 执行功能测试,监控引脚的电压 低于 VOH Spec 或高于 VOL Spec:Fail 高于 VOL Spec:Fail 其他区间:Pass VIL/VIH 测试 - 功能测试法 VIL/VIH 是看 DUT 能不能正常识别输入的逻辑。用功能测试法测 VIL/VIH 的示意图如下(假设此芯片左边是输入引脚,右边是输出,输入输出逻辑电平同相): 用功能测试法测 VIL/VIH 的流程是: 首先要供 VDDmax 的电源给 DUT。 按照 VIL/VIH 标称值给引脚输入电压,让其他的参数满足一定余量。 执行功能测试,监控输出引脚的电压 低于 VOH Spec:Fail 高于 VOL Spec:Fail 其他区间:Pass 供 VDDmin 的电源给 DUT,并重复以上的流程。 如果遇到测试不通过的情况,如果不能定位到错误所在,可以先给多一点余量,排除因其他因素导致的问题。比如给 VIL 最优低电平(0V),给 VIH 最优高电平(VDD),看看是否能按流程通过测试,随后再逐步赋 VIH/VIL 原始值以排除问题。 IOZL/IOZH 测试 - 功能测试法 使用功能测试法测试 IOZL/IOZH 的示意图如下: 测试流程如下: 给 DUT 供电 VDD,设置比较器的值为 VOL/VOH。 设置 VREF,形成动态负载电流,测引脚电压 高于 VOH Spec:Fail 低于 VOL Spec:Fail 其他区间:Pass 参考与致谢 《The Fundamentals Of Digital Semiconductor Testing》 《DC Test Theory》 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

半导体测试基础 - 基本概念

半导体测试基础 - 基本概念 随着芯片集成度越来越高,手动测试已无法满足需求,因此要用到自动化测试设备(ATE,Automated Test Equipment)。因为现在的芯片原来越复杂,普通的 Bench 测试没法满足需求。ATE 可检测集成电路功能之完整性,是集成电路生产制造最终的流程,确保产品质量。芯片测试算是半导体产业链上游里面最末端的一个组成部分。受测试的器件主要分几类:储器、数字电路、模拟电路和混合信号电路。 ATE 内部有很多子系统,包括提供高低电平的驱动电路、可编程的电流负载、检测输出电压的比较器、PMU 连接电路、高速电流比较器、高速开关等。 从上图可以看出,测试系统主要由输入、输出和动态负载三部分组成: 输入部分:给 DUT 提供 VIL/VIH 电压。 输出部分:将 DUT 的输出电压与 VOL/VOH 作比较。 动态负载 通过加载 IOL/IOH 电流,得到输出电压,与 VOL/VOH 作比较。 直接将输出电流与 ILow/IHigh 作比较(一般高端机台才有)。 测试最基础的是测 DC 和 AC 参数。DC 参数用的方法可以是 Static,就是用 PE 卡的 Driver 和 PMU,然后 Force V Measure I 或 Force I Measure V ;也可以用 Functional 的方法,就是 Current Load 和 Voltage Comparator,然后跑 Pattern 来测试。 信号的输入与输出 信号是如何生成并输入 DUT 的: 信号是如何从 DUT 读出并测试的: 输入信号的格式 RZ(Return to Zero):归零码,在一个周期内用二进制传输数据位,当数据位脉冲结束后,需要维持低电平。这种编码能同时传输时钟与数据信号,但因为一部分带宽被归零占用,所以传输效率相对不高。上升下降沿的位置可受 Edge Timing 控制。 RO(Return to One):归一码,与 RZ 相反,需要维持在高电平。上升下降沿的位置可受 Edge Timing 控制。 NRZ(Non Return to Zero):不归零码与 RZ 的区别是它不必归零,所以一个周期可以全部用来传输数据,带宽利用率 100%。如果传输低速异步数据,可以不加时钟线,但要约定通信波特率(如 UART);传输高速同步数据,需要另外配时钟线。NRZ 不受 Edge Timing 的控制。 DNRZ(Delayed Non Return to Zero):延时不归零码是 NRZ 加了时间延迟的波形。延时的时间受 Edge Timing 控制 SBC(Surrounded By Complement ):补码环绕相当于 RZ 和 RO 的叠加。它每个周期内最多可以有 3 个边沿,在 T0 时反转数据,延迟一定时间后表现为预设的值,维持一定时间后又反转回去。SBC 多用于建立 / 保持信号的控制。 ZD(Impedance Drive):阻抗驱动用于控制引脚开启或关断(高阻态)。 时钟信号通常使用 RZ/RO 格式,上升沿有效的信号(如片选 CS 或读 READ)常使用 RZ 格式;下降沿有效的信号(如输出始能 OE 常使用 RO 格式;拥有建立和保持时间要求的数据信号常使用 SBC 格式;其他的输入信号则可以使用 NRZ 或 DNRZ 格式。 输出信号格式 高低电平输出 引脚输出高低电平逻辑时,高电平必须至少要比 VOH 高,低电平至少比 VOL 低。 高阻态输出 DUT 引脚由外部负载将电压拉到 VOL 与 VOH 之间,不能输出电压电流。 负载电流输出 DUT 有些引脚可以输出负载电流。如果测试系统有可编程电流负载就可以直接测试,如果没有就可能要外加电阻测试。负载电流输出需要在 VOL/VOH 达标的情况下输出指定的 IOL/IOH 电流。 常用术语解释 晶圆、晶粒与封装 芯片设计制造的流程: 晶圆(Wafer),晶粒(Die,复数 Dice,也称裸片)与封装后的芯片(Package Device)的关系如下: 经过测试和墨点标示的晶圆: CP 测试与 FT 测试 CP(Chip Probe)测试是芯片还在 Wafer 阶段时,就通过探针卡扎到芯片管脚上对芯片进行性能及功能测试。FT(Final Test)是芯片在封装完成以后进行的最终测试。 测试设备术语 DUT(Device Under Test):待测设备,外部信号通过 DUT 的引脚对其进行测试。也称为 UUT(Device Under Test)。 DPS(Device Power Supplies):为 DUT 直接提供电压与电流的设备。 PMU(Precision Measurement Unit):精密测量单元,用于精确测量器件的直流特性。 PPMU(Per Pin Measurement Unit):每个引脚上都有 PMU 用于测量。 DIB(Device Interface Board):设备接口板,也称 LOAD board。 PIB(Probe Interface Board):探针接口板,用于 Wafer Probe。 PDP(Prober docking plate):探针台对接板。 PROBE CARD:带探针的 PCB,用于 Wafer Probe。 BINNING:根据测试结果对 DUT 进行筛选。 MANIPULATOR:支撑测试头并允许其向多个方向移动的结构。 HANDLER:全称 IC pick up and place handler,自动分选机,用于将 DUT 放置在测试头插座中的机械。 PROBER:探针台,在测试探针下移动晶片的机械单元。 测试中的参数 VCC:对 TTL 器件的供电。 VDD:对 CMOS 器件的供电。 ICC:对 TTL 器件的驱动电流。 IDD:对 CMOS 器件的驱动电流。 VSS:提供电源回流路径。 GND:参考电平,在单电源供电设备上常等价于 VSS。 IDD:从 CMOS 设备中消耗的电流。 ICC:从 TTL 设备中消耗的电流。 VIH:高电平输入时的最低电压限制(不会被识别成 0)。 VIL:低电平输入时的最高电压限制(不会被识别成 1)。 VOH:高电平输出时的最低电压限制(不会被识别成 0)。 VOL:低电平输出时的最高电压限制(不会被识别成 1)。 IIH:输入引脚逻辑为高电平时,允许的最大灌电流。 IIL:输入引脚逻辑为低电平时,允许的最大漏电流。 IOH:输出引脚逻辑为高电平时,驱动 / 拉电流(source)的大小。 IOL:输出引脚逻辑为低电平时,灌电流(sink)的大小。 IOZH:输出引脚逻辑为高电平且处于高阻状态时,允许通过的最大电流。 IOZL:输出引脚逻辑为低电平且处于高阻状态时,允许通过的最大电流。 Propagation Delay:从信号输入到输出信号发生改变的时间间隔。 Rise Time:从高电平的 10% 上升到 90% 所需的时间。 Fall Time:与上面相反。 热切换(Hot Switching) 热切换也称带电流切换,指的是继电器在 电流在流动时 进行开关切换(可以有电压,两边电压保持一致即可)。这样可能会使继电器的寿命变短,或损坏继电器,需要通过编程来避免这样的情况。 闩锁效应(Latch-up) 当对某个引脚施加过高的电压时,导致 CMOS 器件中出现大电流,造成局部电路受损甚至烧毁。 固定型故障(Stuck-At Fault) 固定型故障(SAF)指的是信号引脚由于制造缺陷(defect),被固定在了 0/1/Z 电平的状态,从而造成了故障。 Binning Binning 是根据测试结果对 DUT 进行筛选分组,举个例子: Hard Binning 指的是使用 Handler 一类的机器分类为两堆;Soft Binning 指的是在软件内记录区分不良品,不在物理上分类。 Binning 的过程至少需要有两个 bin,以区分某个测试结果通过或者不通过。 测试流程(Program Flow) 测试流程的设计对整个测试而言十分重要。比如说某些 DC 测试需要预处理(设定特定的设备逻辑,例如功能测试),少了预处理将导致后续步骤的结果毫无意义。 测试流程的设计需要考虑很多因素:测试量的大小、需要测试哪些参数、怎么去进行 Binning 等待。通常会使用流程图来呈现,确保测试流程满足需求。 基本测试项目: 接触 / 连续性测试(Contact/Continuity Test):检查器件引脚中开路 / 短路问题。 直流特性测试(DC PARAMETRICS TEST):验证设备 DC 电流和电压参数,包括 IDD。 数字功能测试(DIGITAL FUNCTIONAL TEST):测试 DUT 的逻辑功能。 交流时序测试(AC TIMING TEST):验证 AC 规格,包括输出信号质量和信号时序参数。 混合信号测试(MIXED SIGNAL TEST):验证 DUT 的模拟和数字电路的逻辑。 其他的测试项:射频器件(RF Devices)、汽车器件(Automotive Devices)、存储器件(Memory Devices)、电源管理器件(Power Management Devices)、RFID 器件、高速数字器件(High Speed Digital devices)等的测试。 参考与致谢 《The Fundamentals Of Digital Semiconductor Testing》 半导体设备系列研究三 - 半导体检测设备:芯与屏相融,光与电交汇 闩锁效应(Latch-up)详解 https://www.eefocus.com/ansonguo/blog?p=1 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

卡片式写作

卡片式写作 普通的大纲式写作容易出现「文思枯竭」的情况,最典型的例子是交论文前一晚的挣扎。 认知隧道(cognitive tunnel)概念: 全部的注意力都聚焦在当下那件紧急的事情上,变得特别狭窄和受限,此时容易忽略全局的信息,看不到整体。 而卡片式写作像编程中的函数封装一样,注重底层封装,一层一层往上抽象,当需要的时候可以直接调用。 这样一来,不仅方便复用(不重复造轮子),卡片在碰撞的同时,也会产生新的火花。 方式 长期收集:将平时看到的、想到的 ideas 记录下来,每个主题单独产生一张卡片。 阶段分享: 挑选每个阶段记录的卡片,不做二次修改,整合发布为公众号文章「碎片精选:第 n 期」 项目成文:写固定主题的文章时,可以融进相关的卡片,并进行二次加工成文。或卡片随机拼凑,产生新的思维火花。 参考与致谢 你一写长文章就焦虑拖延? 如何高效写长文? 如何高效实践卡片式写作? 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

参观实验室 - 经验模板

参观实验室 - 经验模板 参观实验室是每年必备的活动,不管面向的对象是新生还是领导。其区别就是,对新生要很接地气,不要涉及太多理论知识,只需要讲机器人是什么、有什么功能,要让他们对实验室产生兴趣,从而加入我们,如果有感兴趣的再从专业用途上详细展开讲解;而对领导讲解,可以直接讲专业知识,因为要代表学校层面,展示我们所掌握的技术和专业领域。 大多数人不会认真听讲解的,他们只想看到机器动起来。 参观实验室,最主要有以下几个方面: S1 展示 可选。因为不是我们自己的作品,所以不必讲解,只需开动起来吸引人就行了。 奖状区 我们华广机器人·野狼队主要参加两个比赛,RoboMaster 机甲大师赛,和 ROBOCON 全国大学生机器人比赛。 我们是一支有科研实力的队伍,这是我们近年来拿过的奖状,都是全国一等二等级别的。 这是我们比赛的照片和团队的日常,大家可以看看。 步兵活动区 步兵活动区是沿着 B3-401 外墙的一个横向区域,主要演示步兵的全向运动、自瞄等功能,要拉警戒线。 大家可以过来看看,这是我们的步兵机器人。它在比赛中的作用是发射弹丸、打到敌方装甲板上,击杀敌人。整场比赛就像打王者(引导看视频),摧毁敌方水晶,我们这里叫它基地,就能获得胜利。 这是我们的两台步兵机器人,可以看到,这一台能够自动识别瞄准。这是我们视觉算法组的任务,相当于给机器人写自瞄外挂,在比赛的时候就能更好地锁定对方的机器人。 静态展示区 这个区域可以放往年的机器人(不能动的),无人机也可以放这儿。 大家看,这是我们去年 ROBOCON 比赛的四足机器人。 这是 RoboMaster 的英雄机器人,它跟步兵的区别是,它发射大弹丸(拿手上演示),伤害是步兵发射小弹丸的十倍。 这是 RoboMaster 的无人机。它的作用,是给我们队伍提供上帝视角,然后也有打弹的功能,可以对敌方的机器人和基地造成伤害。 大家可以看一下,这是我们打比赛时的第一人称视角,就像是打 FPS 游戏一样的,不过操控的是场上实体的机器人。 工程、大神符、哨兵区 这个纵深区域可以拿警戒线拉起来,里面展示外面看。 到这边我们看看这个机器人,它叫工程机器人,作用就是夹取弹药箱,把大弹丸小弹丸分给步兵和英雄机器人。也可以在他们死了的时候复活他们。所以工程机器人主要后勤兵的作用。 这边看过去,是我们比赛场上的一个道具,大神符每次只随机亮一个扇叶的灯,如果我们的步兵机器人击中亮灯的扇叶,就能获得一些 buff 像加攻击力之类的。 在最左边的是我们的哨兵机器人,它的特点是全自动运行,不需要人为操控,就可以瞄准攻击敌方机器人。 自动识别瞄准的功能,需要用到人工智能机器学习算法,包括刚刚大神符的识别(指一下),都是视觉算法组的职责。 其他 关于我们内部的分组,大家可以看看墙上的壁画(明天我会贴出来) 机械组主要是把机器人给造出来; 电控组主要是编写并调试机器人的控制代码; 视觉组主要是写一些外挂; 硬件电路组主要是给机器人设计并制造电路板(给大家看看主控板) 还有软件组,是给队里写一些实用的软件的,像我们管理物资用的小程序,还有网站博客等等。 行政组我们有宣传策划组和财务组,大家也可以扫码关注公众号了解一下。 想要进实验室,我们不设门槛,只要你对我们感兴趣,有热情,就可以加入我们的。 大家可以扫码关注我们,也可以扫墙上的二维码进行抽奖~ 以下是可以参考的技术内容(不要照着念): S1 展示区 介绍内容:RoboMaster S1 小机器人简易移动 讲解文案:我们现在看到的这个机器人是 DJI 去年 6 月发布的教育机器人“机甲大师 RoboMasterS1“,相信大家都知道 Robomaster 机甲大师赛,S1 机器人就是源自于 Robomaster 赛事。DJI 基于这项赛事中的探索和积累,研发出 S1 并进行推广,让大家都能亲身体会到机器人的魅力。有兴趣的同学可以试着体验一下(手机 app 操控体验) 奖状区 介绍内容:历年来获奖情况 讲解文案:这里是我们野狼队从三年前建队以来所获得的成绩,虽然建队时间不长,但是所获得的成就大家有目共睹。这里一二三等奖都有,说明了我们队伍具有一定科研实力,也期待你们的加入能为我们注入更多新的能量。(对着奖状解说) 步兵区 介绍内容:全向移动 / 小陀螺 / 扭腰、视觉识别 讲解文案:这个是我们 Robomaster 赛事里面的步兵机器人,步兵的作用主要是通过发射小弹丸攻击敌方机器人,这个枪口就是发射小弹丸的地方(指着位置)。步兵具有高灵活度,是所有机器人中灵敏度最高的一个。他可以进行全方位的移动,现在看它来表演一个”小陀螺旋转“和扭腰……(演示)除此之外,步兵机器人还可以进行视觉识别,比如说自瞄,通俗来说就是能够自动瞄准某个物体而跟着他移动。 静态区 介绍内容:狗 / 无人机 / 显示屏播放比赛视频 讲解文案:大家看看这个机器人像什么?是的有点像一只狗,这个是四足机器人的一种,是之前参加 robocon 赛事的参赛机器人。还有这个是 空中机器人,他也是机器人的一种。大家看了那么多机器人,是不是对机器人的形态认知又刷新了呢?这些机器人的功能,大家可以看看我们的比赛视频。 工程夹取区 介绍内容:演示工程夹取弹药箱 讲解文案: 这一台是 RoboMaster 比赛中的 2 号工程机器人,可以看到它与步兵相比,长得更方正。 虽然它不具备发射机构,但在赛场上会以各种特殊机构辅助其它机器人。 比如每颗伤害值 100 的大弹丸,需要由工程机器人的夹取机构获得赛场资源岛中的弹药箱,将大弹丸收集起来后,补给给英雄机器人。当我方的步兵机器人及其它地面机器人被伤害至战亡后,往往会停留在场地中央,这时工程机器人可以使用它的救援机构将步兵机器人拖回至我方的补给区进行复活。 像夹取这样一个动作,各个学校会使用不同的机构实现,这一台车使用一个叫做电机的装置进行翻转取弹的夹爪,以及一个气缸的执行元件实现夹紧弹药箱的动作。 RM 剩余机器人 介绍内容:介绍哨兵、移动英雄和大神符 讲解文案: 英雄:(指着英雄)这个机器人是英雄机器人,他的作用主要是通过发射 35mm 的大弹丸(高尔夫球实物)攻击敌方机器人,这个枪口就是发射大弹丸的地方(指着位置),其和步兵机器人类似,但相比之下英雄机器人会比步兵机器人具有更高的伤害,同时血量也会略高于步兵,但灵活性以及射速都低于步兵机器人。如果把步兵看做能持续输出血量少的游击兵,那么英雄机器人就是既有爆发杀伤能力,又有一定坦度的战士,在比赛上经常和步兵机器人一起组织进攻。 大神符:在这边我们可以看到现在场上正在旋转发光的是大神符,20 赛季官方名字叫能量机关,由于大神符高难度的激活方式和过往赛季的名称,仍有多数 RM 参赛者称它为大神符。大神符在比赛中提供高额增益效果,需要我方步兵机器人通过特定方式激活大神符,直接提升步兵英雄攻击力和防御力。在比赛场中先激活大神符的一方往往拥有着巨大的优势,是拿下比赛胜利的重要因素(吹水的,觉得不合适可以改)。而激活大神符所需的关键算法,由我们视觉算法组成员负责,需要扎实的数学线代概率伦知识功底,对大神符或者是数学逻辑感兴趣的同学,可以扫描这边二维码观看视觉算法组教程,了解报名我们视觉算法组,谢谢大家!!接下来请大家继续往下参观, 哨兵: 哨兵,是 ROBMASTER 机甲大师对抗赛中唯一的全自动机器人兵种。承担保卫基地以及在特定区域能掩护己方队友的职能。 在比赛中,哨兵机器人会被放置在基地与前哨战之间的固定轨道上,并在轨道上移动并寻找敌方地面机器人进行歼灭。尽管哨兵并没有配置操作手,但规则赋予了它比赛之中最高之一的血量与载弹量。同时区别与其他机器人,装备了双枪管,使哨兵拥有无与伦比的火力,成为了赛场上不可小觑的一股力量。而往届赛场上哨兵的数次拿下全场 MVP 的记录也在印证了这一点。作为比赛中体积最小最轻的机器人,却也是赛场上强有力的生力军。 而这么强大的兵种,想要完成它自然也是不小的挑战,机械组的成员需要思考如何在稳定的前提下将相当多的系统整合到那么小的体积内让它们工作时各司其职,互不干涉:电控组的成员则需要为其规划最优的运动方案,让它在那方寸的轨道上游走自如;视觉组的各位则要为它设计自动瞄准程序,让它在无人操作的情况下也能百发百中。那么,你想来挑战这项艰巨又充满乐趣的项目吗? 参观实验室内部 介绍内容:引导人群选择继续参观(去车队)或者深入了解(进来实验室里面可以抽奖),分走人群 讲解文案:相信大家看了那么多机器人,也对我们实验室有一定的了解,感兴趣且想了解更多的同学可以进入实验室参与抽奖活动,或者参观下一个队伍。 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

双系统极简安装指南

双系统极简安装指南 下载 Ubuntu 系统镜像 直接前往 https://cn.ubuntu.com/download 下载所需镜像。 制作启动 U 盘 下载启动盘制作工具:Rufus,准备一个容量 4GB 及以上的 U 盘。 选择启动 U 盘及要烧录的镜像,其他配置按照下图选择: 如果有后续弹出的步骤,按默认选择就行。 分磁盘空间给 Ubuntu 右键 此电脑 - 管理 选择需要分出空间给 Ubuntu 的磁盘,鼠标右键后选择 压缩卷: 一般来说,我们分 50 GB ~ 100 GB 容量给 Ubuntu 就够了,换算为 MB 就是 56325 MB ~ 102400 MB。在 输入压缩空间量 内填入设定的容量,点击确定,分出来的空间会呈现黑色,并显示状态为 未分配。 安装系统 插入 U 盘并重启,在启动期间进入 BIOS(各品牌电脑进入 BIOS 的操作不一样,例如我的是按 F12),选择 安装 Ubuntu 选项。 建议在安装过程中不联网,取消勾选 安装 Ubuntu 时下载更新,等系统安装完成后再更新,避免拖慢安装进度。 在 安装类型 页面,选择 其他选项,接下来选择 空闲 且空间最大的磁盘,点击 + 创建分区。 我们首先创建 /boot 分区。/boot 分区用于存放系统内核,一般给预留 1 GB 以上空间。所以我们在 大小 一栏填入 1024 MB,挂载点 内填写 /boot,点击确定。 接下来创建 / 分区。跟上面一样,先选择空闲磁盘,创建分区,大小默认为剩下空间即可,挂载点 填写 /,点击确定。 接下来最重要的一步,在 安装启动引导器的设备 内选择 /boot 分区对应的设备。这样 Windows 和 Ubuntu 的启动引导就互不冲突了。 接下来选择时区,默认即可。在 您是谁 的页面,设置个人信息,注意用户名和密码尽量设置得比较简单。 拔掉 U 盘后重启,进入 BIOS 并选择 Ubuntu 启动。 安装完成后的操作,可以参考 Ubuntu 配置笔记 这篇文章。 参考与致谢 Windows10+Ubuntu18.04 双系统快速简单安装指北 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

史密斯圆图与匹配电路基础

史密斯圆图与匹配电路基础 史密斯圆图是复数反射系数(伽玛 \(\Gamma\))的极坐标图。这种图以复数阻抗的实部和虚部同时绘制。其中,实部 R 的范围为 0 到无穷大(\(\infty\)),虚部 X 的范围为从负无穷大到正无穷大,都能绘制在一张图上。史密斯圆图能表现的参数与功能包括但不限于: 复阻抗 复反射系数 电压驻波比 VSWR 传输线效应 设计阻抗匹配网络 归一化阻抗 我们首先要把复阻抗转化为归一化阻抗,然后才能绘制在史密斯圆图上。归一化阻抗等于 实际阻抗 除以 系统阻抗: \[ Normalized Z=\frac{Actual Z}{System Z_0} \] 在大多数情况下,系统阻抗为 50Ω,所以基本是实际阻抗除以 50Ω。举个例子,假如实际阻抗值是 (37+j55)Ω,则归一化阻抗的值算出来约为 (0.74+j1.10)Ω。 史密斯圆图详解 在史密斯圆图上,中间横向的主轴为纯电阻轴(R)。在此轴上,电抗恒为 0。在主轴上方的区域(R+jX),电抗呈现感性;而在下方的区域(R-jX),负电抗呈现容性。 关键点 史密斯圆图上有一些关键点。最中间的点表示系统阻抗(在 50Ω 阻抗的系统中,中间这一点就代表 50Ω 阻抗值)。沿着主轴,最右边的点代表开路(阻抗无穷大);最左边的点代表短路(阻抗为 0)。 恒电阻圆 在恒电阻圆上的点,其归一化电阻(实部)为常数。比如其中通过中心点的圆,其电阻为 1(50Ω),即归一化阻抗的实部为 1。在图中呈现的,分别还有归一化阻抗的实部为 0.4 和 3.0 的恒电阻圆: 恒电抗弧 恒电抗弧从开路点延伸出来,落在弧上面的点,表示的是电抗的值,即复阻抗的虚部。弧度越大,电抗的绝对值越大,随着弧度变小,电抗的绝对值会越来越小,直到变为 0(落在纯电阻轴,不呈现感性或容性)。在图中呈现的,分别还有电抗值 ±0.5(虚部为 ±j0.5),±1.0(虚部为 ±j1.0)的恒电抗弧: 将复阻抗转换为复导纳 导纳(Admittance,Y)是阻抗的倒数,电导(Conductance,G)是电阻的倒数,电纳(Susceptance,B)是电抗的倒数。如果它们是复数,计算起来会非常复杂。但在史密斯圆图上,我们只需要以中心点为圆心,画一个经过复阻抗 Z' 点的圆,即可在它的另一侧找到对应的复导纳值 Y'。 举个例子,假如 Z'=1+j1.1,则其对应的 Y'=0.45-j0.5。 如果是一条复阻抗曲线,那么可以把史密斯圆图旋转 180°,得到的曲线就是复导纳曲线了。 恒电导圆和恒电纳弧 完整的史密斯圆图上,还呈现了 恒电导圆 和 恒电纳弧,在下图以蓝线标记: 在史密斯圆图上标定一般值 在史密斯圆图标定一般值,如 Z=25+j40。首先我们先按 50Ω 阻抗对其进行归一化处理,计算得 Z'=0.5+j0.8。由此,我们可以在图上寻找 R'=0.5 的圆与 X'=0.8 的弧,它们的交点就是所求的 Z': 史密斯圆图的径向缩放参数 一般来说,史密斯圆图底下还有径向缩放参数轴。假设图中有一复阻抗点,连接它与中心点,并沿着半径旋转到主轴上,投影到径向缩放参数轴上,如图: 在此轴上可读出一些参数: 电压驻波比(VSWR):2.3:1 回波损耗(Return Loss):8.10dB 反射系数(Reflection Coefficient) 电压:0.155 功率:0.39 不仅如此,我们也可以发现,出现在这个半径圆上的点,这些参数都是相同的。 驻波比与传输线的关系 在前文我们提到,在以系统阻抗(中心点)为圆心,到复阻抗点的距离为半径绘制的圆,圆上不同阻抗的点,其驻波比(SWR)都是相等的。在圆上转一圈的长度,相当于 1/2 波长值。所以,传输线长度每增加一半波长值时,复阻抗会沿着圆转多一圈。 由此可得,从源端到天线的传输线的长度,应尽量控制在天线半波长的整数倍,才能使观测的阻抗与天线的实际阻抗不发生偏移。如果长度为一般值,则可在 SimNEC 仿真软件内使用传输线的模型进行补偿。 还有一个有趣的现象,如果末端为开路的传输线长度为 1/4 波长值(转半圈),那么它看起来就像是短路的;反之如果末端为短路的传输线,长度为 1/4 波长值,则观测出来的特征就像是开路的: 匹配电路的设计 通常我们会在电路中串联或并联电感和电容,移动复阻抗点,以匹配阻抗。 串联电感:沿恒电阻圆顺时针方向移动。 串联电容:沿恒电阻圆逆时针方向移动。 并联电感:沿恒电导圆逆时针方向移动。 并联电容:沿恒电导圆顺时针方向移动。 定性地看,不管是串联还是并联,加电感会使复阻抗点往上走,而加电容会往下走。 简单的 L 型匹配电路 假设当前电路实测复阻抗值为 \(Z_L\),我们需要把它调到理想的 \(Z_0\)(最好的是中心点,次之在 50Ω 的电阻圆上),则可以用电感或电容组成简单的 L 型状的匹配电路,使复阻抗点在史密斯圆图上移动。电感或电容的组合,取决于初始 \(Z_L\) 在史密斯圆图上的位置。可根据下图 \(Z_L\) 的分布,挑选合适的组合构建 L 型匹配电路: 举个例子,初始复阻抗值 \(Z_L\) 如下图(黑点),我们可根据小图提供的 L 型匹配电路的构造,把它调到理想的 \(Z_0\) 上(红点): 为了方便调试,我们在图上勾勒出标准恒导圆与恒阻圆。接下来的步骤可在 SimNEC 仿真软件内进行: 串电感,沿恒电阻圆顺时针方向移动,直到碰到恒导圆。 并电容,沿恒电导圆顺时针方向移动,直到中心点上。 方法大致可以归结为:从近负载端开始,添加第一个器件,使复阻抗点移动到标准恒导圆或恒阻圆上;添加第二个器件,使之沿着标准恒导圆或恒阻圆移动到中心点上。所选器件的值可在软件中读出。 对于实际匹配电路的调试,可跳转文章 一般天线匹配电路的设计。 参考与致谢 史密斯圆图:史密斯圆图的历史以及为什么对射频设计者如此重要 Basics of the Smith Chart - Intro, impedance, VSWR, transmission lines, matching RF engineering basic concepts: the Smith chart 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

四校交流 - 策划案 - 正式

四校交流 - 策划案 - 正式 一、活动基本信息 日期:2021 年 3 月 27 日(周六) 地点:广州城市理工学院(原华南理工大学广州学院)B2B3 中间比赛场地 二、活动当日流程 上午:修整调试 为了解决各参赛队伍「水土不服」的问题,我们计划在各参赛队伍抵达比赛场地之后,留出时间给大家稍作修整,并对各自的机器人进行调试。 中午:午饭午休 中午我们计划到第二食堂用餐。为了避免人员过多聚集,我们将分三批带大家用餐,每个批次的时间安排如下: 第一批:11:30 第二批:11:50 第三批:12:00 吃完午饭之后,我们计划的午休时间是 12:30 - 13:30。 下午:正式比赛 我们计划在下午 14:30 开始正式比赛。在比赛开始前的半小时,裁判组将对各参赛队的机器人进行检录,模拟正式比赛流程。 比赛项目如下: 3v3 (1h):2:30 - 3:30 攻防战(交替) 红方基地(哨兵) 蓝方基地(前哨站) 2v2 (30 min):3:30 - 4:00 1v1 (30 min):4:00 - 4:30 趣味赛(30min):4:30 - 5:00 竞速 定点完成任务计时 下午 5 点的时候,比赛结束。我们将开展交流活动、交换礼物和微信。 傍晚:交流活动 我们暂定比赛结束于当天下午 17:00。比赛结束后各参赛队进入交流环节。 交流活动结束后,我们将在校内送各参赛队回家,当天交流圆满结束。

2025/9/17
articleCard.readMore

四校交流 - 策划案

四校交流 - 策划案 更新日志 210324 规则部分 修改准备时间、比赛时间、修正时间 添加的弹丸量、升级机制、操作间 更新赛务组的人员安排 提前问清事项 来的人数 出行方式 时间安排 什么时候出发 什么时候到 大巴车牌及车型 带什么兵种,多少部 基本流程 抵达 车辆出入放行条、进校门的方式(负责人:宇轩) 接待 备场 休整 调试(宣策采访) 调试场地设备 吃饭 地点:二饭 时间 第一批:11:30 第二批:11:50 第三批:12:00 饭后午休 时间:12:30 - 1:30 参观实验室 正式比赛 时间:2:00 热场环节 适应性训练 + 检录 (30 min):2:00 - 2:30 3v3 (1h):2:30 - 3:30 攻防战(交替) 红方基地(哨兵) 蓝方基地(前哨站) 2v2 (30 min):3:30 - 4:00 1v1 (30 min):4:00 - 4:30 (如果有剩余时间)趣味赛 (30min):4:30 - 5:00 竞速 定点完成任务计时 宣策直播(考虑与其他学校联合直播)(负责人:锶淇、其森) 按比赛规则进行比赛 总结 时间:5:00(暂定) 围圈圈交流(放队旗合照)(负责人:晓柔) 互相加微信 礼物交换 交流结束 结束后的工作 清点物资 开总结会 交报告 交宣策新闻稿 场地 大棚(负责人:高佬、国熙) 检录处 备场 正式比赛场地 操作间 B3 休息吹水区 规则 比赛项目 适应性训练:游走、补给、射击 3v3:死斗 或 攻防战 2v2:死斗或攻防战 1v1:死斗或攻防战 定点任务:【待编辑】 竞速:路线如下图 准备物资: 地胶(2 X 2)作为检查点(转角) 终点处做缓冲处理 终点在盲道过半 流程 两分钟准备时间 同正式比赛 装填初始弹丸 五分钟比赛时间 死斗 或 攻防 步兵 5 秒后原地复活,需要撤离战场回到补给区进行回血和技能恢复 英雄 10 秒后原地复活,需要撤离战场回到补给区进行回血和技能恢复 由于服务器无法直接对机器人进行回血处理,所以需要服务器对机器人进行重置之后再重新给予经验值来进行恢复 机器人复活后保持战亡前的等级、性能点与经验值,且血量恢复至上限血量的 20%。机器人复活后获得 100%防御增益,持续时间为 10 秒 获胜条件 击败基地的一方胜 基地剩余血量百分比高方胜 百分比相同时,伤害量高的一方胜 两分钟休整时间 清理场地 障碍块重置 清扫弹丸 机器人回归补给区 机器人退弹 装弹量 一局比赛中,哨兵机器人可用 17mm 弹丸数量为 500 发。 升级机制 操作间 操作间位于战场外围附近,是比赛时操作手的活动区域。操作间配置对应数量的电脑,且每台电脑配备对应的显示器、鼠标、键盘、USB 集线器等官方设备。 物资准备 比赛物资 电池(负责人:正富) 弹丸(负责人:徐玺) 警戒线(负责人:湘杰) 排插(负责人:正富) 路由器、服务器准备及测试(负责人:健贤) 护目镜、胸牌(负责人:高佬、国熙) 三套完整机械工具(负责人:建勋) 盲道的保护、随机障碍区的障碍、(哨兵的底盘以及保护)、前哨站的保护以及正常使用(负责人:高佬) 硬件焊接工具(负责人:bobi) 仙女棒、布袋、补给区的地胶提示区、标签旗(纸)(负责人:高佬) 普通物资 队服(负责人:所有人) 电工胶布(负责人:bobi) 桌子(负责人:高佬、宇轩) 风扇(负责人:宇轩) 推车(负责人:宇轩) 音响(负责人:宇轩) 水:矿泉水、大可乐、纸杯(负责人:宇轩) 礼物准备 明信片(负责人:锶淇) 签名可乐(负责人:锶淇) 七彩步兵贴纸(负责人:宇轩) 人物钥匙扣(负责人:其森) 队旗(负责人:其森) 合照(负责人:其森) 野狼队 KT 板(负责人:其森) 操作间的布置 大电视、HDMI 等 教室卫生 面向对象 人太多了需要报备(负责人:宇轩) 参赛队员(负责人:高佬、国熙) 组别 人员 职责 补充 电控组 谢正富 1 号步兵第一负责人 1、检录阶段:携带电脑,配合操作手进行检录;2、三分钟准备阶段:上电、检查接线、提示操作手进行功能测试,自瞄测试;3、询问操作手有出现什么问题 电控组 张誉升 2 号步兵第一负责人 1、检录阶段:携带电脑,配合操作手进行检录;2、三分钟准备阶段:上电、检查接线、提示操作手进行功能测试,自瞄测试;3、询问操作手有出现什么问题 机械组 黄永平 1 号步兵第二负责人 1、在备场待命,随时进行维修;2、在进入检录区前先自行检查一遍机器人的健康状况 机械组 钟晓雄 2 号步兵第二负责人 1、在备场待命,随时进行维修;2、在进入检录区前先自行检查一遍机器人的健康状况 操作手组 古炎坤 1 号步兵操作手 1、操作机器人进入检录区,并根据检录员的提示进行相关操作;2、三分钟准备阶段,进入比赛场地后,与电控负责人一起检查机器人,详细内容参考训练计划中的 注意事项;3、比赛结束后:参考训练计划中的 注意事项 操作手组 伍晁均/徐玺(暂替) 2 号步兵操作手 1、操作机器人进入检录区,并根据检录员的提示进行相关操作;2、三分钟准备阶段,进入比赛场地后,与电控负责人一起检查机器人,详细内容参考训练计划中的 注意事项;3、比赛结束后:参考训练计划中的 注意事项 赛务组(负责人:高佬、国熙) 人员 职责 组别 补充 王崟 检录机器人的大小尺寸 + 机械结构坚固程度 检录组 蒙朝都/张阳 检录装甲板的使用情况(仙女棒) 检录组 轮班交替 丁雨欣 检录射速、热量 检录组 陈炽康 弹丸收集 + 障碍重置 场务组 轮班交替 陈佳锋/曾浩彬 弹丸收集 + 障碍重置 场务组 轮班交替 何庭辉 弹丸收集 + 障碍重置 场务组 轮班交替 何颖祺 弹丸收集 + 障碍重置 场务组 轮班交替 袁东青 弹丸收集 + 障碍重置 场务组 轮班交替 苏获霖 弹丸分装 场务组 李肃 弹丸清洁 场务组 沈明生 补给站 场务组 李嘉琦 补给站 场务组 黄健贤 服务器 裁判组(边裁) 任创新 场地裁判 + 机器人裁判系统设置 + 基地血量恢复 裁判组(主裁) 伍国熙 场地裁判 + 机器人裁判系统设置 + 基地血量恢复 裁判组(边裁) 黄霆钰 管理各个出入口的人员(入口) 安保人员 吴焯钧 管理各个出入口的人员(出口) 安保人员 黎雪泳 医护应急处理 医护人员 张颖 医护应急处理 医护人员 职责: 检录机器人的大小尺寸 + 机械结构坚固程度: 利用电工胶布在地面粘贴出 3 种 Size (步兵、英雄、哨兵)的正投影矩形(长 X 宽),用于测量长宽,高度利用卷尺 + 木条标记进行测量 坚固程度测试即让机器人抬起至 20cm 的高度自由下落,查看结构是否正常 检录装甲板的使用情况(仙女棒) 利用仙女棒对装甲板进行击打,查看装甲板是否正常 检测射速、热量是否有正常限制 给予机器人一些子弹,并利用一个布袋回收打出的弹丸,查看机器人的射速和热量是否做限制 弹丸收集 + 障碍重置 一场比赛结束后对场地进行弹丸的清理和回收(扫把 + 扫铲) 对随机障碍块的位置重置 弹丸清洁 对回收完毕的弹丸进行清洁(干洗),去除表面灰尘和杂志 弹丸分装 对清洁完毕的弹丸进行分装,按 50 发一框来进行分配 提前准备好三个框:收集框、清洁框、分装框 补给站 人工补给站。将分装好的弹药带至补给区附近,并对请求补给的机器人进行补给 服务器 配置并维护服务器,引导操作手连接服务器,确保服务器的正常使用,利用服务器对比赛进行管理,包括回血、复活等 场地裁判 + 机器人裁判系统设置 + 基地血量恢复 场地裁判。根据比赛规则对机器人予以警告、判罚处理,维持现场秩序,并通知服务器管理者对机器人进行判罚 裁判系统的设置。根据特殊情况对机器人上的裁判系统进行相关的设置,在服务器出现无法正常运作时,对机器人进行离线模式的选择处理 基地血量恢复。同理,需要人工对离线的基地进行手动的血量恢复 管理各个出入口 - 对各出入口进行人员进出的管理,对未携带吊牌人员进行拦截处理 医护应急处理 - 准备好医药箱,对现场出现的应急情况做出行动 导播组(负责人:锶淇、其森) 直播人员 拍摄人员 战地记者 邀请老师(负责人:宇轩) 吃瓜群众 宣策任务 比赛直播 机位设置 静止机位:大神符、监控摄像头 移动机位:手持手机 采访问题(负责人:锶淇、宇轩) 赛事预告海报推文(负责人:锶淇) 让邓老师帮转学院群(负责人:宇轩) 找服帮推(负责人:晓柔) 招新 招募操作手和宣策组员的详情(负责人:锶淇、其森) 新闻稿(负责人:锶淇、其森) Vlog(负责人:其森) 彩排 周四下午进行预彩排 周五进行彩排 参考与致谢 华工华广一家亲友谊赛具体比赛日程与方案 210327 - 高校联盟赛热身友谊赛

2025/9/17
articleCard.readMore

团队影像资源管理

团队影像资源管理 本篇内容以机器人队的影像资料管理作为实例展开叙述。机器人队用群晖 NAS 做资料存储,相比于传统的文件夹管理方法,用这种方法更方便管理影像资源、更好地管理用户读写权限、搭建各类智能相册(时间线、人脸识别、标签、位置等功能)。 基本操作方法 打开 Synology Photos,接下来: 以活动划分的相册:请在右上角点击 切换到文件夹模式,打开 2021 赛季 文件夹,新建名为 日期 + 活动名称 的文件夹(例如 201108 换届大会,数字和中文之间要加空格保证美观),将照片上传至文件夹内。 不以活动划分的相册(如日常拍摄的照片):请切换到时间线模式,直接拖动照片或视频到界面中进行上传。 技术原理 因为 Synology Photos 默认会创建 /photo 文件夹,并将在 Photos 面板内上传的照片,按年月的方式归档到 /photo/PhotoLibrary 文件夹内。所以,我们可以将自定义的相册放至 /photo 目录下,方便在 Synology Photos 上查看影像。 如图,我们在 /photo 目录下创建了 2021 赛季 文件夹,以活动为单位存放映像资源。 以活动为单位,我们可以使用 日期 + 活动名称 的方式,来命名每次活动的文件夹,例如 201108 换届大会。 为什么要使用文件夹归档相册,而不用 Synology Photos 内的相册呢?这是因为: Synology Photos 无法导出相册信息,一旦需要更换磁盘或迁移,那么所有相册信息将会丢失。 无法细分层级。例如在某些活动的相册文件夹中,需要进一步细分摄影师的文件夹,那么 Synology Photos 无法做到。 将以活动为单位的影响资源放入 /photo 目录后,打开 Synology Photos,即可以瀑布流的形式浏览了: 当然,与主流的智能相册一样,Synology Photos 也有人脸识别的功能。 对于不按活动划分的影像资源(比如日常拍摄),可以打开 Synology Photos,切换到时间线模式,在本地拖动上传照片。这样的话,上传的照片会自动按拍摄日期归档到 /photo/PhotoLibrary 文件夹内,方便收纳整理。 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

团队知识库的搭建

团队知识库的搭建 前情提要 本篇文章以机器人队的知识库管理为实例。此前,机器人队使用有道云笔记作团队知识积累。 其作为一个团队知识库,使用无门槛,但缺点十分明显: 全队使用的是一个公用的笔记账号,无内部权限管理,每个人都可以任意删改其他人的文章 文章内容格式不规范,甚至有人通篇文章用 H1 标题来写,增加了阅读障碍 没有版本管理,一旦错删内容,无可挽回 团队知识库的意义 降低知识传授方面的时间成本、人力成本、边际成本。 降低知识的耦合度,提升知识的复用率,让后人避开前人踩过的坑;形成网状知识结构,达到 1+1>2 的效果 规避知识断层、遗失的风险。 团队每年人员更替程度较大,知识容易随着人员流动造成断层,不利于传承 知识的积累 知识库平台建立完毕后,就到了知识积累的阶段了,这个是全员参与的阶段。组织中的每个人都是知识库的贡献者。但事前最好制定一些知识积累的简要规程,比如规范知识提交的格式,规范主题的命名,段落格式等。知识积累阶段其实才是知识管理中最难的一个阶段,关键难在如何让组织内成员养成积极主动的进行知识积累的习惯。一些可供参考的方法: 宣传引导团队成员使用,让大家意识到知识积累的重要性 针对知识库平台的使用,做适当的培训和交流 将知识库平台打造得尽量易用,避免因复杂而导致排斥行为 日常沟通多引用知识库中知识的位置,让大家在潜移默化中对知识库产生依赖 引导关注。如果一个人贡献的知识受到大家的广泛关注,那么这个人将会有更大的热情贡献知识。组织内知识管理负责人可定期整理新增精品知识的简要并发给大家,吸引大家阅读知识,关注知识;通过展示知识关注度排名也可以激发大家的知识分享热情。 发掘鼓励知识分享的头部人员 将之前平台上的内容按规范格式迁移,并鼓励大家在知识库上查找以前积累的知识 知识的整理 由于知识库是组织内人员协同丰富的,新知识的提交带有一定随意性,点状分布,不成系统,所以这些知识需要专人定期整理,划入适当分类,赋予更加合理的标签,尽量使其系统化。这个工作十分必要,否则一旦长久,知识库内的知识就像一根根独木,独自生长,永远也成不了连片的树林。 团队现状 在用满 10 个 G 的储存空间以后,我们不打算开通会员继续使用了,于是寻找一款合适的团队知识库变得至关重要。 一开始我考虑的是借助语雀、钉钉知识库、Teambition、GitBook、Confluence 等平台搭建,但问题出在价格、权限管理、不可描述的网络原因等无法避开的问题。也曾经想象过利用 VuePress,Docusaurus 等静态平台搭建,但没有在线编辑器、需要在 GitHub 提交 PR 等操作,无疑增加了一般队员的使用门槛。 我对团队知识库的基本要求: 权限管理 :针对不同的用户,阅读权限应有所不同 在线编辑 :针对一般用户,降低操作门槛 支持 MarkDown 语法 :提高写作效率,规范内容格式 UI 简介 :颜值即生产力 版本管理 :利于定期备份,出问题时可溯回 全文检索 :降低查询复杂度 恰巧机器人队添置了 NAS,于是我计划将其作为知识库的服务端,利用开源项目搭建动态知识库网站。经过两个月的选型及一星期的折腾,基于 DokuWik 的团队知识库终于搭建完毕。技术相关的内容,详见下一篇文章。 参考与致谢 用 Blog 和 Wiki 搭建 IT 团队的知识库 知识管理那些事儿 团队的知识管理系统 Wiki Wiki 系统具体能做什么 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

在浏览器上运行 VS Code(旧)

在浏览器上运行 VS Code(旧) 注:≥v3.8.0 版本 code-server 的部署请参考 如何在 iPad 上跑 VS Code ,有更简洁的方法。 背景 众所周知,VS Code 是一个功能十分强大的编辑器。如果能在 iPad 这类轻便的平台上使用 VS Code(iPadOS 对键鼠的支持已经能够媲美桌面系统),那我们就可以随时随地工作了。 恰好有一个让 VS Code 跑在服务器上的服务:code-server. 部署完成后,可通过浏览器访问。这样,只要有网络,任何设备都能够轻松用上 VS Code. 准备环境 一台安装有 Linux 的服务器(我用的是阿里云最低配的学生机)。 官方要求配置如下: 64-bit host. At least 1GB of RAM. 2 cores or more are recommended (1 core works but not optimally). Secure connection over HTTPS or localhost (required for service workers and clipboard support). For Linux: GLIBC 2.17 or later and GLIBCXX 3.4.15 or later. 安装过程 1. 下载 wget https://github.com/cdr/code-server/releases/download/3.1.0/code-server-3.1.0-linux-x86_64.tar.gz # 下载 code-server 不要照搬命令,在 code-server 的 Release 页面复制最新版本的链接(根据服务器的架构来选择,我使用的是 code-server-3.1.0-linux-x86_64.tar.gz 版本),用 wget 或 SFTP 下载 / 传输至服务器上。 如果下载速度很慢,可复制下载链接,使用 GitHub 文件加速 这个网站获取国内加速下载链接。 tar -xvf code-server-3.1.0-linux-x86_64.tar.gz # 解压 2. 安装 cd code-server export PASSWORD="yourpassword" ./code-server --port 8888 --host 0.0.0.0 将 yourpassword 改为你设定的密码,否则会随机生成密码 --port 8888 意为指定运行端口,你可以设置为 80 端口(Http 协议),这样访问的时候就不用加端口号了 --host 0.0.0.0 让服务能通过外网访问。默认的 127.0.0.1 只能本地访问 如不需要密码验证,可以加上 --auth none 如启动服务不成功,可能为 处理器架构版本 选择错误,换一个版本即可 3. 配置后台运行 默认直接运行的情况下,ssh 连接一断就没了。为了使其能够后台运行,可以用 screen : yum install screen 或 apt-get install screen screen -S VSCode-online # VS Code-online 为自取的名字 export PASSWORD="password" && ./code-server --port 8888 --host 0.0.0.0 再次进入运行中的 screen 作业: screen -r 作业名 如果需要停止后台 screen 的运行: screen -ls # 查看已运行服务的 id screen -X -S id quit # 替换掉 id 退出 screen:Ctrl + A + D 4. 轻松使用 在浏览器直接输入 http://你的服务器 ip 即可享用云端 VS Code. 配置域名访问:待探索…… 现阶段问题 可直接下载的插件数量,手动安装插件很麻烦,且没有自动同步插件 / 用户设置功能,之后的版本应该会更新解决。 参考与致谢 在浏览器上运行 VS Code,code-server(阿里云服务器) 在浏览器上运行 VS Code,code-server (推荐)VS code 在线工具——code-serve 在云服务器上的安装和使用 与常见的问题解决 (超详细) iPad 编程学习环境---VS Code web 版本搭建 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

基本元器件 - 二极管

基本元器件 - 二极管 伏安特性: 导通后分电压值约为 0.7 V(LED 约为 1-2 V,电流 5-20 mA)。 反向不导通,但如果达到反向击穿电压,那将导通(超过反向最大电压可能烧坏)。 正向电压很小时不导通(0.5 V 以上时才导通)。 二极管的主要参数 最大整流电流 \(I_F\):表示长期运行允许的最大正向平均电流,超出可能因结温过高烧坏。 最高反向工作电压 \(U_R\):允许施加的最大反向电压,超出可能击穿。(\(U_R\) 通常为击穿电压的一半) 反向电流 \(I_R\):未击穿时的反向电流,越小导电性越好。 最高工作频率 \(f_M\):上线截止频率。因结电容作用,超出可能不能很好体现的单向导电性。 二极管的分类 类型: 整流管 普通二极管:恢复速度相对慢,不适用于高频电路 快恢复二极管 肖特基二极管:应用于 <200V 的场景 稳压管:持续击穿,应用于低功率场景 TVS:瞬间击穿,应用于高功率场景 整流二极管 用途:利用单向导通性,把交流电变成脉动直流电。 快恢复二极管(FRD) 快速恢复二极管的结构和功能与整流二极管相同。整流二极管用于 500 Hz 以下的低频应用,而 FRD 则用于从几千赫兹到 100 kHz 的高频开关。因此,FRD 具有反向恢复时间(trr)很短的特性,这对高速开关非常重要。一般整流二极管的 trr 为几微秒到几十微秒;而 FRD 的 trr 是几十毫微秒到几百毫微秒,约为整流二极管的 1/100。它应用于开关电源、逆变器、DC/DC 转化器等。 稳压(齐纳)二级管 定义:能稳定一定电压的二极管。 稳压二极管利用了 PN 结的反向特性。持续击穿,并得到恒定的电压,应用于低功率场景。 稳压条件: 工作在反向击穿状态下 反向电压大于稳压电压 稳压二级管的参数 稳定电压 \(U_Z\):表示在规定电流下的反向击穿电压,对于同一型号的稳压管,稳定电压是确定值。 反向电流 \(I_Z\):工作在稳压态下的参考电流,电流低于此值时稳压效果变差,也称 \({I_Z}_{min}\)。 额定功耗 \(P_{ZM}\):等于稳定电压 \(U_Z\) 与最大稳定电流 \(I_{ZM}\) 的乘积。超出可能因结温过高损坏。只要不超额定功率,电流越大,稳压效果越好。 基本稳压电路: 限流电阻的选择: 在稳压电路中,需要串联一个限流电阻,保护稳压二极管(用于分掉输入电压和稳定电压之间的电压差值)。电阻两端的电压取输入电压和稳定电压之间的差值,电流取稳压二极管 \({I_Z}_{min}\) 与 \({I_Z}_{max}\) 之间,加上负载路的总电流。 瞬态电压抑制器(TVS) TVS 管是为了防止瞬态高能量冲击,保护精密元器件。TVS 管有单向与双向之分,单向 TVS 管的特性与稳压二极管相似,双向 TVS 管的特性相当于两个稳压二极管反向串联。 TVS 并联在电路中,正常情况下电流不走 TVS 的支路,TVS 表现出二极管单向导通的特性: 当发生过压时,TVS 进入击穿,将电流分流到地,使后续电路的电压保持在二极管的钳位电压: 用法: 加在信号与电源线上,可防静电、交流浪涌或噪声。 能释放超过 10000 V、60 A 以上的脉冲,持续 10 ms,可防止元器件损坏或总线间开关引起的干扰。 放置在信号线和地之间,避免数据和控制总线受噪声干扰。 TVS 管的主要参数: 反向截止电压 VRWM 与反向漏电流 IR:反向截止电压 VRWM 表示 TVS 管不导通的最高电压,在这个电压下只有很小的反向漏电流 IR。 击穿电压 VBR:TVS 管通过规定的测试电流时的电压,这是表示 TVS 管导通的标志电压。 脉冲峰值电流 IPP:TVS 管允许通过的 10/1000μs 波的最大峰值电流(8/20 μs 波的峰值电流约为其 5 倍左右),超过这个电流值就可能造成永久性损坏。在同一个系列中,击穿电压越高的管子允许通过的峰值电流越小,一般是几安 - 几十安。 最大钳位电压 VC:TVS 管流过脉冲峰值电流 IPP 时两端所呈现的电压。 脉冲峰值功率 Pm:\(Pm=IPP*VC\)。在给定的最大钳位电压下,功耗 PM 越大,其浪涌电流承受能力越大,在给定的功耗 PM 下,钳位电压越 低,其浪涌电流的承受能力越大。 稳态功率 P0:TVS 管也可以作稳压二极管用,这时要使用稳态功率。 极间电容 Cj:与压敏电阻一样,TVS 管的极间电容 Cj 也较大,且单向的比双向的大,功率越大的电容也越大,极间电容会影响 TVS 的响应时间。 TVS 管与稳压(齐纳)二极管的差异: TVS 管在短时间内吸收很高的过电压,保护后续电路;而稳压(齐纳)二极管将输入电压钳制为恒定电压,并将钳制的恒定电压提供给后续电路。 开关二极管 为了开关设计而定制的二极管,截至 / 导通切换时间比较短,防止反向电流烧坏精密元器件 示例: 图中的 1N4148 起保护作用,当右侧灌入负电压时,能导通接地,保护三端稳压器 肖特基二极管(SBD) 肖特基二极管是一种采用半导体和金属结合,而不是采用 PN 结的器件(trr 会随着温度的升高而变长)。由于其正向电压小,反向恢复时间短,所以适合于高速开关应用。 肖特基二极管的伏安特性曲线: 正偏与反偏 正向偏置:指 P 接高电位、N 接低电位,电流流动将顺着 PN 结方向,将显示出其单向导电的性能。 反向偏置:相反,形成由 N 区流向 P 区的反向电流,通常可以认为反向偏置的 PN 结不导电,基本上处于截止状态。 常用封装 封装名称 备注 DO-214AC/SMA 通流能力 2 A DO-214AA/SMB 通流能力 4 A DO-214AB/SMC 通流能力 5 A DPAK/D2PAK 参考与致谢 二极管选型规范(仅供参考) 分立半导体器件 - 第 Ⅱ 章:二极管 TVS 管性能及选型 电子工程师手记:二极管选择指南 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

基本元器件 - 光电耦合器

基本元器件 - 光电耦合器 光耦是将发光二极管(LED)和光电探测器集成于一个封装中的器件。 光耦的作用 在光耦中,一次侧(LED 侧)和二次侧(受光器件侧)是电绝缘的。因此,即使一次侧和二次侧的电位(甚至 GND 电位)不同,也可以将一次侧电信号传输到次级侧。光耦将两端电路隔离开来。 参考与致谢 分立半导体器件 - 第 Ⅴ 章:光半导体 光耦的参数有哪些 光耦参数如何理解 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。 光耦的参数 LED 侧: 正向工作电压 Vf(Forward Voltage):Vf 是指在给定的工作电流下,LED 本身的压降。常见的小功率 LED 通常以 If=20mA 来测试正向工作电压,当然不同的 LED,测试条件和测试结果也会不一样。 反向电压 Vr(Reverse Voltage):指 LED 所能承受的最大反向电压,超过此反向电压,可能会损坏 LED。在使用交流脉冲驱动 LED 时,要特别注意不要超过反向电压。 反向电流 Ir(Reverse Current):通常指在最大反向电压情况下,流过 LED 的反向电流。 允许功耗 Pd(Maximum Power Dissipation):LED 所能承受的最大功耗值。超过此功耗,可能会损坏 LED。 中心波长 λp(Peak Wave Length):是指 LED 所发出光的中心波长值。波长直接决定光的颜色,对于双色或多色 LED,会有几个不同的中心波长值。 正向工作电流 If(Forward Current):If 是指 LED 正常发光时所流过的正向电流值。不同的 LED,其允许流过的最大电流也会不一样。 正向脉冲工作电流 Ifp(Peak Forward Current):Ifp 是指流过 LED 的正向脉冲电流值。为保证寿命,通常会采用脉冲形式来驱动 LED,通常 LED 规格书中给中的 Ifp 是以 0.1ms 脉冲宽度,占空比为 1/10 的脉冲电流来计算的。 光敏三极管侧: 集电极电流 Ic(Collector Current),光敏三极管集电极所流过的电流,通常表示其最大值。 集电极-发射极电压 Vceo(C-E Voltage),集电极-发射极所能承受的电压。 发射极-集电极电压 Veco(E-C Voltage),发射极-集电极所能承受的电压。 反向截止电流 Iceo C-E 饱和电压 Vce(sat)(C-E Saturation Voltage) 传输特性: 电流传输比 CTR(Current Transfer Radio):通常用直流电流传输比来表示。当输出电压保持恒定时,它等于直流输出电流 IC 与直流输入电流 IF 的百分比。 上升时间 Tr (Rise Time)& 下降时间 Tf(Fall Time) 隔离特性: 入出间隔离电压 Vio(Isolation Voltage),光耦合器输入端和输出端之间绝缘耐压值。 入出间隔离电容 Cio(Isolation Capacitance),光耦合器件输入端和输出端之间的电容值 入出间隔离电阻 Rio:(Isolation Resistance),半导体光耦合器输入端和输出端之间的绝缘电阻值。

2025/9/17
articleCard.readMore

基本元器件 - 场效应管

基本元器件 - 场效应管 场效应管是一种 电压控电流 的器件。其中,我们常用的 MOS 管是由是金属(metal)、氧化物(oxide)、半导体(semiconductor)组成的场效应晶体管。下文着重介绍以增强型 N 管。 场效应管的引脚与三极管相对应:栅极 / 门极(G)对应基极(b),漏极(D)对应集电极(c),源极(S)对应发射级(e)。箭头指电子运动的方向。 所有场效应管在正常工作时,门级都不会有电流。所以,漏极电流一定等于源极电流。其核心是用 GS 两端电压来控制漏极电流。所以也称为压控型元器件。 MOS 管的引脚定义 MOS 管有三个引脚(G,S,D)其定义如下: G:gate / 栅极 S:source / 源极 D:drain / 漏极 N 沟道的电源一般接在 D,输出接 S;P 沟道的电源一般接在 S,输出接 D,增强型 / 耗尽型接法基本一样。 MOS 管的 source 和 drain 是可以对调的,他们都是在 P 型 backgate 中形成的 N 型区,在大多数情况下,这个两个区是一样的,即使对调也不会影响性能。 寄生二极管 由于生产工艺,MOS 管会有寄生二极管,或称体二极管。 当满足 MOS 管的导通条件时,MOS 管的 D 极和 S 极会导通,这个时候体二极管是截止状态。因为 MOS 管导通内阻很小,不足以使寄生二极管导通。 MOS 管的导通条件 MOS 管是压控型,由 G 和 S 极之间压差决定是否导通。 对 N-MOS 来说,当 \(V_g-V_s>V_{gs(th)}\) 即可导通。 对 P-MOS 来说,当 \(V_s-V_g>V_{gs(th)}\) 即可导通。 增强型 MOS 管的特性 增强型 MOS 管的结构,是在 P 型硅衬底上,制作两个 N 型沟槽,用铝从其引出两个电极分别作为源极 S 和漏极 D(此时 D/S 可互换),然后在半导体的表面覆盖一层很薄的 SiO2 绝缘层,在漏源极间的绝缘层上再装上一个铝电极,作为栅极 G,在衬底上也引出一个电极 B。因为出厂时大多把衬底已经和源极连在一起,所以此时 D/S 不可互换 如图是增强型 MOSFET 的伏安特性曲线,左图为转移特性,右图为输出特性,他们共用纵轴。 伏安特性的关键要素: 开启电压 \(U_{GS_(th)}\):从图中可以看出 \(U_{GS_(th)} = 1 V\)。当 \(U_{GS} < U_{GS_(th)}\) 时,无论 \(U_{DS}\) 多大,电流 \(i_D\) 始终为 0。当 \(U_{GS} > U_{GS_(th)}\) 时,MOSFET 才算开启。 恒流区方程:\(i_D = K(u_{GS}-U_{GS_(th))^2\),其中,K 影响转移特性曲线的增长速率(单位是 \(A/V^2\)) 可变电阻区和恒流区的分界线:随着 \(U_{GS}\) 增加,分界点电压 \(U_{DS_{dv}}\) 也在增加,且满足 \(U_{DS_{dv}}=U_{GS} - U_{GS_(th)}\) MOSFET 工作状态 MOSFET 不同于三极管,因为某些型号封装内有并联二极管,所以其 D 和 S 极是不能反接的,且 N 管必须由 D 流向 S,P 管必须由 S 流向 D。可以用下表判断工作状态: 几个工作区: 截止区:当 \(U_{GS}\) 小于开启电压 \(U_{GS_(th)}\) 时,MOS 不导通。 可变电阻区:\(U_{DS}\) 很小,\(I_D\) 随 \(U_{DS}\) 增大而增大。 恒流区:\(U_{DS}\) 变化,\(I_D\) 变化很小。 击穿区:\(U_{DS}\) 达到一定值时,MOS 被击穿,\(I_D\) 突然增大,如果没有限流电阻,将被烧坏。 过损耗区:功率较大,需要加强散热,注意最大功率。 MOSFET 主要参数 直流参数: 开启电压 \(U_{GS_(th)}\):增强型 MOS 的参数。指当 \(U_{DS}\) 不变时,使得 \(i_D > 0\) 所需最小的 \(\left| u_{GS} \right|\) 的值。 夹断电压 \(U_{GS_(off)}\):结型场效应管和耗尽型 MOS 的参数,与 \(U_{GS_(th)}\) 相似,代表当 \(U_{DS}\) 不变时,\(i_D\) 为规定的微小电流时的 \(u_{GS}\)。 直流输入电阻 \(U_{GS_(DC)}\):栅 - 源电压与栅极电流之比,一般 MOS 的 \(U_{GS_(DC)} > 10^9 \Omega\)。 选型关键参数: 击穿电压 V_BRDSS 随温度变化,应留足余量 导通电阻 R_DS(on) 导通电阻正温度系数,适合并联工作 导通电阻越小,导通损耗越小 导通电阻越小,Qg 就越大,相应的开关速度变慢 带来的开关损耗越大,高频工作下需要折中考虑 最大结温 永远不能超过最大结温 只能测量壳温后通过热阻计算而得 动态电容和 Qg 不是固定值,取决于工作条件 作为开关时希望快速打开,需要一个驱动芯片提供瞬间大电流 作为缓启动 MOS,需要慢慢打开,有效抑制浪涌电流 N-MOS: 门极需要一个比源极更高的电压驱动 更好的性能 更多的选择 更低的成本 P-MOS: 门极需要一个比源极低的电压驱动 不需要更高的电压驱动,驱动简单 三极管与场效应管的对比 三极管 场效应管 特性 电流控电流 电压控电流 输入阻抗 低 高 噪声 大 小 反应速度 快 慢 反馈 定义:将放大电路输出端信号(电压 / 电流)一部分或全部引回到输入端,与输入信号进行叠加。 负反馈:返回的信号对输入信号进行削弱。 MOS 管常见的封装 SOT 封装 SOT(Small Out-Line Transistor,小外形晶体管封装)封装一般用于小功率 MOS 管。 SOT-23 封装: SOT-89 封装: TO 封装 TO(Transistor Out-line,晶体管外形)是比较早期的封装规格,原来多为直插封装(例如 TO-92,TO-220,TO-252),后来也慢慢进化到标贴式封装。TO252 和 TO263 是其典型,其中 TO-252 又称之为 D-PAK,TO-263 又称之为 D2PAK。 D-PAK 封装的 MOS 管有 3 个电极,其中漏极(D)的引脚被剪断不用,而是用背面的散热板作为漏极,能输出更大电流的同时也能更好地散热。 TO-252 封装: TO-263 封装: SOP 封装 SOP(Small Out-Line Package,小外形封装),也叫 SO、SOL 或 DFP。通常有 SOP-8、SOP-16、SOP-20、SOP-28 等等(数字表示引脚数)。MOS 的 SOP 封装多数采用 SOP-8 规格。 SOP-8 封装: 参考与致谢 贴片 mos 管的封装知识和排列 MOS 管的知识,看这一篇就可以了 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

基本元器件 - 晶体三级管

基本元器件 - 晶体三级管 晶体三极管是一种 电流控电流 的元器件。 区分极性 除基极外,带箭头是发射极,不带则是集电极。箭头朝外是 NPN,指向里面是 PNP. 不同封装引脚辨认 基本电流关系 三极管电流方向依托于发射级电流方向。 NPN:发射级流出,所以基极和集电极都是流入。 PNP:发射级流入,所以基极和集电极都是流出。 规律: 满足基尔霍夫电流定律 \(i_B + i_C = i_E\) 处于放大状态下,集电极电流只受控于基极电流(\(i_C = \beta i_B\)),与集电极发射极间的电压无关。 基极与发射极导通时,分压值 \(U_{BE}\) 约为 0.7V 所以三极管就是一个受控电流源,由小电流 \(i_B\) 去控大电流 \(i_C\),取决于晶体管恒定的放大倍数 \(\beta\)。 所以,\(i_E=(1+\beta)i_B = \frac{1+\beta}{\beta}·i_C\) 输出伏安特性 如图,三极管的输出伏安特性分以下几个区域: 放大区:在此区域内,晶体管的 \(i_C\) 几乎不随 \(u_{CE}\) 变化,近似满足 \(i_C = \beta i_B\)。 饱和区:在此区域内,晶体管的 \(i_C\) 随着 \(u_{CE}\) 增大而增大。一般认为当 \(u_{CE}\) 小于饱和压降 \(U_{CES}\)(一般为 0.3 V)时,晶体管工作在饱和区。 截止区:即 \(I_B = 0\) 的那根曲线。但此时 \(i_C\) 并不为 0,因为存在与 \(u_{CE}\) 相关的漏电流。截止区代表晶体管处于几乎没有任何电流进出的状态,近似于完全关闭。 如果我们想用数学公式描述伏安特性,那么需要将曲线简化一下: 简化后,可以这么认为: 放大区:满足 \(i_C = \beta i_B\),与 \(u_{CE}\) 无关。 饱和区:\(i_C\) 随着 \(u_{CE}\) 增大而增大,近似为线性。 \(U_{CES}\) 垂直线:饱和区与放大区的分界线。 阻容耦合放大电路 晶体管的工作状态 截止状态 指基极未产生明显电流(\(I_{BQ}\) 非常小导致 \(I_{CQ}\) 也很小),集电极与发射极之间相当于开路。 \(I_{BQ} = 0, I_{CQ} = 0, I_{EQ} = I_{BQ}+I_{CQ}=0\)。发射结零偏 / 反偏、集电结反偏。 放大状态 指晶体管处于 \(I_{BQ}\) 合适,且满足 \(I_{CQ} = \beta I_{BQ},I_{EQ} = (1+ \beta)I_{BQ}, I_{BQ} = \frac{V_{CC}-U_{BE}}{R_B}\) 发射结正偏、集电结反偏。 这是模电最常用的状态。 饱和状态 \(I_{CQ} < \beta I_{BQ}\),但还是随 \(U_{CEQ}\) 变化。\(I_{BQ}\) 和 \(I_{CQ}\) 都很大,\(I_{CQ}\) 已经不完全受 \(I_{BQ}\) 控制,且 \(U_{CEQ}\) 所占的电压很小。 只要 \(U_{CEQ} < U_{CES}\),就进入饱和状态。此时,再增加 \(I_{BQ}\),\(I_{CQ}\) 也几乎不再增加。 发射结正偏、集电结正偏。 在模电中应该避免进入饱和状态,而在数电中则期望进入饱和或截至状态。 倒置状态 集电极和发射极接反了。虽然也不是不能用,但是会造成 \(\beta\) 下降严重。 饱和状态就好比水龙头打开了,但水箱里没水,此时就是有多少水来多少水。 发射结反偏,集电结正偏。 判断工作状态有三种方法,分别是估算法、函数求解法、图解法。估算法的核心是假设 \(U_{BEQ}\) 约等于 0.7 V,但有误差(电压越大误差越小);函数求解法必须知道输入、输出伏安特性的数学表达式,通过方程求解,一般不会用到;图解法的核心是用伏安特性图和另一直线的交点,求解静态工作点的位置,然后目测结果。 三极管的主要参数 电流放大系数 \(\beta\):一般为 10-100 倍,但在应用中取 30-80 倍为宜(太小放大不明显,太大工作不稳定)。 集电极最大允许电流 \(I_{CM}\):超过可能导致烧坏。 集电极最大允许功耗 \(P_{CM}\) 集电极发射极间反向击穿电压 \(V_{CEO}\) 判断三极管的工作状态 估算法 其中的 估算静态工作点,即用简单的方法大致估算出晶体管电路的静态(各支路电流、各节点电位),核心就是假设 \(U_{BEQ}\) 约等于 0.7 V(一般要算出 \(I_{CQ}\) 和 \(U_{CEQ}\)),具体步骤如下: 根据 \(U_{BEQ} = 0.7 V\),算出 \(I_{BQ}\) 假设处于放大状态,即 \(I_{CQ} = \beta I_{BQ}\),求解出 \(U_{CEQ}\) 此时如果 \(U_{CEQ} >= 0.3 V\),则假设成立,晶体管处于放大状态,\(I_{CQ}\) 与 \(U_{CEQ}\) 为所求。 如果 \(U_{CEQ} < 0.3 V\),则假设不成立,晶体管处于饱和状态。 图解法 图解法的核心,是用伏安特性图和另一直线的交点,求解静态工作点的位置,然后目测结果。 基本放大电路 如图,各部分的作用: \(C_1\)/\(C_2\):隔直通交。排除 \(U_{CC}\) 的影响。取值几微法到几十微法。 \(U_{CC}\):为电路功能;提供合适的静态工作点。 \(R_B\):提供合适的 \(I_B\),取值一般为几十欧到几百千欧。 \(R_C\):取值几千欧到几十千欧。 分析: 总基极电压 \(U_{BE} = U_{BEQ}+u_i\) 总基极电流 \(i_B=I_{BQ}+i_b\) 总集电极电流 \(i_C=I_{CQ}+i_c\) 总的 \(u_CE=V_{CC}-{i_C}{R_C}=V_{CC}-(I_{CQ}+i_c)R=U_{CEQ}+({-i_C}{R_C})\) 此电路的不足:虽结构简单,但静态工作点不稳定,受各元器件影响大。 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

基本元器件 - 电容

基本元器件 - 电容 单位换算 \[1F=1\cdot10^3mF=1\cdot10^6\mu F=1\cdot10^9nF=1\cdot10^{12}pF\] 电容的选型 耐压值:降额使用,3.3V 选 10V,5V 选 10V,12V 选 25V,24V 选 50V,48V 选 100V 电容的材质分类 铝电解电容 钽电容 陶瓷电容 电容量 0.1uF-3F 0.1uF-1000uF 0.5pF-100uF 极性 有 有 无 耐压 5V-500V 2V-50V 2V-1000V ESR 几十毫欧 -2.5 欧姆 (100KHZ/25℃) 几十毫欧-几百毫欧(100KHZ/25℃) 几毫欧-几百毫欧(100KHZ/25℃) ESL 不超过 100nH 2nH 左右 1-2nH 工作频率范围 低频滤波,小于 600KHz 中低频滤波,几百 KHZ-几 MHz 高频滤波,几 MHZ-几 GHz 薄弱点 窄温度范围,电解液会挥发,纹波电流导致发热 必须降额使用,否则失效会爆炸 焊接温度冲击容易导致失效,抗弯曲能力较差,不同材料温度特性差异巨大 建议 用于储能,低于 75℃ 环境,不建议用于高频开关电源 耐压按2倍选择;15V 以上直流电压滤波不建议使用,特别是电源变化较快的场合,浪涌冲击失效显著 布线不要放在应力区,避开高温区域。 电容的用途 滤波 滤除杂波。大电容滤低频,小电容滤高频。 去耦 / 旁路 简单地说,旁路靠近电源,去耦靠近芯片。 去耦 / 旁路电容的作用是将系统中的高频噪声旁路到 GND,一般是在电源引脚与 GND 间并联小容值电容(典型为 0.1uF),用来滤除高频噪声,使电压稳定干净。 去耦与旁路电容的区别的,去耦电容是用于滤除输出信号的干扰(例如稳压器的输出引脚),而旁路电容是用于滤除输入信号的干扰(例如单片机的电源引脚)。去耦电容一般比较大(10uF 以上),而旁路电容一般根据谐振频率选定(0.1/0.01uF)。 调谐 调谐电容用于调节振荡电路的频率,使其与另一个正在发生振荡的电路谐振。 耦合 耦合电容的作用是阻直通交,电容与其后面的负载形成滤波器,滤除了低频信号,保留了高频信号,形成一个高通滤波器。 耦合电容用于连接两个电路,只允许交流信号通过给电容充放电,传输到下一级电路。 储能 储能电容用于收集电荷,储能并使用。 电容选用注意事项 注意耐压值,有极性的电容不可反接。 参考与致谢 《硬件十万个为什么-无源器件篇》 360° 详解去耦电容,真正的理解及在真正工程中的使用! 电源大师课连载(2)| 你不知道的电阻、电容小事儿 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

基本元器件 - 电感与磁珠

基本元器件 - 电感与磁珠 电感 电感的选型 体积大小 电感值所在工作频率 开关频率下的电感值为实际需要的电感值 线圈的直流阻抗(DCR)越小越好 工作电流应降额至额定饱和电流的 0.7 倍以下,额定 rms 电流; 交流阻抗(ESR)越小越好; Q 因子越大越好; 屏蔽类型:屏蔽式或非屏蔽式,优先选择屏蔽式。 工作频率和绕组电压不可降额; 品牌:贴片电感优选 TDK、MURATA(村田)、三礼、SUMIDA(胜 美达) 电感的关键参数 感值 L 一般误差有 10% 或 20%(测试条件是 1MHz 频率)。 感值大小区别: 小感值:低 DCR,高饱和电流,更好的动态,更大的纹波电流。 大感值:小纹波电流。 直流电阻 DCR 可以理解为寄生参数,和电感的封装大小以及感值有很大关系,选型时最好选择较小 DCR 的电感。 感值、尺寸与 DCR 的关系: 电感感值相同,尺寸越小,DCR 越大。 电感尺寸相同,感值越大,DCR 越大。 电感感值相同,有磁屏蔽的电感,DCR 小于没有磁屏蔽的电感。 自谐振频率 SRF 因为电感寄生电容的存在,会发生 LC 振荡,和电容一样,只有在特定的频率下,才能发挥电感的特性。 电感饱和电流 Isat 电感感值下降 30% 时所容许通过的直流电流。 电感温升电流 Irms 在 20℃ 环境下,电感温度上升 40℃ 所容许通过的直流电流。 一般取 Isat 和 Irms 中较小的一个值作为电感的额定电流,且此额定电流应是电路中最大输出电流的 1.3 倍,留有一定的余量,降额使用。 磁屏蔽特性 一般情况下,屏蔽特性:工字型 < 半屏蔽型 < 一体成型。 🚧 磁珠 磁珠是一种电感型 EMI 静噪滤波器,实物和电感很像,其等效模型可以简化为一个电感和一个电阻串联。磁珠的单位是欧姆,根据型号的不同,可以抑制几 MHz-GHz 的噪声,经常被用在信号线和电源线上(串联使用)。 磁珠的单位是欧姆(Ω),电感单位是亨(H)。磁珠由氧磁体组成,电感由磁芯和线圈组成,磁珠把交流信号转化为热能,电感把交流存储起来,缓慢的释放出去,所以说电感是储能,而磁珠是能量转换(消耗)器件。 磁珠主要解决辐射干扰问题,信号线上多用磁珠,某一些高频电路如 RF、振荡电路、DDR SDRAM 等都需要在电源输入部分加磁珠;电感主要解决传导干扰问题,高频电感主要用于中低频滤波电路、RF 匹配等,功率电感主要用于 DC-DC 电路中。 磁珠的主要参数 阻抗 Z:阻抗越大,抑制噪声的效果越好。(一般测试条件为 100 MHz) 直流电阻 DCR:指直流电流通过磁珠时,磁珠呈现的电阻值。DCR 一般越小越好,对有用信号的衰减越小。 额定电流 Rated Current:指磁珠正常工作时允许的最大电流。 参考与致谢 电感如何选型? 《硬件十万个为什么-无源器件篇》 关于磁珠的 6 个问题,你能接住吗? 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

基本元器件 - 电阻

基本元器件 - 电阻 电阻的选型 一般来说,要考虑以下四个因素: 阻值:根据具体应用电路的需要而定 精度:通常为 1%,如果用于电流检测回路(Rsense),通常低阻值大功率更高精度 额定功率:满足 50% 降额,不同封装对应功率请见下表 尺寸:尺寸与功率相关,应考虑功率和加工难度而定 工作温度、湿度等:特定时候需要考虑的因素 温漂:如果用于高精度(传感器应用),则必须考虑 贴片封装的参数 英制 公制 长 (mm) 宽 (mm) 高 (mm) 额定功率 (W) 耐压 (V) 0201 0603 0.60±0.05 0.30±0.05 0.23±0.05 1/20 25 0402 1005 1.00±0.10 0.50±0.10 0.30±0.10 1/16 50 0603 1608 1.60±0.15 0.80±0.15 0.40±0.10 1/10 50 0805 2012 2.00±0.20 1.25±0.15 0.50±0.10 1/8 150 1206 3216 3.20±0.20 1.60±0.15 0.55±0.10 1/4 200 1210 3225 3.20±0.20 2.50±0.20 0.55±0.10 1/3 200 1812 4832 4.50±0.20 3.20±0.20 0.55±0.10 1/2 200 2010 5025 5.00±0.20 2.50±0.20 0.55±0.10 3/4 200 2512 6432 6.40±0.20 3.20±0.20 0.55±0.10 1 200 电阻的阻值 丝印表示方法 三位数标注法:\(XXY = XX * 10^Y\) 例如,丝印为 272 的电阻,实际阻值为 \(27 * 10^2=27 * 100=2.7k\) 四位数标注法:\(XXXY = XXX * 10^Y\) 字母表示小数点位置法:R 表示小数点。 例如,丝印为 5R6 的电阻,实际阻值为 5.6 Ω M k m 也都可以表示小数点,分别代表 MΩ kΩ mΩ 三位数乘数代码标注法:XXY 中,XX 表示有效数的代码,Y 指是 10 的多少次幂,可参考下方的标准电阻取值表 例如,丝印为 01C 的电阻,实际阻值为 \(100*10^2=10 kΩ\) 标准电阻取值 根据约定俗成的优先数规范,一般比较多使用的是 E96 系列,其阻值与乘数代码表如下: 电阻的失效 按可能发生的几率排行,分别是: 开路:电阻膜缺陷或退化;瞬时功率过大冲击时可能导致 阻值漂移超规范:老化后有可能发生 引脚断裂:焊接工艺缺陷、焊点污染;插件电阻引脚反复弯曲时可能发生 烧毁:长时间工作在额定功率以上,有可能烧毁导致开路 焊接问题:虚焊等问题 断线开路:受机械应力或瞬时过功率冲击时可能发生 0 欧姆电阻的使用 当跳线用,跨过布不下线的区域 作为短接座用 单点连接数字地和模拟地(有时也用电感或磁珠) 预留阻值用于调试 不同封装的 0 欧电阻过电流能力(一般以额定电流降额 50% 使用): 封装 额定电流(最大电流)/A 0201 0.5(1) 0402 1(2) 0603 2(3) 0805 及以上 2(5) 电阻的使用场景 分压电路 将电阻串联以分压,其电路特点是: 通过各电阻的电流是同一电流,即各电阻中的电流相等,即 \(I = I_1 = I_2 = I_3\) 总电压等于各电阻上的电压降之和,即 \(V= V_1 + V_2 + V_3\) 总电阻等于各电阻之和,即 \(R=R_1 + R_2 +R_3\) 举个例子,电源稳压器的反馈引脚,一般接就是由两个电阻组成的分压电路,通过分压得到与内部参考电压接近的输出电压值。 分流电路 将电阻并联以分流,其电路特点是: 各支路两端电压相等 总电流等于各支路电流之和,即 \(I= I_1 + I_2 + I_3\) 总电阻的倒数等于各支路倒数之和,即 \(\frac{1}{R}=\frac{1}{R_1}+\frac{1}{R_2}+\frac{1}{R_3}\) 在实际电路设计中,多用于并联在三极管的集电极与发射极之间,作为保护电阻;在一些线性电源稳压器功率不够的场合,也可以在输入端与输出端之间病来你电阻,以提高输出电流。 限流电路 一般用于 LED 的限流。将电阻串联进 LED 所在的电路,以 LED 的导通压降(一般为 0.7 V)和 LED 额定电流,来确定阻值。需要注意的是,一般计算出来的实际工作电流,要小于 LED 的额定工作电流。 限流电路也可以用于热插拔电路。 阻抗匹配电路 阻抗匹配的目的,是为了让负载获得最大功率,即负载电阻等于信号源电阻。推导过程如下: 假设负载电阻为 R,电源电动势为 U,内阻为 r,则通过 R 的电流为: \[ I=\frac{U}{R+r} \] 可以看出,R 越小,则电流越大。而 R 两端的电压为: \[ U_R=IR=\frac{U}{1+\frac{r}{R}} \] R 越大,则输出电压 \(U_R\) 越大。R 的功率为: \[ P=I^2R=(\frac{U}{R+r})^2R=\frac{U^2R}{R^2+r^2+2Rr}=\frac{U^2}{\frac{(R-r)^2}{R}+\frac{4Rr}{R}} \] 因为 r 不变,所以当 R=r 时,\(\frac{(R-r)^2}{R}=0\),此时可获得最大功率 \(P_{max}=\frac{U^2}{4r}\) RC 充放电电路 \(\tau=RC\)(若 R 和 C 的单位为 Ω 和 F,则结果的单位为 s。 RC 电路可视为延时电路或滤波电路,将脉冲信号上升下降沿都进行了滤波,使其变得平缓,可以通过调整 R、C 值,以实现不同上升时间。 上下拉电路 上拉是将不确定的信号通过电阻钳制在高电平(同时也起限流作用);下拉反之。 一般来说,50 Ω 以下的电阻为强上 / 下拉,100 kΩ 以上的电阻为弱上 / 下拉。 其他电路 运算放大器外围电路 抗干扰电路,提高抗浪涌电压能力 负载电路(防止电路空载) 参考与致谢 《硬件十万个为什么-无源器件篇》 贴片电阻封装、尺寸、功率对应表 电源大师课连载(2)| 你不知道的电阻、电容小事儿 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

基本元器件 - 运算放大器

基本元器件 - 运算放大器 俗话说,运算放大器就是模电的终极目标。运算放大器(Operational Amplifier)是一种能够实现电信号(电压/电流/功率)放大的器件。不仅仅如此,它还可以作为缓冲器、滤波器、各种运算功能(积分、微分、乘法、对数)等。 运放拥有一对差分输入端(同相 \(u_+\) 与反相 \(u_-\) 电压输入),一个单端输出端 \(u_o\),一对供电引脚 \(V_+\) 和 \(V_-\)(大多数时候不画出)。它通过同相 \(u_+\) 和反相 \(u_-\) 电压进行输入,在内部进行比较运算,并通过输出端 \(u_o\) 放大输出。输出端 \(u_o\) 输出阻抗为 0,流出的电流由正电源端子 \(V_+\) 提供,流入的电流由负电源端子 \(V_-\) 提供。 当运算放大器工作在 线性区域 的时候,满足关系: \[ u_o=A_{uo}(u_+-u_-) \] 其中,\(A_{uo}\) 称为运算放大器的 开环电压增益(u 代表电压,o 代表 open),一般无穷大。 运放的工作状态 集成运放的电压传输特性如下图所示: 图中分为线性区和非线性区: 工作在线性放大区:斜线的斜率为开环电压增益。 工作在非线性区:即饱和状态,在图中是左右两端的水平线,输出电压为 \(-U_{om}\)(负电源端子 \(V_-\) 的电压),或 \(+U_{om}\)(等同于正电源端子 \(V_+\) 的电压)。 运放的供电 运放的供电方式一般分 单电源 或 双电源。单电源下,\(V_+\) 接正电压,\(V_-\) 接地。双电源一般指 \(V_+\) 接正电压,\(V_-\) 接负电压。不同的供电方式带来了不同的频率性能和输入输出的范围。 除此之外,运放可以工作在正负电源(\(V_+\)/\(V_-\))不对称的情况下(比如 \(V_+\) 为 5V,\(V_-\) 为 -3V),它并不需要知道地的位置,但依然可以正常工作。 运放的轨至轨,指的是输出的电压能达到电源电压。比如,如果是一个非轨对轨的运放,假如供电为 0~5V,输出有可能只能达到 0.7~4.3V,而轨对轨输出则可以 0~5V。 运放的虚短与虚断 虚短 虚短是从电压的角度看的,在负反馈的条件下,正负两个输入端电压基本保持相等,近似于短路(但并不是真正短路),称为虚短。 参考负反馈的电路,可以看到,如果同相输入端电压略高于反相输入端,则负反馈电路会拉高反相输入端电压,直到与同相输入端电压相当;反之,如果同相输入端电压略低于反相输入端,则反相输入端电压也会跟随到此时同相输入端的电压。 虚断 虚断是从电流的角度看的,运放两个输入端输入阻抗很大,流入的的电流只有微安级别,近似为无电流流入也就是断路,称为虚断。 注:运放两个输入端输入阻抗很大,是对于一般情况而言。也有特例,比如电流反馈运放。 常用运放电路 因为运放的开环电压增益无穷大,所以需要通过特殊的电路结构来实现合适的放大效果。 电压跟随器 电压跟随器(也称 Buffer)用于高阻抗信号源和低阻性负载之间的缓冲。 同相放大器 同相放大器输出与输入是同相的,可将信号同相放大。 效果:通过调节 \(R_G\) 与 \(R_F\) 的阻值,使 \(V_{OUT}\) 与 \(V_{IN}\) 呈正比放大的关系。 原理: 因为虚短,所以 \(V_- = V_{IN}\) 因为续断,所以 \(V_-\) 端输入电流可忽略不计,所以 \(I_{R_G}=I_{R_F}\),根据欧姆定律,\(\frac{0–V_-}{R_G}=\frac{V_- - V_{OUT}}{R_F}\),得出 \(V_{OUT}=V_{IN}(\frac{R_F}{R_G}+1)\)。 反相放大器 反相放大器输出与输入是反相的,可将信号放大并反转输出。 电压减法器 / 差动放大器 电压减法器 / 差动放大器可放大两个电压之差,抑制共模电压。 电压加法器 电压加法器用于多个电压求和。 低通滤波器 / 积分器 低通滤波器 / 积分器用于对信号的低通滤波,限制信号带宽。 高通滤波器 / 微分器 高通滤波器 / 微分器用于隔离直流信号、放大交流信号。 差分放大器 差分放大器用于从差分或单端信号源驱动差分输入 ADC。 仪表放大器 仪表放大器用于放大低电平差分信号,抑制共模信号。其中,\(V_{IN}\) 为两个输入端之间的电压差值 运放的参数 开环电压增益 开环电压增益 \(A_{uo}\) 表示运放工作在线性放大区下的放大倍数,用 dB 表示。 失调 / 偏移电压 失调电压 \(V_{OS}\)(Input Offset Voltage)有时候也称输入偏置电压。指的是运放输入端为 0V 的条件下,理想运放输出应为零,但实际运放输出不为零,则实际输出电压除以增益得到的等效输入电压称为失调电压。失调电压实际上反映了运放内部的对称性。 失调电压的影响因素有温度(对应失调电压的温漂)、电源波动(对应电源抑制比)。失调电压是直流偏置,会叠加在输出上,如果输出为交流信号,只需考虑叠加后是否会超过供电电压导致信号失真。 我们知道,同相放大器的放大公式是 \(V_{OUT}=V_{IN}(\frac{R_F}{R_G}+1)\),如果考虑失调电压的影响,那么输出为 \(V_{OUT}=(V_{IN}+V_{OS})(\frac{R_F}{R_G}+1)\)。 失调电压温漂 失调电压温漂 \(T_C V_{OS}\) 表示输入失调电压变化量与温度变化量的比值(芯片工作温度范围内)。 失调电压温漂会导致失调电压发生变化,影响运放输出。 输入失调电流 失调电流 \(I_{OS}\) 指当运放输出为零时,两个输入端流入 / 流出直流电流的差值。失调电流受制造工艺的影响。 \[ I_{OS}=I_{B+}+I_{B-} \] 输入偏置电流 偏置电流 \(I_B\) 指当运放输出为零时,两个输入端流入 / 流出直流电流的均值。 \[ I_B=\frac{I_{B+}+I_{B-}}{2} \] 偏置电流受制造工艺的影响,双极型工艺输入偏置电流在 10nA~1μA 之间;场效应管工艺输入偏置电流一般低于 1nA。 可通过在同相端增加匹配电阻,消除误差。 增益带宽积 增益带宽积 \(GBW\)(Gain–bandwidth product,GBWP/GBW/GBP/GB)指在某频率(一般为运放增益衰减 -3dB)下开环电压增益与测量频率(带宽)的乘积。 \[ GBW=A_{uo}*BW \] 增益带宽积受运放内结电容的频率响应特性影响。在设计中如果发现高频信号增益大小受限,则必须选用 \(GBP\) 参数较大的运放。 共模抑制比 共模抑制比 \(CMRR\)(Common Mode Rejection Ratio,CMRR)指的是共模电压范围(\(CMVR\))与此范围内的输入失调电压(\(\Delta V_{O_{OS}}\))变化的比值,结果用 dB 表示。 \[ CMRR=20log(\frac{CMVR}{V_{O_{OS}}}) \] 共模抑制比受电路对称性(失调电流等参数)、线性工作范围的影响。此参数是为了表示差分放大电路抑制共模信号、放大差模信号的能力。共模抑制比高,意味着可以更加抑制共模输入的干扰信号,提高信噪比。 转换速度 转换速度 \(SR\)(Slew Rate,SR)也称压摆率。表示在大信号条件下,输出电压变化的最大速率。 \[ SR=2 \pi f V_{pk} \] 其中,\(f\) 为最大频率(一般为带宽),\(V_{pk}\) 是放大输出信号的最大峰峰值。 转换速度用于评价运放对信号变化速度的适应能力,是衡量运放在大幅度信号作用时工作速度的参数。当输入信号变化斜率的绝对值小于 SR 时,输出电压才按线性规律变化。 其他参数 共模电压范围 \(CMVR\):也称为输入电压范围,如果两个输入端输入电压超出此范围,输出将发生削波或过大非线性现象。 全功率带宽:指在单位增益下测得的最大频率,在此频率下可以得到一个正弦信号的额定输出电压,且压摆率不会导致信号失真。 工作电源电压范围:运放正常工作时,能施加的电源电压范围。 电源抑制比 \(PSRR\):电源电压的变化与输入失调电压的变化之比,结果用 dB 表示。 建立时间:施加一个阶跃输入后,放大器建立至某一预定的精度水平或输出电压百分比所需的时间。 电源电流:放大器空载工作时电源电压需提供的电流。 根据参数选型 根据参数挑选运放,大致有以下步骤: 判断输入信号类型:直流需注意失调电流、失调电压;差分输入需判断是否选择仪表放大器;高频交流信号需注意增益带宽积 \(GBW\) 和转换速度 \(SR\)。 判断精度要求:需要考虑失调电压、偏置电流、失调电流、共模抑制比对精度影响,判断是否选用高阻运放或精密运放。 判断环境条件:需要注意运放的温度量程,注意温漂,注意电源纹波抑制比 \(PSRR\) 的影响。 判断其他要求:通道数、单 / 双电源供电(轨对轨信号失真小,可满幅值输出)、功率大小(高压 / 大电流情况下)。 根据用途选型 按照用途,运放大致分为: 通用运放:对各类要求均不高的器件,注重通用与性价比。 音频运放:超低噪声(高保真)、低功耗(高续航)。 高速运放(\(GBW ≥ 50 MHz\)):低功耗、低噪声 SNR。 功率运放:高电压、大电流。 精密运放(\(V_{os} < 1mV\)):低失调电压,或低温漂、低噪声、低功耗、宽带宽。 参考与致谢 我懂了!运算放大器的工作原理讲得好! 三个经典的运放电路 运算放大器选型指南 运放选型速记指南 TI 运算放大器选型指南 运算参数的详细解释和分析【TI FAE 分享】 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

大扫除 - 经验模板

大扫除 - 经验模板 每次大扫除,我们队要负责的区域一般是 B3-401 室内、两个新生区域、B3-401 及 402 外侧通道、装配室、加工室材料室、大棚教室内外。 以下是可参考的内容模板。 流程安排 时间 任务 14:00 ~ 14:30 打扫个人桌面 14:30 ~ 16:30 打扫公共区域 16:30 ~ 17:00 检查完成情况,不合格返工 本次大扫除需打扫区域 B3-401 室内 B3-401 及 402 外侧通道 两片新生座位区域 装配室、加工室 各组职责 组别 负责人 负责清扫区域 机械组 曾建勋、袁东青、江秉隽 装配室、加工室 电控组 谢正富 新生座位区域地面 硬件电路组 王赞誉 焊台区域 视觉算法组 徐玺、苏获霖 B3-401 及 402 外侧通道 软件组 程炜翔 新生座位区域地面 宣策组 罗锶淇、许其森 B3-401 室内 财务组 孙宇飞、陈佳茵 B3-401 室内 注意事项 签到时间为下午 2:00,可提前 15 分钟签到 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

大疆 N3 飞控 - 参考资料

大疆 N3 飞控 - 参考资料 资料及软件下载 N3 Downloads 基础知识 硬件组成: 主控器(双 IMU、数据记录仪和气压计),其中 CAN1 连接 GNSS-Compass 模块和 DJI 设备,CAN2 连接 SDK 设备;M1 - M8 连接飞行器电调,且可通过 iESC 端口与 DJI 智能电调通信。 GNSS-Compass 模块,含 GPS / GLONASS 双模接收机和指南针。 电源管理模块(PMU)。 LED 模块。 飞行模式: P:定位模式,使用 GPS 模块或视觉定位系统以实现飞行器精确悬停。 A:姿态模式,不使用 GNSS 与视觉定位系统,仅提供姿态增稳,若 GPS 卫星信号良好可实现返航。 S:运动模式,基于自动定位模式,增加感度,姿态角最大可 45° G:迟缓模式,此模式下飞机运动较为迟缓,建议新手使用。 M:手动,不使用 GNSS 与视觉定位系统,没有姿态增稳,无姿态角度限制。 返航功能:智能 / 低电压 / 失控返航 保护功能:失控保护 / 低电压保护 / 高度距离限制 / 特殊区域飞行限制 / 输出动力缺失保护(六旋翼以上才有用) / 动力保护 / 内置双 IMU / 内置数据记录仪 / 航向锁定 / 返航锁定 飞行特性:因硬件而差异,最大抗风 10 m/s,悬停精度垂直 ±0.5 m,水平 ± 1.5 m,最大偏航角速度 150 °/s 硬件安装 主控器朝上并与机身平行,推荐方向朝向机头(若是别的方向,要在软件里设置),尽量安装在飞行器重心。 LED 模块可装在机身侧下方,方便飞行时观察状态。 PMU 模块要注意散热。 硬件调试 指南针校准 快速拨动 3 次 P / A 模式切换开关,此时黄灯常亮,进入校准状态。 水平旋转飞行器 360°,此时绿灯常亮。 使飞行器机头朝下,水平转 360°。 此时灯正常闪烁,完成校准。若红灯闪烁,则需重新校准。 参数设置 基础感度(俯仰 / 横滚 / 航向):尽可能大,但也不要太大,太大会反馈过度,在悬停状态下高频抖动;反之如果太小则造成响应时间变长(可以类比游戏的网络延迟)且晃动。 油门:尽可能大,但过大起降过快,不安全;过小则会造成起降过慢,且影响上面几个参数。 动力带宽:因不同飞机而异,过小会造成响应慢、悬停状态下高频抖动(不够力);过大则修正过度,回中时出现慢速晃动 。 刹车: 姿态灵敏度(刹车 / 姿态):姿态灵敏度越小则姿态命令跟随遥控器指令越慢,姿态响应更加平缓;刹车灵敏度描述刹车的快慢程度,越小则刹车过程越平缓且 刹车距离越长 。 姿态感度:过大则姿态响应更加迅猛,越小则响应迟缓

2025/9/17
articleCard.readMore

太阳高度角计算

太阳高度角计算 表示太阳在天空中的位置,首先需要选定坐标系,通常用到的坐标系有两种,一种是赤道坐标系,一种是地平坐标系。 概念: 纬度 \(\varphi\):-90°~90°,北纬为正。 赤道坐标系 赤道坐标系以赤道面为基本平面,以 赤纬角 和 时角 两个量来定义太阳的位置。 赤纬角 \(\delta\) :地日连线与赤道面的夹角 时角 \(\omega\):上午为负,下午为正,在数值上等于离正午时间(单位是 h)乘以 15°。 赤纬角会随着公转轨道的位置,在北回归线到南回归线之间(-23.45°~23.45°)变化: 赤纬角 \(\delta\) 计算公式如下: \[ \delta =23.45sin[360×(284+n)/365] \] 其中,n 是一年中的日期序号(1~365)。 地平坐标系 地平坐标系以观察者所处的地平面为基本平面。在地平坐标系中,我们用 高度角 和 方位角 定义某个时刻太阳在天空中的位。 注:读此图需要有几何想象力,即圆是在纸面,太阳是在纸上方。 高度角 \(\alpha_s\) :太阳光线到观察者间的连线,与这条线在地面上的投影之间的夹角。 方位角 \(\gamma_s\):太阳光线到观察者间的连线在地面上的投影,与正南方向线之间的夹角。数值上正南方向为 0°,向西为正值,向东为负值。 高度角 \(\alpha_s\) 的计算公式: \[ sin \alpha_s =sin \varphi sin \delta+cos \varphi cos\delta cos \omega \] 方位角 \(\gamma_s\) 的计算公式: \[ sin \gamma_s=\frac{cos \delta sin \omega}{cos \alpha} \] \[ cos \gamma_s=\frac{sin \alpha sin \varphi - sin \alpha}{cos \alpha cos \varphi} \] 法定时间与真太阳时 法定时间是指行政的时间(比如北京时间),而真太阳时是以正午 12 点的时间。 举个例子,北京和乌鲁木齐,太阳高度角最高时都是真太阳时 12 点;而在法定时间下,乌鲁木齐的太阳高度角最高(即正午)是 14 点左右。 参考与致谢 一文掌握光伏系统中涉及的地理知识 经纬度查询 Solar calculator 浅谈光伏发电太阳能追踪系统的设计 [AngleCalculations.pdf] 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

如何为公众号文章增加特效

如何为公众号文章增加特效 我们时常可以看到一些加了特技的公众号文章,举个例子:你以为它只是相册?其实它是科技宝藏。 它们是如何实现在文字内嵌入动画效果的呢? 可以参考一下这份教程: 参考与致谢 在微信公众号文章里使用 svg 动画与交互 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

如何从乐曲中分离音轨

如何从乐曲中分离音轨 来自法国的音乐流媒体公司 Deezer 开源了一个音轨分离软件 spleeter,只需输入一段命令就可以将音乐的人声和各种乐器声分离,支持 mp3、wav、ogg 等常见音频格式。 spleeter 还支持 GPU 加速。如果在 GPU 上运行,会比实时分解速度快 100 倍,也就是说分解一首 5 分钟的歌曲只需要 3 秒。 spleeter 在 GitHub 上线仅仅一周,就收获了 2.4K 星,在 Hacker News 上也有 1000 + 的热度。 spleeter 最多可以分离出人声、鼓、贝斯、钢琴及其他乐曲这 5 个音轨, 软件使用方法请点击下方链接获取。 参考与致谢 最好用的音轨分离软件 spleeter:处理一首歌仅几秒,上线一周收获 2.4k 星 | 附实测 deezer/spleeter 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

如何从零写一个实用的 VS Code 拓展(编辑中)

如何从零写一个实用的 VS Code 拓展(编辑中) VS Code 是一个实用的编辑器,它拥有强大的扩展生态系统,允许用户自由安装或发布拓展来增强软件的功能。 本文源自个人的需求,围绕一个实用看板工具拓展的开发,详细讲解如何从零编写并发布属于你自己你的 VS Code 拓展。 发掘需求 当你有需求的时候,首先应该先在 VS Code 的拓展商店中查找符合你需求的拓展,而不必重复造轮子。当你发现别人开发的应用都无法符合你的需求、或者缺少你想要的功能,这时候才应该考虑自己开发一个拓展。 在本文的实例中,我想要有一个看板工具,可以一键将我的 Markdown 文档渲染为简洁的看板视图,以此一览当下的所有任务。但是现成的看板相关的拓展,要么源文件不是基于 Markdown 格式的,要么无法做到实时更新看板的预览页面,甚至它们都不够简洁。总之,没有一款能满足我的需求。所以,我打算自己造一个。 搭建框架 开发拓展的第一步,首先要确保 VS Code 和 Node.js 已经安装在本地,随后使用 npm 安装 Yeoman 和 VS Code Extension Generator,快速生成扩展开发的骨架: npm install -g yo generator-code 安装完成后,运行命令创建新的扩展: yo code 当提示选择扩展类型时,可以选择“New Extension (TypeScript)”或根据个人偏好选择其他类型。 在自动生成的框架中,有两个比较重要的文件,它们的名字及用途是: src/extension.ts:扩展的主要入口点和逻辑实现。 package.json:定义扩展的元数据和依赖。 开发拓展 测试拓展 在 VS Code 中按 F5 即可运行和调试扩展。实例中,在 Debug 窗口打开一个 Markdown 文件,即可测试拓展是否可用于渲染出一个看板页面 打包并发布扩展 打包拓展,需要安装 vsce 工具: npm install -g vsce 然后使用 vsce package 打包扩展。 (编辑中)

2025/9/17
articleCard.readMore

如何保存易逝的文字

如何保存易逝的文字 背景 病毒太小了,看不见,所以要用试剂盒。试剂盒是怎么检测的呢?先用聚合酶链式反应,把病毒核酸的数量放大。然后用荧光染料染色,让病毒核酸变得鲜艳耀眼。 本文将介绍敏感信息被「404」前,保存下来的方法。 方法 注:本文将使用 Chrome 浏览器 进行演示。 安装插件 如果你有梯子,可以在 Chrome Webstore 上直接搜索 Web Clipper ,下载并安装插件。 假如你打开上面链接后是这个画面: Download crx file from crx4chrome 插件下载完成后,照着下图的指引,打开拓展程序管理页面: 将刚刚下载的插件拖到这儿以安装。 配置 我们选择 GitHub 的 Issues 功能托管内容。 如果你没有 GitHub 账户,那需要先注册一个:https://github.com/ (过程不再赘述) 这个链接 生成一个 AccessToken 。生成的 Token 务必保存下来,稍后会用到。 打开插件页面,绑定相应的 AccessToken 与 GitHub 仓库。 使用 当我们打开任意一篇文章时,可以将其剪藏下来,并设置标签。文章将会以 issue 形式,储存在对应仓库内。 结语 中国有一句古话:「兼听则明,偏信则暗」。这句话告诉我们从多个不同的角度才能更好的还原事物的样子,才能做出正确的事情;只听信单方面的话,就分不清是非。对待信息也应如此。 参考与致谢 逼近真相:在虚假和半真半假中的生存指南 数字极权时代生存手记 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

如何准备一个逃生背包

如何准备一个逃生背包 怀抱着最好的希望,但预做最坏的打算。 —— 《肖申克的救赎》 背包的选择 逃生背包的选择既要考虑容积足够大(能够装下足量的必需品和工具),又要保证长时间背负的舒适度,还要避免太过于显眼。 如果以登山包的选购视角来看,无架包不适合用作逃生背包,一方面其体积较小,另一方面其负重全靠肩膀,不适合长时间徒步背负;而大部分外架包虽然适合长时间背负,但会容易因为其夸张的体积与背负系统,成为被抢劫的首选对象。 逃生背包最合适的选择,是容积 40L 左右、带简单背负系统的内架包。此外,还需要考虑其耐撕扯、防水性能。 水与净水方式 在徒步逃生的路上,如果自带的矿泉水耗尽,不可避免地需要从大自然获取饮用水。 最安全的净水方案就是把水煮开,能 100% 杀菌消毒,但有可能会因为缺少燃料、耗费时间长而无法进行。如果选择煮开水的方法,建议配备可拆分成煮水底座的金属水壶。 物理的净水方法是各种各样的过滤器,比如手动泵、吸管过滤器、集成式过滤水壶,但它们仅能够过滤杂质,无法完全消杀病毒。 化学的方法是二氧化氯净水片,它体积小、重量轻,但它只能净化比较清澈的水。 食物 在逃生的路上,食物应该尽量选择热量高,且便于携带的。一般选择是压缩干粮配牛肉干、外加复合维生素片。 衣物 衣物穿着尽可能避免棉质面料,应选用快干、耐湿、保暖的面料,且颜色尽量暗淡以便隐蔽。 贴身的内衣物可以选择轻质速干面料的,中间层可选抓绒(轻,速干,保暖)、羽绒(可压缩性好,折叠后体积小)等保暖材质的,外套应选择防风、防水的冲锋衣。下身应选择弹性较好的长裤。另可准备护膝与折叠性佳的帽子备用。 对于鞋子的选择,可以参考徒步、登山鞋等类别,需注重脚感、轻便、防水等性能,且需要先经过磨合 庇护所与寝具 庇护所可以选用体积较小的帐篷,辅以轻薄的睡袋,有条件可以增加充气式的防潮垫。 取火工具 取火工具大致有三类:打火机、打火棒、防水万用火柴,应尽量备齐两种以上,并用防水包装密封。 急救包 割伤类:消毒棉球 / 湿巾、创可贴、医用胶带、纱布、碘伏、棉签、绷带等。 内服药品:布洛芬 / 阿司匹林(缓解发烧、头痛或炎症)、喇叭正露丸、茶苯海明(晕车止吐)、感冒药。 医护工具:橡胶手套、镊子、驱虫剂(避蚊胺,亦可辅助生火)、N95 口罩。 电子产品 手机:需要多一个带 SIM 卡的备用机。 充电宝:尽量准备两个以上。 充电器:选择 GaN 多口充电器。 其他工具 镜子:自我医护、或发送求救信号。 口哨:发送求救信号。 应急救生毯:防寒保暖。 洗漱用品:纸巾、牙刷、压缩洗脸巾、一次性内裤。 工兵铲:一边开刃、另一边带锯齿,可选带小刀、指南针等求生工具的。 钳子:剪钢丝用。 头灯:用于夜间照明,注重轻巧与续航。 无线电台:待补充,选择带 NOAA 气象广播模块的电台。 重要文件:身份证、护照、少量现金、过敏信息等,需防水密封包装。 纸质地图:GPS 失效时备用。 550 伞绳手环:搭建避难所、钓线、紧急攀爬绳索、修理固定装备等。 小针线包:缝合衣物。 登山杖:分散重量,尽量选择重量轻、易收纳的。 防雨用具:一次性雨衣 / 鞋套。 参考与致谢 非常时期,百公里徒步物资配备清单和注意事项 硬核生存指南目录 史上最全!生存狂的物资装备清单 揭秘!生存狂应急避难求生跑路包里放了啥? 推荐|史上最全户外徒步装备清单(收藏版) 《逃生背包 BOB·黄金 72 小时装备攻略》 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

如何合理配置个人资产

如何合理配置个人资产

2025/9/17
articleCard.readMore

如何在 Linux 下使用微信

如何在 Linux 下使用微信 DoChat(盒装微信)是一款适用于 Linux 桌面的容器化微信。 主要特色: 安装便捷,一行 shell 命令即可启动 支持汉字输入 Ctrl+V 粘贴图片到微信 运行条件:Ubuntu Linux 桌面并安装 Docker 参考与致谢 huan/docker-wechat 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

如何在 Markdown 中使用 LaTeX

如何在 Markdown 中使用 LaTeX Markdown 原生支持使用 LaTeX 编写数学公式和符号。 字体样式 换行:\\ 空格:\ 居中:使用 $$ 包裹 字体样式:加粗:\mathbf、斜体:\mathit 字体大小:\tiny、\scriptsize、\small、\normalsize、\large、\Large、\huge、\Huge 颜色:\color{颜色值}{数/字/符} 注释:\text{内容} 四则运算 点乘:\cdot 叉乘:\times 上 / 下标 上标:^ 下标:_ 如有嵌套,使用 {} 包含。 例: \(\(X^{2m}_{3n}\)\) 上 / 下划线 上划线:\overline 下划线:\underline 例:\(\(\overline{x^2+a+b}\)\) 分数 分数的表示:\frac{分子}{分母} 方程组 方式一:\begin{array}{c} 表达式一\\表达式二... \end{array} 方式二:\begin{cases}…\end{cases} 开平方根 格式:\sqrt[n]{x},其中n表示开根次数,x` 表示被开方项。 希腊字母 希腊字母(大写) 表达式 希腊字母 (小写) 表达式 A A α \alpha B B β \beta Γ \Gamma γ \gamma Δ \Delta δ \delta E E ϵ \epsilon Z Z ε \varepsilon H H η \eta Θ \Theta θ \theta I I ι \iota K K κ \kappa Λ \Lambda λ \lambda M M μ \mu N N ν \nu Ξ \Xi ξ \xi O O ο \omicron Π \Pi π \pi P P ρ \rho Σ \Sigma σ \sigma T T τ \tau Υ \Upsilon υ \upsilon Φ \Phi ϕ \phi − - φ \varphi X X χ \chi Ψ \Psi ψ \psi Ω \Omega ω \omega 运算符 运算符 表达式 运算符 表达式 ± \pm ∅ \emptyset × \times ∈ \in ÷ \div ∉ \notin ∣ \mid ⊂ \subset ⋅ \cdot ⊃ \supset ∘ \circ ⊆ \subseteq ∗ \ast ⊇ \supseteq ⨀ \bigodot ⋂ \bigcap ⨂ \bigotimes ⋃ \bigcup ⨁ \bigoplus ⋁ \bigvee ≤ \leq ⋀ \bigwedge ≥ \geq ≠ \neq ≈ \approx ≡ \equiv 微积分符号 运算符 表达式 运算符 表达式 ∮ \oint ∞ \infty ∇ \nabla ∫ \int ∑ \sum lim \lim → \vec{} - - 逻辑符号 运算符 表达式 运算符 表达式 ∵ \because ∴ \therefore ∀ \forall ∃ \exists 参考与致谢 Markdown 数学公式 LaTeX-Symbols.pdf

2025/9/17
articleCard.readMore

如何在 iPad 上运行 VS Code

如何在 iPad 上运行 VS Code 注:本教程基于 code-server v3.8.0,CentOS 8.2. 更推荐以 Docker compose 的方式安装 code-server 服务。 Homelab - 在线代码编辑器 code-server 如果你不想用 Docker compose 的方式部署,请继续阅读下文。 配置服务器 首先,你需要有一台 24h 不停机的服务器(推荐买阿里云 / 腾讯云学生机,只需 ¥9.9/月) 2 核以上 1GB 以上内存 刷 Linux(这里我使用 CentOS 8.2),确保 ssh 能正常连上即可。 安装 code-server 在新的版本下(≥v3.8.0),可以直接使用脚本安装: curl -fsSL https://code-server.dev/install.sh | sh 如果发现半天下载不下来,多半是因为 DNS 污染,参考 GitHub 改 Host 解决。 运行 code-server 使用命令: export PASSWORD="设置一个访问密码" && code-server --port 80 --host 0.0.0.0 --auth password 如果没有出现错误,那么打开浏览器,输入服务器的 IP 地址访问,就可以看到一个在线的 VS Code 了。 配置后台运行 运行在前台的 code-server ,会因为 ssh 退出而结束进程。 安装 screen yum install screen 创建 screen 作业 screen -S VSCode-online # VSCode-online 为自取的名字 开启 code-server 服务 export PASSWORD="设置一个访问密码" && code-server --port 80 --host 0.0.0.0 --auth password 如果顺利的话,就可以在浏览器输入 IP 地址访问了。 拓展 添加桌面快捷方式 如果在 iPad 上使用,可以用 Safari 浏览器打开,点击右上角 分享 图标 --> 添加到主屏幕 。 screen 的其他操作 查看正在运行的作业 id:screen -ls 重新进入运行中的 screen 作业:screen -r 作业id # 作业 id 需要包含前缀的数字标识 结束某作业的运行:screen -X -S 作业id quit 退出当前作业的 screen 界面:Ctrl + A + D code-server 相关命令参数 通过外网访问:code-server 服务默认只运行在本地(127.0.0.1)。为了能通过 IP 访问,可以添加 --host 0.0.0.0 参数 指定运行端口:--port xxxx,你可以将 xxxx 替换为 8888 ;也可以是 80 (走 Http 协议,直接用 IP 访问,不用加端口号) 设置访问密码:加上--auth password ;如不需要,则不加任何参数,或加上 --auth none 安装 Git VS Code 配合 Git 使用,方便进行云开发。 yum install git 使用域名访问 通过服务器 IP 访问也许会有些奇怪,我们可以绑定一个自定义的域名,通过域名来访问 code-server 服务。 当前版本 bugs 及解决 无法通过 VS Code 内置的 Settings Sync 服务同步用户设置:可以通过额外安装 Settings Sync 插件解决 Settings Sync 跳转 GitHub 登录出错:使用电脑浏览器进行配置 iPad 上用鼠标滚轮无法正常滚动页面:目前只能使用直接触摸滚动,或用键盘方向键替代 参考与致谢 在浏览器上运行 VSCode(旧) GitHub 改 Host screen 的安装和使用 Setup Guide · cdr/code-server 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

如何实现外网 RDP 远控(frp)

如何实现外网 RDP 远控(frp) 使用 frp 在任意网络下实现远程桌面控制。 为什么使用 RDP RDP 是 Windows 自带的协议。相比市面上的远程桌面软件,如 Todesk、Anydesk、向日葵等,有以下优势: 兼容性更佳,根据设备自适应分辨率,可连接键鼠使用 自由度高,不限制设备数量,也没有会员体系 连接速度取决于电脑网速和服务器配置 为什么使用 frp RDP 仅支持同 IP 段使用,为了在外网下实现远控,我们需要用 frp 方法给内网做穿透。 frp 是一个反向代理软件,体积轻量但功能强大,可以使处于内网或防火墙后的设备对外界提供服务,它支持 HTTP、TCP、UDP 等众多协议。 准备 服务端(可以是云服务器,也可以是有公网 IP 的实体机) 被控端(Windows 必须是专业版以上) 远控端(全平台都适用) 服务端配置 首先,查看服务器架构: arch 参考 frp 的 Releases 页面,选择符合自己架构的版本下载(比如我是 X86_64 架构,即选择 amd64): wget https://github.com/fatedier/frp/releases/download/v0.36.2/frp_0.36.2_linux_amd64.tar.gz 下载后,解压并改名: tar -zxvf frp_0.36.2_linux_amd64.tar.gz && mv frp_0.36.2_linux_amd64 frp 我们看一下 frp 文件夹内的文件: cd frp && ls frps frps.ini frpc frpc.ini 其中,frps 与 frps.ini 是服务端的程序与配置文件(s 结尾代表 server),而 frpc 与 frpc.ini 是客户端相关的(c 结尾代表 client),我们现在暂时不用,可以删除: rm -f frpc frpc.ini 接下来,我们修改 frps.ini 文件: vim frps.ini frps.ini [common] bind_port = 7000 dashboard_port = 7500 token = 12345678 dashboard_user = admin dashboard_pwd = admin bind_port:客户端和服务端连接的端口,在之后配置客户端时会用上,一般默认即可。 dashboard_port:服务端仪表板的端口,一般默认即可。如果按默认设置为 7500,则可通过 7500 端口访问仪表盘(例如 服务器 IP:7500),查看 frp 状态。 token:客户端和服务端连接的口令,请自行设置。 dashboard_user / dashboard_pwd:仪表盘用户名和密码,请自行设置。 编辑完成后,按 Esc 后输入 :wq 保存退出。 为了在后台运行 frp 服务,我们可以使用 nohup 命令: nohup ./frps -c frps.ini & 如果看到以下输出: nohup: ignoring input and appending output to 'nohup.out' 即表示服务正常运行。我们也可以用 jobs 命令,查看正在运行的服务。 为了测试服务端是否配置成功,我们可以访问 x.x.x.x:7500,使用上面配置的用户名和密码,看看能否顺利进入仪表盘。如果访问不了仪表盘,也有可能在服务器的防火墙处放开相关端口。 被控端配置 还是参考 frp 的 Releases 页面,选择符合自己架构的版本下载。下载后解压重命名,可删除 frps 和 frps.ini 文件。打开 frpc.ini 文件: frpc.ini [common] server_addr = x.x.x.x server_port = 7000 token = 12345678 [rdp] type = tcp local_ip = 127.0.0.1 local_port = 3389 remote_port = 7001 [smb] type = tcp local_ip = 127.0.0.1 local_port = 445 remote_port = 7002 server_addr:服务器 IP 地址,请自行修改。 server_port:保持与服务端 bind_port 的值相同即可,默认是 7000。 token:连接口令,保持与服务端配置的 token 相同。 接下来,我们配置自定义的规则: [rdp]:[xxx] 表示规则名称,可自定义。 type:转发的协议类型,可选 TCP/UDP local_port:本地端口号,这里填写的是 RDP 协议的端口(3389) remote_port:在服务端开放的端口号,可自定义。 RDP(Remote Desktop 协议)在 Windows 上默认的端口号为 3389,协议 TCP。 SMB(Windows 文件共享协议)默认端口号为 445,协议 TCP。 为了在后台运行 frpc,我们创建脚本 frpc.vbs,将以下内容粘贴进去: frpc.vbs set ws=WScript.CreateObject("WScript.Shell") ws.Run "c:\frp\frpc.exe -c c:\frp\frpc.ini",0 注意可能需要修改路径。 将 frpc.vbs 放入 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp 目录内,即可实现开机自启动。 如果想测试使用,可以直接运行脚本,或重启自动运行。 远控端配置 控制端是移动设备 如果需要在手机、iPad 上远控电脑,则需要先安装 Microsoft 远程桌面 App,然后执行以下步骤: 在 App 内右上角点击 + - 添加电脑 电脑名称 填入 IP:remote_port,例如 x.x.x.x:7001,点击返回 账户名称 填入被控端电脑的账户密码,点击返回 如果一切配置正常,这时候应该可以成功远程控制了。 控制端是 Windows 直接在开始菜单搜索打开 远程桌面连接,填入 IP:remote_port 例如 x.x.x.x:7001,按提示输入用户名密码,即可实现远程控制。 参考与致谢 使用 frp 进行内网穿透 Linux 的 nohup 命令的用法 【教程】通过 frp 实现自建远程桌面 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

如何快速删除 node_modules

如何快速删除 node_modules 全局安装 rimraf: npm install rimraf -g 切换到包含 node_modules 文件夹的根目录,运行一下命令: rimraf node_modules 等等就好了。

2025/9/17
articleCard.readMore

如何快速制作一个启动盘

如何快速制作一个启动盘 —— 制作一个启动盘,只需一步到位。 背景 Ventoy 是一个开源的启动盘制作工具。优势如下: 使用简单。将系统镜像(.iso 文件)拷进 U 盘即可。 多系统 可以一次放进多个镜像,自动创建包含多个系统的启动菜单 目前已测试过支持包括主流 Windows、服务器版 Windows、Debian、Ubuntu、CentOS、RHEL、Deepin,VMware ESXi 等 202 个系统 支持超过 4GB 的 ISO 文件 直接从 ISO 文件启动,无需解开 快速 (拷贝文件有多快就有多快) 不影响 U 盘日常普通使用 下载安装 可在软件仓库的 Release 页面下载软件。 下载完成后,打开压缩包内的 Ventoy2Disk.exe 并选择 U 盘,点击 Install 安装即可。 使用 直接把镜像文件拷贝进 U 盘就行了。 参考与致谢 Ventoy - 开源 U 盘启动盘制作工具,支持启动多个系统,还能当普通 U 盘保存文件 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

如何打印出手写效果的文字

如何打印出手写效果的文字 参考视频:https://www.bilibili.com/video/av87409493/?spm_id_from=333.788.videocard.0 主要是以下几个步骤: 使用手写字库:使用数位板,自己创建字库,或直接使用别人的字库。 使用 Word 宏代码:随机调节字体大小、行间距。 人工处理:制造涂改痕迹、纸张做旧、用喷墨打印机将墨迹渗透到背面。 此方法适用于大量重复内容抄写(抄写课文),或开卷考试只允许携带手写资料的情况。 参考与致谢 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

如何批量拉取 Git 仓库更新

如何批量拉取 Git 仓库更新 仓库一多,逐个手动拉取就会变得很麻烦。使用本文的方法,可以对 Git 仓库进行批量拉取操作。 步骤 新建脚本文件 pull-master.sh,并将以下代码粘贴进去: pull-master.sh #!/bin/bash function showMsg() { echo -e "\033[32m$1\033[0m" } function getdir(){ for element in `ls $1` do dir_or_file=$1"/"$element if [ -d $dir_or_file ] then cd $1"/"$element showMsg 'git pull '$element git pull else echo $dir_or_file fi done } root_dir="【包含多个仓库的路径】" getdir $root_dir 将 【包含多个仓库的路径】 替换为你的路径,例如 C:\repos。 运行命令: sh pull-master.sh 或 ./pull-master.sh 或直接双击 pull-master.sh 运行 定时执行 搜索并打开 任务计划程序 点击 创建任务 在 常规 标签页内填写名称 在 触发器 标签页内设置周期 在 操作 标签页内新建操作,填写 程序或脚本(例如 F:\pull-master.sh),添加参数(例如 pull-master.sh),起始于(例如 F:\) 测试运行,如果没问题即可。(如不成功可参考 Pull-Git-Repo.xml) 在群晖 NAS 上部署 将脚本(比如我是 github-pull.sh)放在 NAS 上任意路径 修改 github-pull.sh 内 root_dir 的路径,比如我改为 "/volume1/projects",也就是你放 Git 仓库的地方 控制面板 - 任务计划 - 新增 - 计划的任务 - 用户定义的脚本,在 计划 和 任务设置 标签页配置周期运行时间,和运行脚本的命令(比如 bash /volume1/stash/permanent/github-pull.sh) 可在 设置 内配置输出结果,后选择任务,点击 运行,可测试运行,可打开配置的输出路径看运行结果 如果每次都需要输入密码,可以输入以下命令(需提前开启用户家目录): git config –global credential.helper store 这会在本地生成一个文本,上边记录账号和密码。 参考与致谢 批量 git pull 小脚本 git 批量 pull_shell 脚本 -- 多个代码库批量 pull 最新 master 代码 Windows 定时执行 shell 脚本

2025/9/17
articleCard.readMore

如何撰写一份 BRD

如何撰写一份 BRD —— 商业需求文档(BRD)写作指南 BRD 是什么 简而言之,BRD 将 ideas 系统化整理,一方面帮自己梳理项目方向,一方面用于展示给手握资源的人,以获取产品开发流程中所需的资源。 产品开发流程中,立项是一个分水岭。立项前往往要进行大量的考察和调研,最后基于调研结果输出一个方案,这个方案就是 BRD. BRD 怎么写 1. 产品介绍 产品介绍,就是要简明扼要的说明你要做一个什么样的产品。说明要简短,最好一句话能讲明白(产品的作用,定位,愿景等)。可以分别从 用户 与 专业人士 的角度分析描述。 2. 产品价值 产品的价值,就是要告诉决策层为什么要做这个产品。可以从 用户需求 (满足了什么需求、解决了哪些痛点等)和 战略 (能为企业带来什么价值、获取市场利润、扩大市场份额等等)两个层面描述 3. 产品解决方案 产品解决方案,就是告诉决策者这个产品大概的框架和轮廓,主要包含以下几个方面: 产品形态:这个产品架构大概是什么样的,是资讯形态的,社交形态的,搜索形态的,还是 O2O 的 业务模式:这个业务是 2C 的还是 2B 的,参与者都有谁,怎么形成闭环等 运营模式:采用什么样的运营策略和手段让产品运营起来,如教育类产品中的教师资源,是招聘还是众包等等 盈利模式:通过什么方式来赚钱,例如广告,增值服务,出售商品等 4. 市场分析 做产品不能闭门造车,还要看看市场上的情况,主要包括: 市场容量:需要通过对需求的分析,对人群判断后评估得出。决策者会通过这个判断值不值得投入 竞争对手分析:看看市面市面上还有哪些竞品,他们是怎么解决的,满足了用户的哪些需求,还有哪些没有满足,投入怎么样,团队怎么样,产出怎么样,与我们对比我们的优势是什么,劣势是什么 对市场未来的判断:包括未来市场竞争格局,行业的风险,政策的变化,行业的发展方向等判断 市场机会:怎么找到突破口,这个机会可以让我们发展成为一个什么样的地位 5. 执行计划 大致描述要怎么做这个产品: 第一阶段:用 MVP 验证用户需求,时间段从 xxx 到 xxx 第二阶段:完善产品,扩大用户规模,时间段从 xxx 到 xxx 第三、第四阶段等等 6. 财务预估 预估投入成本和产出收益,决策者最看重这部分。投入相对容易计算;收入可以根据盈利模式的参考值估算得出(像广告可以参考 CPC/CPA 等) 7. 风险预估 风险是指有可能影响产品目标实现,或增加产品成本的行为和因素,在考虑风险的时候,我们不仅要对所有可能出现的风险进行评估,确定风险出现的可能性和严重性,而且要给出对应的规避预案,并明确预案的规避效益。 注意事项 BRD 并不只是简单写个文档,背后需要有很多准备工作要做 在文档中少关注产品细节,多关注产品商业价值的部分 注意逻辑严谨,尽量言简意赅 在真实的基础上,尽量让内容偏向自己有利的一边引导 参考与致谢 不要找模板了,一篇文章告诉你商业需求文档(BRD)怎么写 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

如何用 Markdown 写一份简历

如何用 Markdown 写一份简历 用 Markdown 写一份可在线预览,也可导出 PDF 的简历。 预览网址:cv-template.wiki-power.com 如何导出 PDF:在网页上使用快捷键 Ctrl + P 唤出打印界面,目标打印机选择 Microsoft Print to PDF,即可导出 PDF 版本的简历。 使用方法 打开项目 linyuxuanlin/Markdown-CV-Site,点击绿色的按钮 Use this template 初始化为自己的仓库。 打开 Vercel,点击 New Project,导入刚刚初始化的 GitHub 仓库,设置下列参数: FRAMEWORK PRESET:选择 Other BUILD COMMAND:填入 npm run build OUTPUT DIRECTORY:填入 dist 点击下一步,等待几十秒,网站就生成了。 如需修改简历的内容,请编辑根目录下的 _config.yml 和 markdown/resume-template.md 文件,推送到 GitHub 仓库后,可自动触发 Vercel 构建。 参考与致谢 本项目基于 BigLiao/markCV,做了一些 UI 的简化和改善。简历模板使用的是 冷熊简历 的默认内容。 聊聊简历怎么写? 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

如何用 Markdown 写公众号文章

如何用 Markdown 写公众号文章 在 Markdown 介绍文章 使用 Markdown 进行高效写作 中,我们得以见识 Markdown 用于排版的便捷性。假如我想用它来写微信公众号,该怎么操作呢? 我们都知道,微信公众号用的是富文本编辑器,是无法直接解析 Markdown 语法的。但我们可以自己先将 Markdown 解析为富文本,再粘贴进公众号文章的编辑界面。 MD2WeChat MD2WeChat 是我根据开源项目 lyricat/wechat-format 定制的一个网页工具,可以很方便地将 Markdown 语法解析为富文本: 将 Markdown 语法的文章粘贴到左栏,并在右栏点击一键复制,粘贴进公众号的编辑器即可。 注:因公众号文章中不允许有外部链接,所以外链会被自动加脚注,并在底部附上。 参考与致谢 lyricat/wechat-format 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

如何设计一款单片机的最小系统

如何设计一款单片机的最小系统 本文将基于 STM32 单片机(F1 系列)展开讲解。 背景 学嵌入式,我们一般从单片机学起。学单片机,不能只学软件,硬件知识也要跟上。软硬件相结合的设计,才是真正优秀的设计。 谈及单片机的硬件设计,我们会先将其浓缩为最小系统,即能实现最基础的功能的最简化设计。以 STM32(F1 系列)单片机为例,最小系统无非是这几部分:电源、复位、时钟、启动模式、下载调试。 电源 STM32 的电源有以下几种类型: 主电源(VDD / VSS) 主电源指的是标记为 VDD1、VDD2... 的引脚。 后备电源(VBAT) VBAT 引脚可用于电池供电。如果不用,可以与 VDD 连接在一起。VBAT 也需要一个 100nF 电容滤波。 ADC 电源(VDDA / VSSA) 为了提高转换精度,ADC 设备可以从这里取电。一般将 VDDA 通过一个电感后, 与 VDD 相连接。 若不用到 ADC,可将 VDD,VDDA,VREF+(如果有的话) 接在一起,并对地接 1uF 钽电容 + 10nF 陶瓷电容滤波。 复位 因为 STM32 内部有上拉电阻,所以外部只接 100nF 电容 + 按键即可: 上电时,CPU 处于复位状态,此时电容充电,NRST 引脚电位持续拉低,当电容充满电后,NRST 电位变为高电平,此时 CPU 退出复位模式,进入正常运行状态。当按钮被按下时,电容被短路清空电量,按钮松开后重新充电,触发复位。 根据官方设计指南,电容选取 100nF 即可,以保证 NRST 低电平持续的时间满足 CPU 复位的最小脉宽要求,能正常触发复位。 如果不需要手动复位功能,也可以略去按键。 时钟 如上图,STM32 的时钟分以下几种: HSI:高速内部时钟,是内部的 RC 振荡器,频率为 8MHz HSE:高速外部时钟,可接石英 / 陶瓷谐振器,或者接外部时钟源,频率范围为 4MHz~16MHz LSI:低速内部时钟,RC 振荡器,频率为 40kHz. 独立看门狗的时钟源只能是它,同时它也可以作为 RTC 的时钟源 LSE:低速外部时钟,接频率为 32.768kHz 的石英晶体。LSE 是给 RTC 用的时钟源 PLL:锁相环倍频输出,其时钟输入源可选择为 HSI/2,HSE 或 HSE/2. 倍频可为 2~16 倍,但是输出频率最大不得超过 72MHz 从稳定性上考虑,我们在设计的时候一般使用外部晶振作为时钟源。一般选取 8MHz 晶振作为 HSE,便于倍频(一般倍频到 72MHz);选取 32.768kHz 晶振作为 LSE,RTC 使用便于分频(32768 是 2 的 15 次方,可以得到精准的时间)。 至于晶振的选用,有源的精度高,无源的成本低,一般无源就足够了。 晶振输入输出引脚之间可加一个 1M 的电阻,产生负反馈,保证放大器工作在高增益的线性区。同时还起到限流作用,防止反相器驱动过载损坏晶振。 启动模式配置 一般将 BOOT0 引脚下拉(串接 10K 电阻再接地),BOOT1 任意 即可。 如果需要模式切换,也可以参照以下的设计: 启动模式详见 STM32 的启动模式 下载调试接口 一般我们用 SWD 接口(接线少,方便),直接引出 SWDIO,SWCLK,VCC,GND 即可。 总结 以上就是 STM32(F1 系列)最小系统的电路设计。更加详细的内容,可以跳转下面的官方文档和相关文章。 参考与致谢 STM32F1 系列单片机硬件设计方法 STM32 硬件设计 STM32 时钟系统 《AN2586 应用笔记-STM32F10xxx 硬件开发使用入门》 《AN2867 应用笔记-ST 微控制器振荡器电路设计指南》 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

如何读写单个 bit

如何读写单个 bit #define BitVal(data,y) ( (data>>y) & 1) // Return Data.Y value #define SetBit(data,y) data |= (1 << y) // Set Data.Y to 1 #define ClearBit(data,y) data &= ~(1 << y) // Clear Data.Y to 0 #define TogleBit(data,y) (data ^=BitVal(y)) // Togle Data.Y value #define Togle(data) (data =~data ) // Togle Data value 参考与致谢 How to read/write arbitrary bits in C/C++ 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

如何调制一杯鸡尾酒

如何调制一杯鸡尾酒 介绍鸡尾酒的由来,以及几种经典鸡尾酒的调法。 基酒的种类 基酒是在鸡尾酒的调制中,起到主导作用的酒。基酒一般有 6 种:伏特加、威士忌、朗姆酒、金酒、白兰地、龙舌兰酒。 伏特加(VODKA) 伏特加是由水和蒸馏净化的乙醇调制而成的,一般要经过三重蒸馏得到更纯正的口味。 威士忌(WHISKEY) 威士忌算得上一种烈酒(Spirits,即 Hotel California 歌词中 We haven't had that spirit here since 1969)。在苏格兰、加拿大产的威士忌拼法为 Whisky,而美国、爱尔兰产的则称为 Whiskey。一般分为以下几种类型: 苏格兰威士忌(Scotch Whisky):苏格兰地区产的,传统做法会在制作过程加入煤灰。 波本威士忌(Bourbon Whiskey):使用玉米糖浆进行制造(偏甜),其生产手法类似制作酸面包,在原料发酵时加入一些去酒精的啤酒。 爱尔兰威士忌(Irish Whiskey):在威士忌的发源地爱尔兰地区产的,相传最早是通过从修道院里流传到民间的蒸馏术制作而成。 朗姆酒(RUM) 朗姆酒是由甘蔗副产品(甘蔗汁或糖蜜等)发酵和蒸馏制成的。其蒸馏出物是一种透明澄清的液体,传统做法是需要在橡木桶中进行陈年处理。 其发源于古法提炼蔗糖,即加热甘蔗汁以蒸发水分结晶出蔗糖,到最后总有一些含高分子的残液不可继续加热(将碳化),只能制成焦糖。但后来新英格兰的殖民者发现可以用以酿酒,朗姆酒由此诞生。目前朗姆酒的生产为了符合现代人口味,增加了储存醇化期,因此比较绵软顺口,有焦糖香味。 一个有趣的小知识是,朗姆酒与大航海时代的英国皇家海军、海盗们有着深厚的渊源;在三角贸易时期,也会用它充当货币的作用。 金酒(GIN) 金酒也名杜松子酒,因其主要调味成分是杜松子。琴酒源于荷兰,它最早的用途是药,而不是一种随性的饮品。它是一种以谷物为原料制造的中性烈酒(增添以杜松子为主的多种药材与香料)。 白兰地(BRANDY) 白兰地是我们通常说的洋酒,是经过蒸馏的葡萄酒,一升白兰地通常需要八升葡萄酒浓缩而来。其中常见的分级为 VS(三年以上)、VSOP(四年以上)、Napoleon(六年以上)、XO(十年以上)、Extra(十五年以上)。 当然,好酒适合直接品,用于调酒就有点暴殄天物了。 龙舌兰酒(TEQUILA) 龙舌兰酒是「墨西哥的灵魂」,是用墨西哥植物龙舌兰制成的烈酒。其最早源自中美洲地区的印第安文明,他们取多糖而多汁的龙舌兰发酵成酒。后来经西班牙殖民者以蒸馏的方式提升了酒精度,逐渐取代了发酵方法的酒。 一些调酒的操作术语 build/pour:直接倒入杯中 straight-up:纯喝 on the rocks:加冰 blend:用果汁机搅拌 shake:用大调酒杯加入冰块摇动 stir:在调酒杯内,将透明无色的基酒放入冰块搅动,以降温 muddling:将固体食材萃取出汁液(可用搅拌杵挤压) layer:做出层次分明的效果 float:做出上层液体向下淋透的效果 几种经典的鸡尾酒 马天尼(MARTINI) 马天尼也译为马提尼,俗称鸡尾酒之王。 配方: 60 ml 金酒 10 ml 干苦艾酒 调制方法:将所有成分倒入装有冰块的混合玻璃杯,搅拌均匀,滤入马提尼杯。 装饰:适当添加柠檬皮挤出的汁或青橄榄。 自由古巴(CUBA LIBRE) CUBA LIBRE 起源于 20 世纪初、在美西战争中取得了独立的古巴。因其配方简单、原料廉价变得流行。 配方: 50 ml 朗姆酒(百加得白朗姆) 120 ml 可口可乐 10 ml 鲜青柠汁或柠檬汁 调制方法:将所有配料加进装满冰块的高脚杯中。 长岛冰茶(LONG ISLAND ICE TEA) 长岛冰茶调制的主要成分为伏特加、龙舌兰酒和金酒,酒精浓度约为 30%。因其糖分较多、口味香甜,盖过浓烈的酒精味,容易使人不知觉饮用过量而醉。 配方: 15 ml 伏特加 15 ml 龙舌兰 15 ml 白朗姆 15 ml 金酒 15 ml 君度橙酒 30 ml 柠檬汁 20 ml 糖浆(或一茶勺糖) 用可乐灌满 调制方法:将所有材料加入装有冰块的高脚杯中,然后轻轻搅拌。 装饰:柠檬片(可选)。 玛格丽特(MARGARITA) 配方: 50 ml 龙舌兰(100%) 20 ml 君度或 Triple Sec 酒 15 ml 鲜榨青柠汁(或 30 ml 屈臣氏青柠汁) 调制方法:将所有配料加进有冰块的摇杯中,摇晃并过滤到冰过的的玛格丽特杯中。 装饰:可选盐边。 莫吉托(MOJITO) 配方: 45 ml 白朗姆酒 20 ml 鲜青柠汁 6 片薄荷叶 2 茶勺砂糖 苏打水 调制方法:将薄荷、糖、青柠汁混合,加入一抹苏打水,往杯子里加满冰块。倒入朗姆酒,再加入苏打水。轻轻搅拌,让所有成分混匀。 装饰:薄荷叶和柠檬片。 龙舌兰日出(TEQUILA SUNRISE) 配方: 45 ml 龙舌兰酒 90 ml 鲜橙汁 15 ml 石榴糖浆(必得利) 调制方法:将龙舌兰酒和橙汁直接倒入装有冰块的高脚杯中,加入石榴糖浆,营造色泽效果(日出),不要搅拌。 装饰:用半片橙子或橙皮装饰。 威士忌酸(WHISKY SOUR) 配方: 45 ml 波本威士忌 25 ml 鲜柠檬汁 20 ml 糖浆(或一茶勺糖) 20 ml 生蛋青(可选) 调制方法:将所有材料倒入装满冰块的调酒器中,摇匀,滤入装有冰球的杯中。 装饰:用半片橙子和樱桃装饰,也可选用橙皮。 参考与致谢 Contemporary Classics Wikipedia:Wiki Loves Cocktails/Ergebnisse 六大基酒简介 居家不止冰啤酒 ,这份「家庭鸡尾酒」调制公式敬请收藏 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

如何配一台电脑

如何配一台电脑 1. 选机箱 注意: 电源须下置 尽量有背部走线设计 日常使用小机箱 / 中塔较为合适 2. 选主板 /CPU 参考 CPU 天梯图,根据需求选取。注意: 相同价位下,玩游戏选 Intel,不玩游戏 AMD CPU 可以买散片(一般不会有假货),散片须自备散热器 如自备散热器需注意机箱的 CPU 散热器限高 选完 CPU 选主板。注意: AMD 芯片配 AMD 主板,Intel 芯片配 Intel 主板 注意机箱兼容的主板尺寸(ATX, Micro-ATX, MINI-ITX) 主板 /CPU 可以买套装,比较实惠。 3. 选显卡 参考 显卡天梯图,根据需求选取。注意: 如果 CPU 有核显,且对配置要求不高,则独立显卡非必须 采用 NVIDIA 芯片的称之为 N 卡,而 AMD 芯片称之为 A 卡 相同价位下,绘图渲染工作用 A 卡,玩游戏用 N 卡 N 卡高端型号比较丰富,且功耗较低;A 卡性价比高 注意机箱的显卡限长 4. 选内存条 内存条基本参数要求: DDR4 2400 频数 注意区分台式机 / 笔记本内存条 根据需求,基础 16GB,高性能 32GB 以上 注意主板的内存插口数量 推荐金士顿 / 三星的内存条 5. 选硬盘 硬盘分固态(SSD)与机械(HDD)。因为相同容量下, SSD 比 HDD 贵而且传输速率高,所以通常将系统和软件存放于 SSD,不常用而体积大的资料文档存放于 HDD. SSD 基本参数要求: M.2 接口(NVMe 协议) 根据需求选容量 注意对比读写速率 推荐三星的 SSD HDD 基本参数要求: SATA 3.0 接口 7200rpm 转速 理论传输速率 6Gbit/s 根据需求选容量 推荐希捷的 HDD 6. 选电源 注意: 根据机箱限定的尺寸选取 (300W 起步)所有硬件功率累加,再多 100W 冗余就足够 注意转换效率:白、铜、银、金、白金、钛金依次递增,价格越贵,电费越省 7. 其他配件 无线模块 最好支持 Wi-Fi 6 注意接口类型 开机卡 注意接口类型

2025/9/17
articleCard.readMore

如何高效制作幻灯片

如何高效制作幻灯片 背景 准备一场演讲,通常我们的流程是: 用 PowerPoint 制作幻灯片 用 U 盘将 .ppt 文件拷贝至演讲用的电脑上 开始演讲 这其中存在以下几个问题: 幻灯片的制作复杂,让我们不得不将注意力集中于样式,而非内容上 演讲用的 PPT 版本不同,可能会出现不兼容的情况 用 U 盘拷贝的方式不优雅,而且可能传播病毒 如果有一个新的流程,可以让你像写大纲一般制作 PPT,不纠结于样式;演讲时空着手上台,打开一个网址,就能展示出你要讲的 PPT,是不是很吸引眼球? 用 Reveal.js 制作幻灯片 Reveal.js 是一个使用 HTML 制作 PPT 的框架,制做演示文稿时,你就是在制作一个网页。 hakimel/reveal.js 并直接编辑 index.html. 随后将 index.html 拖进浏览器,即可播放幻灯片。 推荐使用 Visual Studio Code,配合 Live Server 插件,能够实时预览: Reveal.js 的语法可以参考 官方文档 。 在线演示 我们可以将幻灯片托管至 GitHub Pages, 实现在线演示。 具体的操作方法是,将整个项目文件夹同步至 GitHub, 并开启 Pages 功能(可以绑定自己的域名)。然后就可以直接访问网址,实现在线演示 PPT 了。 假如用于演示的电脑无网络连接,你仍然可以拷贝整个项目文件夹,使用演示电脑的浏览器直接播放幻灯片。 你可以访问 https://slides.wiki-power.com/ 查看我创建的在线幻灯片。 参考与致谢 REVEAL.JS - THE HTML PRESENTATION FRAMEWORK hakimel/reveal.js 如何用 Github 免费在线播放你的幻灯? Reveal.js:把你的 Markdown 文稿变成 PPT 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

存储器的分类

存储器的分类 储器一般可以分为内部存储器(内存,RAM)、外部存储器(外存,ROM)、缓冲存储器(缓存,Cache)及闪存(Flash)极大类别。 内存 RAM 内存 RAM(random access memory)是随机存取存储器,存储单元的内容可以按照需要随机取出或者存入(不需要线性依次存储),存取数据比较快,掉电会丢失数据,容量相对小。一般 CPU(MCU)运行时会把程序从 ROM 拷贝到 RAM 里面执行,所以一般 RAM 是作为和 CPU(MCU) 直接交换数据的内部存储器,也叫主存或者内存。 内存有以下的类别: SRAM:静态随机存取存储器(Static RAM),具有静态存取功能。不需要刷新电路就能保存它内部存储的数据,特点是高性能、低集成度(占地面积大)、功耗大、速度可以非常快,但价格高、容量小。一般在 MCU 或者 SOC 会内置一小块 SRAM,用于高速缓存(Cache)。缓存是数据交换的缓冲区。当某一设备需要读取数据时,会首先从缓存中查找,如果找到了则直接运行,找不到才去内存中找。因为缓存的读写速度比内存快得多,故缓存的意义就是帮助系统更快地运行。 PSRAM:伪静态存储器,内部自带刷新机制。 SSRAM:同步静态随机存取存储器(Synchronous SRAM),有时钟线,读写以时钟信号为基准。 DRAM:动态随机存取存储器(Dynamic RAM),每隔一段时间固定对 DRAM 刷新充电一次,否则内部数据会消失。现在电脑用的 DDR 内存条都属于 DRAM。 DARAM:双口 RAM,一个时钟周期可访问两次。 SDRAM:同步动态随机存取存储器(Synchronous DRAM),数据的收发以时钟信号为基准。 SDR SDRAM:单倍速率(Single-Data-Rate)SDRAM,采用单端(Single-Ended)时钟信号,在时钟上升沿采样。 DDR SDRAM:双倍速率(Double-Data-Rate)SDRAM,在时钟上升下降沿采样,工作频率比 SDR 翻倍,采用差分的时钟信号以加强抗干扰。工作电压 2.5V/2.6V。 DDR2 SDRAM:内存时钟 200~533MHz,工作电压 1.8V。 DDR3 SDRAM:8bit 预取机制,内存时钟 400~1066MHz,工作电压 1.5V/1.35。 DDR4 SDRAM:16bit 预取机制,工作电压 1.2V。 DDR5 SDRAM:工作电压 1.1V。 GDDR SDRAM:图形 DDR,目前有 GDDR2~6。 LPDDR SDRAM:低功率 DDR,时钟 166MHz,LPDDR2 其工作电压 1.2V,时钟 100~533MHz。 DDR 三个版本的参数比较: 条目 DDR3 DDR2 DDR 工作频率 400/533/667/800 MHz 200/266/333/400 MHz 100/133/166/200 MHz 数据传输速率 800/1066/1333/1600 MT/s 400/533/667/800 MT/s 200/266/333/400 MT/s 预取位宽 8-bit 4-bit 2-bit 输入时钟类型 差分时钟 差分时钟 差分时钟 突发长度 8,4 4,8 2,4,8 DQS 差分数据选通 差分数据选通 单端数据选通 电源电压 1.5V 1.8V 2.5V 数据电平标准 SSTL_15 SSTL_18 SSTL_2 CL 5,6,7,8,9 时钟 3,4,5 时钟 2,2.5,3 时钟 ODT 支持 支持 不支持 外存 ROM 外存 ROM(Read Only Memory)也称为辅助存储器,不能与 CPU 之间直接进行信息交换。它的储存速度相对慢得多、但容量相对大,在简单的系统上常与内存配合使用,作为储存程序与其他文件的空间。 ROM 最开始是一次性的,只能写入一次,后续只能读取操作,数据掉电不会消失,如 CD-ROM、DVD-ROM,后面出现的 PROM、EPROM、EEPROM 可有条件地写入。 外存有以下的类别(按时间推进): PROM:可编程 ROM,内部是行列式熔断丝,可以自己写入一次,写错了,只能再换一片。 EPROM:紫外线可擦除,写入时需要用编程器产生高压脉冲信号。 OTP-ROM:一次可编程 ROM,写入原理与 EPROM 相同。 EEPROM:电可擦除可编程只读存储器(Electrically Erasable Programmable),在 EPROM 的基础上进一步发展形成,可电擦除,可以按照字节操作,但是集成度不高、价格比较贵。 闪存 Flash 闪存 Flash 是一种长寿命的非易失性(掉电保存)的存储器,算是广义的 EEPROM,因为它也是可电擦除的 ROM,它与 EEPROM 最大的区别就是,只能按照扇区(block)操作读写,但其成本比 EEPROM 低。FALSH 分为 NOR FLASH 和 NAND FLASH。 闪存有以下的类别(按时间推进): NOR Flash:数据线和地址线分开,可以实现像 RAM 的随机寻址 / 读取功能,也就是说程序可以在 NOR Flash 上直接运行,不需要拷贝到 RAM 中。但容量小,分为 Parallel/Serial NOR Flash。 Nand Flash:数据线和地址线复用,不能利用地址线随机寻址,不能直接运行程序,容量大,有 SLC、MLC、TLC、QLC MMC:MMC 接口、NAND Flash、主控制器 eMMC Flash:嵌入式存储解决方案,带有 MMC 接口(并行数据总线)、NAND Flash、主控制器 UFS:串行数据总线、Nand Flash、主控制器 其他知识 eMMC 的最新 5.1 标准理论最高值最高可以达到 400MB/s,UFS 的最大优势就是双通道双向读写,UFS3.0 接口带宽最高 23.2Gbps,也就是 2.9GB/s。 eMMC 的电路接口与 SD 卡是一样的,SD 卡只是焊接在 PCB 上,然后做上金手指和外壳。eMMC 支持 8 位和 4 位数据总线,SD 卡标准是 4 位数据总线。 eMMC 有两条总线,分别传输指令数据输入和输出,而且因为是并行总线还要有额外的 data strobe。而 UFS 则是有两条差分的数据 lane,指令和数据都是以 packet 的形式发送的。 SSD = 主控 + DRAM 缓存 + Nand Flash eMMC = 主控 + Nand Flash + 标准封装接口 参考与致谢 RAM ROM Flash UFS 区别 存储知识和 AUTOSAR NVM 存储服务 DDR3 总结笔记 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

定制 SublimeText3

定制 SublimeText3 背景 Sublime Text 是一款非常强大的文本编辑器。由于下学期有 Python 相关课程,而 Pycharm 等工具的 UI 有些难看。我想尝试把 Sublime Text 打造为 Python 开发利器。 定制后的效果图: 极简部署 下载 Consolas-with-Yahei 字体,解压安装 下载由我定制的 Sublime Text 3(不保证更新) 直接运行 .exe 文件,详细参数配置请见下文 详细配置 软件下载及安装 Sublime Text 3 可从 官网 下载(推荐下载 免安装版本) 软件可以免费使用,但有时候会弹出付费提示。经提醒,已将序列号从文章中删除。需要可以联系我。 包管理器及插件安装 安装包管理器:Preferences -> Install Package Control,之后可用快捷键 Ctrl + Shift + P 快速调出包管理器界面。 安装插件:调出 Package Control 界面,输入 Install Package ,回车,耐心等待,在稍后弹出的界面里搜索所需插件并点击安装。对于未发布插件,可直接选择 Preference -> Browser packages ,打开存放插件的文件夹,把插件直接放进去即可。 卸载插件:调出 Package Control 界面,输入 remove package . 适配中文 汉化:用 Package Control 搜索 ChineseLocalizations ,点击安装。 中文输入问题:下载 IMESupport,解压到插件安装目录,重启 Sublime ,解决中文输入时输入框不跟随的问题。 中文字体:下载 Consolas-with-Yahei ,解压安装,在用户设置里替换为 "font_face": "Consolas-with-Yahei", . 主题 我使用的暗色主题:用 Package Control 搜索 Spacegray 和 Afterglow ,在用户设置里替换为: "color_scheme": "Packages/Theme - Spacegray/base16-ocean.dark.tmTheme", "theme": "Afterglow-green.sublime-theme" 细节调整 在用户设置里可添加如下代码: "word_wrap": "true", // 被遮挡自动换行 "fold_buttons": true, // 开启代码折叠 "fade_fold_buttons": true, // 折叠按钮自动隐藏 "tab_size": 4, // tab 缩进位数 "margin": 4, // 缩进 "tabs_small": true, // 使标签栏变小 "trim_trailing_white_space_on_save": true, // 自动移除行尾多余空格 "ensure_newline_at_eof_on_save": true, // 文件末尾自动保留一个空行,C 语言可用 推荐插件 以下插件可用 Package Control 直接安装。 StyleToken:显示代码所代表的颜色(RGB) FileHeader:自定义文件模板 打开 Preferences -> Package Settings -> FileHeader -> Settings - User ,把 Default 里的内容拷贝到 User , 并修改个人信息如: { "Default": { "author": "linyuxuanlin", "email": "824676271@qq.com", "website": "yxrct.com" } } 在 Preferences -> Browse Packages... -> FileHeader -> template -> header 或 body 中修改模板内容。 效果: 运行 Python 由于自带编译器没有用户输入,所以这里需要一个插件:SublimeREPL. 直接 用 Package Control 安装,并在 Preferences —> Key Buildings -> User 下添加快捷键唤醒: [ { "keys": ["f5"], "caption": "SublimeREPL:Python", "command": "run_existing_window_command", "args": { "id": "repl_python_run", "file": "config/Python/Main.sublime-menu" } }, ] 之后,在 Python 代码里可直接按 F5 运行。 自动格式化代码 安装 Python PEP8 Autoformat 插件,在 Key Buildings 中加入: { "keys": ["alt+r"], "command": "pep8_autoformat" }, 便可用 Alt + R 格式化 Python 代码。 总结 颜值即生产力。Sublime Text 不止支持 Python,几乎所有的文件格式都可以用它打开编辑。调教得当的话,在一个极简、强大的界面下敲代码,想想也是挺浪漫的。 参考与致谢 Sublime Text 3 调教你的私人利器(上) Sublime Text 自动生成文件头部注释(版权信息):FileHeader 插件的使用 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

宽带注入变压器的使用 🚧

宽带注入变压器的使用 🚧 宽带注入变压器用于将信号注入到电路中,例如开关电源的控制回路,配合环路分析仪实现开关电源的环路分析。本篇以 CYBERTEK 的宽带注入变压器 CK100(2Hz-2MHz)展开说明。 宽带注入变压器 CK100 的基本参数如下: 参 数 规 格 比例系数 1:1 带宽(-3dB) 2Hz—2MHz 隔离电压 600V CATIII 初级次级间电容 400pF@1kHz 次级最大电流 10mA 工作稳定 0°C to 50 °C 尺寸 85mm ×46mm ×30mm 重量 96g 参考与致谢 宽带注入变压器 CK100(2Hz-2MHz) 宽带注入变压器 CK100 数据手册 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

射频 - S 参数

射频 - S 参数 S 参数(Scattering parameters,S-Parameters,散射参数)用于反映反射信号 / 传输信号在频域范围内的特性(幅度 / 相位),它是一个复数矩阵。我们可以将电路内部视作一个黑盒子(不考虑内部电路元素),通过 S 参数测量它的端口特性。 S 参数的详细说明 S 参数的名称规范是,第一个数字代表测量的端口,第二个代表参考的端口,比如,S21 代表相对于端口 1 信号激励源,测出来端口 2 的信号。S 参数波的形式可以是功率、电压或电流。 如上图所示,S11、S22 代表反射系数(反射 / 输入),S21、S12 代表传输系数(传输 / 输入)。 S11 S11 指的是相对于端口 1 的入射信号,端口 1 的反射信号,\(S11=\frac{S_{Reflection}}{S_{Incident}}\)。 S21 S21 指的是相对于端口 1 的入射信号,端口 2 的传输信号,\(S21=\frac{S_{Transmission}}{S_{Incident}}\)。 S12 S12 指的是相对于端口 2 的入射信号,端口 1 的传输信号,\(S12=\frac{S_{Transmission}}{S_{Incident}}\)。 S22 S22 指的是相对于端口 2 的入射信号,端口 2 的反射信号,\(S22=\frac{S_{Reflection}}{S_{Incident}}\)。 参考与致谢 S 参数的意义及矢网实操测量方法 《S-Parameter Measurements Basics for High Speed Digital》 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

射频 - 基础知识 🚧

射频 - 基础知识 🚧 参考与致谢 PPT:射频基础知识培训讲义 射频工程师基础知识大全 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

射频 - 天线基础知识

射频 - 天线基础知识 本文将对天线的原理与基本的参数展开介绍。 天线的原理 天线(Antenna)是传导波与空间中自由电磁波之间的转换器,可以将导线上的电信号转化为无线电波发射到空间,也可以收集空间中的无线电波并转化为电信号(这两种模式从原理上可一视同仁,但有源天线例外)。 天线来源于由电感与平行板电容器组成的共振器,把平行板拉开,电感感量将减少。拉开一定距离,并把导线本身的电感当作谐振电感,就可以形成一个偶极子天线。 天线的参数 辐射密度(Radiation Density) 假设有一个理想的各向同性微波发射器,它是空间中一个点,产生球面波且各方向辐射均匀。 在此微波发射器上施加一个发射功率 \(P_S\) 时,在距离 \(r\) 处的辐射密度(也称功率密度)为: \[ S=\frac{P_S}{4\pi r^2} \] 辐射密度也可用远场中的电场和磁场强度的乘积定义: \[ S=E \cdot H \] 辐射方向图(Radiation Pattern) 辐射方向图用于描述天线远场三维辐射的效果。对于各向同性辐射发生器(下文称点源天线)来说,对空间中每个方向的辐射大小都是相同的,但它不能在特定方向上极化。对于一般天线,如偶极子和单极子天线,就具有方向性。举个例子,短偶极子天线在自由空间中的 3D 辐射方向图如下图所示。可以观察到,在天线轴的方向上,是没有辐射密度的: 除了用 3D 图表示辐射,通常也用水平、垂直两个轴向的 2D 剖面图来表示(也称为主平面方向图)。下图是偶极天线的水平方向与垂直方向图: 辐射方向图一般在极坐标系下绘制,这样可以直观看出每个方向的辐射程度。而在某些情况下(如高指向性天线),也可在笛卡尔坐标系(X-Y 系)下表示辐射图,可更清晰地突出主波束和相邻旁瓣的细节: 根据辐射图,可以看出天线的更多参数: 旁瓣抑制(Side Lobe Suppression,或旁瓣电平):表示主瓣与最高旁瓣之间的差值。 水平半功率波束宽度(Half-Power Beamwidth, HPBW):表示从主瓣最大高度下降 3dB 的左右两个角度之间的范围,通常在水平和垂直两个 2D 辐射方向图中呈现。 前后功率比(Front-to-Back Ratio):表示定向天线正向峰值增益与背面(180°)增益的比值,通常用 dB 表示。 方向性(Directivity) 天线的方向性因数 \(D\)(也称指向性系数)表示的是其辐射主方向上的辐射强度 \(F_{max}\) 与同功率(\(P_t\))下无损耗的点源天线的辐射强度 \(F_i\) 之比。在这里,我们以坡印亭向量(Poynting vector)表示功率密度,以此替代辐射强度: \[ \vec S=\vec E \times \vec H \] 注:在远场中,\(\vec S\) 垂直于 \(\vec E\),\(\vec S\) 和 \(\vec E\) 垂直于 \(\vec H\)。 功率密度是在离天线相同的距离 \(r\) 处测量的,因此,当 \(F_i=\frac{P_t}{4\pi}\) 时,可得出: \[ D=\frac{F_{max}}{F_i} \] 效率(Efficiency) 天线效率 \(\eta\) 一般定义为天线的辐射功率与输入功率之比。高效率天线能将输入的大部分能量辐射出去,而低效率天线大部分被吸收为天线内的损耗,或因为阻抗不匹配而被反射回来。对于无源天线而言,不管是作为发射还是接收天线,其效率都是相同的,此特性称为天线互易性(Antenna Reciprocity)。天线辐射效率 \(\varepsilon_R\) 的公式表达如下: \[ \varepsilon_R=\frac{P_{refl}}{P_{forw}}\cdot 100\% \] 天线效率不仅以百分数表示,也常用 dB 表示。例如,10% 的效率等同于 -10dB,50% 的效率等同于 -3dB。 以上的公式表示的是天线的辐射效率,还有另一种效率称为天线的总效率 \(\varepsilon_r\)。它们之间的关系是,总效率等于辐射效率乘以阻抗匹配损耗 \(M_L\): \[ \varepsilon_r=M_L\cdot\varepsilon_R \] 因阻抗匹配损耗值是介于 0~1 之间的,所以天线的总效率始终会小于辐射效率。如果阻抗完全匹配,则两个效率是相等的。在实际中,天线的效率通常指考虑阻抗匹配损耗后的总效率,因此,更好地匹配阻抗,能提高天线的实际效率。 增益(Gain) 天线增益用来衡量天线朝一个特定方向收发信号的能力。增益与天线方向图密切相关,方向图主瓣波束宽度越窄,副瓣越小,增益越高。 在相同的条件下,增益越高,能量越集中,波瓣越窄,电波传播的距离越远,但覆盖角度会变小,所以在实际中应合理选择天线的增益。 天线的增益对应于方向性系数,表示辐射主方向上的辐射强度 \(F_{max}\) ,与同功率(\(P_{t0}\))下无损耗的点源天线产生的辐射强度 \(F_{i0}\) 之比。当 \(F_{i0}=\frac{P_t}{4\pi}\) 时,可得出: \[ G=\frac{F_{max}}{F_{i0}} \] 不同于方向性系数的是,增益将天线的效率 \(\eta\) 也考虑了进来: \[ G=\eta \cdot D \] 如果天线的效率是 100%,则增益与方向性系数是相等的,但现实中效率不可能达到 100%,所以在实际测量中,增益会比方向性系数更常用。 增益和方向性系数通常以 dB 表示,增益 \(g(dB)=10logG\),方向性系数 \(d(dB)=10logD\)。由此衍生出 dBd(相对于半波偶极子天线)与 dBi(相对于点源天线)单位,它们之间的关系是 dBi=dBd+2.15。 关于增益的一些补充说明: 天线是无源器件,不产生能量。天线增益只是一种将能量有效集中向某特定方向辐射 / 接受电磁波的能力。 天线的增益由振子叠加而产生。增益越高,天线长度越长。增益每增加 3dB,体积就就会增大一倍。 实际增益(Practical Gain) 增益的定义,前提是天线与源端之间阻抗完全匹配,但实际情况下很少能实现。所以,将实际非理想匹配下测量到的增益值,称为天线的实际增益。其公式定义如下: \[ G_{pract}=(1-|r|^2)\cdot G \] 其中,\(r\) 表示反射系数,在下文将详细介绍。 有效面积(Effective Area) 天线的有效面积 \(A_W\) 是专门为接收天线定义的参数,用于衡量天线拾取信号的能力,定义为从拾取的最大接收功率 \(P{rmax}\) 与平面波功率密度为 \(S\) 之比: \[ A_W=\frac{P{rmax}}{S} \] 对于抛物面反射器或平板阵列等孔径天线,有效面积是物理面积乘以孔径效率 \(q\)(Aperture Efficiency): \[ A_W=A_g\cdot q \] 天线的有效面积也与增益有关系(正反可互推): \[ A_W=\frac{\lambda ^2}{4\pi}\cdot G \] 输入阻抗(Input Impedance) 天线的输入阻抗是个至关重要的参数,它是一个复数值,由实部电阻与虚部电抗组成: \[ Z_{in}=R_{in}+jX_{in} \] 其中,实部电阻 \(R_{in}\) 由辐射电阻 \(R_R\) 与损耗电阻 \(R_L\) 组成: \[ R_{in}=R_R+R_L \] 对于小部分天线来说,辐射电阻 \(R_R\) 计算时需要指定其在天线上的位置,因为它是空间相关的(辐射功率与天线电流均方根的商值)。对于天线电流也同理,需要指定天线馈电点,得出最大电流值。 如果天线工作在谐振状态,则输入阻抗的虚部为 0。电短线性天线通常表现为容性(\(X_{in}<0\)),电长线性天线通常表现为感性(\(X_{in}>0\))。 额定阻抗(Nominal Impedance) 额定阻抗 \(Z_n\) 通常规定为天线连接线的特性阻抗,通常为 50Ω。通常天线阻抗须与之相匹配。 阻抗匹配(Impedance Matching) 如果天线、连接线、源端之间的阻抗不匹配,就会出现不连续性。如下图的例子,从源端发射出的一部分能量被反射,无法到达天线,从而影响发射效果;反过来从天线接收的能量也不能全部传输到接收机: 阻抗匹配可以用发射天线的等效电路图来看,当满足 \(Z_S=Z_{in}\) 时,才能获得最大传输功率: 驻波比(Voltage Standing Wave Ratio, VSWR) 如果阻抗不匹配,可能会造成一些能量被反射回来,导致驻波(Standing Waves)的产生。我们用驻波比 \(s\) 来描述驻波的特征,定义为传输线上最大和最小电压的比值(也可以根据电流的比值计算而得): \[ s=\frac{V_{max}}{V_{min}}=\frac{I_{max}}{I_{min}} \] 除此之外,也可以通过入射电压 \(V_{forw}\) 与反射电压 \(V_{vref}\) 的振幅(或功率)来计算驻波比: \[ s=\frac{|V_{forw}|+|V_{refl}|}{|V_{forw}|-|V_{refl}|}=\frac{\sqrt{P_{forw}}+\sqrt{P_{forw}}}{\sqrt{P_{forw}}-\sqrt{P_{forw}}} \] 反射电压 \(V_{vref}\) 与入射电压 \(V_{forw}\) 的振幅之比称为反射系数 \(r\)(Reflection Roefficient): \[ r=\frac{V_{refl}}{V_{forw}} \] 因此,驻波比也可以通过反射系数计算而得: \[ r=\frac{1+|r|}{1-|r|} \] 另外,我们定义反射系数的对数形式为回波损耗 \(a_r\)(Return Loss): \[ a_r=-20log|r| \] \[ =-20log\frac{V_{refl}}{V_{forw}}=-10log\frac{P_{refl}}{P_{forw}} \] 衡量阻抗匹配质量的参数有很多,它们之间的简单对应关系如下: VSWR R \(a_r\) 反射的能量 1.002 0.001 60dB \ 1.01 0.005 46dB \ 1.1 0.05 26dB 0.2% 1.2 0.1 20dB 0.8% 1.5 0.2 14dB 4% 2.0 0.33 9.5dB 11.1% 2.0 0.5 6dB 25% 5.0 0.67 3.5dB 44.4% 天线因子(Antenna Factor) 天线因子(天线系数 / 天线因数)也称传感器系数或转换系数,通常用于接收天线,定义是电场强度与在馈电点(50Ω 下)测得的输出电压之比: \[ K=\frac{E}{V} \] 大部分时候也用它的对数形式(dBm)表示: \[ k=20log K \] 如果天线有经过出厂校准,一般天线因子的值是固定的。天线因子与实际增益之间的关系是: \[ K=\frac{9.73}{\lambda \cdot \sqrt{G}} \] \[ k=-29dB+20log(\frac{f}{MHz})-g \] 带宽(Bandwidth) 天线的带宽参数用于衡量其可用频率范围,在这个范围内,天线的性能能满足要求。带宽的标准通常是阻抗匹配(VSWR<1.5),增益或旁瓣抑制等其他参数也可以作为带宽标准。 对宽带天线(Broadband Antennas)而言,最高与最低可用频率的比率是确定的。举个例子,2:1 的比率称为两倍频,10:1 的比率称为十倍频: \[ BW=\frac{f_H}{f_L} \] 宽带天线指的是 BW≥2。此外,有另一个带宽的定义,仅对窄带天线(Narrowband Antennas)有效: \[ BW=\frac{f_H-f_L}{f_C}\cdot100\% \] 其中,\(f_C\) 表示中间频率。此 BW 的值可超过 100%(≤200%)。 参考与致谢 《Antenna-Basics_Rohde&Schwarz》 《如何選擇天線於微波系統_Rohde&Schwarz》 天线增益 | WLAN 天线快速入门 What Is Antenna Gain 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

射频 - 天线的分类与选型 🚧

射频 - 天线的分类与选型 🚧 天线的分类 半波偶极子天线 单极天线 指向天线 对数周期偶极子天线(LPDA) 主动天线 半波偶极子天线 偶极子天线是天线的最基本形式,其中以半波(调谐)偶极子天线最具代表性。它的总长度略小于半个波长,谐振时的输入阻抗一般介于 50~70Ω 之间(具体取决于其长度与直径之比),因此它比较适配 50Ω 标准阻抗的传输线与负载。偶极子天线上的电流分布如图中红线所示(近似为正弦曲线): 偶极子天线的辐射图在上一篇文章有提及,其所在的参考平面(E 平面)辐射图看起来像数字「8」,而垂直于轴(H 平面)的辐射图看上去是较为均匀的圆形: 半波偶极子天线的局限是智能工作在特定频率下,因为其天线输入阻抗很大程度上取决于天线的长度与波长的比值,所以当天线离半波谐振频率越远,阻抗失配的问题就会愈发明显。阻抗变化幅度会随着长度与直径之比变小而变小,如图: 参考与致谢 《Antenna-Basics_Rohde&Schwarz》 《如何選擇天線於微波系統_Rohde&Schwarz》 通俗易懂!看完你就是半个天线专家了 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

射频 - 无线电波与天线 🚧

射频 - 无线电波与天线 🚧 无线电波与超短波 无线电波的概念 无线电波是一种能量传输形式,在传播过程 中,电磁在空间上相互垂直,同时又都垂直于传播方向。 无线电波像池塘中的波浪,在传播时会减弱。 无线电波在真空中的传播速度等于光速(c,300000km/s),在非真空环境下,传播速度受介质影响,计算公式如下: \[ v=\frac{c}{\varepsilon^{\frac{1}{2}}} \] 其中,\(\varepsilon\) 为传播介质的介电常数。 无线电波的波长、频率和传播速度的关系: \[ \lambda=\frac{V}{f} \] 其中,\(\lambda\) 为波长(m),\(V\) 为传播速度(m/s),\(f\) 为频率(Hz)。 无线电波的极化 无线电波的极化,指的是无线电波在空间传播时,其电场方向按一定的规律而变化。 天线 天线的极化 天线辐射电磁场的电场方向,就是天线的极化方向。 天线的原理 导线载有交变电流时,就可以形成电磁波的辐射,其辐射的能力与导线的长短和形状有关。 当导线的长度增大到可与波长相比拟时,导线上的电流就大大增加,因而就能形成较强的辐射。通常将上述能产生显著辐射的直导线称为振子。 天线相当于一个四端网络: 如果振子两臂长度相等,那么称之为对称振子或半波振子: 例如,400MHz 的对称振子长度大约为 400mm;800MHz 的对称振子长度大约为 200mm。 对称振子上的各种场的分布: 天线的输入阻抗 🚧 参考与致谢 《天线-无线电波学习资料_华为》 天线增益,精通天线的第一课 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

射频 - 组件与系统 - 导线

射频 - 组件与系统 - 导线 在射频(radio frequency, RF)电路中,阻容感这些基本元器件,表现出来并不是只有阻性、容性、感性单一特性。我们将从最基本的元器件开始分析。 射频电路中的导线可有多种形式。频频谱中导线的行为在很大程度上取决于导线的直径和长度。在 AWG(American Wire Gauge)规范中,规定了每种线规及对应的直径(AWG 值每相差 6,英制直径就相差一倍): AWG 值 直径(mil) 50 1 44 2 38 4 32 8 36 16 20 32 14 64 趋肤效应 导体在低频下,电子的传输覆盖整个导体截面。随着频率增加,截面中心磁场的增强,会对电子的传输产生阻抗,将电子挤向边缘,使截面中心的电流密度低于边缘处,这就是 趋肤效应(也译为集肤效应)。趋肤效应在所有导体(包括阻容感的管脚)。 导体中电流密度下降到边缘的 \(\frac{1}{e} (37\%)\) 的深度,叫做 趋肤深度,这是与频率、导体磁导率、电导率相关的函数,因此不同的导体有不同的趋肤深度。 趋肤效应造成的影响是让导体的有效横截面减小,让交流阻抗变大。对于敷铜而言,趋肤深度在 60 Hz 时约为 0.85 cm,在 1 MHz 时约为 0.007 cm(即 63% 的 RF 电流在表面到距离表面 0.007cm 的宽度范围内流动)。 直线电感 任何载流介质都会产生磁场,如果介质中是交流电,那这个磁场也会交替变化,因此在导线上产生一个电压,它将阻止任何电流的变化,这种现象称为 自感,我们把有这种性质的称为电感。直线电感虽然微不足道,但在高频下就需要注意了。 直线电感的大小取决于长度与直径,计算公式如下: \[ L=0.002l[2.3\log(\frac{4l}{d})-0.75] uH \] 其中,电感大小 \(L\) 的单位是 \(uH\),导体长度 \(l\) 和直径 \(d\) 的单位为 \(cm\)。 电感是 RF 设计中不可忽视的因素,所有电感和 RF 电路(包括连接线、管脚等等)都会表现出感性。 参考与致谢 《RF-Circuit-Design(second-edition)_Chris-Bowick》 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

射频 - 组件与系统 - 电容

射频 - 组件与系统 - 电容 电容也广泛用于射频,如旁路、级间耦合、谐振电路、滤波器。 平行板电容 电容器是由绝缘材料或电介质隔开的两个导电表面组成的任何设备。电介质通常是陶瓷、空气、纸、云母、塑料、薄膜、玻璃或油。电容器的电容是当导体之间存在电位差时允许存储电荷的特性。电容以法拉为单位测量。 电容是由绝缘材料或电介质隔开的两个导电表面组成的。电介质通常是陶瓷、空气、纸、云母、塑料、薄膜、玻璃或油。电容值是表示两导体存在电位差时,允许储存电荷的特性: \[ C=\frac{Q}{V} \] 其中,电容值 \(C\) 的单位是 \(F\)(法),电荷值 \(Q\) 的单位是 \(C\)(库伦)。因为 \(F\) 的单位太大,所以有 \(1uF=10^{-6}F\),\(1pF=10^{-12}F\) 如果我们知道平行板面积 \(A\),平行板间距离 \(A\)(单位是英寸),电介质材料的介电常数 \(\varepsilon\)(单位是 \(f/m\)),那么平行板电容器的计算公式可表示为: \[ C=\frac{0.2249\varepsilon A}{d\varepsilon_0} pF \] 其中,\(\varepsilon_0\) 是自由空间中的介电常数(\(\varepsilon_0=8.854*10^{-12}f/m\))。 电容等效电路 平行板电容器只是一种理想的电容器,现实世界中,电容器的等效电路如图所示: 其中,\(C\) 为我们通常所指的电容,\(L\) 为管脚电感,\(R_s\) 是以功率因数(PF)或耗散因数(DF)表示的散热损耗,\(R_p\) 表示绝缘电阻。更详细的定义如下: 功率因数(Power Factor, PF): 理想电容器中,交流电流将超前施加的电压 90°。因等效电路中总串联电阻(\(Rs + Rp\)),此相位角 \(φ\) 在实际电容器中会更小。功率因数是关于温度、频率和电介质材料的函数,由以下公式定义: \[ PF=\cos \phi \] 绝缘电阻(Insulation Resistance): 表示在施加电压的情况下流过电容器电介质的直流电流量。没有材料是完全绝缘的,所以会有漏电流。在等效电路中,这条漏电流的路径用 \(R_p\) 表示,其值通常高于 100000 兆欧。 有效串联电阻(Effective Series Resistance, ESR): 此电阻值是 \(Rs + Rp\) 的组合等效值,是电容器的交流电阻。由以下公式定义: \[ ESR=\frac{PF}{\omega C}(10^6) \] 其中,\(\omega=2 \pi f\)。 耗散因数(Dissipation Factor, DF): 耗散因数是交流电阻与电容器电抗之比,由以下公式定义: \[ DF=\frac{ESR}{X_c}*100\% \] 衍生出来的品质因数 Q,是耗散因数的倒数,品质因数越大,电容的性能越好。 电容器中这些缺陷的影响可以在图 1-9 中看到。在这里,理想电容器的阻抗特性与实际电容器的阻抗特性相对应。如图所示,随着工作频率的增加,引线电感变得很重要。最后,在 Fr 处,电感与电容器串联谐振。然后,在 Fr 之上,电容器就像一个电感器。通常,较大值的电容器往往比较小值的电容器具有更多的内部电感 在实际电容器中,受这些因素的影响,频率与阻抗的变化曲线如图: 可以看到,随着频率的升高,管脚电感的影响变大,最终在 \(F_r\) 处,电感与电容产生串联谐振。频率再往上,电容表现为感性。一般来说,大电容往往比小电容有更大的电感。因此举个例子,在 250MHz 频率下,100nF 的电容比 300pF 的旁路效果差,因为根据电抗的公式 \(X_e=\frac{1}{\omega C}\),在特定频率下,大电容比小电容有更小的的电抗。 但是,在射频频率上,情况可能正好相反。在某些较高频率下,一个 100nF 的电容可能会比一个 330pF 的对信号产生更高的阻抗。这是在设计频率高于 100 MHz 的电路时必须考虑的问题。使用网分仪可以看出在特定频率下电容的阻抗。 电容的种类 电容可以由各种介电材质制造而成。常用的有以下类别: (未完待续) 参考与致谢 《RF-Circuit-Design(second-edition)_Chris-Bowick》 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

射频 - 组件与系统 - 电阻

射频 - 组件与系统 - 电阻 电阻是一种导电介质的属性,在交流环境下,电阻器有时候仍发挥着其直流属性(例如在晶体管的偏置网络中),有可能会破坏电路的射频工作点。 电阻等效电路 在射频电路中,电阻的等效模型是这样的: 图中,R 表示电阻本身,L 表示管脚等效电感,C 是寄生电容的组合(因电阻器的结构而异)。一般来说,碳膜电阻的高频性能很差,因为它是由密集的介电颗粒或碳颗粒组成的,每对碳颗粒之间是一个很小的寄生电容。这些寄生效应是等效电路的重要组成成分。 线绕电阻在射频电路中也有问题,这些电阻往往在高频上表现出变化的阻抗,对于 10MHz-200MHz 频率范围内的小阻值电阻来说尤为明显。绕线电阻的寄生电感比碳膜电阻大,电感值可用单层空芯电感计算公式(下文会提及)近似求得。因为线绕电阻电感的特征明显,其阻抗会随着频率的增加而增大。在某个频率(\(F_r\))下,电感(\(L\))将会与并联电容(\(C\))产生谐振,产生一个阻抗的峰值,在峰值点之后,频率越增加,阻抗反而越小,如下图所示: 金属膜电阻可在频率范围内表现出最佳的特性,虽然其等效电路与碳膜、绕线电阻一样,但等效电路中各个寄生元件的值都会降低。 如图,金属膜电阻的阻抗在大致高于 10MHz 时开始有降低的趋势,这是由于等效电路中的并联电容导致的。但是在很高的频率上,或者很低的阻值(50Ω)时,阻抗会受管脚电感与趋肤效应的影响。管脚电感产生了一个谐振峰值。而趋肤效应影响的是曲线的斜率。 参考与致谢 《RF-Circuit-Design(second-edition)_Chris-Bowick》 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

射频 - 谐振电路 - 基本定义

射频 - 谐振电路 - 基本定义 在这一大章节下,我们将研究并联谐振电路及其在射频下的特性,负载 Q 的概念以及它与源阻抗和负载阻抗的关系,也会研究元件的损耗,以及它们是如何影响电路的,最后将展示一些耦合谐振电路。 谐振电路应用在射频电路中每个发射器、接收器、测试设备上,选择性地将某个频率或一组频率从源传递到负载,同时衰减该通带之外的所有其他频率。理想的谐振电路是这样子的: 它是一个完美的矩形通带,在频率小于或大于目标带宽时无线衰减,同时允许目标贷款内的信号不受干扰地通过。但因为构成滤波器的元器件的物理属性,完美滤波器是不可能的,但我们可以设计满足需求的非理想滤波器。 带宽 带宽(Bandwidth)一般指半功率带宽,即幅值响应比带通响应低 3dB 处,上限频率与下限频率的差(\(f_2-f_1\)),如图所示: dB 的含义与计算 dB 是个相对值,能够简短表示很大或很小的数。假如我们表示功率变化增大到 100000000 倍,只需要写 +80dB 即可。 \[ dB=10\lg(\frac{P_1}{P_0}) \] 其中,\(P_1\) 表示当前功率,\(P_0\) 表示参考功率。假如 \(P_1\) 是 \(P_0\) 的两倍,那么: \[ 10\lg(\frac{P_1}{P_0})=10\lg2=3dB \] 假如 \(P_1\) 是 \(P_0\) 的一半,那么: \[ 10\lg(\frac{P_1}{P_0})=10\lg\frac{1}{2}=10\lg2^{-1}=-3dB \] 同理,+10dB 表示功率增大 10 倍,-10dB 表示功率减小为 1/10。 3 dB 在功率图或误码率图中经常出现,指的是 +3 dB 表示增大为两倍,-3 dB 表示下降为 1/2。 dBm 与 dBw dBm、dBw 就是把 dB 公式中的参考功率 P0 分别换成 1 mW、1 W: \[ dBm=10\lg(\frac{P_1}{1mW}) \] \[ dBw=10\lg(\frac{P_1}{1W}) \] 因为 1 mW、1 W 都是确定的值,因此 dBm、dBw 都可以表示功率的绝对值。 有一个当前功率与使用 dBm、dBw 的换算表: watt dBm dBw 0.1 pW -100 dBm -130 dBW 1 pW -90 dBm -120 dBW 10 pW -80 dBm -110 dBW 100 pW -70 dBm -100 dBW 1 nW -60 dBm -90 dBW 10 nW -50 dBm -80 dBW 100 nW -40 dBm -70 dBW 1 μW -30 dBm -60 dBW 10 μW -20 dBm -50 dBW 100 μW -10 dBm -40 dBW 794 μW -1 dBm -31 dBW 1.000 mW 0 dBm -30 dBW 1.259 mW 1 dBm -29 dBW 10 mW 10 dBm -20 dBW 100 mW 20 dBm -10 dBW 1 W 30 dBm 0 dBW 10 W 40 dBm 10 dBW 100 W 50 dBm 20 dBW 1 kW 60 dBm 30 dBW 10 kW 70 dBm 40 dBW 100 kW 80 dBm 50 dBW 1 MW 90 dBm 60 dBW 10 MW 100 dBm 70 dBW 其中,最常用的是 1 W = 30 dBm。 dBi、dBd 与 dBc dBi、dBd 与 dBc 的计算方法与 dB 相似,表示的是功率相对值,但参考基准 \(P_0\) 所代表的含义不同。 dBx 参考基准 dBi(Decibe-Isotropic) 全方向性天线(Isotropic antenna) dBd(Decibe-Dipole) 偶极子天线(Dipole antenna) dBc(Decibe-Carrier) 载波(Carrier) 表示同一增益,dBi 一般比 dBd 大个 2.15,这个差值是两种天线的不同方向性导致的。 谐振电路的中心频率与其带宽之比(Q) 此 Q 与上一篇文章的 Q 定义不同。Q 是谐振电路选择性的量度,Q 值越高,带宽越窄,谐振电路的选择性就越高。Q 的公式定义如下: \[ Q=\frac{f_e}{f_2-f_1} \] 形状因子(Shape Factor, SF) 谐振电路的形状因数通常定义为谐振电路 60dB 带宽与 3dB 带宽之比。举个例子,如果 60dB 带宽 \(f_4 - f_3\) 为 3 MHz,3dB 带宽 \(f_2-f_1\) 为 1.5 MHz,则形状因子为: \[ SF=\frac{3MHz}{1.5MHz}=2 \] 形状因子是衡量裙边陡峭程度的一种方式。数字越小,响应裙边越陡峭。完美滤波器的形状因子为 1,这是终极取值。形状因子比 1 小的通带如下图,但这在物理上是不可能的: 极限衰减(Ultimate attenuation) 指的是通带与带通外衰减峰值之差。受元器件实际物理特性影响,极限衰减不可能是无限的。 插入损耗(Insertion Loss) 指在信号源段与末端之间的组件造成的衰减损耗。在阻抗没有匹配的情况下,因为这些组件的阻性,源端有些信号会被这些组件吸收,这里造成的衰减就叫插入损耗,以 dB 表示。 纹波(Ripple) 纹波表示谐振电路通带的平坦度,以 dB 表示。它的值定义为通带中的最大衰减与最小衰减的差。 参考与致谢 《RF-Circuit-Design(second-edition)_Chris-Bowick》 100 分钟看懂 dB、dBm、dBw 的区别 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

射频 - 谐振电路 - 无损组件的共振

射频 - 谐振电路 - 无损组件的共振 在之前的章节,我们在基本元器件的寄生器件中提到了共振。以下将研究共振产生的原因及如何利用它。 无损组件的共振 从上图的分压规则可以看出,当阻抗为 \(Z_p\) 的分流元件放置在具有内阻 \(R_s\) 的发生器的输出端时,该电路可达到的最大输出电压为: \[ V_{out}=\frac{Z_p}{R_s+Z_p}(V_{in}) \] 因此,\(V_{out}\) 始终小于 \(V_{in}\)。如果 \(Z_p\) 是与频率相关的阻抗(例如容性或感性电抗),则 \(V_{out}\) 也将与频率相关,并且 \(V_{out}\) 与 \(V_{in}\) 的比率是电路的增益(或在这种情况下为损耗),也将取决于频率。例如,我们以一个 25pF 电容器作为分流元件: 并绘制 \(V_{out}/V_{in}\) 函数(以 dB 为单位)与频率的关系: 依据以下的公式: \[ \frac{V_{out}}{V_{in}}=20\log_{10} \frac{X_C}{R_s+X_C} \] 其中,\(\frac{V_{out}}{V_{in}}\) 是以 dB 表示的损耗;\(R_s\) 表示源阻抗;\(X_C\) 表示容抗,\(X_C=\frac{1}{j\omega C}\)。 此 RC 电路的损耗会随着频率的增加而增加。这就形成了一个简单的低通滤波器。需要注意的是,频率每翻一倍,衰减斜率会以 6 dB 的速率下降。这是由于电路中的单个电抗元件导致的。下文将会看到,对于我们加进电路中的每个重要电抗元件,该衰减斜率将额外增加 6 dB。 如果我们把电路中的电容换成一个 0.05µH 的电感: 可以绘制出这样的曲线: 依据的是以下公式: \[ \frac{V_{out}}{V_{in}}=20\log_{10} \frac{X_L}{R_s+X_L} \] 其中,\(X_L\) 表示感抗,\(X_L=j\omega L\)。 这里形成了一个最终衰减斜率为 6 dB/倍频程的简单高通滤波器。 根据上文的公式,我们能够绘制出两个独立且相反的电抗元件的频率响应。如果我们将电感和电容同时并进源端,形成一个 LC 电路: 我们将得到这样的曲线: 根据以下公式计算而得的: \[ \because V_{out}=\frac{X_{total}}{R_s+X_{total}}(V_{in}) \] \[ \because X_{total}=\frac{X_C*X_L}{X_C+X_L} \] \[ \because X_C=\frac{1}{j\omega C} \] \[ \because X_L=j\omega L \] \[ \therefore \frac{V_{out}}{V_{in}}=\frac{j\omega L}{(R_s-\omega^2 R_s L C)+j\omega L} \] 如果用 dB 表示,可以表示为: \[ \frac{V_{out}}{V_{in}}= 20\log_{10} | \frac{j\omega L}{(R_s-\omega^2 R_s L C)+j\omega L} | \] 在上面的曲线中,当我们接近调谐电路的谐振频率时,谐振曲线的斜率增加到 12 dB/倍频程,这是因为两个电抗元件都在以 6 dB/倍频程的速率变化,并以相反的方向倾斜;然而,当我们在任一方向远离共振时,曲线再次稳定到 6 dB/倍频程的斜率,因为只有一个电抗发挥作用,另一个电抗在这些频率下对电路呈现非常高的阻抗,且在电路中表现几乎可以忽略。 RLC 滤波器可用于从环境无线电波的总频谱中选择某个窄范围的频率,作为带通滤波器使用。 参考与致谢 《RF-Circuit-Design(second-edition)_Chris-Bowick》 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

射频 - 谐振电路 - 负载 Q 值 🚧

射频 - 谐振电路 - 负载 Q 值 🚧 我们将谐振电路的中心频率与其 3dB 衰减带宽之比定义为谐振电路的 Q 值,也称为负载 Q 值,因为它描述了实际电路内或负载条件下谐振电路的通带特性。谐振电路的负载 Q 取决于三个主要因素: 源阻抗 \(R_s\) 负载电阻 \(R_L\) 上一章提到的元器件的 Q 值 \(R_s\) 和 \(R_L\) 对负载 Q 的影响 源阻抗和负载阻抗对谐振电路的负载 Q 的影响如上图所示。原始曲线(虚线)是由 50Ω 源阻抗,0.05uH 的无损电感器和 25pF 无损电容器组成的电路的谐振曲线,它的 Q 值由上文的公式 \(Q=\frac{f_e}{f_2-f_1}\) 计算约为 1.1,显然这不是一个非常窄带或高 Q 值的设计。 把源阻抗变为 1000Ω,绘制出一条新的谐振曲线(实线),谐振电路的 Q 值明显增加到 22.4。通过提高源阻抗,我们增加了谐振电路的 Q 值。 上面的方法并不能看出负载阻抗对谐振曲线的影响。如果像这样把外部负载连接到谐振电路: 可以等效为: 此时负载 Q 可以表示为: \[ Q=\frac{R_p}{X_p} \] 其中,\(R_p\) 是等效总并联电阻,\(X_p\) 表示容抗 / 感抗(他们在谐振时是相等的)。 e.g. 如果我们要设计一个谐振电路,使其在 150Ω 的源阻抗和 1000Ω 的负载阻抗条件下运行。在 50 MHz 的谐振频率下,负载 Q 须等于 20。假设无损耗元件且无阻抗匹配。那么我们可以得出 \(R_p=130Ω\),根据上文公式,\(X_p=\frac{R_p}{Q}=\frac{130}{20} =6.5Ω\),又因为 \(X_p=\omega L=\frac{1}{\omega C}\),因此,可选 20.7nH 的电感、489.7pF 的电容。 可以看出,\(R_p\) 的降低会降低谐振电路的 Q 值,并且,如果 \(R_p\) 不变、改变 \(X_p\),可以获得相同的效果。因此,对于给定的源阻抗和负载阻抗,当电感为小值而电容器为大值时,可以获得谐振电路的最佳 Q 值。无论哪种情况,\(X_p\) 都会降低。例如: 因此,采用这两种方法都可以对 Q 值进行调整: 选择源阻抗和负载阻抗的最佳值。 选择优化 Q 的 L 和 C 的分量值。 但通常我们只能用第二种方法,因为在许多情况下,源和负载是定好的,没法去改变他们。这种情况下,\(X_p\) 受一个给定的 Q 值定义,但通常算出来的值没有合适的实物值与之匹配,在下文将给出解决方法。 元器件的 Q 值对负载 Q 值的影响 在上文中,我们都是假设谐振电路中使用的元件是无损器件,元器件的 Q 值不会对负载 Q 值产生影响。但在非理想情况下,我们必须考虑单个元件的 Q 值。 在无损谐振电路中,谐振时电路端子上的阻抗是无限大的。但在实际电路中,由于元件损耗,会存在一些等效并联电阻: 电阻 (Rp) 及其相关的并联电抗 (Xp) 可以从 参考与致谢 《RF-Circuit-Design(second-edition)_Chris-Bowick》 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

将应用封装为 Docker 容器

将应用封装为 Docker 容器 将应用封装为 Docker 容器,可以更加方便地部署管理。下面是一个示例,演示了如何将一个 Python 应用封装为 Docker 容器,并使用 Docker Compose 的方式执行。 基本模板 将应用 Docker 容器化,首先需要确保 Docker 已经安装。接着,需要在你的 Python 应用程序根目录下,创建这两个文件:Dockerfile 和 compose.yaml,它们大致会包含以下内容: Dockerfile # 设置基础镜像为 Python 官方镜像,版本可自定义 FROM python:3.9 # 设置工作目录为 /app WORKDIR /app # 复制 Python 应用程序的依赖文件 COPY requirements.txt . # 安装应用程序依赖 RUN pip install --no-cache-dir -r requirements.txt # 复制应用程序文件,从当前目录拷贝进容器内的目录 COPY . . # 设置默认执行命令 CMD ["python", "app.py"] compose.yaml version: "3" services: app: build: . 在这个 compose.yaml 文件中,我们定义了一个服务名为 app 的服务。通过 build: . 指令,它将使用当前目录下的 Dockerfile 文件来构建镜像。在 compose.yaml 的目录下执行 docker compose up,即可构建并启动这个应用。 实例:将一个简单的 Python 应用封装为 Docker 容器 以下是一个简单的 Hello World 应用示例, 这是一个示例的 Python 应用,用于在网页上打印 Hello World: app.py from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello World!" if __name__ == "__main__": app.run(host="0.0.0.0", port=int("8000"), debug=True) 如果我们按照普通的流程部署 Python 应用,而不采用容器化的方法,则需要先安装依赖,对于某些需要编译安装包,在 Windows 环境下还可能出错,可能会缺失必要的头文件。如果我们将其封装为 Docker,就可以忽略环境的差;即使 Host 主机不联网,也只需拷贝镜像即可完成部署。以下的步骤展示将其 Docker 容器化,并用 Docker Compose 部署。 首先,创建一个名为 Dockerfile 的文件,在其中填写以下内容: Dockerfile # 设置基础镜像为Python官方镜像 FROM python:3.9 # 复制应用程序文件 COPY . /app # 设置工作目录 WORKDIR /app # 安装依赖 RUN pip install flask # 暴露 8000 端口用于访问 EXPOSE 8000 # 启动应用程序 CMD python ./app.py 然后,在同一目录下创建一个名为compose.yaml的文件,将以下内容复制到其中: compose.yaml version: "3" services: helloworld-flask: build: . ports: - "8099:8000" # 端口 8099 可自定义 现在,你可以打开终端,进入包含 Dockerfile 和 compose.yaml 文件的目录,并运行以下命令来启动应用程序: docker compose up Docker 将会构建镜像并启动容器。访问 http://localhost:8099 即可看到 Hello World 的字符。通过以上步骤,可以将一个简单的 Python 应用容器化,并使用 Docker Compose 进行部署。 参考与致谢 Containerize an application 3 分钟将 Python 应用容器化

2025/9/17
articleCard.readMore

小米手机折腾记录

小米手机折腾记录 最近买了一部极具性价比的手机,红米 Note 12 Turbo,又回到了 Android 的大阵营,在这儿记录一下折腾的过程。 刷欧版 MIUI 放弃国行版 MIUI 的原因是,从 MIUI 13 开始,有传闻内置了系统级的反诈,我并不希望自己的手机成为监控的工具。并且在国行版 ROM 中,不少系统 App 带牛皮藓广告,就算关掉了,下回更新系统还是会加回来。相比之下,国外版本的 ROM 会相对更遵守 Android 的规范,也没了广告,系统相对干净。 小米手机在刷机前,需要先解锁 Bootloader(俗称解 BL 锁)。一般需要插 SIM 卡并登小米账号,等上 7 天(等过 7 天无理由退货期),下载小米官方的 手机解锁工具 即可解锁。 为了方便且能够在手机上持续 OTA 更新,我选择的是线刷欧版 EEA(官方版)的 ROM,可以在 XiaomiROM.com 上找到你的机型对应的 ROM 的官方下载链接。如果不想系统里有内置不可卸载的谷歌全家桶,可以尝试欧版 EU(民间版),在 SourceForge 上可以找到。 刷机一般用线刷的方式(即连数据线到电脑,用刷机工具把 ROM 刷到手机上)。首先需要下载小米官方的 线刷工具 MiFlash。需要注意的是,MiFlash 仅支持小米官方 ROM 固件。 线刷的具体步骤,可参考 小米手机线刷方式刷机指南。如果在刷机过程中遇到错误信息,可参考 小米线刷报错问题及解决方法。刷机前注意先备份,参考 小米手机数据备份和还原方法;刷机的时候,尽量用原装数据线,连接电脑 USB2.0 的接口,ROM 的路径也不要带中文。 使用 Magisk 获取 Root 权限 Magisk 是一个强大的 Android 底层自定义工具,可以用来获取 Root 权限,并授权给各种功能模块,也有隐藏自身 Root 状态的功能,防止一些 App 提示系统不安全。 安装 Magisk 的具体教程可参考 小米手机安装面具教程(Xiaomi 手机获取 root 权限)。 刷入 Magisk 并获取 Root 权限后,有以下的玩法可以尝试: LSPosed 安装教程(LSP 框架安装教程) MIUI 系统拯救计划 Magisk 安装 Shamiko 模块对软件隐藏 Root 小米手机卸载谷歌全家桶软件方法 参考与致谢 解锁小米手机 XiaomiROM.com Xiaomi.eu Multilang MIUI ROMs Files 下载官方小米刷机工具 MiFlash,含小米刷机教程步骤 MiFlash 线刷工具下载合集 Windows 配置 fastboot 和 adb 命令环境变量 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

嵌入式 Linux - GPIO 子系统

嵌入式 Linux - GPIO 子系统 参考与致谢 8. 控制蜂鸣器(GPIO 子系统) 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。 GPIO 子系统简介 GPIO(General Purpose I/O)即通用输入输出端口。这些引脚通常有多种功能,最基本的是高低电平输入检测和输出,部分引脚还会与主控器的片上外设绑定,可作为串口、I2C、网络、电压检测等的通信引脚。 与 LED 子系统类似,Linux 提供了 GPIO 子系统驱动框架,使用该驱动框架将 CPU 的 GPIO 引脚导出到用户空间,我们通过访问 /sys 文件系统进行控制。GPIO 子系统支持把引脚用于基本的输入输出功能,其中输入功能支持中断检测。(在 Linux 内核源码 Documentation/gpio 目录可找到关于 GPIO 子系统更详细的说明) GPIO 设备目录 GPIO 驱动子系统导出到用户空间的目录是 /sys/class/gpio,使用如下的命令查看:

2025/9/17
articleCard.readMore

嵌入式 Linux - 基础知识

嵌入式 Linux - 基础知识 常用命令 查看 CPU 信息:cat /proc/cpuinfo 查看内核版本:cat /proc/version 查看内存使用情况:cat /proc/meminfo 也可以使用命令 free 来简单了解内存使用情况 查看 FLASH 存储器使用情况:cat /proc/partitions 查看任务进程:top 查看支持的文件系统:cat /proc/filesystems(nodev 表示不需要挂载块设备) 查看 CPU 主频:cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq Linux 的驱动 Linux 上驱动的作用,就是把硬件设备与 Linux 文件建立了映射关系。 比如,控制 LED 灯和按键时,我们不需要知道他们的具体硬件连接,只要知道哪个文件代表哪个设备,然后就可以通过文件以同样的方式操控同类设备了。 参考与致谢 [野火]i.MX Linux 开发实战指南 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

开启 Chrome(Edge)多线程下载

开启 Chrome(Edge)多线程下载 如何开启 在地址栏输入链接并回车: Chrome:chrome://flags/#enable-parallel-downloading Edge:edge://flags/#enable-parallel-downloading 将 Parallel downloading 选项的 Default 改为 Enabled 即可。 参考与致谢 一招加速浏览器下载 20 倍!免费开启 Chrome / Edge “隐藏” 自带的多线程下载功能 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

技术文档写作规范

技术文档写作规范 众所周知,风格统一、语法规范的排版,能使文章更加易读,降低沟通的成本。 文章结构 撰写技术文章时,可以参考以下的结构层次: # 文章标题 一两句话介绍本文的内容。 ## 效果 请大致介绍 demo 的用法,并展示效果。 ## 原理 请逐步介绍原理。 ## 总结 做一个简单的总结。 ## 参考与致谢 - [参考 1](参考 1 的链接) - [参考 2](参考 2 的链接) 排版规范 段落 使用 Markdown 语法时,首行无需缩进 段与段之间需要有空行区分 需要添加空格的场景 中文与英文、数字之间: 错误:Qt生成器是一个针对C++的跨平台IDE Qt 生成器是一个针对 C++ 的跨平台 IDE 数字与单位之间:(但数字与百分号间不需加空格) 错误:其频率为 72MHz,占空比为 50 %。 其频率为 72 MHz,占空比为 50%。 普通与特殊字符(链接、加粗、斜体等)之间: 这个 字体 使用了加粗样式 请 点击这里 进行订阅 英文半角标点之后: Hello, world 中文与破折号之间: Markdown - 一种高效的写作方式 文本样式 中英文混排时,默认使用中文全角标点 中英文混排中,如果出现整句英文,则此句内使用英文半角标点 行内链接一般使用加粗,以提高阅读性 使用准确的专有名词: 错误:使用 github 登录 中文使用直角引号,代替普通引号: 错误:华广机器人队,也称为“野狼队” 不重复使用标点以强调 写作风格 如无必要,勿增实体 为了提高可读性,尽量避免使用长句,可拆分为多个简单句 论点要有论据支持,避免只说理不举例 参考与致谢 个人文案排版规范 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

把回忆放心交给 Google Photos(已弃用)

把回忆放心交给 Google Photos(已弃用) 背景 过去,我们会把承载着回忆的照片存在电脑或硬盘上。我们渐渐发现,照片不断堆积,文件夹式的分类方法也逐渐失去其意义:一次旅行过后,常常因拖延症而没有整理照片;照片整理好了,却再也不会翻看品味了;一旦硬盘遭祸(物理或人为因素),只能送去数据恢复,有时还不一定能救回来。 我不断寻找、发现新的存放照片的介质。过用 Resilio Sync,微云同步盘,百度云同步盘等同步工具做多重备份;也考虑过搭建 NAS 照片库(RAID 1);或者是各类云服务例如 iCloud,小米云相册,微云,百度云等,却始终没有用着顺手的。首先,用文件夹的形式来管理照片,确实很规整,但不方便整理与翻看;其次,国内的这些服务提供商,哪天要缺钱了把你隐私给卖了,也是很常见的。 我最终发现了 Google Photos,相对安全,操作也比较人性化。体验了一年多时间,觉得挺不错的,于是更新了本篇文章。 特色 1. 无限容量 相比 iCloud(5GB 免费空间),小米云(11GB 免费空间),虽然可以购买储存容量,但是在同步所有照片的时候,多少还是有点小心翼翼。而 Google Photos 的无限容量,完全满足搭建个人存放照片的需求。但有条件:照片最高 1600 万像素,视频 1080p,超出会被压缩。不过对于非专业用户来说,也足够了。 2. 智能 相较于文件夹形式管理,即使没有对照片归档分类,Google Photos 的搜索功能也足以帮你挖出封存多年的旧照片;你可以给人物打上标签,就可以搜索到关于 TA 的所有照片了。另外,「重温往年今日」也是一个不错的功能。 3. 相对安全 数据无价。如果你只把相册储存在自己的设备上(硬盘等),也许会担心数据损坏或遗失问题。而把相册交给信任的云服务提供商保管,则会安全许多。毕竟,他们会对用户的数据负责;而假如硬盘出了问题,你只能自己承担。 谈到安全,隐私问题不容忽视。于我而言,会把照片这样的隐私给不作恶的 Google 托管,绝不会把数据交给 360、百度。GDPR 下对用户隐私更加尊重的 Google,比「中国人更愿意用隐私换便利」的百度,不知高到哪里去了。 4. 其他优点 兼容各设备(iCloud 和某些云服务,只照顾自家设备) 自带照片编辑器 同步到云端后可释放手机储存 自动合并重复照片 界面美观、人性化 弊端 1. 安全问题 不敢说得太过绝对,毕竟免费的服务,不应许以过高的期待。不过,Google 有名声做保障,也相较于国内厂商,确实比存在硬盘和国内云盘安全得多。 Google 也许会拿你的照片训练 AI,但应该不会泄露出去。 2. 国内网络 众所周知的原因,如果你没有良好的梯子,那还是放弃 Google Photos 吧。 3. 同步 Google Photos 在打开的时候才能同步照片,或许这也是优点。同步后可以删除设备上的照片,释放空间。用一段时间后缓存会增加,需要定期清缓存(对于储存容量小的设备)。 FAQ Q:还是对数据安全不放心,有更好的解决方法吗? 参考与致谢 探寻 Google Photos 无限免费的“真相” Google Photos 备份照片的好选择,却不一定是最好的 Google 相簿你一定想知道的 16 招搜尋照片神奇密技 “中国人更愿意用隐私换便利”,李彦宏错了吗? 这一次,Google Photos 要重新定义「云相册」 Google 隐私权和条款 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

换届大会 - 经验总结

换届大会 - 经验总结 出现的问题 工作人员职责不明确,通知不到位 借不到大教室,借不到音箱,中教室没有胶凳,有的人站着没有座位 KT 板和 logo 板出图时间太迟 教室设备视频播放出现问题 没有很好地引导参会人群入座 主持人对整个大会的流程不熟悉;主持时照着稿子念,没有做到脱稿 出问题的时候没有主负责人控场 任命书的设计打印、颁布时的排序 拍摄大合照时没有架好机位,未能把所有人拍进去 如何改进 提前两周 换届大会属于比较重大的活动,需要至少提前两周召集工作人员,开一个方案策划会,商定以下策划: 换届大会总流程 确定主持人,写稿并训练脱稿 确定需要发言的人员,通知提前写稿 需要借 / 买的物资,如台签、任命书、音箱、KT 板、装饰品、相机等 大致明确参会的人员,需要邀请的嘉宾(老师、上届队员) 明确安排工作人员职责(记录纸面) 借用教室,提交负责的老师审批(最好是 4 楼大教室,需要提前至少两周,否则可能已经被借走) 明确活动总负责人,负责策划分歧敲定、突发事件的决策处理 提前一周 发布全员通知,并邀请嘉宾 检查催促设计类与购买类物资签收情况 任命书设计打印 活动总负责人要做到心中有数,具体是哪些因素拖慢了总体进程,提前一周要开始催了。 提前半天 工作人员集合 场地布置工作 检查记录物资情况 检查教室设备 架设拍摄机位 大会流程与主持人彩排 千万不要等到大会快开始前,才匆忙地去教室准备。有些问题到了教室才会暴露出来,需要有充足的时间用于弥补。 大会进行 参会人员签到 引导入座 如果出现突发情况,由活动主负责人决策处理 即使准备充分,在大会进行之时,也可能遇到很多没想到的情况,容易出现群龙无首的状况。此时需要有活动主负责人做出紧急决策,并拍板执行。虽然可能出现决策失误,但总比每个人都说一个方法,最终处理不了状况的好。 大会结束 工作人员集合 清点并搬运物资 后续写总结 今年的换届大会相比去年的,人数多了很多,氛围和仪式感更加充足,但流程中所遇上的各种小问题,尤其是技术问题,确实让整个团队有失颜面。 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

推挽与开漏输出

推挽与开漏输出 一般来说,微控制器的引脚都会有一个驱动电路,可以配置不同类型的数字和模拟电路接口。输出模式一般会有推挽与开漏输出。 推挽输出 推挽输出(Push-Pull Output),故名思意能输出两种电平,一种是推(拉电流,输出高电平),一种是挽(灌电流,输出低电平)。推挽输出可以使用一对开关来实现,在芯片中一般使用晶体管 / 场效应管。 如图,分别是推和挽,详细过程是: 推:当输入信号为低电平时,P-MOS 导通,电流从 VDD 经过它到输出引脚。此时 N-MOS 截止。 挽:当输入信号为高电平时,N-MOS 导通,电流从输出引脚经过它到 GND。此时 P-MOS 截止。 推挽操作不允许在总线配置中把多个设备连接在一起,只能单向线路的接口(例如 SPI、UART),如果当两个推挽输出结构相连在一起,一个输出高电平,即上管导通,下管闭合;同时另一个输出低电平,即上管闭合,下管导通时。电流会从第一个引脚的 VCC 通过上管再经过第二个引脚的下管直接流向 GND。整个通路上电阻很小,会发生短路,进而可能损害端口。这也是为什么推挽输出不能实现线与的原因。 推挽输出因为能驱动高低电平,有更高的驱动能力,在数字信号中有更好的上升/下降沿(斜率较大),意味着更好的性能。 推挽输出一般也可以被配置为输入模式,通过关闭上下管,在线路上呈高阻抗状态。 开漏输出 开漏(OD,Open Drain Output)指打开 MOS 管的漏极,历史上也有开集输出(OC,Open Collect Output) 最原始的开漏输出只有两种状态:低、高阻。如果需要输出高电平,则需要外加上拉电阻。 最原始的开漏输出是用一个 N-MOS 管实现的,当输入信号为高电平时,输出脚被拉低到地;但输入信号为低电平时,输出脚呈高阻浮空态。 开漏输出最主要的特性就是高电平没有驱动能力,需要借助外部上拉电阻才能真正输出高电平。 开漏输出常用在通信接口,有多个设备连接在同一线上(例如 I2C、One-Wire)。线路默认被上拉电阻拉至高电平,当任意设备有信号触发时,就会将整条线电平拉低。 用于开漏输出的上拉电阻必须平衡以下参数: 边沿斜率:线路本身有电容,上拉电阻与其耦合会构成低通滤波器,不同阻值会影响上升 / 下降沿的斜率。电阻越小,边沿越陡,信号传输效果越好。 功耗:如果上拉电阻阻值过小,当线被上拉时会导致过高的功耗 噪声:如果上拉电阻阻值过大,上拉会变弱,外部干扰噪声会更容易被线路拾取。 对比 推挽输出 开漏输出 高电平驱动能力 高 看外部上拉电阻 低电平驱动能力 高 高 电平跳变速度 快 由外部上拉电阻决定,越小越快但功耗越大 线与 不支持 支持 电平转换 不支持 支持 推挽输出一般用于单向线通信;开漏通常用于双向线通信。 因为有上拉电阻,所以开漏输出功耗会相对高。 一般来说,推挽比开漏切换速度快。 参考与致谢 开漏输出与推挽输出 Open Drain Output vs. Push-Pull Output 什么是 GPIO 的推挽输出和开漏输出 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

搭建属于自己的 HomeLab

搭建属于自己的 HomeLab Homelab 是指可在家中搭建的实验(折腾)环境,用于进行实验和学习。通常指一系列硬件设备(家用服务器、小主机、旧电脑手机、树莓派等),上面运行着操作系统环境和软件(Linux、虚拟机、Docker 等)。Homelab 有很多种用途,比如作为软路由、远程主机,也可以部署一系列的自托管服务,如个人书库、影视库、密码管理器、个人网站、RSS 阅读器、播客服务器、备忘录等等。不仅实用,也可以作一门兴趣,为生活增添乐趣。 我的 Homelab 配置 我自己的 Homelab 配置是 轻量云服务器 + 小主机 + NAS,它们的配置与用途各有千秋: 轻量云服务器(阿里云 1C2G) 小主机(N100 CPU) NAS(群晖 DS220+) 公网 IP 有 无 无 储存空间 小 中 大 性能 低 高 低 不难看出,它们都是偏科生,但只要合作起来便是三边形战士。轻量云服务器 偏向网络访问型,小主机 偏向性能处理型,NAS 偏向空间存储型。 轻量云服务器 轻量云服务器 其实就是云服务器厂商多余的边角料,配置不高,但胜在价格实惠,比如我购买的阿里云轻量仅 ¥ 96 / 年(如果你有更便宜的套餐不妨让我了解一下)。 因为有公网 IP (80/443 端口也是开放的),我在这台轻量云主机上部署的服务,主要是 frp 服务器、反向代理服务器、访问其他机器的跳板机、监控其它主机的面板、小型网站服务、网站 uptime 监测等需要通过公网直接访问的服务。 小主机 小主机 我选用了零刻 N100 CPU 的准系统,自配 16G DDR5 内存条与 250G SSD 硬盘,总体下来大概 ¥ 1000 出头。日常功耗不高,在需要性能的时候也能呼之即来。 在小主机上部署的应用类型,主要是 web VS Code 代码编辑器、私有笔记库、RSS 阅读器、播客服务器、影视库、内网浏览器等这一类需要消耗性能的服务。 NAS NAS 我选用的是群晖 DS220+,X86 架构方便运行 Docker 环境。前一段时间,我还给它加上了一条 16G 的内存条,企图提升它的性能。但随后发现,瓶颈仍然是那颗孱弱的 J4025 CPU。白群晖算是买软件送硬件了,但是为了资料的安全性,还算是值得的。 我在 NAS 上部署的,主要是设备资料备份、网盘同步、照片库、书库等储存需求型的服务。 如何一键批量部署 Docker compose 有了折腾不止的精神,三天两头刷系统是不可避免的。部署了那么多的应用,总不可能一个个单独 bring up 吧。这儿有个简单的 shell 脚本,可以一键部署所有 Docker compose: compose.sh echo "starting compose.sh..." # 遍历当前目录下的一级文件夹 for folder in */; do [ "$folder" != "Archive/" ] # 忽略 Archive 文件夹 cd "$folder" # 进入文件夹 docker-compose up -d # 执行 docker compose up -d 命令 cd .. # 返回上级目录 done echo "done." 我的目录结构是这样的: ├── compose │ ├── code-server | | ├──compose.yaml | | ├──.env │ ├── frp | | ├──compose.yaml │ ├── xxx | | ├──compose.yaml │ ├── …… │ └── compose.sh 只要在 compose 目录下执行 sh compose.sh,就能一键启动所有的 Docker compose 了。 自托管的优势 相比于第三方托管,让别人替你保管数据,自托管(Self-Hosted) 具有十足的优势,表现在你对个人数据拥有完全的掌控权,可以根据自己的喜好去定制所需,能帮你获取到更多优质的信息源(个人书库、影视库、RSS 服务)。前提是要有一定的时间精力与资金投入,并且拥有一颗乐于折腾的心。 在接下来的一系列文章中,我将介绍一些基础的配置,还有许多有趣的服务。上面提到的铁三角组合,只是我个人的差异化配置,如果你只有一台机器,折腾起来也是完全没有问题的。我将介绍的内容大多是基于 Docker 与 Docker-compose 部署的,因为这种方式兼容性极佳,在不同配置的机器上都能做到开箱即用。但需要提及的一点是,机器的选择最好是 X86 架构的,因为有些许容器没有做 ARM 适配,需要自己编译安装。 参考与致谢 你们的 NAS 部署了什么有趣的服务? 一键启动多个 docker-compose 配置容器 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

数字电路中的竞争与冒险

数字电路中的竞争与冒险 在数字电路中,信号传输与状态变换时都会有一定的延时,从而导致竞争和冒险的现象。 原因 竞争(Competition):在组合逻辑电路中,不同路径的输入信号变化,传输到同一点门级电路时,在时间上有先后之分。 冒险(Hazard):由于竞争的存在,输出信号需要经过一段时间才能达到期望状态,过渡时间内可能产生瞬间的错误输出,例如尖峰脉冲。 竞争不一定会导致冒险,但冒险一定会有竞争存在。 举个例子,对于同一个输入信号 A,信号 A' 由于会经过反相器,到达与门的时间会比 A 滞后,会导致与门的输出出现干扰脉冲: 解决方法 对于冒险现象的发生,可以用以下方法消除: 增加输出滤波电容:用于消除冒险的窄脉冲。但缺点是会让波形变得平缓,在高速信号中容易产生错误。 延时读取输出值:略过窄脉冲的影响。 参考与致谢 Verilog 竞争与冒险 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

数字电路基础知识

数字电路基础知识 数制与码制 数制:表示数量的规则。每一位的构成、从低位向高位的进位规则,例如十进制。 码制:表示事物的规则,编码时遵循的规则。 模拟电路:用连续的模拟电压 / 电流值来表示信息 数字电路:用一个离散的电压序列来表示信息 常用到的进制: 任意进制的数转为十进制: \((526)_8=5*8^2+2*8^1+6*8^0=(342)_{10}\) \((2A.7F)_H=2*16^1+10*16^0+7*16^{-1}+15*16^{-2}=(42.4960937)_D\) \(D=\sum K_iN^i\) 二进制的补码 最⾼高位为符号位(0 为正,1 为负) 正数的补码和它的原码相同 负数的补码 = 数值位逐位求反 + 1 +5 = (0 0101) 1101.0110 码制 等长编码: 4 位 BCD 码 ASCII 格雷码:编码顺序依次变化,按表中顺序变化时,相邻代码只有⼀一位改变状态 逻辑代数基础 异或:不同为 1,相同为 0 \(Y=A'B+AB'\) 同或:相同为 1,不同为 0 \(Y=AB+A'B'\) 逻辑运算基本公式 \((A B) ' = A' + B'\) \((A+ B)' = A'B'\) \(A + B C = (A +B)(A +C)\) 逻辑运算常用公式 逻辑代数基本定理 逻辑函数的表示方法 真值表 逻辑式 逻辑图 波形图 逻辑函数的公式化简法 逻辑式的最简形式 最小项 其实就是真值表中的行数 公式化简法 反复应用基本公式和常用公式,消去多余的与项和 多余的因子。 卡诺图化简法 不必全化为最小项。 如果 0 比较少,也可以圈 0 后取反。 门电路 正逻辑与负逻辑 如果以高电平表示逻辑 1,以低电平表示逻辑 0,则称这种表示方法为正逻辑;反之,则称这种表示方法为负逻辑。 CMOS 管门电路 参考与致谢 《编码:隐匿在计算机软硬件背后的语言》 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

智能硬件产品经理的技术要求

智能硬件产品经理的技术要求 硬件知识 硬件设计:基本的硬件设计知识(用软件实现硬件功能,costdown 永远是做硬件的主旋律) ID/MD 设计:颜值很大程度影响销量,而且外观也需要可以实现加工 生产制造:设计出来的东西一定要能生产出来,对生产流程要有大致了解 软件知识 嵌入式软件:固件功能要高效,而不要太复杂;APP 在线固件升级要尽早加上,且要能配强制升级 App:APP 简单点,不要太复杂。注意要方便、引导用户升级,包括更新 APP/ 固件,才能实现快速迭代 业务后台:也就是云服务。有各种模块和接口,能够支持前台 App 和 Rom 的各种功能与数据对接。小型项目建议使用第三方服务,不要挖坑 管理后台:包括 CMS/BOSS 系统、数据平台等。包括用户管理系统、设备管理系统、运营平台、数据统计与报表、BI 分析系统、大数据等等 生产管理软件:为产品添加唯一 ID/MAC 地址等,需要生产管理系统里面怎么配合,PMC 怎么操作,是否需要数据同步到管理后台,需要在生产前准备好 第三方对接 HomeKit/ 米家 / 微信硬件等平台:主流的硬件平台的对接文档要通读了解 第三方账号体系:如微信 /QQ 登录等 第三方分享:如微信朋友圈 / 微博 /Twitter/FaceBook 等,智能硬件必做的事情 第三方云服务:如 AWS/Ayla/ 阿里云 / 机智云等 Google Analytics/ 百度统计 / 友盟等:尽量以数据驱动运营 市场 / 竞品分析 多用各家的产品:知己知彼 关注评价:了解主流销售平台对自己产品和竞品的评价,了解应用商店对 App 的评价,媒体相关报道,多与同行交流 参考与致谢 智能硬件产品经理需要哪些技术基础?Spencer 的回答 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

机器学习入门 - 基础流程

机器学习入门 - 基础流程 一般而言,传统的编程是告诉计算机一些数据以及计算规律,让计算机输出结果。当规则制定好之后,对于每一次输入,计算机输出的答案应该也是唯一确定的。 flowchart LR classDef default fill:#fff,stroke:#000,stroke-width:2px,font-size:16px,fill: white 规则-->传统编程方法; 数据-->传统编程方法; 传统编程方法-->答案; 而机器学习的方法,是告诉计算机数据和一部分答案(标签),计算机输出答案与规律。这种方法是从已知答案的数据背后寻找某种规则。 flowchart LR classDef default fill:#fff,stroke:#000,stroke-width:2px,font-size:16px,fill: white 数据-->机器学习方法; 部分答案-->机器学习方法; 机器学习方法-->规则; 机器学习的基本流程大致如下: 数据收集 机器学习就像「神农尝百草」,是一种归纳法(传统编程是演绎法)。而对于归纳法而言,数据是基础,越多越好。数据决定了机器学习的上限,而模型和算法再好,也只是逼近这个上限。 数据预处理 在最初的阶段,需要处理带标签的原始数据,形成用于训练和用于验证的数据集。这一步骤的主要的工作是特征提取和数据清洗。 特征提取是将特征提取出来,作为模型训练的输入。而数据清洗通常的流程有: 去除唯一属性:唯一属性通常是一些 id 编码,这些属性不能刻画样本的分布规律。 处理缺失值:可以选择直接补全缺失值,也可以直接删除含有这个属性的特征。 特征编码:把文字或其他形式的特征转换为数字编码,方便模型处理。比如把 ON/OFF 编码为 1/0. 特征缩放:通过归一化和标准化的手段,将样本属性缩放到某个指定的范围内,避免数量级差异大的属性占据主导地位。 模型的构建和训练 拥有可用的数据集之后,就可以根据需求选择合适的算法模型了。机器学习主要有三种方式:监督学习(Supervised Learning),无监督学习(Unsuoervised learing)和强化学习(RL, Reinforcement Learning)。 监督学习(Supervised Learning):监督意味着已经有标注好的数据集。通过已标注好的数据进行模型训练,从而利用训练好的模型来对新的数据进行预测。监督学习的应用一般分为 回归 和 分类: 回归(Regression):预测一个数字,有无限种可能的结果 分类(Classification):预测分类,只有两种或以上的少数选择,是拟合不同类别之间的分界线。 无监督学习(Unsuoervised learing):无需标注数据(有时候人也不知道问题的准确答案),应用一般有 聚类、降维 和 异常检测(Anomaly Detection) 这几种: 聚类(Clustering):例如给出一堆图片,把相似的图片划分到一起。 降维(Dimensionality Reduction):数据特征过多、维度过高时,要将数据降到合适的低维空间处理,保留最重要的特征数据。主要算法有主成分分析(PCA, Principal Component Analysis)。 强化学习(Reinforcement Learning, RL):把学习的过程作为一个试探评价的环节,会根据具体的环境得到反馈的强化信号(奖赏/惩罚)。让机器不断尝试,从而得到一种趋利避害的策略,形成一套解决问题的最优解。 我们可以对处理好的数据先做一个顶层的分析,是用监督学习还是无监督模型,问题的类型是属于分类还是回归。在实际选择时,也通常会选用不同的模型进行训练,然后比较输出结果并选择最佳的那个。 模型训练的根本,是找到最合适的权重,以最大限度地进行分类(分类问题中)、或使误差尽量小(回归问题中)。 我们以一个包含权重的公式为例: \[ y=ax_1+bx_2+cx_3 \] 其中,\(y\) 就是标签,在训练数据集中已经有正确的标注;而 \(x_1, x_2, x_3\) 即特征值。举个实际的例子: \[ 花的种类=a*花蕊颜色+b*叶子颜色+c*花瓣颜色 \] 在这个阶段的工作,就是通过训练反推出权重 a、b、c,使得这条公式的结果尽量逼近原始输入数据。并且要设定损失函数(Loss Function),设法减小整体误差,实际中常使用均方误差(MSE, Mean Squared Error)来计算损失函数的误差。 模型评估 在上一个阶段把误差降到足够小后即可停止训练,用预处理后的测试数据集来验证模型效果。 预测 在上个阶段模型达到了预期的准确率和覆盖率(召回率)之后,就可以把模型拿来实际使用了。 入门机器学习要两手抓,一方面是算法基础,另一方面是代码练习。这样才能在学习中巩固,把理论基础转化为实际用途。 下一篇文章我们先介绍机器学习环境的配置。 参考与致谢 Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 3rd Edition (https://github.com/ageron/handson-ml3) 《程序员的 AI 书:从代码开始》 《AI 制胜:机器学习极简入门》

2025/9/17
articleCard.readMore

机器学习入门 - 模型评估指标

机器学习入门 - 模型评估指标 参考与致谢 《机器学习基础 - 从入门到入职》 机器学习基础-监督学习-目标函数之平均绝对误差(Mean Absolute Error,MAE) scikit-learn.org sklearn.metrics.mean_absolute_error sklearn.metrics.mean_squared_error 不同的机器学习任务需要使用不同指标来评估,本篇文章基于 scikit-learn ,从实际代码上介绍机器学习中回归、分类、聚类这三种模型的评估指标。 回归模型的评估指标 对于回归模型而言,目标是使得预测值能够尽量拟合实际值。常用的性能评估指标有绝对误差和均方误差两种。 平均绝对误差(Mean Absolute Error, MAE) 用于衡量回归问题中预测值与真实值之间平均绝对差异。MAE 的值越小,表示预测值与真实值之间的平均差异越小,即预测的准确性越高。 \[ MAE = \frac{1}{n} \sum_{i=1}^{n} |y_{\text{true}, i} - y_{\text{pred}, i}| \] 公式中,\(n\) 是样本数量, \(y_\text{true}\) 是真实值,\(y_\text{pred}\) 是预测值。 >>> from sklearn.metrics import mean_absolute_error >>> y_true = [3, -0.5, 2, 7] >>> y_pred = [2.5, 0.0, 2, 8] >>> mean_absolute_error(y_true, y_pred) 0.5 >>> y_true = [[0.5, 1], [-1, 1], [7, -6]] >>> y_pred = [[0, 2], [-1, 2], [8, -5]] >>> mean_absolute_error(y_true, y_pred) 0.75 均方误差(Mean Squared Error, MSE) 用于衡量预测值与真实值之间的平均差异。数值越小表示预测结果与真实值的拟合程度越好。 \[ MSE = \frac{1}{n} \sum_{i=1}^{n} (y_{\text{true}, i} - y_{\text{pred}, i})^2 \] 公式中,\(n\) 是样本数量, \(y_\text{true}\) 是真实值,\(y_\text{pred}\) 是预测值。 >>> from sklearn.metrics import mean_squared_error >>> y_true = [3, -0.5, 2, 7] >>> y_pred = [2.5, 0.0, 2, 8] >>> mean_squared_error(y_true, y_pred) 0.375 >>> y_true = [[0.5, 1],[-1, 1],[7, -6]] >>> y_pred = [[0, 2],[-1, 2],[8, -5]] >>> mean_squared_error(y_true, y_pred) 0.708... 分类模型的评估指标 分类模型的评估指标比较多,不同的评估指标之间甚至可能有冲突

2025/9/17
articleCard.readMore

机器学习入门 - 环境搭建

机器学习入门 - 环境搭建 Anaconda 环境 我们选择使用 Anaconda 来配置在机器学习的环境。一方面其添加了许多常用的数据科学的包如 Numpy、TensorFlow 等,也包含了它们所依赖的更多模组;另一方面它能更方便地管理和切换运行环境。用一句话说,Anaconda 就是一个一站式的数据科学编程环境。 Anaconda 的下载:https://www.anaconda.com/download 安装完成后,如何开始呢?你可以看这个官方课程,一步步入手:Get Started with Anaconda,也可也直接参考以下的简明步骤开始。 当安装完成后,可以在 Anaconda Prompt 命令行界面,输入命令 conda list 验证其安装状况以及内置的包列表。 官方推荐创建一个虚拟环境,这样如果玩坏了可以直接换一个,不必重新卸载安装: conda create --name NEW_ENV_NAME conda activate NEW_ENV_NAME conda 默认的 channel 是 defaults,但这个 channel 的代码包不全,所以将其更换为 conda-forge: conda config --add channels conda-forge 接着,在这个虚拟环境里安装一些常用的包: conda install jupyterlab rich faker chime schedule pandas scikit-learn 最后,启动 JupyterLab: jupyter lab scikit-learn 机器学习工具包 接下来的文章,将使用 scikit-learn 入门机器学习。scikit-learn(sklearn)包含了分类、回归、降维、聚类等基础常用的机器学习算法,也包含了特征提取、数据处理、模型评估等模块,适合入门。 参考与致谢 《AI 制胜:机器学习极简入门》 Anaconda scikit-learn

2025/9/17
articleCard.readMore

机器学习常用的包

机器学习常用的包 在机器学习领域,有许多优秀的库可供研究者和开发者使用。以下推荐一些适合初学者的机器学习的包,它们各具特色,适合不同层次的学习需求和应用场景: Scikit-learn:初学者的最佳选择 Scikit-learn 是一个开源的机器学习库,适用于 Python。它的特点是简洁的 API、丰富的算法库和易用性,是初学者的理想选择。Scikit-learn 提供了广泛的监督和无监督学习算法,如线性和逻辑回归、决策树、聚类等,同时也支持各种实用的数据变换和模型评估方法。该库的文档详尽,且有大量教程和示例,有助于新手快速上手。 TensorFlow:深度学习的强大工具 TensorFlow 是由 Google 开发的一个开源深度学习框架。不仅适用于研究和开发高级深度学习模型,也适合那些希望将模型部署到生产环境中的用户。TensorFlow 支持多种语言,并提供了丰富的工具和库,比如 TensorBoard,用于模型训练过程中的可视化。虽然 TensorFlow 的学习曲线相对陡峭,但它的灵活性和强大功能使其成为深度学习领域的重要工具之一。 Keras:简化深度学习的高级 API Keras 是一个开源的神经网络库,旨在简化深度学习模型的构建和实验。它可以作为 TensorFlow、Microsoft Cognitive Toolkit 或 Theano 的高级接口使用,提供了一种更简单、更快速的方式来创建深度学习模型。Keras 的特点是用户友好的 API、模块化和可扩展性。对于希望快速实现和测试新想法的用户来说,Keras 是一个极佳的选择。 PyTorch:研究和快速原型开发的首选 PyTorch 是一个由 Facebook 开发的开源机器学习库,特别适合于研究原型和实验的快速迭代。它提供了强大的 GPU 加速支持和动态神经网络(即计算图可以在运行时动态改变),这使得模型的设计、调试和优化更加直观和灵活。PyTorch 的 API 简洁明了,易于理解和使用。 XGBoost:梯度提升冠军 XGBoost 是一个优化的分布式梯度提升库,专为提升速度和性能而设计。它在许多机器学习和数据科学比赛中表现优异,如 Kaggle 竞赛,被广泛应用于各种回归、分类和排序问题。XGBoost 具有出色的准确性,支持多种语言,易于使用,且能够处理大规模数据。对于追求模型性能和效率的开发者来说,XGBoost 是一个不可或缺的工具。 这五个库各有侧重,从 Scikit-learn 的易用性到 TensorFlow 和 PyTorch 的灵活性,再到 Keras 的快速开发和 XGBoost 的高效性能。选择适合自己的库才是最重要的。 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

机器视觉入门

机器视觉入门 环境配置 首先,我们需要安装相关的软件: Python:下载 Python 最新版本。在安装的时候要注意勾选 安装到 path 选项,这样可以省去环境的配置 VS Code:下载 VS Code,可跳转文章 VS Code 生产力指南 - 环境配置 Python 插件:VS Code 插件 接下来安装包文件。我们在 VS Code 点击菜单栏 查看 - 终端,调出终端,输入以下命令: 安装 opencv-contrib-python: pip install opencv-contrib-python 安装 Matplotlib: pip install matplotlib 安装 scikit-image: pip install scikit-image 安装 dlib。因为直接安装会出错,我们需要先下载 .whl 文件:下载链接 切换到文件所在的目录,运行命令: pip install dlib-19.21.1-cp39-cp39-win_amd64.whl 安装 face-recognition: pip install face-recognition 安装 cvlib: pip install cvlib 安装 keras: pip install keras 安装 tensorflow: pip install tensorflow 如果上一条命令出错,可以试试这条的命令: python -m pip install --upgrade https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-1.12.0-py3-none-any.whl 安装 flask: pip install flask 至此,机器视觉相关的环境就配置好了。 注意事项 解决相对路径报错的问题,加上以下语句: import os dirname, filename = os.path.split(os.path.abspath( __file__)) os.chdir(dirname) 参考与致谢 linyuxuanlin/Learning_OpenCV4_with_Python PacktPublishing/Mastering-OpenCV-4-with-Python 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

校门口车辆放行 - 流程

校门口车辆放行 - 流程 当遇上出展 / 外出交流 / 比赛时,可以让货车进学校接物资;或是其他学校来交流,想直接开车进来,也可以使用此放行条。 下载文件 【校外人员进校审批表.docx】。 修改表格内容。 找指导老师签名(邓老师)。 去学院办公室盖章。 接人的时候,出示给校门口保安看。 【校外人员进校审批表.docx】 预览:

2025/9/17
articleCard.readMore

正则表达式实用语句

正则表达式实用语句 匹配某一字符串(string)的所在行: ^(.*)string(.*)\n 手机号码(严谨): /^1((3[\d])|(4[5,6,7,9])|(5[0-3,5-9])|(6[5-7])|(7[0-8])|(8[\d])|(9[1,8,9]))\d{8}$/ 手机号码(宽松): /^1[3-9]\d{9}$/ 国内座机电话: /^\d{3}-\d{8}|\d{4}-\d{7}$/ 座机电话(包括港澳台): /^(\d{3}-\d{8})|(\d{4}-\d{7})|(852|853|886-\d{7,8})$/ 电子邮箱: /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](https://github.com/wqjiao/regular-set/blob/master?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](https://github.com/wqjiao/regular-set/blob/master?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/ 身份证号码: /^\d{6}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/ 护照(包含香港、澳门): /(^[EeKkGgDdSsPpHh]\d{8}$)|(^(([Ee][a-fA-F])|([DdSsPp][Ee])|([Kk][Jj])|([Mm][Aa])|(1[45]))\d{7}$)/ 车牌号(新能源 + 非新能源): /^([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领 A-Z]{1}[A-HJ-NP-Z]{1}(([0-9]{5}[DF])|([DF](https://github.com/wqjiao/regular-set/blob/master/[A-HJ-NP-Z0-9])[0-9]{4})))|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领 A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9 挂学警港澳]{1})$/ 新能源车牌号: /[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领 A-Z]{1}[A-HJ-NP-Z]{1}(([0-9]{5}[DF])|([DF][A-HJ-NP-Z0-9][0-9]{4}))$/ 非新能源车牌号: /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领 A-Z]{1}[A-HJ-NP-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/ 车架号: /^[A-Z0-9]{17}$/ 发动机号: /^[A-Z0-9]{6,17}$/ 中国邮政编码: /^(0[1-7]|1[0-356]|2[0-7]|3[0-6]|4[0-7]|5[1-7]|6[1-7]|7[0-5]|8[013-6])\d{4}$/ 允许字母数字下划线组合: /^[a-zA-Z0-9_]{6,16}$/ 汉字: /^[\u4E00-\u9FA5]+$/ 英文: /^[a-zA-Z]+$/ 数字: /^\d{1,}$/ 小数: /^\d+\.\d+$/ 不能包含汉字: /^[^\u4E00-\u9FA5]*$/

2025/9/17
articleCard.readMore

用 Graphviz 绘制关系图

用 Graphviz 绘制关系图 一种用代码绘制关系图的方式。 背景 Graphviz 是个好东西,可用来绘制关系图。与 Visio 有一个本质上的差异: Graphviz 生成图是自动布局的,不需要手动调整元素的位置。当一个关系网络比较复杂时,用自动布局可实现最小化连线交叉。 安装 发现一个很好用的在线编辑器:[GraphvizOnline]\([http://dreampuf.github.io/GraphvizOnline/\#digraph graph_name { ](http://dreampuf.github.io/GraphvizOnline/#digraph%20graph_name%20{%20) %20%20A->B\[label%3D"关系"\]%20 }\) 支持即时渲染,导出 .png 与 .svg 等格式。 macOS 安装:brew install graphviz 作图流程 新建 xxx.dot 编辑 .dot 文档 切换到所在目录,导出:dot xxx.dot -T png -o xxx.png 简易语法 graph graph_name { A--B[label="连接关系"] } 总结 自动布局是 Graphviz 的精髓。类比我之前用 Markdown 语法直接生成幻灯片,这些工具把内容标准化,让人能够更加注重于内容,而非形式与布局。 参考与致谢 Graphviz 简易教程 Drawing graphs with dot Windows 下 Graphviz 安装及入门教程 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

用 Vercel 加速 Pages 服务

用 Vercel 加速 Pages 服务 前一段时间,我的博客(托管在 GitHub Pages)被墙了。因为受众大多是国内用户,所以问题很大。 Vercel 的优势 免费自定义域名,支持 HTTPS 提供 Serverless 服务 提供 Google Cloud 与 AWS 节点,有香港与台湾节点,国内访问速度还可以 免费额度有 20 GB,够用 不限站点与 Serverless API 数量 Serverless 支持 Node.js,Go,Python,Ruby 支持 now.sh CLI,GitHub,GitLab,Bitbucket 导入 / 部署 用法 因配置步骤不复杂,所以只以文字进行简要的说明。 用 GitHub 账号直接登录 导入站点(直接导入 GitHub Repo) 配置部署指令(VuePress 平台可放空) 配置输出路径(VuePress 是 docs/.vuepress/dist) 要在设置里面把生产分支设为 gh-pages 绑定域名 注意 每次 commit message 要写超过 1 个字符,否则不会部署。 参考与致谢 Vercel ZEIT (Vercel) now.sh 免费部署博客网站,支持 Serverless Python Go Node.js 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

用 reveal.js 制作幻灯片

用 reveal.js 制作幻灯片 快捷键 下一张幻灯片:空格 方向选择幻灯片:方向键 总览视图:Esc 演讲者视图:S 暂停演讲 / 黑屏:V/B/. PDF 导出 在地址后加 ?print-pdf,例如 http://localhost:8000/?print-pdf 参考语法 图片 <img data-src="" style=" width: px; margin: 0 auto 1rem auto; background: transparent; " /> align="left" 文字 <p style="white-space: pre-line;"><small> </small></p> 视频 <section data-transition="slide" data-background="#EAB547" data-background-transition="zoom" > <video data-src=""></video> </section> 参考与致谢 reveal.js 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

用树莓派架设云打印服务器

用树莓派架设云打印服务器 用树莓派搭建云打印服务器,让普通打印机也能无线共享打印。 背景 假使办公室内有一台公用的打印机(未连接电脑),每次打印都需要手动切换。那么可以用树莓派作为打印机的服务器,实现共享云打印。 步骤 1. 前期准备 树莓派刷入 Raspbian 系统,最好更换国内软件源。 2. 配置云打印服务 安装 CUPS 插件: sudo apt-get install cups sudo cupsctl --remote-any sudo /etc/init.d/cups restart 查看树莓派当前 IP 地址: $hostname -I 现在可以在浏览器输入: https://你的树莓派 IP:631/ 打开 CUPS 的界面。 浏览器可能会弹出警告,忽略即可。 跳到 Administration 界面,注意右边的勾选: 添加打印机: 将打印机用 USB 线接上树莓派,一般可以看到本地 USB 设备: 直接添加设备,名字越简单越好,share 选项一定要勾选: 找到打印机相应的型号,然后一直点就行了。 配置完成后,可以在打印机的页面选择 Print Test Page 测试能否正常打印: 3. 在 Windows 上配置 控制面板 - 设备和打印机 - 添加打印机 填入 IP,例如: http://你的树莓派 IP:631/printers/刚才设定的打印机名称 打印测试页试试? 总结 重复两遍以上的事情,就可以考虑用自动化流程解决了,要学会用聪明的方法偷懒。 参考与致谢 树莓派 3 - 搭建网络打印机服务器(支持 PC,IPhone,Android 打印) 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

用群晖自带反向代理实现 HTTPS 访问

用群晖自带反向代理实现 HTTPS 访问 首先,你需要一个外部访问群晖的 IP 或域名,并且已经申请了 SSL 证书。详细说明可跳转文章 使用 acme.sh 自动申请域名证书(群晖 Docker) 配置反向代理 依次打开 控制面板 - 登录门户 - 高级 - 反向代理服务器。 以 使用 Bitwarden 搭建密码管理器(群晖 Docker) 我们新增名称为 bitwarden 的反代服务。按照下图填写配置: 来源 协议:选择 HTTPS 主机名:填写外部访问的域名 端口:填写外部访问的端口 勾选 启用 HSTS(强制跳转 HTTPS) 目的地 协议:选择 HTTP 主机名:填写 localhost 端口:填写内部访问的端口(对于 bitwarden 来说,就是刚刚容器 80 端口映射的端口,比如 8003) 配置证书 依次打开 控制面板 - 安全性 - 证书,选中正在使用的证书,点击 设置,确保 bitwarden 的反代服务所对应的域名的证书为当前证书即可。 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

电机驱动方案 - IR2104S

电机驱动方案 - IR2104S 本电机驱动方案基于半桥驱动芯片 IR2104S 与 AP30H80K N-MOS 管,用于 IR2104S 供电的外部稳压器采用 XL2009E1 方案。 项目仓库:Collection_of_Motor_Driver_Design/DC_Motor/IR2104S 项目在线预览: 基本参数 输入 VM:输入 12-36V,给电机供电的电源,根据 XL2009E1、IR2104S 与 AP30H80K 的参数而确定)。 VCC_3V3:输入 3.3-5V,外部输入的 H 桥系统工作电压,根据逻辑芯片 SN74LVC1G08DCKR 的参数而确定)。 IN1/IN2:外部逻辑输入,高低电平电压推荐跟随 VCC_3V3 而定,真值表见下文。 PWM:PWM 输入,高低电平电压与 IN1/IN2 的电压保持一致。 SD:默认内部下拉,低电平有效(使 IR2104S 半桥芯片关断),外部输入高电平(VCC_3V3 电压)开启 IR2104S。 输出 M+/M-:接外部电机。 VCC_12V:板载 XL2009E1 电路稳压输出,作为备用供电输出。 电机驱动模块在使用时,H 桥系统需要跟外部控制器共地。 本方案逻辑控制的真值表如下: SD IN1 IN2 PWM 电机状态 0 x x x 滑行 1 1 0 1 正转 1 0 1 1 反转 1 1 1 x 刹车 1 0 0 x 刹车 1 x x 0 刹车 基本原理 逻辑电路 驱动一个电机,需要用到两对半桥电路,组成一个 H 桥全桥电路。为了能根据真值表来控制电机的状态,这里使用两个与门电路,使外部输入 PWM 信号与 IN1/IN2 做与运算,并将结果(PWMA/PWMB)传给 IR2104 的 IN 引脚。逻辑芯片的电源输入并联一个 100nF 电容去耦。 稳压电路 稳压电路基于 XL2009E1 Buck 芯片搭建,其功能是将外部动力电源输入稳压为 12V,为 IR2104S 芯片供电(其供电范围是 10-20V)。 稳压模块的设计可以跳转文章 电源方案(Buck)- XL2009E1,此处不多赘述。 半桥驱动电路 电机驱动的基础知识可以跳转文章 直流有刷电机驱动的设计,此处不多赘述。 IR2104S 是英飞凌的一款半桥驱动芯片。其主要参数如下: 高达 +600V 的浮动自举耐受电压 10-20V 的栅极驱动供电电压 兼容 3.3V/5V/15V 逻辑输入电平 其他特性: 欠压锁定 集成死区时间控制 交叉传导预防逻辑 上管与逻辑输入同相位 关断时上下管都关断 上下管的传播延迟匹配 内部框图: 典型应用原理图: 在此方案中,IR2104S 的供电为 12V,并联一个 100nF 输入去耦电容。IN 为逻辑输入引脚,输入高于 3V 即视为高电平、低于 0.8V 为低电平。通过逻辑芯片运算输出的 PWMA/PWMB 高低电平信号,可以控制上下管开启与关断。SD 为外部关断输入(低电平有效)。IN 与 SD 混合输入,对应上下管栅极引脚 HO/LO 状态时序图如下: 可以看到,如果 IN 输入高电平,则上管栅极给高电平开启、下管栅极给低电平关断,反之亦然。如果 SD 检测到低电平,则无论 IN 输入电平高低,上下管都将拉低关断。 为了防止同一半桥上下管射穿(shoot-through),IR2104S 集成了死区控制。死区时间控制时序图如下: 其中,DT 的典型值为 520ns。 上下管开启/关断传导延迟时序图: 其中,\(t_{on}\) 典型值为 680ns,\(t_{off}\) 典型值为 150ns。 因为方案使用的都是 N-MOS 管(导通条件是 \(V_g-V_s>V_{gs(th)}\)),所以需要有一个高侧浮压自举电路,才能正常开启上管。此方案使用一个 1uF/50V 的 MLCC 电容,跨接 VM 与 VB 引脚,使 HO 引脚高电平电压高于 N-MOS 的 \(V_{GS(th)}\),即 IR2104S 供电电压减去二极管正向导通压降,使上管能够正常导通。 MOS 管的选型需要考虑到 \(V_{DSS}\) 、\(V_{gs(th)}\)、\(I_D\) 和 \(R_{DS(on)}\) 这几个参数。\(V_{DSS}\) 的确定是根据驱动电机的电压加上足够的余量;\(I_D\) 根据应用的要求加上足够余量;\(R_{DS(on)}\) 越小越好。综合考虑参数和价格,本方案选用 AP30H80K。 衰减模式的设计,因为 IR2104S 没有集成同步衰减,所以我们选用 SS34 肖特基二极管做异步衰减。 参考与致谢 STM32+IR2104S 的 H 桥电机驱动电路详解 mos 管 H 桥驱动芯片 自举电容的疑惑 AN-6076 高压栅极驱动 IC 自举电路的设计与应用指南 pwm 驱动电机 为什么 pwm 不能太快_【电机控制】为什么控制上下 MOS 管的互补 PWM 不能发 100%占空比? 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

电源完整性设计

电源完整性设计 电源完整性是指电源波形的质量,研究的是电源分配网络(PDN)。并从系统供电网络综合考虑,消除 / 降低噪声对电源的影响。电源完整性的设计目标是把电源噪声控制在运行的范围内,为芯片提供干净稳定的电压,并使它能够维持在一个很小的容差范围内(通常为 5% 以内),实时响应负载对电流的快速变化,并能够为其他信号提供低阻抗的回流路径。 电源噪声的主要来源: 供电模块(VRM,包括 LDO/DC-DC)的输出噪声 走线的直流电阻与寄生电感 同步开关噪声(SSN) 电源与地平面谐振噪声 临近电源网络耦合噪声 其他部件耦合噪声 大量的芯片引脚在进行逻辑状态切换时,会有一个大的瞬态电流流过回路,造成地平面的波动,会造成芯片的地与系统地不一致,称为地弹;造成芯片和系统的电源有差压,称为电源弹。在进行 PCB 叠层设计时,尽可能增大电源平面叠层之间的垂直距离,减少电源平面和地平面之间的垂直间距。 电源完整性设计策略 关注过孔、走线和电源平面的通流能力;当在一个平面上布置多个电源时,需要进行电源平面的分割,分割方式要简洁合理,分割区域的大小要满足载流能力的要求; 尽可能使电源平面与地平面成对相邻出现,且尽可能接近; 关注去耦电容的设计,电容的去耦作用是有一定的距离要求的,即去耦半径。电容焊盘的扇出方式推荐采用多过孔的方式。 关注同步开关噪声(SSN,地弹和电源弹)的影响,可增加去耦电容;在满足系统整体性能需求前提下,尽可能使用平缓的驱动信号(减缓驱动器的上升沿和下降沿时间) 电源完整性的测试项目 电压值(精度) 测试仪器:万用表 测试方法:分别在测试空载 / 满载下测试 测试点:电源芯片输出管脚、用电芯片的电源管脚 合格标准:一般在标称电压值 ±5% 范围内(根据芯片的电压要求来确定) 电源噪声 / 纹波 定义 纹波:出现在输出端子间的一种与输入频率和开关频率同步的成分,用有效值表示,一般在输出电压的 0.5% 以下 噪声:出现在输出端子间的纹波以外的一种高频成分,也用峰 - 峰(peak to peak)值表示,一般在输出电压的 1% 以下 纹波噪声:两者合成,用峰 - 峰(peak to peak)值表示,要求一般在输出电压的 2% 以下 测试仪器:示波器 测试方法 分别在测试空载 / 满载下测试 纹波:采用地线环靠接测量法(靠接测量),示波器设置带宽(bandwidth)为 20MHz,直流偏置电压(offset)为上面电压精度测量值。 纹波噪声:把示波器带宽设置成全带宽(Full) 测试点:输出电容两端 合格标准: 一般要求纹波 < 输出电压的 1%(在 20MHz 带宽下测试,结果可视为单纯的纹波) 一般要求纹波噪声 < 输出电压的 2%(在全带宽下测试,结果可视为纹波 + 噪声) 注意事项 测试时注意就近原则,保持地环线最短 测试使用无源探头 测试纹波时记录其频率,以便分析 电压上下电波形 测试仪器:示波器 测试方法:示波器设置为上升 / 下降沿触发,开关电源观察上下电波形,能完整显示出来以看出问题 测试点:电源芯片的输出管脚、系统上的电源线 合格标准 电源输出端电压上下电过冲一般要求不超过被测电压的 10%。在芯片前端测试时,可参考电平通用标准 电源上电时电压不得有很大的跌落,下电时不能有很大的反冲和回勾(跌落和反冲不能跨越芯片启动工作电压),如出现台阶现象需要评估影响。 如果出现负电压,就需要结合实际情况讨论 注意芯片的上下电时序要求 注意事项:需要遍历系统上下电、单板插拔、电源板插拔的情况 缓启动电路参数 测试仪器:示波器 测试方法:使用多通道测试,上电观察时间差 测试点:一路在缓启动之前的电路,一路在缓启动之后 合格标准 延迟时间(\(T_{delay}\)):一般要求其范围 20 ~ 200ms 上升时间(\(T_{rise}\),输出电压从 10% 上升到 90% 的时间):要求其范围越小越好,但同时要求冲击电流满足合格标准 没有多次振荡现象 注意事项:需要遍历系统上下电、单板插拔、电源板插拔的情况 电源电流和冲击电流 测试仪器:示波器 测试方法: 电源电流:使用电流探头,观察电源上电电流波形和上电后电流的平稳波形 冲击电流:同上。上电冲击电流最好在冷机时测试(冲击电流最大);下电冲击电流最好在单板满载时进行 测试点:将电流探头卡在被测试电流通路上 合格标准 电源电流稳定值不能超过 90% 最大额定输出电流 冲击电流值不能超过额定输出电流的 5 倍(3 倍以上应引起注意) 任何情况下的电流一定要大于电源的最小负载,且须满足最大容性负载要求 注意事项 需要遍历系统上下电、单板插拔、电源板插拔的情况 测试冲击电流,需要取下感性元件如电感,因为感性器件本身具有抑制冲击电流的作用。 电源告警信号 测试方法:使系统产生告警条件,测试告警信号的电平大小 测试点:告警信号的接收末端 合格标准:参考电源芯片的规格书 冗余电源的均流参数 测试方法:用测试电源输出电流的方法,测试冗余电源的每路电流的输出值,比较每路输出电流的大小 测试点:冗余电源的每路电流输出链路 合格标准:系统电源、其冗余电源(均流)的各路电流输出值相差 10% 以下 参考与致谢 电源完整性(PI)概述 《硬件信号质量 SI 测试规范》 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

电源拓扑 - 开关稳压(隔离型)

电源拓扑 - 开关稳压(隔离型) 区别于非隔离型开关稳压,在隔离型开关稳压拓扑中,能量是通过相互耦合的磁场元件(变压器)传递,源极与负载仅仅是通过磁场耦合的,所以在输入与输出之间有电隔离。 隔离型 DC-DC 拓扑结构 对隔离型 DC-DC 转换器而言,常用拓扑一般是反激式(Flyback),正激式(For-ward)和推挽式(Push-pull)这三种。 在这些隔离型转换器中,从输入到输出的能量传递是通过变压器完成的。能量通过相互耦合的磁场元件(变压器)传递,源极与负载仅仅是通过磁场耦合的,所以形成了输入与输出之间的电隔离。与非隔离型转换器一样,稳压的过程是通过 PWM 控制器在反馈回路中调节输出电压实现。 反激式 Flyback 反激式(Flyback)转换器可以把一个较高的输入电压,转换为一个较低的稳定输出电压。当开关 \(S_1\) 闭合的时候,能量存储在变压器的磁芯中,而当开关 \(S_1\) 断开的时候,再把能量传递到次级端。其拓扑图如下: 注:图中的开关 \(S_1\) 实际为电子开关(可为功率 MOS 管),此处为了易于理解,简化为普通的开关。 基本原理: 开关 \(S_1\) 闭合(蓝色实线) 此时变压器 \(T_1\) 的初级绕组侧形成环路,流经初级绕组电感的 \(L_P\) 的电流 \(I_{S1}\) 以 \(\frac{V_{in}}{L_P}\) 的速率增长。此时不会有电流通过次级绕组电感 \(L_S\) 流至负载,负载电流是由电容 \(C_1\) 提供的。 此时变压器输入的能量为:\(\frac{V_{in}*t_{on}}{N}\)(N 为匝数比) 开关 \(S_1\) 断开(绿色虚线) 此时由于变压器 \(T_1\) 中的磁场崩塌,导致初级与次级绕组中的电压反相,初级绕组中储存的能量被传递到次级绕组,传递过程中次级绕组的电压迅速上升,并且伴有一个脉冲电流,这个电流以 \(\frac{V_{out}}{L_S}\) 的速率下降,并给负载供电、给电容 \(C_1\) 充电。二极管 \(D_1\) 在这里充当峰值整流器。 此时变压器输出的能量为:\(V_{out}*t_{off}\) 因为变压器的能量传递守恒(即能量守恒),\(\frac{V_{in}*t_{on}}{N}=V_{out}*t_{off}\),可得到: \[ V_{out}=\frac{1}{N}\cdot\frac{δ}{1-δ} \cdot V_{in} \] 各节点的波形曲线: 可以发现,Flyback 与 Buck-Boost 传递公式只相差了 1/N 这个系数。Flyback 的优点在占空比很小的情况下,输出电压可以调得很高,所以很适用于输出高电压的电源。其次,也可以添加多个次级绕组,实现多个输出,且极性可以各不相同,适用于低成本设计。 Flyback 的缺点是,需要谨慎选择变压器气隙磁芯,不应使其进入饱和状态,因为如果磁滞现象很严重的话,会使变压器的效率大幅降低。另外,因峰值电流很高,绕组中的涡电流损耗也是一个问题。这两个问题限制了 Flyback 的实际可操作频率范围。最后当 S1 打开的瞬间,初级绕组上会出现一个很大的感性尖峰,这会对开关场效应管造成很大的压力。 正激式 Forward 正激式 Forward 可根据关于匝数比的函数,生成一个稳定的输出电压。其拓扑图如下: 基本原理: 开关 \(S_1\) 闭合(蓝色实线) 此时变压器 \(T_1\) 的初级绕组侧形成环路,流经初级绕组电感的 \(L_P\) 的电流 \(I_{S1}\) 以 \(\frac{V_{in}}{L_P}\) 的速率增长。由于初级与次级绕组是互相耦合的,所以初级绕组中电流增大,会导致次级绕组上产生感应电流,次级绕组两端感应电压为 \(\frac{V_{in}}{N}\)。次级绕组上的电流以 \(\frac{V_{in}}{L_1 N}\) 的速率增长,通过整流二极管 \(D_1\) 和输出电感 \(L_1\),最终给负载 \(R_L\) 与输出电容 \(C_1\) 供电。 此时变压器输入的能量为:\((\frac{V_{in}}{N}-V_{out})\cdot t_{on}\)(N 为匝数比) 开关 \(S_1\) 断开(绿色虚线) 当电容 \(C_1\) 两端的电压逐渐上升到上限阈值时,会产生一个「关断」的反馈信号(一般由光耦器件实现),使得开关 \(S_1\) 断开,中断了源电流供应。此时复位绕组与二极管 \(D_3\) 共同保持变压器中的磁场不消失(但也将导致电流以 \(\frac{V_{in}}{L_P}\) 的速率下降)。次级绕组两端电压会出现极性反转,反向电流以 \(\frac{V_{out}}{L_1}\) 的速率下降,经过续流二极管 \(D_2\) 电感 \(L_1\),为负载 \(R_L\) 与输出电容 \(C_1\) 供电。当 \(C_1\) 两端的电压下降到阈值时,将产生一个「开启」的反馈信号,让 \(S_1\) 再次闭合,开始一个新的周期。 此时变压器输出的能量为:\(V_{out}\cdot t_{off}\) 根据变压器的能量传递守恒(即能量守恒),\((\frac{V_{in}}{N}-V_{out})*t_{on}=V_{out}\cdot t_{off}\),可得: \[ V_{out}=\frac{δ}{N} \cdot V_{in} \] 各节点的波形曲线: 相比 Flyback 的区别是,Forward 是连续将能量通过变压器从初级传递到次级的,而不需要将能量储存在变压器的气隙磁芯中。这样一来磁芯不再需要气隙,相应地也不会带来损耗和 EMI 辐射。因为磁滞损耗在 Forward 中不再是哥严重的问题,所以磁芯的电感可以很大,峰值电流可以因此降低,这一来又进一步减小了绕组和二极管中的损耗,也降低了输入输出的纹波电流。 所以,在相同输出功率下,Forward 比 Flyback 效率高,但缺点是成本也相对高,且需要设置一个最小负载以保持不会进入非连续模式,因为在非连续模式下,能量传递的方式是完全不同的。 有源钳位正激式 Active Clamp 🚧 推挽式 Push-Pull 🚧 参考与致谢 《开关电源基础知识》 升压型、降压型和升降压型转换器简介 《开关电源原理与设计》 《DC-DC 转换器知识手册及用户实用技巧》 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

电源拓扑 - 开关稳压(非隔离型)

电源拓扑 - 开关稳压(非隔离型) 开关电源是利用电控开关管开通和关断的时间比率,以维持稳定输出电压的一种电源,现代开关电源一般由脉冲宽度调制(PWM)控制 IC 和 MOSFET 构成。 开关稳压基础概念 一个完整周期的时间:\(T_{s}\) 电子开关接通的时间:\(T_{on}\) 占空比 \(\delta=\frac{T_{on}}{T_{s}}\) 电感的伏秒平衡:处于稳定状态的电感,开关导通时间(电流上升段)的伏秒数,须与开关关断时间(电流下降段)的伏秒数在数值上相等。 功率相等原则:在不考虑效率的情况下,开关电源的输入功率等于输出功率,即输入电压与电流的乘积,相当于输出电压与电流的乘积。直观上,降压转换器能提供比输入更大的电流,而升压转换器的输出电流小于输入的电流。 开关稳压主要元件及特性 开关稳压使用的主要元器件是电子开关、电感与电容。 电子开关 电子开关的要求就是实现快速闭合断开,越快越好,一般常用三极管、功率 MOS 管或 IGBT 管。 电感 电感作为储能元件,在 DC-DC 中用于平滑电流(所以也称扼流圈)。流过电感的电流特点是有磁通连续性(可以理解为惯性)。通常情况下,电感工作在其线性区,此时电感值为常数,不随端电压和流过的电流而变化。电感有以下几个特点: 电感 \(L\) 中有电流 \(I\) 流过时,储存有 \(\frac{1}{2}LI^2\) 的能量。 电感 \(L\) 两端电压 \(V\) 不变时,因为 \(V=L\frac{di}{dt}\),忽略内阻,电感电流的变化率就是 \(\frac{di}{dt}=\frac{V}{L}\),即电感电流呈线性增加。 正在储能的电感,如果突然切断原回路,电感会维持磁场不变,即电流不能瞬时突变,或者说伏·秒值不变。 电感中储存的功率可表示为: \[ P(L)=\frac{LI^2f}{2} \] 可以看出,电感中储存的功率与开关频率成正比关系。如果开关频率加倍,则电感尺寸可减半。 电容 电容在 DC-DC 中也是用来储能与传递电能的,但跟电感频率特性相反,它主要用来吸收纹波、平滑电压波形,使输出电压变得平稳。也称其为输出电容。 电容中储存的功率可表示为: \[ P(C)=\frac{CV^2f}{2} \] 与电感同理,电容可以通过增加开关频率,从而缩小尺寸。但需要注意的是,开关频率越高,一般会产生越高的噪声,所以需要在尺寸和频率之间权衡。 二极管 在非同步 DC-DC 中,我们使用二极管为开关断开时的电感提供续流回路,所以也称其为续流二极管。而在同步 DC-DC 中,会使用电子开关来代替续流二极管。 非隔离型 DC-DC 拓扑结构 非隔离型 DC-DC 拓扑结构在工作时,输入源级与输出负载共享同一条电流路径。 用电子开关、电感、电容、二极管,能构成最简单的 PWM 型 DC-DC。主要分三类:降压型 Buck、升压型 Boost、升降压型 Buck-Boost,以下将详细展开说明。另外还有双级反相升降压型 Cuk(音 chook),双级正相升降压型 SEPIC(ZETA),因较少应用不展开描述。 降压型 Buck 降压型 Buck 是把一个较高的电压转换为一个稳定的低电压。其拓扑如下: 注:图中的开关 \(S_1\) 实际为电子开关(可为功率 MOS 管),此处为了易于理解,简化为普通的开关。 基本原理: 开关 \(S_1\) 闭合(蓝色实线) 此时二极管 \(D_1\) 截止,电流经过电感 \(L_1\),给负载 \(R_L\) 供电,同时将电能储存在电感 \(L_1\) 和电容 \(C_1\) 中。在电感线圈未饱和前,电流呈线性增加(电感内电流不能突变),输出电压不能立刻达到输入的电压值。 此时电感正向伏秒为:\((V_{in}-V_{out})* T_{on}\) 开关 \(S_1\) 断开(绿色虚线) 电感 L 因自感惯性作用,其电流方向大小不能发生突变。这时候电流会流经由续流二极管 \(D_1\) 提供的回路,继续为输出负载供电。此时电容 \(C_1\) 也参与放电。 此时电感反向伏秒为:\(V_{out} * T_{off}\) 根据电感伏秒平衡(即能量守恒),\((V_{in}-V_{out})* T_{on}=V_{out} * T_{off}\),可得到: \[ V_{out}=\delta*V_{in} \] 各节点的波形曲线: 通过控制 PWM 的占空比,使得电子开关 \(S_1\) 不断地闭合断开,此时的输入电流是脉动的。但经过电感、电容、二极管的共同作用下,输出的电流是相对连续平稳的。 升压型 Boost 升压型 Boost,可以把一个较低的电压转换为一个稳定的较高电压。其拓扑如下: 基本原理: 开关 \(S_1\) 闭合(蓝色实线) 电流流经电感 \(L_1\),在电感未饱和前,其电流以 \(\frac{V_{in}}{L_1}\) 的速率线性增加,电能以磁能形式储存在电感中。此时电容 \(C_1\) 为负载 \(R_L\) 供电,假设此时负载两端电压为 \(V_0\)。因为开关 \(S_1\) 闭合,所以二极管 \(D_1\) 阳极接地,电容放出的电不能通过二极管。 此时电感正向伏秒为:\(V_{in}* T_{on}\) 开关 \(S_1\) 断开(绿色虚线) 由于电感 \(L_1\) 上的电流不能突变,所以电感上的磁能转化为电压输出电流,以 \(\frac{V_{out}-V_{in}}{L_1}\) 的速率线性下降,与电源 \(V_{in}\) 形成串联,向电容 \(C_1\) 和负载 \(R_L\) 供电。当串联电压高于\(V_0\) 时,电容 \(C_1\) 状态为充电;当串联电压等于 \(V_0\) 时,充电电流为零;当 \(V_0\) 有下降趋势时,电容向负载放电,以维持 \(V_0\) 不变。 此时电感反向伏秒为:\((V_{out}-V_{in})* T_{off}\) 根据电感伏秒平衡 \(V_{in}* T_{on}=(V_{out}-V_{in})* T_{off}\) ,可得到: \[ V_{out}=\frac{\delta}{1-\delta}*V_{in} \] (当且仅当 V{in}<V 时成立) 各节点的波形曲线: 因为串联时负载两端电压 \(V_0\) 高于原本的 \(V_{in}\),所以能实现升压。 升降压型 Buck-Boost 升降压型 Buck-Boost 可以把一个输入电压转换为一个反相的稳定输出电压,这个输出电压的值可以高于或低于输入电压的值。其拓扑如下: 基本原理: 开关 \(S_1\) 闭合(蓝色实线) 电流流经电感 \(L_1\),在电感未饱和前,其电流以 \(\frac{V_{in}}{L_1}\) 的速率线性增加;二极管 \(D_1\) 反向截止,阻断从电源通向负载的电流。这段时间内存储在 \(C_1\) 中的能量对负载供电。 此时电感正向伏秒为:\(V_{in}* T_{on}\) 开关 \(S_1\) 断开(绿色虚线) 由于电感 \(L_1\) 上的电流不能突变,其电流以 \(\frac{V_{out}}{L_1}\) 的速率线性下降,所以电流走绿色虚线回路,对负载供电,并给电容 \(C_1\) 充电,二极管 \(D_1\) 正向导通。流经电感的电流呈线性减小。由于电流的流向,输出电压对地而言是负值,所以这个拓扑结构的输出是反相的。 此时电感反向伏秒为:\(-V_{out}* T_{off}\) 根据电感伏秒平衡 \(V_{in}* T_{on}=-V_{out}* T_{off}\) ,可得到: \[ V_{out}=\frac{-\delta}{1-\delta}*V_{in} \] 各节点的波形曲线: 升降压型转换器的优点是输入电压可以低于也可以高于稳压后的输出电压。实际可用于电池供电电路,比如系统需要 12V 的电源,电池充满电是 13V,亏电是 11V 的情况。 Buck 与 Boost 的连续与非连续模式 连续(CCM)与非连续(DCM)模式,指的是 电感的电流是否会下降至 0。如果负载很大,那么电感中的电流不会降至 0,就称为连续的;反之如果负载很小,转换器有足够的时间对输出端的电容进行完全充电,那么在剩余的时间里,电感的电流将会降至 0,当新的周期开始后,电感电流又重新从 0 开始线性增加,这称为非连续模式。 连续与不连续的临界状态是 \(\frac{1}{2}\Delta i_L=I_{out}\)。当 \(\frac{1}{2}\Delta i_L<I_out\) 时,则为连续模式;反之则为不连续。 在低负载的情况下,连续模式过渡到非连续模式将导致输入输出电压关系的变化: 因此为了保持在连续模式下工作,许多升降压控制器在低负载的情况下选择提高它们的工作频率。 同步与异步转换 同步与异步的区别,指 逆向电流保护整流器(续流管)用的是二极管还是场效应管。如下图,左侧是异步,右侧是同步: 同步的模式下,场效应管的启动信号必须是与 PWM 信号异相位的。 同步相比异步的优点是,场效应管的 \(R_{DS(on)}\) 很小,正向压降很小,在高电流和地输入电压的情况下,会有更高的效率。而且大功率场效应管的封装一般比功率二极管小,因此可以省空间。 同步相比异步的缺点是,会带来额外的驱动电路和防止两个场效应管同时导通所需的时序电路,会提高成本;另外在低负载的情况下,场效应管栅极电容充放电会产生额外的功耗,所以效率实际上比异步的低。 参考与致谢 《开关电源基础知识》 升压型、降压型和升降压型转换器简介 《开关电源原理与设计》 《DC-DC 转换器知识手册及用户实用技巧》 《Power-Topologies-Quick-Reference-Guide_TI》 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

电源拓扑 - 线性稳压

电源拓扑 - 线性稳压 线性稳压器的功能是将一个稳定的或者不稳定的输入源电压转换为一个稳定的输出电压。正常工作时,即使输入端的电压出现巨大的波动,输出端的电压仍可以保持稳定。 线性稳压器的原理 大多数的线性稳压器是用闭环控制的。为了得到想要的输出电压值,我们可以通过调整 R1/R2 的比值,使在放大器反相输入端的电压等于放大器正相输入端的参考电压 \(V_{ref}\)。误差放大反馈回路的作用是使两个输入端之间的电压差保持为 0。 其原理是,如果负载减小 / 输入电压增大,则输出端的电压将变大,放大器反相输入端的电压将高于正相输入端的电压 \(V_{ref}\),误差放大器输出端的电压为负值,传导晶体管的基极的电压变小,最终晶体管的输出电压也将变小。反之,如果负载增大 / 输入电压减小,放大器反相输入端的电压将下降,小于正相输入端的电压 \(V_{ref}\),传导晶体管的基极电压变大,导致输出电压变大,以补偿原本应该下降的输出端电压。反馈回路可以同时调整由输入电压变化(线路调整 Line regulation)和负载变化(负载调整 Load regulation)所引起的电压变化。 线性稳压器的效率 线性稳压器的效率,指的是输出端的功率 \(P_{out}\) 与输入端的功率 \(P_{in}\) 之比: \[ η = \frac{P_{out}}{P_{in}} \] 其中, \[ P_{out}=V_{out}*I_{out}, \] \[ P_{in}=V_{in}*I_{in}, \] \[ I_{in}=I_{out}+I_{q} \] \(I_{q}\) 是无负载下的静态电流。 低压差线性稳压器 - LDO 普通线性稳压器中,使用双极性晶体管作为电流放大器。因构成达灵顿电路,所以存在一定的压差。 如果用 P 沟道场效应晶体管代替双极性晶体管,就得到了所谓的低压差线性稳压器(Low Drop Output, LDO),它的必要压差只有几百毫伏。 因为场效应管的必要压差仅仅取决于它的正向导通电压(相当于 \(R_{ds}*I_{load}\))。通常电阻 \(R_{ds}\) 非常小,所以必要压差也就非常低。 优缺点及应用 优点 电路简单、便宜 输出端噪声低 对噪声的隔离度高 快速的瞬态响应 缺点 需要一定的压差才能起稳压作用,因此只能做降压用。 在压差比较大的情况下,转换效率比较低,损耗都以发热的方式消耗掉,并影响板卡的稳定性、可靠性。 功率至上,即便负载电路并不需要很大电流。这样做的后果就是所有元件即便非必要的时候也工作在满负荷下,结果产生高很多的热量。 在压差不够的情况下,会出现比较大的纹波。 应用 对供电电源的噪声要求严格的模拟电路、时钟产生电路等。 小电流、电源转换效率影响不大的数字电路供电场景。 参考与致谢 请举手回答,LDO 和 DC-DC 有什么不同? 在系统中成功运用低压差稳压器(AN-1072) 《线性稳压器基础知识》 LDO 基础知识:工作原理及应用 《DC-DC 转换器知识手册及用户实用技巧》 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

电源方案(Boost)- SX1308

电源方案(Boost)- SX1308 注:此方案 IC 不稳定,不推荐使用。 项目地址:https://github.com/linyuxuanlin/Modularity_of_Functional_Circuit/tree/master/Power/SX1308 原理:DC/DC(Boost) 输入电压:2-24 V 输出电压: 最高 28 V 输出电流: 2 A 工作频率: 1.2 MHz 效率:最高 97% 价格:¥ 0.57 特性 内置软启动 输入欠压锁定 轻载时自动切换至 PFM 模式 电流限制 过热保护 引脚定义 参考设计 参数调节 (更详细的参数请参考数据手册) 输出电压调节 通过调整反馈分压电阻 \(R_1\) 和 \(R_2\) 来设置输出电压(反馈电压 \(V_{REF}=0.6 V\)): \(V_{OUT}=V_{REF}\times(1+\frac{R_1}{R_2})\) 一般来说,\(R_2\) 选取 10 kΩ,则 \(V_{OUT}\) 与 \(R_1\) 对应关系如下: \(V_{OUT}\) \(R_1\) 5 V 73.2 kΩ 10 V 158 kΩ 12 V 191 kΩ 15 V 240 kΩ 20 V 324 kΩ 使能引脚 EN 为使能脚,大于 1.5 V 时启动,小于 0.4 V 时关闭,请勿悬空此引脚。 PCB 布局参考 输入电容电源靠近 IC 电源引脚放置。 输入输出电容靠近 IC 的 GND,以减小电流环路面积。 加宽、缩短 VIN,SW 和 VOUT 的走线,以通过较大的交流电流。 缩小芯片 SW 脚处铜皮,预防因交变电压引起的 EMI。 缩短 FB 走线以防噪声干扰,反馈电阻要靠近芯片放置,R2 的 GND 应尽量靠近 IC 的 GND 引脚放置,且 VOUT 到 R1 的布线应该远离电感和开关节点。 踩坑总结 中文数据手册中的参考原理图,15 pF 的 NP0 电容估计画错了,应该是接地的滤波电容(也可以不加)。如果不去掉的话,带不了大负载。 参考技术贴 http://www.crystalradio.cn/thread-1497661-1-1.html 此电路受 PCB 布局的影响很大,SW 脚处引出的铜皮不能多,否则会有寄生电容。其他应严格按照上文的布局参考。 实测负载最大输出电流 800 mA 左右,能基本保持输出电压稳定(输出 11.6 V)。 EN 引脚不能悬空,必须上拉(开启 Boost)或下拉(关闭),否则将会以原电压输出。 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

电源方案(Buck)- LMR14050

电源方案(Buck)- LMR14050 LMR14050 是 TI 的一款 Buck 转换器芯片,输入电压范围很宽(4-40V),且能提供 5A 的持续输出电流,轻载有休眠模式提高效率。它的内部集成度高,所以外围需要设计的元器件很少。开关频率能通过外部电阻 \(R_T\) 在 200kHz-2.5MHz 范围内选择,也能够与 250 kHz-2.3 MHz 频率范围内的外部时钟同步。保护功能有过温关断、\(V_{OUT}\) 过压保护(OVP)、\(V_{IN}\) 欠压锁定(UVLO)、逐周期电流限制和带频率折返的短路保护。 项目仓库: Collection_of_Power_Module_Design/DC-DC(Buck)/LMR14050 项目在线预览: 主要特性 拓扑:DC/DC(Buck) 器件型号:LMR14050SDDA 封装:HSOIC-8 输入电压:4-40 V 输出电压:0.8-28V 输出电流: 5A 持续 工作频率: 200kHz-2.5MHz 参考价格:¥ 11.3 其他特性 40µA 超低工作静态电流 关断电流:1µA 90mΩ 高侧 MOS 管 最短导通时间:75ns 电流模式控制 热保护、过压保护和短路保护 内部功能框图 引脚定义 BOOT:给高侧 MOS 管的自举电容。在 BOOT 和 SW 间接一个 0.1uF 电容。 VIN:电源输入,经过去耦电容 \(C_{IN}\) 后接到此引脚。 EN:使能开关,内部上拉。外部拉低于 1.2V 可关闭输出,浮空或接 \(V_{IN}\) 使能输出。欠压锁定的调节请见下文。 RT/SYNC:电阻时序或外部时钟输入。当使用外部电阻接地来设置开关频率时,内部放大器将此引脚保持在固定电压。如果引脚被拉至高于 PLL 上限阈值,则会发生模式更改并且引脚变为同步输入。内部放大器被禁用,引脚是内部 PLL 的高阻抗时钟输入。如果时钟边沿停止,则重新启用内部放大器并且操作模式返回到通过电阻器进行的频率编程。? FB:反馈输入引脚,由电阻从 \(V_{OUT}\) 分压输入反馈,不可直接接地。 SS:缓启动控制引脚,接电容设置缓启动时间。 SW:稳压开关输出,在内部连高侧 MOS 管。接功率电感。 特性描述 稳压原理 LMR14050 的输出电压通过开启高侧 N-MOS 并控制导通时间来调节。在高侧 N-MOS 导通期间,SW 引脚电压摆动至大约 \(V_{IN}\),电感电流 iL 随线性斜率 (\(V_{IN}\) – \(V_{OUT}\)) / L 增加;当高侧 N-MOS 关断时,电感电流通过续流二极管,以 \(V_{OUT}\) / L 的斜率放电。稳压器的控制参数由占空比 \(D = t_{ON} /T_{SW}\) 决定,其中 \(t_{ON}\) 是高端开关导通时间,TSW 是开关周期。稳压器控制环路通过调整占空比 D 来保持恒定的输出电压。在理想的降压转换器中,损耗被忽略,D 与输出电压成正比,与输入电压成反比:\(D = V_{OUT} / V_{IN}\)。 连续导通模式(CCM)下的 SW 电压与电感电流的对应关系: 睡眠模式 轻载状态下会进入睡眠模式,以提高效率、减少门极驱动损耗(通过减少开关切换)。如果输出的峰值低于 300mA 将会触发睡眠模式。 BOOT 自举电路的设计 LMR14050 内部集成了自举电压转换器,在 BOOT 和 SW 引脚接一个自举电容,就可以提供足以驱动高侧 MOS 管门极的电压。BOOT 电容的参考值为 0.1uF(X7R 或 X5R 陶瓷电容,耐压至少 16V)。 输出电压调节 LMR14050 提供一个 0.75V 的内部参考电压。输出电压通过电阻分压器,从 \(V_{OUT}\) 分压出来输入 FB 引脚,在内部进行比较调节。分压电阻建议使用偏差 1% 或更低的、温度系数 100 ppm 或更低的。通过所需分压电流选择低侧电阻 \(R_{FBB}\)(参考值是 10-100kΩ),并通过公式计算高侧电阻 \(R_{FBT}\)。选择较大的阻值有利于提高轻载效率,但如果太大,稳压器将更容易受到来自 FB 输入电流的噪声和电压误差的影响。 \[ R_{FBT}=\frac{V_{OUT}-0.75}{0.75}R_{FBB} \] EN 使能与欠压锁定调节 当 \(V_{IN}\) 高于 3.7V,且 EN 高于 1.2V 阈值时 LMR14050 开启输出,当 \(V_{IN}\) 掉落到低于 3.52V 或 EN 低于 1.2V 时稳压器关闭。EN 有内部上拉电流源(1uA)以确保 EN 脚浮空时稳压器正常输出。 可通过调节 EN 的外部上下拉电阻,以调节启动和关闭的电压阈值: \(R_{ENT}\) 和 \(R_{ENB}\) 遵从以下公式计算: \[ R_{ENT}=\frac{V_{STRAT}-V_{STOP}}{I_{HYS}} \] $$ R_{ENB}=\frac{V_{EN}}{\frac{V_{START}-V_{EN}}{R_{ENT}}+I_{EN}} $$ 其中,\(V_{STRAT}\) 是希望使能启动的电压阈值,\(V_{STOP}\) 是希望欠压关闭的电压阈值,\(I_{HYS}\) 是当 EN 电压超过 1.2V 时从 EN 来的滞后电流(典型值为 3.6uA)。 外部缓启动 缓启动用于抵御通电时冲击稳压器与负载的浪涌电流,可通过外置连接于 SS 与 GND 之间的电容 \(C_{SS}\) 来进行配置。有一个内部电流源 \(I_{SS}\)(典型值为 3uA)为电容充电并生成一个从 0V 到 \(V_{REF}\) 的斜坡。缓启动时间可通过公式配置: \(t_{SS}(ms)=\frac{C_{SS}(nF)*V_{REF}(V)}{I_{SS}(uA)}\) 在稳压器失能或内部关闭时,缓启动将会被重置。 开关频率与同步(RT/SYNC) LMR14050 的开关频率可以被接在 RT/SYNC 和 GND 之间的电阻 \(R_T\) 编程设定。RT/SYNC 引脚不可浮空或端接到地,根据以下公式或图表决定其阻值: \[ R_T(kΩ)=32537*f_{SW}^{-1.045}(kHz) \] LMR14050 开关动作也可以被外部时钟输入信号同步(250kHz-2.3MHz): 内部晶振将会被外部时钟的下降沿同步。外部时钟推荐高电平不低于 1.7V,低电平不高于 0.5V,最小脉宽不低于 30ns。如果接低内阻信号源,那么频率设定电阻 \(R_T\) 需要被并联到 AC 耦合电阻 \(C_{COUP}\)(可为 10pF 陶瓷电容),接到终端电阻 \(R_{TERM}\)(例如 50Ω),这样可以较好地匹配阻抗。 过流与短路保护 LMR14050 通过对高侧 MOS 管的峰值电流进行逐周期电流限制,以防止过流情况。每个开关周期都会将高端开关电流与误差放大器(EA)的输出减去斜率补偿进行比较。高侧开关的峰值电流受限于恒定的钳位最大峰值电流阈值。因此,高侧开关的峰值电流限制不受斜率补偿的影响,并且在整个占空比范围内保持恒定。 过压保护 LMR14050 内置输出过压保护(OVP)电路,以最大限度减少电压过冲。当 FB 电压达到上升 OVP 阈值(VREF 的 109%)时会关闭高侧 MOS 管;当降至低于 OVP 下降阈值(VREF 的 107%)时,高侧 MOS 管恢复正常工作。 热关断保护 LMR14050 有内部热关断保护功能。当结温超过 170℃ 时热关断激活,高侧 MOS 管停止开关。当芯片温度降至 158℃ 以下,才会从内部软重启。 参考设计 设计参数: 输入电压 \(V_{IN}\):7-36V,典型值为 12V 输出电压 \(V_{OUT}\):5V 最大输出电流 \(I_{O\_MAX}\):5A 瞬态响应(0.5-5A):5% 输出电压纹波:50mV 输入电压纹波:400mV 开关频率 \(f_{SW}\):300kHz 缓启动时间:5ms 输出电压设置 根据上面的公式,如果我们需要输出电压为 5V,则可选 \(R_{FBT}\) 为 100kΩ,\(R_{FBB}\) 为 17.4kΩ(17.65kΩ 的近似值,经调试均衡损耗)。 如果我们需要输出电压为 12V,则可选 \(R_{FBT}\) 为 100kΩ,\(R_{FBB}\) 为 6.34kΩ(6.666kΩ 的近似值,经调试均衡损耗)。 开关频率设置 我们选择 300kHz 的开关频率,根据上面的公式,\(R_T\) 选取 84.5kΩ(83.9kΩ 的近似值)。 输出电感选型 在 DC-DC 中,电感最关键的参数是电感值、饱和电流和 RMS 电流。电感值的选取基于所需的峰-峰纹波电流 \(Δi_L\)。由于纹波电流随着输入电压的增加而增加,所以始终使用最大输入电压来计算最小电感值 \(L_{MIN}\)。输出电感的最小值可通过公式计算: \[ Δi_L=\frac{V_{OUT}*(V_{IN\_MAX}-V_{OUT})}{V_{IN\_MAX}*L*f_{SW}} \] \[ L_{MIN}=\frac{V_{IN\_MAX}-V_{OUT}}{I_{OUT}*K_{IND}}*\frac{V_{OUT}}{V_{IN\_MAX}*f_{SW}} \] 其中,\(K_{IND}\) 是表示电感器纹波电流相对于最大输出电流的系数,合理值应该是 20%-40%。在瞬时短路或过流操作事件期间,RMS 和峰值电感电流可能很高。电感电流额定值应高于电流限制。 一般来说,电感值越低越好,因为它通常带来更快的瞬态响应、更小的 DCR 及更小的尺寸。但是太低的电感值会带来较大的电感电流纹波,从而可能错误触发满载时的过流保护。由于 RMS 电流略高,它还会产生更多的传导损耗。较大的电感电流纹波,也意味着较大的输出电压纹波。对于峰值电流模式控制,不建议电感电流纹波过小,较大的峰值电流纹波可提高比较器的信噪比。 在参考设计中,\(K_{IND}\) 的值取 0.4,所以计算得到最小的电感值为 7.17uH,接近的取值为 8.2uH。可选用 7A RMS 电流和 10A 饱和电流的 8.2 μH 铁氧体电感器。 输出电容选型 输出电容 \(C_{OUT}\) 的选择直接影响稳态输出电压纹波、环路稳定性、负载电流瞬变期间的电压过冲和下冲。输出纹波本质上由两部分组成。一是电感电流纹波通过输出电容的等效串联电阻(ESR)引起的: \[ ΔV_{OUT\_ESR}=Δi_L*ESR=K_{IND}*I_{OUT}*ESR \] 另一种是由电感电流纹波对输出电容充放电引起的: \[ ΔV_{OUT\_C}=\frac{Δi_L}{8*f_{SW}*C_{OUT}}=\frac{K_{IND}*I_{OUT}}{8*f_{SW}*C_{OUT}} \] 这两种电压纹波并不同相,所以实际的峰-峰纹波会比两者之和小。 如果系统需要严格的电压调节(大电流阶跃和快速压摆率),则输出电容会受到瞬态性能规范的约束。当发生快速大负载提升时,输出电容能够在电感电流上升到适当水平之前,提供所需的电荷。稳压器的控制环路通常需要至少三个时钟周期,来响应输出电压下降。输出电容必须足够大,以提供三个时钟周期的电流差,以将输出电压保持在指定范围内。 当负载突然大幅下降时,输出电容会吸取电感中储存的能量。钳位二极管没法灌电流,所以电感中的电能将会导致输出电压过冲。计算特定输出下冲所需的最小输出电容的公式: \(C_{OUT}>\frac{3*(I_{OH}-I_{OL})}{f_{SW}*V_{US}}\) 将电压过冲保持在指定范围内,所需的最小电容计算公式: \(C_{OUT}>\frac{I_{OH}^2-I_{OL}^2}{(V_{OUT}+V_{OS})^2-V_{OUT}^2}*L\) 其中, \(K_{IND}\) 为电感纹波电流的纹波比(\(Δi_L/I_{OUT}\)) \(I_{OL}\) 为负载瞬态期间的低电平输出电流 \(I_{OH}\) 为负载瞬态期间的高电平输出电流 \(V_{US}\) 为目标输出电压下冲 \(V_{OS}\) 为目标输出电压过冲 在参考设计中,目标输出纹波为 50mV。假设 \(ΔV_{OUT\_ESR}=ΔV_{OUT\_C}=50mV\),\(K_{IND}\) 取值为 0.4,\(ESR\) 不大于 25mΩ,\(C_{OUT}\) 不小于 16.7 μF,参考设计的过冲和下冲范围 \(V_{US}=V_{OS}=5%*V_{OUT}=250mV\)。所以 \(C_{OUT}\) 可分别被计算出不小于 180uF 和 79.2uF,所以选取较严格的标准为 180uF,即使用 4 个 47uF(16V,X7R 陶瓷电容,ESR 为 5mΩ)并联。 肖特基二极管选型 二极管的额定击穿电压最好比最大输入电压高 25%。为了最佳可靠性,二极管的额定电流应等于稳压器最大输出电流。在输入电压远大于输出电压的情况下,二极管平均电流会更低,这时候可以使用平均电流额定值较低的二极管,约为 \((1-D) * I_{OUT}\),但峰值电流额定值应高于最大负载电流。一般选 6-7A 起步。 输入电容选型 LMR14050 需要高频输入去耦电容和大容量输入电容。高频去耦电容的典型推荐值为 4.7-10 μF(X5R/X7R,陶瓷电容,耐压为最大输入电压两倍以上)。在参考设计中,使用了两个额定电压为 100 V 的 2.2 μF X7R 陶瓷电容器。高频滤波电容需要靠近稳压器放置。 大容量电容为电压尖峰提供阻尼,参考值为 47uF 或 100uF 电解电容。 BOOT 自举电容选型 LMR14050 需要一个 BOOT 自举电容,在前文有提及,BOOT 电容的参考值为 0.1uF(X7R 或 X5R 陶瓷电容,耐压至少 16V)。 缓启动电容选型 根据前文公式,如果设定缓启动时间为 5ms,则可得出 22 nF(接近计算值 20nF)的缓启动电容。 Layout 参考 减小 EMI 的 Layout 建议: 反馈网络、电阻 \(R_{FBT}\) 和 \(R_{FBB}\) 应尽量靠近 FB 引脚。 \(V_{OUT}\) 的采样路径应远离噪声产生路径,最好通过屏蔽层另一侧的层。 输入去耦电容需要尽可能靠近 \(V_{IN}\) 和 GND 放置。 电感应靠近 SW 引脚放置,以减少磁噪声和静电噪声。 输出电容 \(C_{OUT}\) 应靠近电感和二极管的节点放置,走线尽可能短,以降低传导和辐射噪声,提高效率。 二极管、\(C_{IN}\) 和 \(C_{OUT}\) 的接地连接应尽可能小,并仅在一个点(最好在 \(C_{OUT}\) 接地点)连接到系统接地层,以最大限度地减少系统接地层中的传导噪声。 实际测试 24V 输入,5V/5A 满载输出,实际输出 4.95V/5.00A,纹波 15mV,温度 110℃。 参考与致谢 技术文档 · LMR14050 N-1149 Layout Guidelines for Switching Power Supplies 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

电源方案(Buck)- TPS54531

电源方案(Buck)- TPS54531 TPS54531 是 TI 的一款具有 Eco-mode 的 3.5V 至 28V 输入、5A、570kHz Buck 转换器。 项目仓库: Collection_of_Power_Module_Design/DC-DC(Buck)/TPS54531 项目在线预览: 主要特性 原理:DC/DC(Buck) 输入电压:3.5-28 V 输出电压: 最低 0.8 V 输出电流: 5 A 工作频率: 570 kHz 效率:最高 92% 价格:¥ 3.80 特性 轻负载时脉冲跳跃 Eco-mode 功能 可调慢启动可限制涌入电流 可编程欠压闭锁(UVLO)阈值 过压瞬态保护 逐周期电流限制、频率折返和热关断保护 引脚定义 参考设计 参数调节 (更详细的参数请参考数据手册) 输出电压调节 通过调整反馈分压电阻 \(R_5\) 和 \(R_6\) 来设置输出电压(反馈电压 \(V_{REF}=0.8 V\)): \[ V_{OUT}=V_{REF}\times[\frac{R5}{R6}+1] \] \(R_5\) 大约取值 10 kΩ,在参考设计中,我们需要输出 4.96 V,所以取 \(R_5\) = 10.2 kΩ,\(R_6\) = 1.96 kΩ。 使能引脚 EN 引脚低于 1.25 V 失能,浮空以使能。这里使用两个电阻进行欠压锁定。 Eco-mode 节能模式 当电感器的峰值电流低于 160 mA 时,芯片进入节能模式,关闭输出。 热关机 当芯片温度超过 165℃ 时,芯片停止运行;当低于 165℃ 时重新启动。 PCB 布局参考 踩坑总结 续流二极管和电感的电流应该大于输出电流。 芯片背面需裸铜上锡用于散热。 布局应按照 Buck 电流流向。 成品板可输出 5 A 电流,但长跑 3 A 以上需要另加散热。功率器件如二极管和电感会发烫。 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

电源方案(Buck)- XL2009E1

电源方案(Buck)- XL2009E1 XL2009E1 是芯龙的一款最高 36V 输入、3A 输出、固定 180kHz 的 Buck 芯片,被指过流保护功能,当短路的时候,频率会降到 48kHz。 项目仓库:Collection_of_Power_Module_Design/DC-DC(Buck)/XL2009E1 主要特性 拓扑:DC/DC(Buck) 器件型号:XL2009E1 封装:SOP8L 输入电压:8-36 V 输出电压:1.25-32V 最小输入输出差:0.3V 最大占空比:100% 工作频率:固定 180kHz 最大输出电流: 3A 效率(输入 12V,输出5V@2.1A):89% 参考价格:¥ 2.1 其他特性 带输出恒流环 内置短路保护 内置限流保护 典型应用电路 根据数据手册提供的典型应用电路(输入 8-36V,输出 5V@2.1A): 引脚定义 FB:反馈输入引脚,由电阻从 \(V_{OUT}\) 分压输入反馈,不可直接接地。反馈参考电压为 1.25V。 OCSET:输出恒流设置引脚。 VC:内部稳压器旁路电容。一般接 1uF 到 VIN。 VIN:供电输入引脚。输入电压为 8-36V。需要有大电容去耦。 SW:Buck 开关输出。 特性描述 内部功能框图 输出电压调节 XL2009E1 提供一个 1.25V 的内部参考电压。输出电压通过电阻分压器,从 \(V_{OUT}\) 分压出来输入 FB 引脚,在内部进行比较调节。分压电阻建议使用偏差 1% 或更低的、温度系数 100 ppm 或更低的。分压电阻选择较大的阻值有利于提高轻载效率,但如果太大,稳压器将更容易受到来自 FB 输入电流的噪声和电压误差的影响。推荐低侧电阻 \(R_1\) 取值为 4.7k,并通过公式计算高侧电阻 \(R_2\): \[ V_{OUT}=1.25*(1+\frac{R_2}{R_1}) \] 肖特基二极管选型 二极管的额定击穿电压最好比最大输入电压高 25%。为了最佳可靠性,二极管的额定电流应等于稳压器最大输出电流。在输入电压远大于输出电压的情况下,二极管平均电流会更低,这时候可以使用平均电流额定值较低的二极管,约为 \((1-D) * I_{OUT}\),但峰值电流额定值应高于最大负载电流。 XL2009E1 的数据手册提供了直接选型表(3A): 输入电压 型号 20V SK32 30V SK33/30WQ03 40V SK34/30WQ04 50V SK35/30WQ05 60V SK36 参数曲线 输出电压与电流的关系: 效率与输出电流的关系: 输出电流与 RCS 电阻的关系(恒流控制): 参考与致谢 XL2009_Datasheet 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

电源方案(LDO)- XC6206

电源方案(LDO)- XC6206 XC6206 系列是高精度、低功耗的三端正电压调节器,提供大电流和极小的压差电压,内部由限流电路、驱动晶体管、精密基准电压和纠错电路组成。该系列兼容低 ESR 陶瓷电容。输出电压可以在 1.2V 至 5.0V 范围内以 0.1V 为增量进行选择。 本篇选用的是 TOREX(特瑞仕)的 XC6206 系列,SOT-23 封装,其他厂商相同型号可替代,但请校对详细参数。 项目仓库: Collection_of_Power_Module_Design/LDO/XC6206 主要特性 最大输出电流:200mA(典型值 6.0V 下) 压差电压:250mV@100mA(典型值 6.0V 下) 最大工作电压:6.0V 输出电压范围:1.2V ~ 5.0V(0.1V 增量) 精度:当 Vout<1.5V 时,精度 ±30mV;当 Vout>1.5V 时,精度 ±2%;当 Vout>2V 时,精度 ±1% 低功耗:典型值 1.0uA 保护电路:内置限流电路 工作温度:-40℃~ +85℃ 可选封装:SOT-23、SOT-89、USP-6B 选型说明 典型应用电路 内部功能框图 注:框图内的二极管为 ESD 或寄生二极管。 引脚定义 引脚名称 引脚描述 VSS 地 Vin 电源输入 Vout 电源输出 特性描述 各型号的具体参数表: 参考与致谢 XC6206_Datasheet 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

电源方案(PMIC)- EA3036C

电源方案(PMIC)- EA3036C EA3036C 是一款 3 通道 PMIC,适用于由锂电池或直流 5V 供电的应用。它内部集成三个同步降压转换器,可在轻载和重载运行时提供高效率输出。内部补偿架构使应用电路设计简单。此外,独立的使能控制方便控制上电顺序。EA3036C 采用 20 脚 QFN 3x3 封装。 项目仓库: Collection_of_Power_Module_Design/PMIC/EA3036C 主要特性 输入电压与控制电路电压:2.7-5.5V 输出电压(3 个 Buck 转换器):0.6V-Vin 单路连续负载电流:1A(3 路总输出必须小于 6W) 固定 1.5MHz 开关频率 100% 全占空比输出 待机电流:<1uA 每路独立使能控制 内部补偿 逐周期电流限制 短路保护 自恢复过温(OTP)保护 输入过压(OVP)保护 采用 20 引脚 3mm x 3mm QFN 封装 典型应用电路 内部功能框图 引脚定义 引脚名称 引脚描述 VCC 内部控制电路的电源输入脚 VINx 通道 x 的电源输入脚,加 10uF MLCC 电容去耦 LXx 通道 x 内部 MOS 管开关输出,可接低通滤波电路输出更稳定电压 FBx 通道 x 的反馈脚,通过分压电路连接电压输出 ENx 使能脚,不能浮空 GNDx 通道 x 的地 AGND 模拟地 底部焊盘 散热用,需要接地 特性描述 PFM/PWM 模式 每一路 Buck 都可以运行在 PFM/PWM 模式下。如果输出电流小于 260mA(典型值),稳压器将自动进入 PFM 模式。PFM 模式下的输出电压和输出纹波高于 PWM 模式下的输出电压和输出纹波。但在轻载的情况下,PFM 比 PWM 效率高。 使能开关 EA3036C 是一款专为 IPC 应用设计的电源管理 IC,包含三路 1A 同步 Buck,可通过单独的 EN 引脚进行使能开关控制。 如果需要设定每路 Buck 的开启时间,可通过使用如下电路进行编程: 180° 相位偏移架构 为了降低输入纹波电流,EA3036C 采用了 180° 相位偏移架构。 Buck1 和 Buck3 相位相同,而 Buck2 的相位相差 180°。这样子可以减小纹波电流,从而降低 EMI。 过流保护 EA3036C 内部的三个稳压器都有自己的逐周期限流电路。当电感峰值电流超过电流限制阈值时,输出电压开始下降,直到 FB 引脚电压低于阈值,通常比参考值低 30%。一旦触发阈值,开关频率就会降低到 400KHz(典型值)。 峰值负载电流 EA3036C 的峰值负载电流能力,取决于内部 PMOS 电流限制、工作占空比(Vout/Vin)和电感值。在 Vin=5V, L=1.5uH 的条件下,输出峰值负载电流能力如下图所示: 输出电压 峰值负载电流 3.3V 1.2A 1.8V 1.5A 1.5V 1.5A 1.2V 1.5A 需要注意的是,总输出功耗必须小于 6W,以免芯片过热损坏。 热关断 如果芯片温度高于热关断阈值点,EA3036C 将自动关断。为避免工作不稳定,热关断的迟滞约为 30°C。 输出电压调节 每路稳压器的输出电压都可以通过电阻分压器(R1、R2)进行调节。输出电压由下式计算: \[ V_{OUTx}=0.6*\frac{R_1}{R_2}+0.6V \] 如果需要输出常用的电压值,则可参考下表配置分压电阻(都需要选用 1% 精度的): 输出电压 R1 R2 3.3V 68kΩ 15kΩ 1.8V 200kΩ 100kΩ 1.5V 150kΩ 100kΩ 1.2V 100kΩ 100kΩ 输入 / 输出电容选型 输入电容用于抑制输入电压的噪声幅值,为器件提供稳定、干净的直流输入,输出电容可抑制输出电压纹波。输入和输出都可选用 MLCC 电容(低 ESR) 输入 / 输出电容器的建议型号如下: NPM 容值 耐压 封装 C2012X5R1A106M 10uF 10V 0805 C3216X5R1A106M 10uF 10V 1206 C2012X5R1A226M 22uF 10V 0805 C3216X5R1A226M 22uF 10V 1206 输出电感选型 输出电感的选择,主要取决于通过电感的纹波电流量 \(\Delta I_L\)。\(\Delta I_L\) 越大,输出电压纹波和损耗也会越大。虽然小电感可节省成本和空间,但较大的电感值可以获得更小的 \(\Delta I_L\),带来更小的输出电压纹波和损耗。电感取值的计算公式: \[ L=\frac{V_{PWR}-V_{OUT}}{\Delta I_L*F_{SW}}*\frac{V_{OUT}}{V_{PWR}} \] 对于大多数应用场景,EA3036C 可选用 1.0~2.2uH 的电感。 功耗 EA3036C 的总功耗不应超过 6W,计算公式如下: \[ P_{D(total)}=\Sigma (V_{OUTx}*I_{OUTx}) \] Layout 参考 PMIC 的 Layout 需要讲究。可参照以下建议以获得最高性能: 建议使用 4 层 PCB 布局,将 LX 平面和输出平面放在顶层,将 VIN 平面放在内层。 顶层输入 / 输出贴片电容的接地脚应该打过孔连接到内层地和底层地。 AGND 应通过过孔直接连接到内部地层。 尽量加宽大电流路径走线。 将输入电容尽可能靠近 VINx 引脚放置,以减少噪声干扰。 使反馈路径(从 VOUTx 到 FBx)远离噪声节点(例如 LXx)。 LXx 是一个高电流噪声节点。使用短而宽的走线完成布局。 芯片底部焊盘需要打多个孔到内层和底层地,用以散热。 参考与致谢 EA3036C 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

电源方案(PMIC)- EA3059

电源方案(PMIC)- EA3059 EA3059 是一款 4 路 PMIC,适用于由锂电池或直流 5V 供电的应用。它内部集成四个同步降压转换器,可在轻载和重载运行时提供高效率输出。内部补偿架构使应用电路设计简单。此外,独立的使能控制方便控制上电顺序。EA3059 采用 24 脚 QFN 4x4 封装。 项目仓库: Collection_of_Power_Module_Design/PMIC/EA3059 项目在线预览: 主要特性 输入电压与控制电路电压:2.7-5.5V 输出电压(4 个 Buck 转换器):0.6V-Vin 输出电流:单路连续负载 2A、峰值 4A(4 通道总输出必须小于 10W) 固定 1.5MHz 开关频率 100% 全占空比输出 各通道效率达 95% 待机电流:<1uA 每路独立使能控制 内部补偿 逐周期电流限制 短路保护 自恢复过温(OTP)保护 没有输入过压(OVP)保护(相比 EA3059) 采用 24 引脚 4mm x 4mm QFN 封装 典型应用电路 内部功能框图 引脚定义 引脚名称 引脚描述 VCC 内部控制电路的电源输入脚 VINx 通道 x 的电源输入脚,加 10uF MLCC 电容去耦 LXx 通道 x 内部 MOS 管开关输出,可接低通滤波电路输出更稳定电压 FBx 通道 x 的反馈脚,通过分压电路连接电压输出 ENx 使能脚,不能浮空 GNDx 通道 x 的地 AGND 模拟地 底部焊盘 散热用,需要接地 NC 无连接 特性描述 PFM/PWM 模式 每一路 Buck 都可以运行在 PFM/PWM 模式下。如果输出电流小于 150mA(典型值),稳压器将自动进入 PFM 模式。PFM 模式下的输出电压和输出纹波高于 PWM 模式下的输出电压和输出纹波。但在轻载的情况下,PFM 比 PWM 效率高。 使能开关 EA3059 是一款专为 OTT 应用设计的电源管理 IC,包含四路 2A 同步 Buck,可通过单独的 EN 引脚进行使能开关控制。 如果需要设定每路 Buck 的开启时间,可通过使用如下电路进行编程: 180° 相位偏移架构 为了降低输入纹波电流,EA3059 采用了 180° 相位偏移架构。 Buck1 和 Buck3 相位相同,与 Buck2 和 Buck4 的相位相差 180°。这样子可以减小纹波电流,从而降低 EMI。 过流保护 EA3059 内部的四个稳压器都有自己的逐周期限流电路。当电感峰值电流超过电流限制阈值时,输出电压开始下降,直到 FB 引脚电压低于阈值,通常比参考值低 30%。一旦触发阈值,开关频率就会降低到 350KHz(典型值)。 热关断 如果芯片温度高于热关断阈值点,EA3059 将自动关断。为避免工作不稳定,热关断的迟滞约为 30°C。 输出电压调节 每路稳压器的输出电压都可以通过电阻分压器(R1、R2)进行调节。输出电压由下式计算: \[ V_{OUTx}=0.6*\frac{R_1}{R_2}+0.6V \] 如果需要输出常用的电压值,则可参考下表配置分压电阻(都需要选用 1% 精度的): 输出电压 R1 R2 3.3V 510kΩ 110kΩ 1.8V 200kΩ 100kΩ 1.5V 150kΩ 100kΩ 1.1V 68kΩ 82kΩ 输入 / 输出电容选型 输入电容用于抑制输入电压的噪声幅值,为器件提供稳定、干净的直流输入,输出电容可抑制输出电压纹波。输入和输出都可选用 MLCC 电容(低 ESR) 输入 / 输出电容器的建议型号如下: NPM 容值 耐压 封装 C2012X5R1A106M 10uF 10V 0805 C3216X5R1A106M 10uF 10V 1206 C2012X5R1A226M 22uF 10V 0805 C3216X5R1A226M 22uF 10V 1206 输出电感选型 输出电感的选择,主要取决于通过电感的纹波电流量 \(\Delta I_L\)。\(\Delta I_L\) 越大,输出电压纹波和损耗也会越大。虽然小电感可节省成本和空间,但较大的电感值可以获得更小的 \(\Delta I_L\),带来更小的输出电压纹波和损耗。电感取值的计算公式: \[ L=\frac{V_{PWR}-V_{OUT}}{\Delta I_L*F_{SW}}*\frac{V_{OUT}}{V_{PWR}} \] 对于大多数应用场景,EA3059 可选用 1.0~2.2uH 的电感。 功耗 EA3059 的总功耗不应超过 10W,计算公式如下: \[ P_{D(total)}=\Sigma (V_{OUTx}*I_{OUTx}) \] Layout 参考 PMIC 的 Layout 需要讲究。可参照以下建议以获得最高性能: 建议使用 4 层 PCB 布局,将 LX 平面和输出平面放在顶层,将 VIN 平面放在内层。 顶层输入 / 输出贴片电容的接地脚应该打过孔连接到内层地和底层地。 AGND 应通过过孔直接连接到内部地层。 尽量加宽大电流路径走线。 将输入电容尽可能靠近 VINx 引脚放置,以减少噪声干扰。 使反馈路径(从 VOUTx 到 FBx)远离噪声节点(例如 LXx)。 LXx 是一个高电流噪声节点。使用短而宽的走线完成布局。 芯片底部焊盘需要打多个孔到内层和底层地,用以散热。 输入电容尽可能靠近 VINx 引脚放置,以减少噪声干扰。 布局参考如下: 顶层: 中间电源层: 中间地层: 底层: 参考与致谢 EA3059 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

电源设计 - LDO 电源抑制比(PSRR)与测量方法

电源设计 - LDO 电源抑制比(PSRR)与测量方法 低压差线性稳压器(LDO)相比 DC-DC 的优点之一,是输出电压纹波小。但是高速电路下,LDO 的电源抑制比(PSRR)也是不可忽略的因素,通常被误认为是单一的静态值,本篇文章将详细讲解电源抑制比(PSRR)及如何测量它。 电源抑制比(PSRR)的定义 电源抑制比(Power Supply Rejection Ratio, PSRR)也称纹波抑制比,通常在 LDO 的数据手册中能找到,它代表 LDO 在某个频率下从输入到输出的衰减程度,代表不同频率下纹波抑制能力。在有些高速通信电路如 Wi-Fi、蓝牙等,就需要用上电源抑制比较大的高速 LDO,当芯片需要瞬间拉大电流时能快速响应,不至于掉到低于额定电压导致负载重启。还有一些场景是使用 DC-DC 作为一级降压、LDO 作为二级降压 / 滤波,因为 DC-DC 开关频率在 kHz-MHz 级别,即 LDO 在 100kHz 以上,就需要严格考虑 PSRR 了。 电源抑制比(PSRR)用公式表示为: \[ PSRR(dB)=20\log\frac{V_{rp(in)}}{V_{rp(out)}} \] 其中,\(V_{rp(in)}\) 表示输入纹波,\(V_{rp(out)}\) 表示输出纹波。高速 LDO 的 PSRR 一般大于 60dB,而普通 LDO 的 PSRR 一般在 20dB 左右。60dB 的 PSRR 代表当输入纹波为 1V 时,输出纹波将为 1mV。 我们先看普通 LDO(XC6206 系列)的纹波抑制曲线: 可以看出,在频率为 1kHz 时,XC6206P302 的纹波抑制比约为 23dB。 再看高速 LDO(XC6217x302)的纹波抑制曲线: 在频率为 1kHz 时,XC6217x302 的纹波抑制比约为 68dB。 电源抑制比(PSRR)的测量方法 电源抑制比(PSRR)的测量分 输入注入 和 输出测量 两个部分。通过以下方法测试,并记录输入与输出的电压纹波,根据公式即可算出 PSRR 的值。 输入注入 信号发生器 使用信号发生器直接产生正弦波,接在 LDO 的输入端。此方法受限于信号发生器的输出电流(像 DG4062 输出电流峰值在 100kHz 正弦波下是 1.65A)。 运算放大器 放大器的作用是将 AC 纹波叠加到直流电源的 DC 电压上。 运放的选择需要满足几个基本条件: 运放带宽满足 LDO 测试范围。 运放最大输出电流不小于 LDO 最大输出电流。 运放输出电压范围覆盖 LDO 输入电压范围。 可按照以下的示意图设计加法器: 其中,R1 与 R2 相等,最低截止频率由 C1 和 R1 共同决定,最高截止频率由运放的带宽所决定。 信号发生器 + 运算放大器 使用运放作为信号发生器的电压跟随器,可解除信号发生器驱动电流不足的限制。 LC 节点法 利用电感和电容实现 DC 电压和 AC 电压的叠加,一起作为 LDO 的输入: 其中,电容 C1 用于防止 VAC 对 VDC 产生高脉冲影响,电感 L1 防止 VDC 使 VAC 发生短路,使用 LC 隔离两个电源 这个电路的最高频率由电感 L1 和电容 C1 共同决定,最低频率由 C1 决定。 音频分析仪(Audio Precision) 音频分析仪自身没有能力产生 DC 直流电压,且驱动能力弱,所以需要通过一个高带宽大电流的运放,把它产生的 AC 纹波叠加到直流电源的 DC 电压上,然后再连接到 LDO 的输入端。但因为音频分析仪带宽的限制,不能测到频率 100kHz 以上的 PSRR。 专用注入器 此方法需要用到专用的输入注入器(例如 J2120A,带宽 10Hz-10MHz,直流电压最大值为 50V,输出电流最高 5A),它可以把 AC 纹波和直流电源 DC 电压直接叠加,但经过注入器后的输入电压会有所衰减。配合网分仪分别测量输入与输出电压纹波值: 输出测量 示波器 一般的示波器可以测量到毫伏级电压,当 LDO 的 PSRR 不高于 40-50dB 时,如果输入交流电压峰峰值为 1V,那么 LDO 输出中的同频率交流电压峰峰值为 3mV~10mV,可以用示波器直接测量。 示波器不适用于测量高 PSRR 的 LDO,如果输出纹波太小,示波器无法精确测量。 运放 + 示波器 当 LDO 的 PSRR 大于 50dB 时,由于输出纹波幅值通常小于 1mV,无法利用示波器直接测量。这时可以考虑使用运算放大器将 LDO 输出交流电压放大 100 倍甚至更高,在设计运放电路时需要考虑: LDO 输出有直流电压,电路需要将直流电压去掉。 放大电路自身产生的噪声要远小于放大后交流电压。 运放输入失调电压不能太大,否则经放大电路放大后会输出很大的直流电压。 放大电路的带宽需要满足 LDO 的 PSRR 测量频率范围。 放大电路的设计: 该电路的最低截止频率由 C1 和 R1 所决定,最高截止频率由运放的带宽所决定。 频谱分析仪 / 网分仪 频谱分析仪可以测量微伏级电压信号,可以配合使用高阻抗输入探头来测量 LDO 输出交流电压。如果没有高阻抗探头,可以用运放搭建: 测量注意事项 测试时应首先使用示波器观察 LDO 输入端交流电压波形是否正常。 LDO 电路最好按数据手册,加相应的电容去耦,但使用运放方法测试时,需要去掉 LDO 的输入电容,避免运放不稳定。 如果使用注入器,输出电压有衰减,则电压需要适当增加。 LDO 的输出负载不要用电子负载提供,建议用功率电阻。 输出使用接地弹簧探头以降低噪声,如下图。 参考与致谢 Reducing high-speed signal chain power supply issues LDO 基础知识:电源抑制比 LDO PSRR Measurement Simplified LDO 的 PSRR 测量 LDO 的 PSRR 测量 · 电子研习社 电源抑制比(PSRR)测量 关于 DC-DC 瞬态测试的一些东西 🚧 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

电源设计 - 开关稳压 IC(非隔离型)

电源设计 - 开关稳压 IC(非隔离型) 设计需考虑因素 开关电源的设计至少要考虑以下条件: 输入 / 输出电压:按照器件的推荐工作电压范围选用,考虑实际电压的波动范围,确保不超出器件规格。 输出电流:输出电流要保留一定的余量,还需要评估电路的瞬间峰值电流和发热的情况,并满足降额要求。 纹波:纹波是衡量电路的输出电压波动的重要参数,要关注轻载和重载纹波。通常选用示波器 20 M 带宽来测试。 效率:要同时关注轻载和重载两种情况。轻载会影响待机功率,重载影响温升。通常看 12 V 输入,5 V 输出下 10 mA 的效率,一般需要达到 80% 以上。 瞬态响应:瞬态响应特性反应负载剧烈变化时,系统是否能及时调整以保证输出电压的稳定。要求输出电压波动越小越好,一般按峰峰值 10 % 以下要求。 开关频率:通常在 500 kHz 以上,关系到电感电容的选用,其它如 EMC,轻载下噪音等问题也与之有关。 反馈参考电压及精度:反馈电压要与内部的参考电压相比较,配合外部的反馈分压电阻,输出不同电压。不同产品的参考电压会有不同,如 0.6-0.8 V,反馈电阻要选用 1% 精度。 线性稳定度和负载稳定度:线性稳定度反映输入电压变化输出电压稳定性;负载稳定度反映输出负载变化输出电压稳定性。一般要求 1%,最大不要超 3%。 EN 电平:EN 高低电平要满足器件规格要求,有些 IC 不能超出特定电压范围。由于时序控制的需要,该引脚会增加电容,为了电平调节和关断放电,同时要有对地电阻。 保护性能:要有过流保护 OCP,过热保护 OTP 等,并且保护后条件消失能自恢复。 其它:项目要求有软启动;热阻和封装;使用温度范围要能覆盖高低温等。 选用原则:普遍性、高性价比、易采购、生命周期长、兼容和可替代、降额、易生产和归一化。 调制方式 PFM(脉冲频率调制方式) 开关脉冲宽度不变,通过改变脉冲输出频率,使输出电压达到稳定。适合长时间使用(尤其是小负载),具有耗电小的优点。 PWM(脉冲宽度调制方式) 开关脉冲的频率不变,通过改变脉冲宽度,使输出电压达到稳定。效率高且具有较低的纹波和噪声。 功率电感底部是否可以铺地铜 从 EMI 的角度,建议铺铜;从电感感量的角度,对于屏蔽型电感,电感感量基本没有影响,因此也建议铺铜;对于工字型电感,铺铜对电感感量有少许影响,可以视情况而定。 实验判断电感是否饱和 除此之外,也可从异常温升、啸叫等情况来判断。 外围器件选择的要求 输入 / 输出电容:需要满足耐压(1.5-2 倍以上输入电压)和输入纹波的要求。 BST 电容:自举启动电容,用于抬高电压开启芯片内上管。一半按照数据手册的推荐值(一般 0.1-1uF),耐压一般要高于输入电压。 电感:不同输出电压的要求感量不同;注意温升和饱和电流要满足余量要求,一般最大电流的 1.3 倍以上(或电感饱和电流必须大于最大输出电流+ 0.5*电感纹波电流)。 反馈电容:按数据手册要求取值,不同厂家芯片取值不同,输出电压不同也会有不同的要求。 反馈电阻和 EN 分压电阻:要求按规格书取值,精度需选取 1%。 开关电源纹波分析 🚧 PCB Layout 要求 电感:优先选择一体成型的电感,因为它们有较低的 EMI。 反馈网络:反馈走线需要尽可能离电感和电源噪声走线远。在满足第一个条件下,可以尽量让走线短而粗。最好是走线在与电感相对的 PCB 的另一侧,并在中间用地平面隔开。下分压电阻通常接信号地 AGND 反馈走线可以包地。 去耦电容:输入去耦陶瓷小电容应该尽量靠近芯片的 \(V_IN\) 和 GND,减少寄生电感;电容负极可增加过孔,减少阻抗。一般还需要前馈电解大电容,电源输入先过大电容再过小电容。 功率回路尽可能的短粗,保持较小的环路面积,较少噪声辐射。电感靠近 SW 引脚,远离反馈线。输出电容靠近电感,地端增加地过孔。 BST 的电容走线尽量短,不要太细。 芯片散热要按设计要求,尽量在底下增加过孔散热。 参考与致谢 详解开关电源的三大基础拓扑 - 全文 掌握这些技巧,让你轻松操作 DC-DC 电路 MPS,电感底部铺地平面违章吗? 【短视频】MPS 电源小课堂第三话: 判断电感饱和的几个小窍门 怎么选择 BUCK 降压电源的电感? AN-1149 Layout Guidelines for Switching Power Supplies 开关电源纹波分析 🚧 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

电源设计 - 方案确定

电源设计 - 方案确定 电源设计需考虑的需求 功能:输入电压、电流(变动范围);输出电压、电流等,还要达到总体的功率指标,实现系统最大转换效率。 性能:输出电压上的纹波大小、带负载的能力、效率、发热程度等。 成本:系统综合成本,需要考虑核心器件与外围器件(电感或线圈、电容、MOS 管驱动等)。 空间:需要考虑空间尺寸的限制、摆放位置、散热、干扰等。 如何选择一款电源方案 常见的电源类型 线性稳压 三端稳压器 低压差线性稳压(LDO) 开关稳压 非隔离 降压型(Buck) 升压型(Boost) 升降压型(Buck-Boost) 双级反相升降压型(Ćuk) 双级正相升降压型(SEPIC, ZETA) 隔离 正激 反激 电源 IC 多路输出 充电 IC 线性稳压与开关稳压的参数对比 线性稳压 开关稳压 效率 相对低(30% ~ 60%) 相对高(70% ~ 90%) 稳压模式 只能降压 降压、升压、升降压、反压 发热量 相对大 相对小 体积 相对大 相对小 重量 相对重 相对轻 电路复杂度 简单 相对复杂 稳定度 相对高 一般 瞬态响应 快 慢 噪声 无 有(需噪声处理对策) 是否可隔离 不可隔离 可有隔离 应用场景 小电流、需要低噪声、对效率要求不高 大电流,对效率要求高 线性与开关稳压的直观区别 把输出电压类比为从水龙头的出水量,线性稳压是需要出多少水就把水龙头开多大;而对开关稳压来说,水龙头只能有开和关两个状态,所以必须快速开关,通过改变占空比来控制出水量。 线性稳压由工作在线性状态的三极管构成可变电阻对负载进行恒流控制,得到稳定的电压输出,这种方式结构简单、噪声抑制度很高(达到 60dB 也就是 1000 倍以上),但一般效率比较低,要满足输入电压高于输出电压一定的压差才能够稳压,只能做降压变换。线性稳压电路简单、纹波小,对输入端的毛刺抑制度(PSRR)高,但为了限制输出电压,而把多余的能量转化为热量。 开关稳压是利用感性元件和容性元件可以储存能量的特点,把能量分段打包传递。这些打包的能量或者储存在电感的磁场中,或者储存在电容的电场中。开关控制保证每个分段只传递负载需要的能量,所以效率相对高。开关稳压的好处是能够降压、升压、反压,输入电压的范围可以很宽,效率可以做到很高(有的能达到 95% 以上),缺点是外围电路比较复杂,外围元器件的选型比较敏感,另外高频的开关信号会在电压输出上带来较大的干扰、纹波。 开关稳压与线性稳压的组合 基于开关稳压器和线性稳压器的优缺点,如果将它们组合使用(即先过开关稳压,再过线性稳压),就可在降低输出电压纹波的同时,也提高效率。 根据输入和输出电压来选择 \(V_{in}>V_{out}\) 压差不大、负载电流小、要求低噪声 —— LDO 压差大、负载电流大、噪声不是特别敏感 —— 开关 Buck 负载电流小、噪声不敏感、要求效率高 —— 电荷泵 \(V_{in}<V_{out}\) 小功率 —— 电荷泵 压差大、负载电流大、噪声不是特别敏感 —— 开关 Boost \(V_{in}\) 变化范围大,可能大于或小于 \(V_{out}\) 小功率 —— 电荷泵 负载电流大、噪声不是特别敏感 —— 开关 Buck-Boost 如果需要隔离 选择隔离拓扑结构如 flyback、forward、push-pull、全桥等。 元器件选型 选型需考虑的因素: 功能:是否满足输入/输出电压及电流要求 性能:尽可能低的纹波、噪声,尽可能高的转换效率 价格:整体系统成本 供货渠道:是否容易购买 可以使用电源芯片厂提供的工具辅助选型,例如 TI 参考设计。 PCB 的布局布线 对 LDO 而言,发热是影响性能和稳定性的重要因素,故 layout 时需要考虑散热。 参考与致谢 最受全球工程师欢迎的 10 款稳压器件 开关电源设计的关键 7 步 开关电源知多少? 电子产品中电源电路的设计举例 电源及管理 漫画解电源,初学者福音! 单板小功率电源芯片的选型攻略 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

电源设计 - 纹波噪声与测量方法

电源设计 - 纹波噪声与测量方法 电源的纹波与噪声 纹波是由输出滤波电容的充放电产生的,频率一般对应电源工作频率或其两倍(视拓扑而异)。噪声一般会叠加在纹波的拐点,是在每次开关状态改变时,由寄生效应产生的。纹波与噪声通常放在一起进行测量,以 mVpp 的单位刻度表示。 如果负载需要非常低纹波噪声的电源,通常会在输出电压后再添加一个高速 LDO,需要比较高的 PSRR 值(70dB 以上)。关于 PSRR 的介绍与测量,可参考文章 电源设计 - LDO 电源抑制比(PSRR)与测量方法。 测试方法 使用示波器测量纹波噪声的注意事项: 探头: 如果有条件,推荐上有源探头。一般用 1x 探头(峰峰值一般为 mV 级,为了避免示波器探头造成的衰减引入测量误差) 缩短接地线长度,并联在输出电容上测量。 耦合模式:AC 耦合 带宽:20MHz 数字滤波器:开启 1Mhz 捕获与触发 参考与致谢 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

电源设计 - 自举电路

电源设计 - 自举电路 自举电路,通俗讲就是自己把自己抬起来,其原理就是利用自举升压电容进行升压的电路。 我们经常会在 Buck、电机驱动 H 桥等电路中见到自举电容。以 N-MOS 为例,需要自举的根本原因是因为 \(V_{ds}\) 很小,导致不能满足 \(V_{gs}>V_{(gs)gh}\) 的导通条件,根据电容两端电压不能突变的原理,可以在栅极叠加产生一个更高的电压,从而使 MOS 管导通。 相比于其他升压拓扑结构,自举电路的优点是成本低、电路结构简单。 自举的过程 下面,我们以半桥驱动中的自举电路来分析: 在第一个阶段(下管驱动阶段,\(Q_1\) 截止,\(Q_2\) 导通),此时自举电容 \(C_B\) 进行充电。在此期间,来自 \(V_{DD}\) 的充电电流流入驱动芯片的 \(VDDA\),并通过电容的充电环路,从自举电阻器 \(R_B\)、二极管 \(D_1\)、电容 \(C_B\) 和 \(Q_2\) 流到地。 第二个阶段(上管驱动阶段,\(Q_2\) 截止,\(Q_1\) 导通),\(Q_1\) 源极(连接 GNDA 脚)上的电压快速上升至 \(Q_1\) 漏极电压 VDRAIN。因为电容两端电压不能突变,所以 VDDA 上的电压等于 \(Q_1\) 源电压加上 \(C_B\) 两端的电压(\(C_B\) 已充电至大约 VDD–0.7V)。而因为 \(Q_1\) 源极(和 GNDA)电压升高,二极管 \(D_1\) 变为反向偏置,断开 VDD 电源与 \(C_B\) 的连接。此时由 \(C_B\) 提供上管驱动阶段所需的所有电流。 自举电路的设计 🚧 🚧 参考与致谢 一文学会自举电路原理 AN486: High-Side Bootstrap Design Using ISODrivers in Power Delivery Systems 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

电路焊接比赛记录

电路焊接比赛记录 前言 2019 年 11 月,野狼队电控组新生们经过两天的基础焊接培训后,在电协举办的焊接比赛中,取得了不错的成绩。 培训内容 硬件速成参考文档 by Bobi & Power 硬件基础课 - 教学大纲 by Power 实物 - 原理对照图 by Bobi 赛前准备 - 讲解大纲 by Bobi & Power 比赛经验总结 洞洞板背面走线最好使用管脚配合注锡,又稳又快。比赛的时候需要特别注意时间分配。 测试电源最好自带,焊好了可以测试一下能否正常工作。自己熟手的基本工具要带齐。 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

画图基础

画图基础 大纲 & 思维导图 工具:幕布 零散思维体系化的过程。 原型策划图 画原型图是产品经理的基本功,原则是简洁明了地突出页面的重点。绘制原型图的下一步是交付设计师,如果不能直接从页面上理解重点,将会花大量的时间口头沟通,难以达到预期效果。 关键原则 字体的使用: 尽量使用无衬线字体,同时根据内容的重要程度呈现不同的大小和颜色,尽量不要使用纯黑色,一般依次使用 HEX 值是 333333,666666,999999,cccccc 的字体颜色就够了。 操作与内容分离:显示内容的元素,与可以点按操作的元素,要有明显的区分。对于可点按操作的元素,应该使用系统级的标准控件样式。 布局有区分度:以明显的间隔或适当的留白区分多个区域。总之,让人一眼能够辨认出元素属于哪个区域的 元素间对齐:在元素的摆放上尽量做到左 / 右 / 居中对齐。 排版上重复:在排版上,最好在不同区域之间,重复使用同一种设计语言,增加可预见性,降低理解的难度。 适当添加图标与现有素材。 用例图 展示不同的用户角色,及描述相应的职能。这个系统中包含了哪些功能,分别是由谁来执行或使用的,都可以从图中清晰地看出来。 流程图 工具:Process On 等。 一般圆角矩形代表开始/结束,菱形代表判断,矩形代表操作和步骤,大多数时候够用了。具体可参考 这篇文章 。 泳道图:展现角色和阶段。在实际运用中,大多数时候一条泳道代表着一种角色,从而描绘了角色之间的流程关系。 状态转换图:相比普通流程图,状态转换图更加关心每个流程的下一个状态,而不是流程何时结束。可以帮助研发更好地理解,哪些状态是终态,哪些状态是中间态,从而编写出逻辑更清晰的代码实现。 模型关系图 接近数据库的设计,反应数据库关系。评估功能实现的复杂度。 框架图 从一个相当长期的视角,来从宏观上解构产品。产品框架图更关注如何从宏观上解决一个问题,而不去放大某个局部所需的功能特性。因此,它更多地是从回顾性的、前瞻性的、全局性的角度,去输出产品各个模块或系统之间的分布与关系。因此,产品构架图并不是必须的。往往,只有在规划整个产品的未来完整发展规划,或回顾性地整理某个系统的结构时,才需要准备。 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

直流有刷电机驱动的设计

直流有刷电机驱动的设计 通常我们使用 PWM 控制 H 桥电路,实现对直流有刷电机转向和转速的控制,且 PWM 占空比与电机的转速成正比。 H 桥的基础知识 H 桥(H-Bridge)是一种可以快速切换负载上电压极性的桥式电路。这种电路通常用于驱动直流有刷电机,使其顺时针或者逆时针转。因为其结构看着像字母「H」,所以称其为 H 桥电路。 一个 H 桥由四个开关组成,S1 和 S3 组成 H 桥的高位开关(High-Side Switch),通常是 P 型 MOSFET 或 PNP 型晶体管,S2 和 S4 组成 H 桥的低位开关(Low Side Switch),通常是 N 型 MOSFET 或 NPN 型晶体管。 当开关 S1 和 S4 闭合、S2 和 S3 断开时,电机正常旋转,记为正方向。 当开关 S2 和 S3 闭合、S1 和 S4 断开时,电机反向旋转,记为反方向。 当开关 S1 和 S2 闭合,或 S3 和 S4 闭合时,电源被短路,有烧毁电源的风险,严禁出现此类情况。这种情况称为射穿(shoot-through) 当开关 S1 和 S3 闭合、S2 和 S4 断开;或 S2 和 S4 闭合、S1 和 S3 断开时,电机不旋转。此时电机处于「刹车」状态,电机惯性转动产生的电势将被短路,形成阻碍运动的反电势,形成「刹车」作用。 当 S1、S2、S3、S4 四个开关都断开时,电机处于滑行状态,将惯性转动较长时间。 在实际电路中,我们可以使用驱动芯片来对 H 桥 4 个 MOS 管进行精确的控制。 选择分立搭建还是集成芯片 相比使用集成驱动芯片,用分立元件搭建电路成本更低、可定制性更强。一般来说,驱动电机首先从 MCU 输出 PWM 信号,经过光耦隔离、逻辑电路后,再到驱动芯片,最后到全桥 / 半桥 MOS 管。 但是,使用分立元件搭建电机驱动,需要注意的事项会比较多,比如死区控制(防止射穿)、控制合适驱动电压、设计保护电路等等,电路设计上的复杂度更高、PCB 占位面积变大、成本变得更高、且设计风险也会提高。 通常来说,驱动直流有刷电机时,我们采用集成 H 桥驱动芯片来实现对直流有刷电机的控制。 MOS 管的选型 在电机驱动中,我们一般选用增强型 N-MOS 管。原因如下: 选用增强型:其在低电平时可以完全关断,且当电平高于开启电压 \(U_{GS(TH)}\) 时,可以完全导通; 选用 N-MOS:因为 P-MOS 型号选择少、价格高、导通电阻大,进而导致高发热和低效率; 选用 MOS 管:MOS 管相比于 BJT,功率损耗更小、体积更小、驱动电流更大、相应更快、导通电阻更小。 实际设计上,为了简化合并物料,我们一般会全部使用 N-MOS。但是由于 N-MOS 不可以直接用于 H 桥高端控制(因为 N-MOS 的导通条件是 \(V_g-V_s>V_{gs(th)}\)),所以需设计高端浮压自举电路(因为其结构简单),以驱动上管。自举电路的详细介绍,请跳转文章 电源设计 - 自举电路。 N-MOS 选型需注意的参数: \(V_{DSS}\) \(R_{DS(on)}\) 集成 H 桥驱动芯片 H 桥驱动芯片一般会将以下的保护电路集成进来: 过压保护(Over-Voltage Protection, OVP) 欠压锁定保护(Under-Voltage Lock-Out, UVLO) 过流保护(Over-Current Protection, OCP) 热关机保护(Thermal Shut-Down, TSD) 射穿保护(Shoot-Through Protection, STP) 静电放电保护(ElectroStatic Discharge, ESD) 一般我们使用门极驱动芯片为高压 / 低压侧功率 N-MOS 管提供驱动栅极的电源(根据数据手册,必须使其高于 MOS 管的 \(U_{GS(TH)}\),漏极 D 和源极 S 之间才能导通)。举个例子,下图是 DRV8701 门极驱动的参数: 配合 IRFH8330 使用,可以带得动这个 MOS 管: PWM 频率的选择 使用 PWM 信号控制电机速度时,需要注意其频率。若频率过低,电机在低速时会产生噪音,而且对占空比的变化也会显得反应迟缓。而如果 PWM 的频率过高,会在 H 桥的 MOSFET 上产生较大的开关损耗。 如果 H 桥驱动芯片的规格书中没有给出具体频率范围的话,一般来说 4kHz-200kHz 左右的 PWM 信号都可以较理想地控制电机的转速。 死区时间插入和交叉传导(直通)保护 死区可以简单理解为一个延时,使正转时导通的上桥完全关断时再打开反转时需要打开的下桥。死区过小会导致危险,死区过大会导致电机响应不好,电源的利用效率低等问题。 使用集成方案:纳入自动握手,以便利用最佳的死区时间,而不受回转率、电压、MOS 特性和温度的影响。握手是一个多步骤的过程,确保利用最佳的死区时间,并且不发生交叉传导。握手的过程: 接收信号,以从高端 MOS 到低压侧 MOS 禁用高端 MOS,并监测 \(V_{GS}\) 以确定什么时候禁用它 插入死区时间,启用低压侧 MOS H 桥的衰减模式 衰减模式,是指走哪个续流回路,使电机停下来。因为直流电机属于感性负载(电感电流不能突变),想让电机停下,除了断开供电,还需要形成一个续流的回路,释放掉电机上的能量,否则电机产生的续流有可能损坏 MOS 管。 异步与同步衰减 我们可以使用二极管来构建续流回路,如图: 而我们知道,MOS 管内本身有体二极管可以充当续流回路,在有些应用中,也会外加并联肖特基二极管,所以可以借其实现续流衰减。用二极管实现衰减的模式被称为异步衰减。但异步衰减的损耗会相对大(\(2*I*V_D\)),所以我们引出另一种衰减途径,叫同步衰减。同步衰减是通过打开 MOS 管实现续流。因为 MOS 管的导通电阻 \(R_{ds(on)}\) 小,所以同步衰减损耗会相对小(\(I^2*R_{ds(on)*2}\)),下面将主要讲解同步衰减。 关键参数 \(I_{TRIP}\):当前驱动芯片设定的电流,受驱动算法控制; \(T_{DRIVE}\):驱动阶段的时间 \(T_{BLANK}\):死区阶段时间,为了防止射穿 \(T_{OFF}\):续流阶段 同步衰减的三种模式 同步衰减有三种模式:快衰减(Fast Decay)、慢衰减(Slow Decay)和混合衰减(Mixed Decay)。这里的快慢指的是续流期间电流衰减的相对速度,而非电机的转速。 三种模式的区别: 快衰减 慢衰减 混合衰减 相电流纹波 大 小 适中 续流阶段时间 \(T_{OFF}\) 短(可能导致更大的开关损耗) 长(可能会听到低频噪音) 适中(频率和性能均衡) 相电流下降速度 快 慢 适中 适用范围 适用于大电感电机 适用于小电感电机 适中 快衰减 快衰减的过程是,关闭驱动的两个 MOS 管,等待死区时间过后,打开斜对称的两个 MOS 管,让电流快速消耗掉。在死区时间内,H 桥仍会经历异步衰减,但时间短可忽略。 慢衰减 慢衰减的过程是,关闭驱动的两个 MOS 管,等待死区时间过后,打开两个下管,让电流慢慢消耗掉。同样的,在死区时间内,H 桥仍会经历异步衰减,但时间短可忽略。 混合衰减 混合衰减的过程是,关闭驱动的两个 MOS 管,等待死区时间过后,打开斜对称的两个 MOS 管(快衰减),让电流快速消耗;再打开两个下管(慢衰减),让电流慢慢消耗掉。混合衰减模式下相电流的纹波介于快衰减和慢衰减之间。 电机驱动的 EMC 问题与处理 因为直流电机属于感性负载(电感电流不能突变),为了防止 H 桥关闭输出时电机电压上出现不稳定的反弹或尖峰,可在电机电压源上放置一个大电容(>100μF,一般选用铝电解电容),用于吸收直流电动机制动时产生的飞轮电流,并在电机切换正反转时稳定电机电压源。 另外一个问题是,电机电压源与电机驱动板电源线之间的寄生电抗(电感+电阻)与 PCB 的寄生电容组成一个 LC 谐振槽,在电机电压源向电机驱动板送电时,如果局部旁路电容不足,电机电压可能会迅速下降,寄生 LC 会被触发,出现振荡尖峰。为了减少电源线 LC 谐振引起的尖峰,可在电机 H 桥驱动芯片的电源引脚附近放置一个 0.1μF 的旁路电容(一般选用陶瓷电容)。 一个参考例子: 另外,可在电机线上加磁环,减少共模干扰(实测明显)。 参考与致谢 4 个 N-MOS 组成的全桥驱动电路 详解关于 ROBOCON 比赛中有刷电机设计 浅谈直流有刷电机的驱动电路 Slow, Mixed and Fast Decay Modes. Why Do We Need To Complicate Things? 精通电机驱动的电流续流、衰减模式和刹车 Current Recirculation and Decay Modes 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

破冰活动 - 经验总结

破冰活动 - 经验总结 出现的问题 规则制订不明确,测试游戏流程不充分、没有认真对待,导致出现临场修改规则的状况 物资收货时间太晚,且缺少专门的管理人员 安排工作人员、下发任务的时间过晚 工作人员不清楚规则 / 未做好本职,缺少团队意识和时间观念 某些游戏规则过于复杂,使气氛变得低落 负责摄影者未经过培训,大合照拍摄未能把所有人都拍进去,活动摄像 / 摄影质量不佳, 没有设置总决策人员负责突发情况拍板 活动开始前,没有先准备道具 每一组来参与活动的时候都需要重复一遍规则 漏缺了总的计分人员 活动后,场地上有很多用过乱扔的打印纸,但实际上垃圾袋就在一旁 晚饭上菜顺序错误,使大家感觉饭菜量偏少 如何改进 提前两周 至少提前两周,召集工作人员开方案策划会,商讨以下事项: 参考往届资料,制订活动整体流程、初版游戏规则与计分规则(尽量简单易懂) 物资借用 / 购买(活动摊位可以准备一些小零食防饿) 安排工作人员分工,确定活动总负责人、物资管理人员、总计分负责人,有明确的奖惩制度 不同状况的预案(雨天、准备药品) 提前一周 测试游戏规则(不要只测试一回) 验收物资,查漏补缺 提前一天 礼品分装 准备活动时的 BGM(游戏、颁奖等) 发布规则(工作人员只解答规则的疑问) 架好拍合照机位,熟悉活动场地光线状况,准备多几块相机的电池 场地道具能布置的先布置 破冰进行 强调开始的时间,到点直接开始,不因为迟到的人耽误大部分人的时间 工作人员 要有责任心,将工作落实到位,不得擅自离开岗位 在完成自己部分任务有余之后,再去帮助其他职位 破冰结束 组织清理场地 清点物资,搬回实验室 聚餐 晚餐先上甜点 / 凉拌菜,这段时间老生做自我介绍 饮料不要只有一瓶可乐,最好是可乐 + 橙汁 饭要先上(管饱先),荤素要夹杂上菜 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

示波器的触发模式

示波器的触发模式 示波器的触发,指的是只有满足一个预设的条件后,才会捕获一条波形。这种根据条件捕获波形的动作就叫做触发。 如果没有设置触发,那么示波器捕捉到的信号可能会是这样的: 触发的作用,是让示波器可以稳定显示一个周期性的信号: 三种触发模式 自动模式 在自动模式下,示波器首先按照触发条件进行触发,当超过设定的时间没有触发条件时,示波器将强制触发,显示信号。 当我们对一个信号的特征不了解时,就可以选用此模式,可以保证在其他触发设置都不正确时示波器也会有波形显示。尽管波形不一定是稳定的,但是可以为我们进一步调节示波器提供直观的判断。 正常模式 正常模式下,示波器只有当触发条件满足时才产生扫描(所以要先设置触发模式和电平)。如果没有触发信号,就会不进行扫描,在屏幕上看不到波形。 正常模式的作用在于观测波形的细节,特别是对于比较复杂的信号。当我们对一个特定的信号设置了特定的触发条件,尤其是满足触发条件的时间间隔比较长时,就可以选用正常模式。 单次触发 单次触发是正常模式的子集,它也是当触发条件满足时才产生扫描,否则不扫描。不同之处在于,一旦扫描完成,即使后面再有满足触发条件的信号出现,也不再进行扫描显示,必须手动再按一下才重新扫描。 单次触发模式常用于捕捉单次或多次出现但不具有周期性的信号,比如说一个电路上电时产生的上电信号只会出现一次,如果不使用单次触发,很难捕获到这个信号。 触发类型 斜率 斜率触发选项分为 上升沿、下降沿、上升与下降沿。 上升沿:设置信号在上升边沿触发。 下降沿:设置信号在下降边沿触发。 上升与下降沿:设置信号在上升或下降边沿触发。 耦合 对于噪声比较大的信号,噪声的的存在干扰了信号的准确触发,触发耦合的作用就是用来抑制触发电路中的干扰和噪声。 耦合触发选项分为 直流、交流、高频抑制、低频抑制、噪声抑制。 直流:触发源信号交流和直流成分都被送入触发电路。 交流:触发源信号直流成分被滤除。适用于观察从低频到较高频率的信号。 高频抑制:触发源信号中特定频率以上的信号都被滤去。适用于观察含有高频干扰的信号。 低频抑制:触发源信号中特定频率以下的信号都被滤去。适用于观察含有低频干扰的信号。 噪声抑制:用低灵敏度的直流耦合来抑制触发源信号中的噪声成分。适用于观察含有高频噪声干扰的信号。 参考与致谢 工程师如何用好用活示波器?从这 3 方面入手... 示波器的触发详解 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

示波器的采集模式

示波器的采集模式 参考与致谢 [4-5-6-MSO_Help_077130319] 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。 示波器的采集(Acquisition)是将模拟信号取样、转换为数字数据并组装成波形记录的过程,然后将记录存储在采集内存中。采集模式决定了如何从取样的波形数据计算出波形记录点。 几种采集模式及其原理 采样模式(Sample mode) 采样模式 是保留每个采集间隔中的第一个采样点。这是示波器的默认模式。在这种模式下,仪器不对采集的样本进行任何后处理。 峰值检测模式(Peak Detect mode) 峰值检测模式 会保留每个采集间隔内的所有样本中的最高值和最低值。该模式仅适用于实时、非插值采样,并且非常适用于捕捉高频率的故障信号。 高分辨率模式(High Res mode) 高分辨率模式 会根据当前采样率应用独特的 FIR 滤波,在抗混叠的同时保证了该采样率下的最大带宽。在超出了所选择采样率的可使用带宽情况下,该滤波器可去除示波器放大器和 ADC 噪音。 高分辨率模式可减少触发抖动,也适用于高精度下快速采集。 包络模式(Envelope mode) 包络模式 是对周期信号的峰值进行叠加,它每一轮采集使用的都是峰值检测模式。 平均模式(Average mode) 平均模式 是在多次采集过程中计算每个记录点的平均值。在每一路单独的单独的采集中,平均模式使用采样模式。使用平均模式可以减少随机噪声的影响。

2025/9/17
articleCard.readMore

移除 Chrome(Edge) 由组织管理

移除 Chrome(Edge) 由组织管理 步骤 Win + R,输入 regedit 打开注册表 找到以下目录并删除它们 Chrome: HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome HKEY_CURRENT_USER\SOFTWARE\Policies\Google\Chrome Edge: HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Edge HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Edge 参考与致谢 Works! Fix Chrome (or Edge) is Managed by your Organization (in 3 steps!) 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

线性注入器的使用

线性注入器的使用 线性注入器可以把 AC 纹波和直流电源 DC 电压直接叠加,作为 LDO 的输入以测量其 PSRR。本篇以 PICOTEST 的 J2120A 展开说明。 线性注入器与宽带注入变压器有点像,但宽带注入变压器不能用于测量 LDO 的电源抑制比(PSRR),因为它对直流电流不耐受,即使是非常小的直流电流(5mA 或更小)也会显著降低信号容量,甚至使变压器完全饱和。因此,需要用到线性注入器进行测量。 J2120A 线性注入器的基本参数: 最大直流输入电压:50VDC 最大连续电流:5A 最大压降:3.25VDC 3dB 频率响应:15Hz~5MHz 可用频率响应:10Hz~10MHz 推荐注入信号:-20~10dBm 工作温度范围:0~50℃ 测试场景: 需要注意的是,在测试时不能加输入去耦电容,因为 J2120A 的输出有一定阻抗,加电容会形成一个低通网络,影响 PSRR 结果。 网分仪的参数设置: 起始频率:10Hz 终止频率:10MHz 扫频模式:对数 扫频点数:≥401 输出电平:-10dBm 1/2 通道衰减:10dB 接收器带宽:100Hz 参考与致谢 Power Supply Rejection Ratio Measurement.pdf J2120A Line Injector Useful Information 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

编码器的几种输出方式

编码器的几种输出方式 开集输出(OC) 开集输出(Open Collector),就是打开三极管的集电极。开集输出是以输出电路的晶体管发射极作为公共端,且集电极悬空的输出电路。一般分为 NPN 和 PNP 开集输出。 NPN 开集: PNP 开集: 使用时,需要将信号脚上拉,才能实现开集输出的功能。 电压输出 电压输出是在集电极开路输出的电路基础上,在电源间和集电极之间接了一个上拉电阻,使得集电极和电源之间能有一个稳定的电压状态。使用时不需要上拉电阻。 互补输出 互补输出是输出上具备 NPN 和 PNP 两种输出晶体管的输出电路。根据输出信号的高/低,两个输出晶体管交互进行开/关动作,比集电极开路输出的电路传输距离能稍远,也可与集电极开路输入机器(NPN、PNP)连接。 线性驱动输出 线性驱动输出是采用 RS-422 标准,用 AM26LS31 芯片应用于高速、长距离数据传输的输出模式。信号以差分形式输出,因此抗干扰能力更强。输出信号需专门能接收线性驱动输出的设备才能接收。 参考与致谢 旋转编码器的集电极开路输出、电压输出、互补输出和线性驱动输出之间的区别是什么 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

网络分析仪的使用 🚧

网络分析仪的使用 🚧 网络分析仪是表征射频和微波系统中所用元器件的基础仪器。 S 参数 S 参数即散射参数,是网络分析仪的工作语言。参数能够完整地描述任何线性、非时变的元件,全面描绘该元件在其可能连接的系统中表现出的特性。散射参数包含相位信息,因此它们是复数形式的相量,同时还与频率有关。一旦知道 S 参数,便可以将它们转换为其他网络参数,以便进行电路设计、优化或调谐。 图像 史密斯图 SWR 校准 每次使用网分测试之前,都要进行校准。 校准的方法是,使用标准校准件(注意要选对校准件的型号)分别校准开路、短路、负载三种情况。并使用端口延伸功能,点击开路自动校准,使信号检测延伸到传输线的末端。校准完成的表现是,复阻抗值能落在史密斯图主轴的最右端(开路)。 参考与致谢 双端口测量和 S 参数 - 灵活应用网络分析仪 用网络分析仪测量天线阻抗 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

网页版串口助手的开发

网页版串口助手的开发 Demo:https://serial.wiki-power.com/ linyuxuanlin/Serial_on_Web 本项目是在 web-serial-terminal 的基础上增添 debugout.js,实现打印日志及导出的功能。以下是详细的步骤: 添加 debug.js 代码 // save all the console.logs function debugout() { var self = this; // OPTIONS self.realTimeLoggingOn = true; // log in real time (forwards to console.log) self.useTimestamps = false; // insert a timestamp in front of each log self.useLocalStorage = false; // store the output using window.localStorage() and continuously add to the same log each session self.recordLogs = true; // set to false after you're done debugging to avoid the log eating up memory self.autoTrim = true; // to avoid the log eating up potentially endless memory self.maxLines = 2500; // if autoTrim is true, this many most recent lines are saved self.tailNumLines = 100; // how many lines tail() will retrieve self.logFilename = "log.txt"; // filename of log downloaded with downloadLog() self.maxDepth = 25; // max recursion depth for logged objects // vars self.depth = 0; self.parentSizes = [0]; self.currentResult = ""; self.startTime = new Date(); self.output = ""; this.version = function () { return "0.5.0"; }; /* USER METHODS */ this.getLog = function () { var retrievalTime = new Date(); // if recording is off, so dev knows why they don't have any logs if (!self.recordLogs) { self.log("[debugout.js] log recording is off."); } // if using local storage, get values if (self.useLocalStorage) { var saved = window.localStorage.getItem("debugout.js"); if (saved) { saved = JSON.parse(saved); self.startTime = new Date(saved.startTime); self.output = saved.log; retrievalTime = new Date(saved.lastLog); } } return ( self.output + "\n---- Log retrieved: " + retrievalTime + " ----\n" + self.formatSessionDuration(self.startTime, retrievalTime) ); }; // accepts optional number or uses the default for number of lines this.tail = function (numLines) { var numLines = numLines || self.tailLines; return self.trimLog(self.getLog(), numLines); }; // accepts a string to search for this.search = function (string) { var lines = self.output.split("\n"); var rgx = new RegExp(string); var matched = []; // can't use a simple Array.prototype.filter() here // because we need to add the line number for (var i = 0; i < lines.length; i++) { var addr = "[" + i + "] "; if (lines[i].match(rgx)) { matched.push(addr + lines[i]); } } var result = matched.join("\n"); if (result.length == 0) result = 'Nothing found for "' + string + '".'; return result; }; // accepts the starting line and how many lines after the starting line you want this.getSlice = function (lineNumber, numLines) { var lines = self.output.split("\n"); var segment = lines.slice(lineNumber, lineNumber + numLines); return segment.join("\n"); }; // immediately downloads the log - for desktop browser use this.downloadLog = function () { var file = "data:text/plain;charset=utf-8,"; var logFile = self.getLog(); var encoded = encodeURIComponent(logFile); file += encoded; var a = document.createElement("a"); a.href = file; a.target = "_blank"; a.download = self.logFilename; document.body.appendChild(a); a.click(); a.remove(); }; // clears the log this.clear = function () { var clearTime = new Date(); self.output = "---- Log cleared: " + clearTime + " ----\n"; if (self.useLocalStorage) { // local storage var saveObject = { startTime: self.startTime, log: self.output, lastLog: clearTime, }; saveObject = JSON.stringify(saveObject); window.localStorage.setItem("debugout.js", saveObject); } if (self.realTimeLoggingOn) console.log("[debugout.js] clear()"); }; // records a log this.log = function (obj) { // log in real time if (self.realTimeLoggingOn) console.log(obj); // record log var type = self.determineType(obj); if (type != null && self.recordLogs) { var addition = self.formatType(type, obj); // timestamp, formatted for brevity if (self.useTimestamps) { var logTime = new Date(); self.output += self.formatTimestamp(logTime); } self.output += addition; if (self.autoTrim) self.output = self.trimLog(self.output, self.maxLines); // local storage if (self.useLocalStorage) { var last = new Date(); var saveObject = { startTime: self.startTime, log: self.output, lastLog: last, }; saveObject = JSON.stringify(saveObject); window.localStorage.setItem("debugout.js", saveObject); } } self.depth = 0; self.parentSizes = [0]; self.currentResult = ""; }; /* METHODS FOR CONSTRUCTING THE LOG */ // like typeof but classifies objects of type 'object' // kept separate from formatType() so you can use at your convenience! this.determineType = function (object) { if (object != null) { var typeResult; var type = typeof object; if (type == "object") { var len = object.length; if (len == null) { if (typeof object.getTime == "function") { typeResult = "Date"; } else if (typeof object.test == "function") { typeResult = "RegExp"; } else { typeResult = "Object"; } } else { typeResult = "Array"; } } else { typeResult = type; } return typeResult; } else { return null; } }; // format type accordingly, recursively if necessary this.formatType = function (type, obj) { if (self.maxDepth && self.depth >= self.maxDepth) { return "... (max-depth reached)"; } switch (type) { case "Object": self.currentResult += "{\n"; self.depth++; self.parentSizes.push(self.objectSize(obj)); var i = 0; for (var prop in obj) { self.currentResult += self.indentsForDepth(self.depth); self.currentResult += prop + ": "; var subtype = self.determineType(obj[prop]); var subresult = self.formatType(subtype, obj[prop]); if (subresult) { self.currentResult += subresult; if (i != self.parentSizes[self.depth] - 1) self.currentResult += ","; self.currentResult += "\n"; } else { if (i != self.parentSizes[self.depth] - 1) self.currentResult += ","; self.currentResult += "\n"; } i++; } self.depth--; self.parentSizes.pop(); self.currentResult += self.indentsForDepth(self.depth); self.currentResult += "}"; if (self.depth == 0) return self.currentResult; break; case "Array": self.currentResult += "["; self.depth++; self.parentSizes.push(obj.length); for (var i = 0; i < obj.length; i++) { var subtype = self.determineType(obj[i]); if (subtype == "Object" || subtype == "Array") self.currentResult += "\n" + self.indentsForDepth(self.depth); var subresult = self.formatType(subtype, obj[i]); if (subresult) { self.currentResult += subresult; if (i != self.parentSizes[self.depth] - 1) self.currentResult += ", "; if (subtype == "Array") self.currentResult += "\n"; } else { if (i != self.parentSizes[self.depth] - 1) self.currentResult += ", "; if (subtype != "Object") self.currentResult += "\n"; else if (i == self.parentSizes[self.depth] - 1) self.currentResult += "\n"; } } self.depth--; self.parentSizes.pop(); self.currentResult += "]"; if (self.depth == 0) return self.currentResult; break; case "function": obj += ""; var lines = obj.split("\n"); for (var i = 0; i < lines.length; i++) { if (lines[i].match(/\}/)) self.depth--; self.currentResult += self.indentsForDepth(self.depth); if (lines[i].match(/\{/)) self.depth++; self.currentResult += lines[i] + "\n"; } return self.currentResult; break; case "RegExp": return "/" + obj.source + "/"; break; case "Date": case "string": if (self.depth > 0 || obj.length == 0) { return '"' + obj + '"'; } else { return obj; } case "boolean": if (obj) return "true"; else return "false"; case "number": return obj + ""; break; } }; this.indentsForDepth = function (depth) { var str = ""; for (var i = 0; i < depth; i++) { str += "\t"; } return str; }; this.trimLog = function (log, maxLines) { var lines = log.split("\n"); if (lines.length > maxLines) { lines = lines.slice(lines.length - maxLines); } return lines.join("\n"); }; this.lines = function () { return self.output.split("\n").length; }; // calculate testing time this.formatSessionDuration = function (startTime, endTime) { var msec = endTime - startTime; var hh = Math.floor(msec / 1000 / 60 / 60); var hrs = ("0" + hh).slice(-2); msec -= hh * 1000 * 60 * 60; var mm = Math.floor(msec / 1000 / 60); var mins = ("0" + mm).slice(-2); msec -= mm * 1000 * 60; var ss = Math.floor(msec / 1000); var secs = ("0" + ss).slice(-2); msec -= ss * 1000; return "---- Session duration: " + hrs + ":" + mins + ":" + secs + " ----"; }; this.formatTimestamp = function (timestamp) { var year = timestamp.getFullYear(); var date = timestamp.getDate(); var month = ("0" + (timestamp.getMonth() + 1)).slice(-2); var hrs = Number(timestamp.getHours()); var mins = ("0" + timestamp.getMinutes()).slice(-2); var secs = ("0" + timestamp.getSeconds()).slice(-2); return ( "[" + year + "-" + month + "-" + date + " " + hrs + ":" + mins + ":" + secs + "]: " ); }; this.objectSize = function (obj) { var size = 0, key; for (key in obj) { if (obj.hasOwnProperty(key)) size++; } return size; }; /* START/RESUME LOG */ if (self.useLocalStorage) { var saved = window.localStorage.getItem("debugout.js"); if (saved) { saved = JSON.parse(saved); self.output = saved.log; var start = new Date(saved.startTime); var end = new Date(saved.lastLog); self.output += "\n---- Session end: " + saved.lastLog + " ----\n"; self.output += self.formatSessionDuration(start, end); self.output += "\n\n"; } } self.output += "---- Session started: " + self.startTime + " ----\n\n"; } 添加下载日志的按钮 在 <button id="SerialConnectButton" type="button" disabled>Connect</button> 语句后加上: <button onclick="bugout.downloadLog();">下载日志</button> 调用对象 在 <script> 中加入: var bugout = new debugout(); 输出日志 在 term.write(chunk); 后加入: bugout.log(chunk); 参考与致谢 rafaelaroca/web-serial-terminal inorganik/debugout.js onclick 事件 js 如何读写 txt 文件?(曲线救国篇) 终于找到你!如何将前端 console.log 的日志保存成文件? 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

自制 CMSIS-DAP 🚧

自制 CMSIS-DAP 🚧 CMSIS DAP 是 ARM 官方推出的开源仿真器,支持所有的 Cortex - ARM 器件,支持 JTAG / SWD 接口,在最新的固件版本中,还支持单线 SWO 接口,可以直接在程序里把相应的数据通过 SWO 接口输出到调试窗口,起到类似串口调试的目的。DAP 主要有以下特点: 完全开源,没有版权限制,所以相应的价格会很便宜 无须驱动,即插即用 在新版本的 DAP 里集成了串口,除了下载调试外还能充当 USB 转串口模块,一机两用 性能方面已经可以满足一般用户的需求 (未完成) GitHub 仓库:linyuxuanlin/DashDAP 参考与致谢 x893/CMSIS-DAP ARM 官网的 DAP 介绍 电子屌丝的的情怀:CMSIS DAP 仿真器 CMSIS DAP 仿真器 konosubakonoakua/Various_MCU_Debugger_DIY 2.0 版本编辑中 项目在线预览: 背景 CMSIS-DAP / DAP-Link 相比 J-Link / ST-Link 有以下优势: 完全开源,无法律风险 支持虚拟串口 免驱 DAPLink 是 CMSIS-DAP,支持 U 盘拖拽烧录 / 固件升级 硬件部分 MCU 晶振 选用村田 8MHz 无源晶振,型号为 CSTCE8M00G53-R0,封装为 3213,电容为 15pF. 为什么选用这个呢?是因为它体积相对小,并且把两个起振电容整合进去了,硬件设计上能省很多事。至于村田晶振型号的命名方式,可以参考下表: 电源 功能模块 软件部分 驱动 在 Win10 / MacOS / Linux 不需要手动安装驱动;Win8 及更老的系统需要手动安装驱动。 拖拽式下载(MSC) 讲编译生成的 .hex 或 .bin 文件直接拖进 DAPLink 的虚拟 U 盘,即可完成烧录。如果发生错误,错误的信息就会存放在 FAIL.txt 中。 虚拟串口(CDC) CDC 虚拟串口功能具备一般的串口功能,允许双向通信,允许发送中断命令来重置目标板。 参考与致谢 JLink、STLink、DAPLink、CMSIS DAP 使用区别 技新 · DAPLink 仿真器 wuxx / nanoDAP LGG001 / DAPLink-Brochure 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

自适应网页设计

自适应网页设计 思想 一次设计,普遍适用。 方法 允许网页宽度自动调整 在网页代码头部加入: <meta name="viewport" content="width=device-width, initial-scale=1" /> 这行代码包含在自动生成的 HTML5 框架内。 不使用绝对宽度 使用 width: xx%; 或 width: auto; ,替代 width: xxx px; 使用相对大小的字体 指定字体大小为页面默认大小的 100%,即 16 像素: body { font: normal 100% Helvetica, Arial, sans-serif; } 再指定 h1 大小为默认的 1.5 倍,即 24 像素: h1 { font-size: 1.5em; } 流动布局(fluid grid) 各个区块的位置都是浮动的,而非固定不变的。 .main { float: right; width: 70%; } .leftBar { float: left; width: 25%; } float 的好处是,如果宽度太小,放不下两个元素,后面的元素会自动滚动到前面元素的下方,不会在水平方向 overflow(溢出),避免了水平滚动条的出现。 尽量不要出现 绝对定位(position: absolute)。 选择加载 CSS 如果屏幕宽度小于 400 像素(max-device-width: 400px),就加载 tinyScreen.css 文件: <link rel="stylesheet" type="text/css"     media="screen and (max-device-width: 400px)"     href="tinyScreen.css" /> 如果屏幕宽度在 400 像素到 600 像素之间,则加载 smallScreen.css 文件: <link rel="stylesheet" type="text/css"     media="screen and (min-width: 400px) and (max-device-width: 600px)"     href="smallScreen.css" /> 图片的自适应(fluid image) img { max-width: 100%;} 参考与致谢 自适应网页设计(Responsive Web Design) 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

英语六级 - 备考

英语六级 - 备考 听力 要点 听之前看选项, 训练时掐时间, 以名词为主挑重心(尤其是细节名词),明白这个选项讲的是什么东西, 注意否定词,用 "↓" 标出, 比较几个选项的异同: 主语一致重宾语, 动词开头重宾语, 主语不一致,一般四个选项都不一样, 一般来说,名词在句子或短语的末尾是重心, 不轻易丢数字, 注意细节名词。 对话片段选项特征 He / She 做主语:注意听针对 He / She 的片段, They 做主语:一般问谈论的对象所作的事情, It 做主语:问的是某个物体或某件事怎么样, 动词原形开头:问题往往是 What … to do? To do 开头:问原因,一般用 why 或 what … purpose 提问, 介词短语 速记 速度、不用写满整行,单词不用写完整,多用符号 背单词 方法 学术法 根据拼读: 直接拼读单词(三遍) 直接记忆中文含义(三遍) 联想造句 词根法: 前缀:in/in 里,ex/e 外,dis/di 分,com/con/col/co 合,de 数量下,sup/sub/sur/sus 位置下,pre/pro/pri 位置前,re 反复/返回,per 每一,en 使… 听力单词 抓关键词:actually/cause/although/still 写作词汇 实现某人精神上的升华:increase one's spiritual level I have increase my spiritual level through reading this book. 人际交往:interpersonal communication 思辨能力:critical thinking ability We could enrich our critical thinking ability through the debate. 换位思考:put oneself in others' shoes Put yourself in other's shoes when you misunderstand sb. 学习能力:learning ability 将心比心:be aware of others' feelings 大学学历:university degree 体谅他人:be empathetic to others 职业规划:career planning Career planing is vitual for one's whole life. 急人之所急:put oneself in others'place 丰富人生:enrich life Take part in different kinds of activity could enrich our life. 关爱和包容:love and inclusivenes 培养开放通达的气质:cultivate open-mindedness 倾向于:tend to/ be inclined to do sth. 培养独立自主的能力:cultivate independence We advise parents to cultivate independence of their children as soon as possible. 尽力做:attempt to do sth. I attempt to pass this exam. 脚踏实地的努力:the down-to-earth efforts 博大胸怀:generous heart 是金子总会发光:cream always rises to the top cream always rises to the top, don't get upset about these failures. 宽大为怀:benevolent 取得显著进步:make remarkable progress 推己及人:considerate 主动付出时间:volunteer ones' time 包容:tolerate 带来快乐和成就感:bring happiness and fulfillment 遵守:follow 充满阳光:be full of sunshine Co mphis 代价高的:costly 以保证充分的休息时间:ensure enough time of rest 疲劳:fatigue 集中精力完成:make concentrated effort to complete sth. 降低的作效率 decreasing productivity 充分合理地利用某事:fully and properly use sth. 虚度时光:idle time away 高效地工作:be productive at work 不明智的:inadvisable/ unwise 应对挑战:meet/ face up to challenges \(过于、) 繁重的:overburdened 我们应该:it is advisable to 扩展个人兴趣:explore private interest 自我强加的:self- imposed …. 生活:make sth. part of one's' life 更加专注和高效:be more focused and productive 学业:academic study 有意识地努力做某事:make conscious effort to do sth. 课外活动:extracurricular activities 美满的/充实的生活:fulfilling life 以……为重:sth. comes first 专业知识:professional knowledge 充分发挥潜力:achieve ones' full potential fulfill one's potential 首要任务:primary duty 敞开心扉:open one's heart 精挑细选:be picky about 个性自主的:individualistic 时间管理:time management 主观能动性:take initiative 规划生活:organize one's' life 核心竞争力:core competitiveness 让我们进步 facilitate our development 肩负责任:take responsibilities to do sth. 绝对信任:implicit trust 信守承诺:honour one's' promises 大有助益:greatly facilitate 大获裨益:benefit greatly from sth. 毫无保留的:without reservation 完全胜任:be well qualified for sth. 归属感:sense of belonging 极大乐趣:enormous interest 值得信任:trustworthy 竞争优势:competitive edge 综合素质:comprehensive quality 即时快乐:instant pleasures 全面视角:comprehensive view 攀登更高:more further up 诸多益处:bunch of benefits 拓宽眼界:broaden one's horizon 与时俱进:keep oneself up to date 巨大的成功:remarkable success 事与愿违:end up disappointed 如愿以偿:achieve successful outcome 长远打算:lone- term plan 长期规划:blueprint 找工作:land job 阅读理解 理解句子 1. 基本语法 谓语动词:一个句子有且仅有一个(拆解复合句) 非谓语动词:to do 不定式;-ing 形式表动词名词或现在分词;-ed 表示过去分词 介词短语:介词+n./ving(一定要接名词才完整) 从句:(连词)+ 句子 主动时态: 时间/状态 完成 进行 一般 完成进行 过去 had + Ved was / were + Ving Ved 现在 have / has + Ved be + Ving V / Vs / Ves have / has + been + Ving 将来 will + have + Ved will + be + Ving will + V 过去将来 should / would + have + Ved should / would + be + Ving should / would + V should / would + have + been + Ving 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

解决 Google 相册导出时间信息丢失问题

解决 Google 相册导出时间信息丢失问题 在 Google Takeout 导出 Google 相册后,很多照片的时间信息都被另存为 .json 文件。如何将其导入对应照片呢? 新建一个 Python 文件 update-data.py: from win32file import CreateFile, SetFileTime, GetFileTime, CloseHandle from win32file import GENERIC_READ, GENERIC_WRITE, OPEN_EXISTING from pywintypes import Time import os,json,time # 获取指定后缀的文件名 def get_all_file(ext_name): file_list = [] datanames = os.listdir() for dataname in datanames: if os.path.splitext(dataname)[1] == ext_name: #目录下包含.json的文件 file_list.append(dataname) return file_list # 读取json def load_json(json_file_name): f = open(json_file_name,'r',encoding = 'UTF-8') text = f.read() dic = json.loads(text) return dic def modifyFileTime(filePath, createTime, modifyTime, accessTime, offset): """ 用来修改任意文件的相关时间属性,时间格式:YYYY-MM-DD HH:MM:SS 例如:2019-02-02 00:01:02 :param filePath: 文件路径名 :param createTime: 创建时间 :param modifyTime: 修改时间 :param accessTime: 访问时间 :param offset: 时间偏移的秒数,tuple格式,顺序和参数时间对应 """ try: format = "%Y-%m-%d %H:%M:%S" # 时间格式 cTime_t = timeOffsetAndStruct(createTime, format, offset[0]) mTime_t = timeOffsetAndStruct(modifyTime, format, offset[1]) aTime_t = timeOffsetAndStruct(accessTime, format, offset[2]) fh = CreateFile(filePath, GENERIC_READ | GENERIC_WRITE, 0, None, OPEN_EXISTING, 0, 0) createTimes, accessTimes, modifyTimes = GetFileTime(fh) createTimes = Time(time.mktime(cTime_t)) accessTimes = Time(time.mktime(aTime_t)) modifyTimes = Time(time.mktime(mTime_t)) SetFileTime(fh, createTimes, accessTimes, modifyTimes) CloseHandle(fh) return 0 except: return 1 def timeOffsetAndStruct(times, format, offset): return time.localtime(time.mktime(time.strptime(times, format)) + offset) #日期转换,将谷歌的日期转化为数值 def time_format(data_string): print(data_string) year = data_string.split('年')[0] month = data_string.split('年')[1].split('月')[0] day = data_string.split('年')[1].split('月')[1].split('日')[0] add_flag = data_string.split('年')[1].split('月')[1].split('日')[1].find('下午') hour = data_string.split('年')[1].split('月')[1].split('日')[1].split('午')[1].split(':')[0] minute = data_string.split('年')[1].split('月')[1].split('日')[1].split('午')[1].split(':')[1] second = data_string.split('年')[1].split('月')[1].split('日')[1].split('午')[1].split(':')[2] if add_flag > 0: hour = str(int(hour)+12) return year + '-' + month + '-' +day +' ' + hour + ':'+ minute + ':' + second if __name__ == '__main__': file_name_json = get_all_file('.json') #获取当前目录下所有文件图片文件名list for fnj in file_name_json: dic = load_json(fnj) #提取字典信息 st = dic['creationTime']['formatted'] #获取文件日期 output_format = time_format(st) #转换日期格式 file_name = fnj[0:-5] #获取对应文件的照片名字 print(file_name) offset = (0, 1, 2) #修改文件日期 modifyFileTime(file_name, output_format, output_format, output_format,offset) 这个脚本的作用是根据 json 修改文件创建日期,并将其导入同名的照片。 直接将此脚本放入每个相册的目录中运行即可。执行过后,照片的时间信息就回来了。 参考与致谢 谷歌相册下载后的时间丢失问题 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

读《黑客与画家》

读《黑客与画家》 「黑客精神」 黑客行为必须包含三个特点:好玩、高智商、探索精神。只有其行为同时满足这三个标准,才能被称为「黑客」。 对于黑客来说,关着的门就是一种挑衅,而锁着的门则是一种侮辱。……黑客相信,只要有助于改进现状、探索未知,人们就应该被允许自由地使用各种工具和信息。当一个黑客需要一样东西来帮助自己创造、探索或者改正某种设备时,他不会自找麻烦,不会接受那些财产专有权的荒谬概念。 「工作」 人类喜欢工作,在世界上大多数地方,你的工作就是你的身份证明。但是,我们那时做的所有事情根本就是无意义的,至少那时看来是这样。最好的情况下,那些事情也不过是遥远的将来我们可能从事的实际工作的练习。它所面向的目标是如此遥远,以至于当时我们都不知道自己练习这些到底是为了干什么。更常见的情况是,那些事情不过是一系列随意设置的绳圈,你被要求一个个跳过去。 你在学习中遇到的文字都是专为考试而设计的,目的就是为了出题,而不是为了讲清楚问题。 (南北战争的三个主要原因是……等到考试的时候,就会有一道题:请列出南北战争的三个主要原因。) 而且,没有办法回避那些事情。 成年人已经达成共识,认定通往大学的途径就是这样的。逃离这种空虚生活的唯一方法,就是向它屈服。 与此同时,社会发生了什么变化?我们被迫面对一个更严峻的问题。它与当前的其他许多难题有着共同的起因,那就是 「专业化」(specialization) 。当工作的专业程度越来越高时,我们就必须接受更长时间的训练。工业化时代来临之前,儿童最晚大约在 14 岁就要参加工作,如果是在农庄(那个时代大多数人生活在农村),参加工作的时间就更早。如今,只要一个青少年读大学,他就要等到 21 岁或 22 岁才开始全职工作。如果再读更髙的学位,比如医学博士或哲学博士,可能要拖到 30 岁才能完成学业。 黑客如何才能做自己喜欢的事情?我认为这个问题的解决方法是一个几乎所有创作者都知道的方法:找一份养家糊口的「白天工作」\(day job\). 这个词是从音乐家身上来的,他们晚上表演音乐,所以白天可以找一份其他工作。更一般地说,「白天工作」的意思是,你有一份为了赚钱的工作,还有一份为了爱好的工作。 专业化是现代社会的必需,但过度专业化可能会剥夺个人探索世界的能力。在科技发展迅猛的时代,在一种知识里钻研越深,当新的技术栈出现的时候,将更不易迁移。我想,应该保持「适度专业化」,留下来的时间和精力学一些自己喜好的知识,这样既满足了社会对专业能力的需求,又保持了持续发展的潜力,对于个人而言,是一个较好的平衡。 「创造方法论」 创造优美事物的方式往往不是从头做起,而是在现有成果的基础上做一些小小的调整,或者将已有的观点用比较新的方式组合起来。 你把整个程序想清楚的时间点,应该是在编写代码的同时,而不是在编写代码之前。 我喜欢直接坐在计算机前编程,而不是在纸上编程。更糟的是,我不是耐心地一步步写出整个程序,确保大体上是正确的,而是一股脑不管对错,先把代码堆上去,再慢慢修改。 编程不是在纸上写,一落笔便成文,而应该随时可修改的。如果说项目的成品是一栋大厦,在构建的时候一定不是每建一层就装修一层。在开发项目的时候,细节之处的灵感可以先记下来,但要避免「过早优化」,就像你刚建到三楼,便匆匆忙忙给二楼的窗户安玻璃,后来发现大厦的主结构不符合要求。 我认为,这也是多人共同开发一个软件的正确模式。需要合作,但是不要「合」得过头。如果一个代码块由三四个人共同开发,就没有人真正「拥有」这块代码。最终,它就会变得像一个公用杂物间,没人管理,又脏又乱,到处堆满了冗余代码。正确的合作方法是将项目分割成严格定义的模块,每一个模块由一个人明确负责。模块与模块之间的接口经过精心设计,如果可能的话,最好把文档说明写得像编程语言规范那样清晰。 对于团队项目,分工时应该 按模块切分任务,让每个人对自己负责的部分有掌管的权利。 程序写出来是给人看的,附带能在机器上运行。 只有在那些不太成熟、容易出现问题的地方,你才应该加上注释,提醒读者注意那里,就好像公路上只有在急转弯处才会出现警示标志一样。 此处联想「Python 之禅」: Simple is better than complex. 又要提到「奥卡姆剃刀」原则了: 如无必要,勿增实体。 \( Entities should not be multiplied unnecessarily. \) 作者在文中是这样阐述的: 当你被迫把东西做得很简单时,你就被迫直接面对真正的问题。当你不能用表面的装饰交差时,你就不得不做好真正的本质部分。 关于如何去构建好的设计,文中提出了这几个观点:简洁、符合历史精华的审美、模仿大自然。 好设计是简单的设计。从数学领域到绘画领域,你都可以听到这种说法。在数学中,它表示简短的证明往往是更好的证明。特别是对于数学公理来说,少即是多。在编程中,这种说法也基本适用。对于建筑师和设计者,它意味着美依赖于一些精心选择的结构性元素,而不依赖于表面装饰品的堆砌。( 装饰品本身并不是坏事,只有当它被用来掩盖结构的苍白时,才变成了一件坏事。 )绘画也是类似的,认真观察的、非常有代表性的静物作品往往要比表面极尽华美、但是实质上只是无意义重复的「巨作」(比如再现非常复杂的花边的绘画作品)更有价值。在写作上,这种说法意味着只说必须要说的话,并且说得简短。 说来奇怪,如果你希望自己的作品对未来的人们有吸引力,方法之一就是 让你的作品对上几代人有吸引力。 我们很难猜想未来是什么样子,但是可以肯定,未来的人们不会在乎今天流行的风潮,这一点与上几代人是相同的。所以,如果你的作品对今天的人们以及 1500 年的人都有吸引力,那么它极有可能也会吸引 2500 年的人。 好设计是模仿大自然的设计。我不是说模仿大自然这种行为本身有多么好,而是说 大自然在长期的演化中已经解决了很多设计问题 。所以,如果你的设计与大自然很接近,那么它基本上不会很差。 最后一点能很好地解释「人为什么不会进化出轮子」这个问题。 在历史的任何时刻都有一些热点项目,一些团体在这些项目上做出伟大的成绩。如果你远离这些中心,几乎不可能单靠自己就取得伟大成果。某种程度上,你个人最多可以对趋势产生一定的影响,但是你不可能决定趋势,实际上是趋势决定了你。 个人对历史的影响大多是微乎极微的。如果时代没有特定的趋势,只能逆流而上。摸清时代的发展趋势,是创造出更大的成就的必要条件。 帕金森定律(Parkinson's Law)的一种原始表达形式是「工作总是到最后一刻才会完成」,后来引申到计算机领域就变成了「数据总是会填满所有空间」,更一般性的总结则是「对一种资源的需求总是会消耗光这种资源的所有供应」。 做出优秀成果的人,在做的过程中常常觉得自己做得不够好。其他人看到他们的成果觉得棒极了,而创造者本人看到的都是自己作品的缺陷。这种视角的差异并非偶然,因为只有对现状不满,才会造就杰出的成果。 「自由思想」 塞缪尔·约翰逊说过,人们对一个作家的评价,需要 100 年才能达成一致。你必须先等他的那些有影响力的朋友都死了,然后再等他的追随者都死了,才能对他有一个公正的评价。 但真正令人惊恐的是,流行一时的不仅有衣服,还有道德观念。明明是专横武断、毫无依据的错误观点,但是大多数人却深信不疑,受到影响而不自知。这是非常危险的。流行的衣服,其实是很难看的衣服;流行的道德观念,其实不是善而是恶。但是,如果别人都穿流行的衣服,而你不穿,你就会遭到嘲讽;如果别人都遵守流行的道德观念,而你不遵守,结果则要严重得多,你会被解雇、流放、监禁,甚至被杀。 要是能坐上时间机器回到过去,不管哪一个年代,有一件事都是不会改变的,那就是「祸从口出」。你一定要小心自己说的话。自以为无害的言论会给你惹来大麻烦。今天,说地球围绕太阳运转真是再平常不过了,如果换在 17 世纪的欧洲,这么说就大难临头了。伽利略说了这样的话,结果遭到了宗教法庭的审判。 有时候,别人会对你说:「要根据社会需要,改造自己的思想、(well-adjusted)。」这种说法隐含的意思似乎是,如果你不认同社会,那么肯定是你自己的问题。你同意这种说法吗?事实上,它不仅不对,而且会让历史倒退。如果你真的相信了它,凡是不认同社会之处,你连想都不敢想,马上就放弃自己的观点,那才会真正出问题。 一旦发现了「不能说的话」,下一步怎么办?我的建议就是别说,至少也要挑选合适的场合再说,只打那些值得打的仗。与笨蛋辩论,你也会变成笨蛋。 这时你要明白,自由思考比畅所欲言更重要。如果你感到一定要跟那些人辩个明自,绝不咽下这口气,一定要把话说清楚,结果很可能是从此你再也无法自由理性地思考了。我认为这样傲不可取,更好的方法是在思想和言论之间划一条明确的界线。在心里无所不想,但是不一定要说出来。我就鼓励自己在心里默默思考那些最无法无天的想法。你的思想是一个地下组织,绝不要把那里发生的事情一股脑说给外人听。 1638 年,英国诗人弥尔顿(John Milton)准备第一次访问意大利。曾经担任英国驻威尼斯大使的沃顿爵士(Hemy Wootton)告诉弥尔顿要记住一句座右铭「i pensieri stretti & il viso sciolto」。字面意思是「守口如瓶,笑脸相迎」,也就是说,你要对每一个人微笑,但是不要说出自己的真实想法。这所有反击方法之中,最好的一种可能就是幽默。狂热分子都有一个共同点:缺乏幽默感。他们无法平静地对待笑话。在幽默王国中,他们闷闷不乐,就像满身笨重盔甲的骑士走进了溜冰场,无所适从。一个现实的例子就是,维多利亚女王时代的英国人讲究宫廷礼仪,迂腐守旧,人们把这当作笑话看待,结果它好像就真的被笑话击垮了。它在当代的化身「政治正确」也将得到同样的命运。「我很高兴自己写了《萨勒姆的女巫》,」阿瑟·米勒写道,「但是回想起来,我常常希望自己有那种气质,写一出反映当时情况的荒诞喜剧。」 如果自己就是潮水的一部分,怎么能看见潮流的方向呢?你只能永远保持质疑。问自己,什么话是我不能说的?为什么? 幽默感是强壮的一种表现,始终拥有幽默感就代表你对厄运一笑了之,而丧失幽默感则表示你被厄运深深伤到。所以,强壮的标志(或者至少是特点)就是轻松面对自己的人生。 「市场」 真正竞争软件设计的战场是新兴领域的市场,这里还没有人建立过防御工事。只要你能做出大胆的设计,由一个人或一批人同时负责设计和实现产品,你就能在这里战胜大公司。微软公司自己一开始就是这样走向成功的,苹果公司和惠普公司也是如此。我觉得几乎所有的创业公司都是这样取得成功的。 没有盗版是一种「优势」,但也是一个问题。一定数量的盗版对软件公司是有好处的。不管你的软件定价多少,有些用户永远都不会购买。如果这样的用户使用盗版,你并没有任何损失。事实上,你反而赚到了,因为你的软件现在多了一个用户,市场影响力就更大了一些,而这个用户可能毕业以后就会出钱购买你的软件。 麦当劳是快餐连锁集团,它的发展依靠的就是设计出了一个快餐服务体系,可以复制到全世界每一个角落。每一家麦当劳连锁店都必须严格遵守操作规定,这使得它就像软件一样运作。所以,麦当劳其实也符合「一次开发,普遍适用」的模式。 这不仅是创业公司运作的好方法,更是创业公司的本质。风险投资商(VC)知道这个道理,为它起了一个名字——进入壁垒(bairiers to entry)。如果你有一个新点子去找 VC,问他是否投资,他首先就会问你几个问题,其中之一就是其他人复制你的模式是否很困难。也就是说,你为竞争对手设置的壁垒有多高^。你最好做出令人信服的解释,阐明你的技术难以复制的原因。否则一旦大公司看到了,它们就会做出自己的版本,再加上它们的品牌、资本、经销能力,一夜之间就把你的市场全部抢走。那时你就像来到开阔地带的游击队,会被正规军一举歼灭。 「工具」 大多数时候,你不需要一台全功能的电脑(即本身可以运行软件的电脑)。你所需要的设备只要有键盘、屏幕、浏览器就够了,可能还有无线网卡。 我也曾想过,既然性能与便携不可兼得,那么把消耗性能的计算与渲染工作放到云端,而用户终端只需要有基本性能的处理器,与屏幕、键鼠等交互设备。并且,云服务器映射到终端,一对多的方式,不仅可以节省成本,也可以做到无缝切换,适应更多场景。在家外接大屏幕,在外用平板就行了。 目前主要的问题主要是连接速率与成本。 参考与致谢 奥卡姆剃刀 - 维基百科 为什么地球生物没有进化出轮子这类结构?- 知乎 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

转义字符

转义字符 转义序列 字符 \b 退格符 \f 换页符 \n 换行符 \r 回车符 \t 制表符 \unnnn Unicode 字符 \xnn ASCII 字符,字符代码由十六进制数字 nn 指定 \' 单引号 \" 双引号 \\ 单个反斜杠字符 参考与致谢 flash 中重要转义字符 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

软件开发中的注意事项

软件开发中的注意事项 别给用户过多的选择,这样会让他们感到疲惫,并伤害他们内心的幸福感。 针对群体,做具体的用户画像。竞选总统,你需要讨好大多数人;做产品,只需要取悦少数人就够了。 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

通信协议 - CAN 🚧

通信协议 - CAN 🚧 CAN(Controller Area Network)是一种多主方式的串行通讯总线。基本设计规范要求有高的位速率、高抗电磁干扰性,而且能够检测出产生的任何错误,当信号传输距离达到 10Km 时 CAN-bus 仍可提供高达 5Kbps 的数据传输速率。 CAN 电路设计 CAN 模块的设计,是基于 CAN 芯片,对串行信号(RX/TX)与 CAN 差分信号(CANH/CANL)进行互相转换。以下是两种较为常用的 CAN 收发器。 基于 TJA1050 完整资料请见 Modularity_of_Functional_Circuit/ 模块设计 - CAN 通信 / 基于 TJA1050 特性 供电:5 V(4.75-5.25 V) 高速率:60 Kbps-1 Mbps 完全符合 ISO 11898 标准 低电磁辐射(EME) 具有贷款输入范围的差动接收器,可抗电磁干扰(EMI) 可以连接至少 110 个节点 没有上电的节点不会对总线造成干扰 工作模式 TJA1050 有两种工作模式(高速 / 静音),由引脚 S(RS) 来控制。 高速模式: 高速模式是普通的工作模式,将引脚 S 接地即可进入该模式。因引脚 S 内置下拉,所以即使外部没有连接,默认也是高速模式。 在这个模式中,总线输出信号有固定的斜率,并以最快的速度切换,适合于最大的位 速率和,或最大的总线长度,此时它的收发器循环延迟最小。 静音模式: 静音模式中,发送器是禁能的,不管 TXD 的输入信号,所以运行在非发送状态中消耗的电源电流,和在隐形状态中是一样的。将引脚 S 接高电平就可以进入静音模式。 静音模式中,节点可以被设置成对总线绝对无源的状态,此时微控制器不再直接访问 CAN 控制器,TJA1050 将会释放总线。 芯片管脚 参考电路 如图,CAN 协议控制器(例如单片机)通过串行线(RX/TX)连接到收发器,在收发器上转换为 CAN 信号(CANH/CANL),并通过引脚 S 来选择高速 / 静音模式。 基于 SN65HVD230 完整资料请见 Modularity_of_Functional_Circuit/ 模块设计 - CAN 通信 / 基于 SN65HVD230 特性 由 3.3 V 单电源供电 可以连接至少 120 个节点 低电流待机模式 速率:最高 1 Mbps 工作模式 SN65HVD230 有三种工作模式(高速 / 斜率 / 静音),由引脚 S(RS) 来控制。一般我们使用高速模式。 高速模式: 将 Rs 强下拉至 GND 以启用高速模式。 斜率模式: 使用 10k 至 100k 之间的电阻,将 Rs 下拉至 GND。具体电阻阻值与速率的关系,请参考数据手册。 低功耗模式: 将 Rs 强上拉至 3.3V 芯片管脚 参考电路 PESD2CAN 是 CAN 专用的 ESD 保护二极管,保护芯片免受静电和其他瞬变因素的损害。 参考的 PCB 布局如下: TJA1050 与 SN65HVD230 的异同 TJA1050 与 SN65HVD230 主要的区别是工作电压的不同,TJA1050 工作在 5 V 环境下的,而 SN65HVD230 工作在 3.3 V 环境下。 共同的注意事项: CAN 信号线在 PCB 布线的时候,要走差分线。 末端电阻一般在 CAN 线起始端和末端才需要使用,中间端不需要外加。 如果需要对总线的共模电压进行过滤和稳定,也可以使用分体式末端电阻(如上文所示,分为两个 60 Ω 电阻,中间加连接到地的电容)。 CAN 接口 EMC 设计 CAN 通讯中,电缆容易耦合外部干扰,对信号传输造成影响,甚至会通过接口电路影响内部核心敏感电路。 CAN 接口防护器件主要包括:滤波电容、共模电感、跨接电容、TVS 管。 滤波电容 \(C_1,C_2\):用于给干扰提供低阻抗的回流路径,选取范围为 22pF~1000pF,典型值为 100pF。 共模电感 \(L_1\):用于滤除差分线上的共模干扰,阻抗选取范围为 120Ω/100MHz~2200Ω/100MHz,典型值为 600Ω/100MHz。 跨接电容 \(C_3,C_4\):用于接口地和数字地之间的隔离,典型值为 1000pF/2kV。 TVS 管 \(D_1,D_2\):用于防 ESD 或瞬间的高能量冲击,使其线路的电压钳位在一个预定的数值内,从而确保后面的电路器件免受瞬态高能量的冲击而损坏。 参考与致谢 接口电路的防护设计 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

通信协议 - I2C

通信协议 - I2C I2C(Inter-Integrated Circuit)是一种串行通讯总线,可允许存在多主机,但同一时刻只能有一个主机在线。I2C 由两条开漏信号线组成,接线简单,利用电阻上拉,典型电平为正逻辑 3.3V 或 5V。传输速率分快速模式(400Kb/s)、标准模式(100Kb/s)、低速模式(10Kb/s)。 在 I2C 总线上,从机以它的 I2C 地址被选择。这样子可以用在一个主机上通过两根线控制多个从机。 I2C 的引脚 SCL(serial clock):由主机产生的方波,用来控制传输速率和数据的锁存。 SDA(serial data):这是一个 半双工、同步 的信号线,传输的数据包括地址、控制信号与通信数据。 I2C 地址 I2C 地址划分,是 7 bit 地址加上 1 bit 读写指示。 I2C 总线上的每个设备都必须有一个唯一的地址,如果地址重复会出问题。有些设备的 I2C 地址是可以编程设置的。 I2C 通信 START:主机在 SCL 为高时,拉低 SDA 发起。 STOP:主机在 SCL 为高时,释放 SDA(变为高电平)发起。 ACK(acknowledge):I2C 传输都是随着每个 SCL 脉冲,每次传输 1 个字节(8 个位)。每次传输的第 9 个脉冲被保留为从机的确认信号,每次的 ACK 信号表示前一次传输成功。 I2C 传输句段示例 这一段传输的值为 11001101: 主机拉低 SDA 电平以产生 START 信号。 第一个位被设置,主机拉低 SCL,将时钟信号经过 DAC 进行输出。 传输到第九个位时,主机不会拉低 SDA,如果从机确认传输完整,则将 SDA 拉低让主机知道。 有效的数据传输 在 SCL 保持高电平(传输数据)时,SDA 在这段时间内必须保持稳定才有效。 在 SCL 节拍间的低电平,才允许 SDA 切换数值。 当 SCL 为高电平,SDA 发生变化时,就会被解释为 START、RESTART 或 STOP 事件。 接口电路上升 / 下降计时 如图,晶体管将在低电平时导通,并将 \(C_b\) 电容放电到低电平。反之,晶体管将在高电平时截止,上拉电阻会将 \(C_b\) 充电至高电平。 \(t_r\)(上升时间):信号从低电平过渡到高电平的最大时间。因为 I2C 是开漏信号,所以上升时间由上拉电阻和总线电容的 RC 时间常数决定。 \(t_f\)(下降时间):信号从高电平过渡到低电平的最大时间。 I2C 上拉电阻计算 上拉电阻最小值:\(R_{Pull(Min)}=\frac{V_{DD}-V_{OLMAX}}{I_{SinkMax}}\) 上拉电阻最大值:\(R_{Pull(Max)}=\frac{t_r}{0.8473*C_b}\) 其中,上拉电阻最小值会带来最短的上升时间。如果用的阻值比这个再小,就会导致当输出晶体管开启(逻辑低电平)时,消耗过多的电流,违反最大逻辑低电平输出的规范。 上拉电阻最大值会带来最长的上升时间。如果使用大于此值的上拉电阻,将会违反时序要求。 \(V_{DD}\) 表示供电电压;\(V_{OLMAX}\) 表示最大逻辑低电平(典型值为 0.4V);\(I_{SinkMax}\) 表示最大灌电流(典型值为 3mA);\(C_b\) 表示总线电容,取决于 PCB 走线的长度和宽度,与连接至总线的设备的电容。 计算示例: 参考与致谢 《Analog Engineer’s Pocket Reference》 I2C 总线该怎么用?看完你就会了 [电路]I2C 总线协议 🚧 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

通信协议 - SPI

通信协议 - SPI SPI(Serial Peripheral Interface)是一种 全双工、同步、串行、主从、总线 通信协议,其数据传输速率为 8 Mbit。SPI 只能有一个主机,可连接一个或多个从机。连接多设备时,需要用到片选引脚(chip select,CS)。 SPI 的引脚 SCLK(serial clock):由主机驱动的方波时钟信号,从端为输入采样。SDO 和 SDI 上的信号根据 SCLK 上的时钟信号来进行锁存操作。一个时钟周期传输 1bit 数据,所以传输速率等同于主机产生的时钟频率。 SDI/SDO(serial data in / serial data out):描述了相对于主机的数据流的方向,但更多时候在板子上出现的是 MOSI(Master Out Slave In)和 MISO(Master In Slave Out)。对应地,SDO 在主机上是 MOSI,在从机上是 MISO;而 SDI 在主机上是 MISO,在从机上是 MOSI;在菊花链拓扑中,A 器件 MISO 连接到 B 器件的 MISO。 CS/SS(chip select / slave select):由主机驱动,用于仲裁 SPI 总线上通信的优先级。当 CS 线上为低电平时,就会激活 SPI 通信。CS 是低电平有效。 SPI 数据锁存操作 SPI 数据在 SCLK 上升或下降沿时进行锁存。 锁存数据的边沿称为临界边沿。 举个例子,以下左图表示 SDO 在上升沿锁存逻辑 1,右图表示在下降沿锁存逻辑 0。 SPI 读取句段示例 临界边沿为上升沿 主机输出到从机(在从机上为 SDI) CS 脚被拉低为 0V,以激活 SPI 数据在 SCLK 上升沿时,从高位(MSB)到低位(LSB)按顺序进行传输 完成传输数据:1011001 SPI 临界边沿 \(t_{SU}\)(setup time):定义在临界边沿事件发生多久前,SDI 数据就该被确定并稳定下来。 \(t_{HO}\)(hold time):定义在临界边沿事件发生后,SDI 上的数据必须保留多长时间。 \(t_{DO}\)(delay time):定义在临界边沿事件发生后,SDO 上的有效数据的延迟时间。 SPI 传输模式(4 种) CPOL(clock polarity,时钟极性):空闲(不传输数据)时钟的极性,0 代表低电平,1 代表高电平。 CPHA(clock phase,时钟相位):定义在上升还是下降沿进行锁存。0 代表在第一个变化的边沿进行锁存;1 代表在第二个变化的边沿进行锁存。 模式编号 CPOL(时钟极性) CPHA(时钟相位) 锁存边沿 0 0(低电平) 0(在第一个边沿进行锁存) 上升沿 1 0(低电平) 1(在第二个边沿进行锁存) 下降沿 2 1(高电平) 0(在第一个边沿进行锁存) 下降沿 3 1(高电平) 1(在第二个边沿进行锁存) 上升沿 菊花链(Daisy Chain) 在普通模式下,SPI 每个从机都需要一条 CS 线。当从机一多,会占用主机过多的 IO 口。使用菊花链的拓扑连接,就可以只用一条 CS 线,驱动所有的从机。 菊花链的原理是,数据从主机传输到第一个从机,然后从第一个从机传输到第二个从机,依此下去,数据沿着线路级联,直到系列中的最后一个从机,最后的一个从机通过 SDO 将数据传送到主机。 SPI 的优缺点 优点: 全双工通信 推挽驱动,能提供比较好的信号完整性和较高的速度 协议灵活,不仅限于 8-bit 一个字节 硬件设计简单 不需要上拉电阻,因此功耗更低 没有仲裁机制或相关的失效模式 从机不需要时钟(由主机提供) 从设备不需要单独的地址 不需要收发器 信号都是单向的,容易进行电流隔离 时钟速率没有上限 缺点: 用到的引脚比 I2C 多 从机无法进行硬件应答 没有错误检查机制,如 UART 中的奇偶校验位 只能有一个主机 规范不统一,无法验证一致性 传输距离相对比较近(相比 CAN、RS232、RS485 等) 参考与致谢 《Analog Engineer’s Pocket Reference》 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

通信协议 - USB 🚧

通信协议 - USB 🚧 USB 版本 USB 机械接口 接口定义 - 标准 USB: 触点 功能 1 VBUS(4.75-5.25 V) 2 D- 3 D+ 4 GND 接口定义 - Mini USB: 触点 功能 颜色 1 VBUS(4.75-5.25 V) 红 2 D- 白 3 D+ 绿 4 ID 5 GND 黑 USB 插头与版本的兼容性 USB Type-C 端口类型 数据: 下行端口(Downstream Facing Port,DFP):主机 / 下行集线器端口。典型示例为传统的标准 Type-A 端口。 上行端口(Upstream Facing Port,UFP):设备 / 上行集线器端口。典型示例为传统的标准 Type-B 端口。 双重角色端口(Dual-Role Port,DRP):连接事件发生前,在 DFP 端口和 UFP 端口之间切换的端口。初始连接事件后,可通过 USB 供电协议协商进行动态交换。 供电: 拉电流电源 / 供电设备:5V-20V 时的拉电流最多为 5A。典型示例为传统的标准 Type-A 端口。 灌电流电源 / 耗电设备:5V-20V 时的灌电流最多为 5A。典型示例为传统的标准 Type-B 端口。 引脚定义 Type-C 分公母头(插头与插座),两者引脚大部分呈镜像分布。 Type-C 插座: Type-C 插头: 对接示意图(全功能): 引脚定义: 引脚 名称 功能 详细说明 A1 GND 电源 最低支持 60W(与所有 VBUS 结合使用) A2 TX1+ USB3.1 或备用模式 与 TX1- 共同构成 10 Gbps 差分对 A3 TX1- USB3.1 或备用模式 与 TX1+ 共同构成 10 Gbps 差分对 A4 VBUS 电源 最低支持 60W(与所有 VBUS 结合使用) A5 CC1 CC 或 VCONN 用于方向检测、电流能力通告检测及 USB2.0 BMC 通信 A6 D+ USB2.0 — A7 D- USB2.0 — A8 SBU1 备用模式 低速边带信号,仅供备用模式使用 A9 VBUS 电源 最低支持 60W(与所有 VBUS 结合使用) A10 RX2- USB3.1 或备用模式 与 RX2+ 共同构成 10 Gbps 差分对 A11 RX2+ USB3.1 或备用模式 与 RX2- 共同构成 10 Gbps 差分对 A12 GND 电源 最低支持 60W(与所有 VBUS 结合使用) B1 GND 电源 最低支持 60W(与所有 VBUS 结合使用) B2 TX2+ USB3.1 或备用模式 与 TX2- 共同构成 10 Gbps 差分对 B3 TX2- USB3.1 或备用模式 与 TX2+ 共同构成 10 Gbps 差分对 B4 VBUS 电源 最低支持 60W(与所有 VBUS 结合使用) B5 CC2 CC 或 VCONN 用于方向检测、电流能力通告检测及 USB2.0 BMC 通信 B6 D+ USB2.0 — B7 D- USB2.0 — B8 SBU2 备用模式 低速边带信号,仅供备用模式使用 B9 VBUS 电源 最低支持 60W B10 RX1- USB3.1 或备用模式 与 RX1+ 共同构成 10 Gbps 差分对 B11 RX1+ USB3.1 或备用模式 与 RX1- 共同构成 10 Gbps 差分对 B12 GND 电源 最低支持 60W 供电协议: 模式 标称电压 最大电流 USB2.0 5V 500 mA USB3.0/USB3.1 5V 900 mA USB BC1.2 5V 1.5A USB Type-C Current @ 1.5A 5V 1.5A USB Type-C Current @ 2.0A 5V 3.0A USB PD 最高 20V 最高 5A CC 引脚 CC 引脚使用的上下拉电阻取决于是下行端口(DFP)、上行端口(UFP)还是电子标记/有源电缆,必须始终通过端口监视才能实现插入与移除检测、方向检测、电流能力通告的功能。 主机 / 下行端口(DFP)使用上拉电阻。上拉电阻 Rp 需同时连接至 CC1 与 CC2 引脚,并上拉至 3.3V/5V/电流源。上拉电阻的取值将向设备通过端口的供电电流能力,如下表所示: DFP 供电电流能力 上拉至 4.75V~5.5V 上拉至 3.3V±5% 至 1.7~5.5V 电流源 默认 USB 功率(USB2.0-500mA,USB3.0-900mA) 56kΩ±20% 36kΩ±20% 80µA±20% 1.5A@5V 22kΩ±5% 12kΩ±5% 180µA±8% 3A@5V 10kΩ±5% 4.7kΩ±5% 330µA±8% 设备 / 上行端口(UFP)使用下拉电阻或电压钳位。下拉电阻 Rd 的值恒定为 5.1kΩ±10%。 电缆方向检测,如果 CC1 引脚检测到有效的上下拉,则代表正向(未翻转);如果 CC1 检测到,则代表反向(已翻转): 参考与致谢 USB 相关介绍 USB USB Logo Usage Guidelines AN1953 | USB Type-C™ 简介 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

通信协议 - 串口通信

通信协议 - 串口通信 串口通信算得上是单片机中最常用、最基础的一种通讯方式。常用可作为一种调试的手段,与单片机通讯监控数据、发送指令,也可以用作两个单片机之间互相通讯使用。串口通讯的物理层是 RS-232 与 TTL 标准。 协议层 并行和串行 并行通信:各个数据位同时传输,速度快但占用引脚资源多。 串行通信:数据按位顺序传输,占用引脚资源少但速度相对慢。 单工、半双工和全双工 单工:数据只在一个方向上进行传输。 半双工:允许数据在两个方向上传输,但是同一时刻,只允许数据在一个方向上传输,相当于方向可切换的单工通信。 全双工:允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,要求发送和接收设备都有独立的接发能力。 同步和异步 同步通信:带时钟同步信号传输。例如 SPI,IIC 等通信接口。 异步通信:不带时钟同步信号。例如 UART,单总线。 USART 和 UART UART:通用异步收发器(Universal Asynchronous Receiver/Transmitter) USART:通用同步异步收发器(Universal Synchronous/Asynchronous Receiver/Transmitter) USART 是 UART 的升级版,区别在于多了 CLK 线,在 CLK 没有信号的时候,就表明没有数据传输任务,有 CLK 信号的时候,就是正在传输信号,并且 CLK 提供了时钟同步功能,效验也更精确。 物理层 TTL 标准 TTL 标准请跳转文章 TTL 电平接口 · 通信协议 - 数字逻辑电平 RS-232 标准 RS-232 通信的物理层,是两个设备的 DB9 接口之间通过串口信号线建立起连接,串口信号线中使用 RS-232 电平传输数据信号。因为控制器一般使用的是 TTL 电平,所以需要专用的电平转换芯片才能实现通讯。 TTL 与 RS-232 电平比较: 通讯标准 电平标准(发送端) 5V TTL 逻辑 0:0~0.5V;逻辑 1:2.4V-5V RS-232 逻辑 0:+3V~+15V;逻辑 1:-15V~-3V 理想状态下的对应时序图: RS-232 协议一般使用 DB9 接口,计算机一般用公头接口(针),调制调解器设备中一般为母头(孔): 接口引脚定义: 引脚符号 名称 说明 DCD 载波检测 Data Carrier Detect,数据载波检测,用于 DTE 告知对方,本机是否收到对方的载波信号 RXD 接收数据 Receive Data,数据接收信号,即输入 TXD 发送数据 Transmit Data,数据发送信号,即输出。两个设备之间的 TXD 与 RXD 应交叉相连 DTR 数据终端(DTE)就绪 Data Terminal Ready,数据终端就绪,用于 DTE 向对方告知本机是否已准备好 GND 信号地 地线,两个通讯设备之间的地电位可能不一样,这会影响收发双方的电平信号,所以两个串口设备之间必须要使用地线连接,即共地 DSR 数据设备(DCE)就绪 Data Set Ready,数据发送就绪,用于 DCE 告知对方本机是否处于待命状态 RTS 请求发送 Request To Send,请求发送, DTE 请求 DCE 本设备向 DCE 端发送数据 CTS 允许发送 Clear To Send,允许发送,DCE 回应对方的 RTS 发送请求,告知对方是否可以发送数据 RI 响铃指示 Ring Indicator,响铃指示,表示 DCE 端与线路已接通 DB9 公头与母头的 TX/RX 相反,所以一般对接即可,等效于连接这几条信号线: 串口线中的 RTS、CTS、DSR、DTR 及 DCD 信号,使用逻辑 1 表示信号有效,逻辑 0 表示信号无效。 在实际使用中,有时候只保留 RXD、TXD 与 GND。 参考与致谢 USART — 串口通讯 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

通信协议 - 以太网 🚧

通信协议 - 以太网 🚧 参考与致谢 以太网 PHY 自学笔记 [电路]以太网 PHY 物理层 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。 嵌入式以太网硬件 一个嵌入式系统的以太网的硬件,主要是由这几个部分构成的:MAC 控制器、PHY 芯片、网络变压器和 RJ45 接头,有的系统还会有 DMA 控制器。 一般来说,CPU/MCU 会将 MAC 集成在片上(MAC 为数字电路,考虑芯片面积与架构的原因,一般会集成在片上),所以需要在外部设计的硬件是 PHY、变压器与接口。而在许多情况下,网络变压器也会集成进 RJ45 接头内。 MAC MAC(媒体访问控制子层协议,Media Access Control)位于 OSI 七层结构中的数据链路层,主要负责控制与连接物理层的介质。MAC 遵循 IEEE-802.3 标准。 在发送数据的时候,MAC 协议可以事先判断是否可以发送数据,如果可以发送,则将给数据加上一些控制信息,随后将数据以及控制信息以规定的格式发送到物理层。 在接收数据的时候,MAC 协议首先判断输入的信息并是否发生传输错误。如果没有错误。则去掉控制信息发送至 LLC 层。 PHY PHY 是物理接口收发器,以太网的物理层由它实现,PHY 由 IEEE-802.3 标准定义,包括介质独立接口 MII/GMII 子层、物理编码子层 PCS、物理介质附加子层 PMA、物理介质相关子层 PMD、MDI 子层。 PHY 在发送数据的时候,会收到从 MAC 传输过来的数据(对 PHY 来说,没有帧的概念,对它来说,都是数据而不管什么地址,数据还是 CRC。对于 100BaseTX 因为使用 4B/5B 编码,每 4bit 就增加 1bit 的检错码),然后把并行数据转化为串行流数据,再按照物理层的编码规则把数据编码,再变为模拟信号把数据送出去。收数据时的流程反之。典型的 PHY 内部结构框图如下所示(RTL8211E): MAC 与 PHY 间的接口协议

2025/9/17
articleCard.readMore

通信协议 - 数字逻辑电平

通信协议 - 数字逻辑电平 TTL 电平接口 TTL(Transistor-Transistor Logic)是基于三极管结构的,其标准电源供应为 5V。由于 2.4V 与 5V 之间还有很大空间,电压不停跳变会增加系统功耗,所以压缩形成了 LVTTL(Low Voltage Transistor-Transistor Logic)电平,分 3.3V、2.5V LVTTL。 (LV)TTL 电平的特征: TTL 电路通过电流控制器件,电路的速度快,传输延迟时间短(5-10ns),但是功耗大。 TTL 电平一般过冲都会比较严重,可能在起始端串一个 22Ω/33Ω 电阻。 TTL 电平输入脚悬空时是内部认为是高电平,如需下拉,需接 1k 以下电阻下拉。 TTL 电平接口速度一般限制在 30MHz 以内。因为 BJT 的输入端存在几 pF 大小的输入电容(构成一个 LPF),如果输入信号超过一定频率,信号将会丢失。 其驱动能力一般最大为几十毫安。正常工作的信号电压一般较高,如果将它与信号电压较低的 ECL 电路接近时,会产生比较明显的串扰问题。 CMOS 电平接口 CMOS(Complementary Metal Oxide Semiconductor)是基于 NMOS、PMOS 组成的结构,其标准电源供应为 5V。与 TTL 同理,CMOS 也衍生出 LVCMOS 电平标准,且因 MOS 管相对于三极管的导通门电压更低,因此 LVCMOS 可比 LVTTL 使用更低的电压通信。LVCMOS 有 3.3V、2.5V、1.8V、1.5V、1.2V 标准。 (LV)CMOS 电平的特征: CMOS 电路通过电压控制器件,电路的速度慢,传输延迟时间长(25-50ns),但功耗低。但是在高转换频率时,CMOS 系列实际上却比 TTL 消耗更多的功率。 CMOS 接口相对于 TTL 接口有了更大的噪声容限,输入阻抗远大于 TTL 输入阻抗。正常情况下,CMOS 的功耗和抗干扰能力远优于 TTL。 CMOS 结构内部寄生有可控硅结构,当输入或输入管脚高于 VCC 一定值(比如一些芯片是 0.7V)时,电流足够大的话,可能引起闩锁效应,导致芯片的烧毁。 CMOS 电路的输入阻抗是很高的,因此,它的耦合电容容量可以很小,不需要使用大的电解电容器。由于 CMOS 电路通常驱动能力较弱,所以必须先进行 TTL 转换后再驱动 ECL 电路。此外,设计 CMOS 接口电路时,要注意避免容性负载过重,否则的话会使得上升时间变慢,而且驱动器件的功耗也将增加 (因为容性负载并不耗费功率)。 各电平标准的对比 数字电路有个双阈值标准。虽然最终表示的只有 0 和 1 两个状态,但在实际电路中,电压低于多少为 0,电压高于多少为 1,是通过双阈值标准来协定的。 \(VCC\) \(V_{OH}\) \(V_{IH}\) \(V_{IL}\) \(V_{OL}\) \(GND\) 5V TTL 5.0 2.4 2.0 0.8 0.4 0.0 3.3V LVTTL 3.3 2.4 1.5 0.8 0.4 0.0 5V CMOS 5.0 4.5(0.9*VCC) 3.5(0.7*VCC) 1.5(0.3*VCC) 0.5(0.1*VCC) 0.0 3.3V CMOS 3.3 2.97(0.9*VCC) 2.31(0.7*VCC) 0.99(0.3*VCC) 0.33(0.1*VCC) 0.0 2.5V CMOS 2.5 2.0 1.7 0.7 0.4 0.0 1.8V CMOS 1.8 1.35 1.17 0.63 0.45 0.0 串行与并行通信 数据位可以并行或串行形式传输。在并行通信中,数据位是同时发送的,每个都通过单独的线路。下图是二进制(01000011)中字母 C 的并行传输: 在串行通信中,通过单线逐个发送这些位。下图是字母 C 的串行传输: 参考与致谢 《Analog Engineer’s Pocket Reference》 一文了解 SPI 总线工作原理、优缺点和应用案例 [FPGA13][电路]接口电平标准 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

逻辑分析仪的使用 🚧

逻辑分析仪的使用 🚧 与示波器不同的是,逻辑分析仪只针对数字信号的电平进行测量。 逻辑分析仪测量和分析信号的方式不同于示波器。逻辑分析仪不测量模拟细节,而是检测逻辑门限电平。逻辑分析仪只查找两种逻辑电平,在输入高于门限电压(阈值)时,电平称为 高 或 1;当电平低于阈值时,则称为 低 或 0。在逻辑分析仪对输入采样时,它根据相对于电压门限的信号电平,来输出 0 或 1。 参考与致谢 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

避免 Chrome(Edge)强制转换 HTTPS

避免 Chrome(Edge)强制转换 HTTPS 有些网站只能用 http 访问,但有时候浏览器会强制转换为 https,导致访问错误。以下步骤将展示如何禁用浏览器的自动转换。 操作步骤 在地址栏输入链接并回车: Chrome:chrome://net-internals/#hsts Edge:edge://net-internals/#hsts 在 Delete domain security policies 栏,将你不需要自动转换的链接填进。比如,我要求 wiki-power.com 不被强制转换为 https 访问,则填入 wiki-power.com 然后点击 Delete 删除即可。 随后在地址栏输入链接并回车: Chrome:chrome://flags/#edge-automatic-https Edge:edge://flags/#edge-automatic-https 将 Automatic HTTPS 选项的 Default 改为 Disabled,并重启浏览器。 参考与致谢 Edge 或谷歌浏览器输入 http 的网址被强制转化为 https,手工修改为 http 都无效 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

锂电池选型指南

锂电池选型指南 锂电池的选型,一般考虑以下几点: 电压 锂电池用 串联级数 + s 来表示电压。单节锂电池的额定电压为 3.7v,充满时为 4.2v,放空为 3.5v. 所以,不同电压级数的锂电池对应电压关系如下: 电池级数 额定电压(V) 电压范围(V) 2s 7.4 7.0 – 8.4 3s 11.1 10.5 – 12.6 4s 14.8 14.0 – 16.8 5s 18.5 17.5 – 21.0 6s 22.2 21.0 – 25.2 容量 锂电池的容量表示其存储电能的多少。举个例子,2000mAH 表示以 2000mA 的电流持续放电一个小时。 放电倍率 锂电池放电倍率用来表示电池充放电电流大小的比率(最大放电电流 = C * 容量)。举个例子,容量是 1000mAh 的电池,如果放电倍率是 1C, 那么放电电流就是 1000mA; 如果是 10C,放电电流就是 10000mA. 选择足够的放电倍率是很重要的。在机器人系统的电机启动瞬间或换向时,或者在 PID 控制下想要达到系统瞬态响应的需求,就有可能需要很大的瞬时输出电流。如果不能给够电流,就有可能拉低电压,造成控制部分电压抖动,甚至单片机重启。 如何推算系统的最大电流?一般来说,优先考虑电机等用电大户。由于电机属于感性负载,启动瞬间电流可达到额定电流的 4~7 倍。所以,在设计中,假设电机启动瞬间,电流为额定电流的 7 倍。 在总体计算过后,再留出 20% 的余量即可。 参考与致谢 ROS 机器人硬件平台搭建----供电系统之锂电池选型 锂电池的主要参数与选型 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

防反接电路的设计

防反接电路的设计 防反接电路在电路设计中还是挺重要的,因为你永远不知道你的用户会有用什么样的骚操作,把电源接反导致炸板。 二极管防反接电路 如图,在电源正 / 负极的路上,增加二极管(单向导通性),实现防反接。此电路简单,成本最低。缺点是压降大(0.6V 左右);电流越大,发热越严重;反向电压过大时,会有漏电流,应留足余量。可以选用成本相对高但较低压降的肖特基二极管。 ;## P-MOS 管防反接电路 ; ;![](https://media.wiki-power.com/img/20200226214710.png) ; ;以上图为例。刚上电时,MOS 管的寄生二极管导通,S 级电压为 VCC-0.6V,G 级为 0V,P-MOS 导通;当电源反接时,G 级为高电平,不导通,保护后级。 ; ;实际应用中,可以在 P-MOS 栅极与源级之间再加一个电阻。这种办法也有 P-MOS 跟 N-MOS 之分,都是利用 MOS 管的寄生二极管以及其导通性,不过 N-MOS 的导通电阻比 P-MOS 小,因此会降低一点点功耗。电源反接后,MOS 管就是断路,可以很好的保护后级电路。这种方法应用比较广泛,推荐实际中使用 N-MOS. MOSFET 防反接 MOSFET 拥有较低的导通电阻(\(R_{DS(on)}\)),用作防反接保护电路,只有很小的功率损耗。因为 N-MOS 是 G 极高电平导通,P-MOS 是 G 极低电平导通,所以 N-MOS 一般用于低端侧防反接,P-MOS 则用于高端侧: 正确接入电源时,MOS 管导通,后续电路能正常接受供电;反接时,MOS 管截止,断开以保护后续电路。 MOSFET 防反接的损耗为 \(R_{DS(on) * I_{load}}\)。挑选 MOSFET 的指标是 \(R_{DS(on)}\) 尽可能小,\(U_GS{th}\) 在电源电压以下。相比而已,N-MOS 比 P-MOS 导通电阻小,而且选型更加丰富。 整流桥防反接电路 桥式整流电路有两个二极管产生压降,功耗与发热都比较大,如果不是一些特殊场合,一般不推荐使用。 保险丝 + 稳压二极管 此电路设计非常巧妙,既可以防反接,又可以防过压。其原理是: 当电源 Vin 接反时,稳压二极管 D1 正向导通,负载的负压为二极管的导通电压 Vf,而 Vf 一般比较低,不会烧坏后级负载电路。同时,电压主要落在 F1 上,因此开始时电流会迅速上升,直至超过 F1 的熔断电流后,保险丝 熔断,电源断开,这样也不会因为电流过大,而烧坏 D1. 当正接但电压过高时(例如大于稳压管的 5.6V),因为稳压管 D1 存在,所以负载端获得电源约为 5.6V。而 F1 上就会有比较大的电压(Vin-5.6V),电流上升直至熔断,保护了后端电路。此为防过压保护。 这个电路要注意的几个点: 保险丝的选型。熔断电流要大于后级负载正常的工作电流(电路正常使用时不能熔断) 稳压二极管的选型。稳压值要大于正常 Vin 的电源输入(正常电源输入时不能击穿稳压),但是要小于后级能允许的最大输入电压(稳压值不能烧坏后级电路) 满足 稳压二极管的最大允许电流 + 上电时负载电流 > 保险丝的击穿电流 这个条件。在电源过压输入时、保险丝被击穿之前,稳压管才不会因通过的电流过大而烧坏 反接电路时产生的负压 Vf 一般小于 1.5V。后端电路应能承受 1.5V 的负压,不会被烧坏 此电路尽量用于功率小于 500mW 的电路中 参考与致谢 4 种常用的防反接电路,你都 Get 到了吗? Reverse Current/Battery Protection Circuits 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

音乐相关

音乐相关 Goldberg-Variation 钢琴谱 Goldberg-Variation.pdf:BWV 988 系列所有曲目均有包含 演奏 Aria from Goldberg-Variations BWV988 《不能说的秘密》 吉他谱 架子鼓谱 参考与致谢 一张图大概学会架子鼓识谱 不能说的秘密 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

高速电路的设计 🚧

高速电路的设计 🚧 高速 PCB 设计需考虑因素 成本控制 叠层排布原则 布局原则 布线原则 阻抗设计 信号完整性 电源完整性 EMC 设计 热设计 DFM 设计 两层板与多层板的区别 参考平面与阻抗的计算 多层板回流路径更短 更容易布线 多层板成本高 叠层规范 元件、焊接面为完整的地平面(屏蔽作用) 尽可能的无相邻平行布线层(避免互相干扰) 所有信号层尽可能与地平面相邻;关键信号与地层相邻,不跨分割区(减小回流路径) 综上,可参考的叠层方案是: 顶层:信号 1 中间 1 层:地 中间 2 层:电源 底层:信号 2 为了减少边沿辐射,电源层要相对地层内缩(pullback)1 mm 以上。 不同通信协议的 PCB 阻抗设计要求 高速信号 阻抗要求 误差 走线 DDR 100Ω ±10% eMMC 50Ω ±10% PCIe USB 90Ω ±10% 差分 HDMI 100Ω ±10% eDP 90Ω ±10% 差分 MIPI 100Ω ±10% 差分 SDIO/SDMMC 50Ω ±10% 一些基本概念 信号完整性(Signal Integrity):信号完整性是指信号在信号线上的质量。信号具有良好的信号完整性是指当在需要的时候具有所必需达到的电压电平数值。 传输线(Transmission Line):由两个具有一定长度的导体组成回路的连接线,我们称之为传输线,有时也被称为延迟线。它的电流返回到地或电源。传输线的基本特性是特性阻抗和信号的传输延迟。 集总电路(Lumped circuit):在一般的电路分析中,电路的所有参数,如阻抗、容抗、感抗都集中于空间的各个点上,各个元件上,各点之间的信号是瞬间传递的,这种理想化的电路模型称为集总电路。 分布式系统(Distributed System):实际的电路情况是各种参数分布于电路所在空间的各处,当这种分散性造成的信号延迟时间与信号本身的变化时间相比已不能忽略的时侯,整个信号通道是带有电阻、电容、电感的复杂网络,这就是一个典型的分布参数系统。 上升/下降时间(Rise/Fall Time):信号从低电平跳变为高电平所需要的时间,通常是量度上升/下降沿在 10%-90% 电压幅值之间的持续时间,记为 Tr。 截止频率(Knee Frequency):这是表征数字电路中集中了大部分能量的频率范围(0.5/Tr),记为 Fknee,一般认为超过这个频率的能量对数字信号的传输没有任何影响。 特征阻抗(Characteristic Impedance):交流信号在传输线上传播中的每一步遇到不变的瞬间阻抗就被称为特征阻抗,也称为浪涌阻抗,记为 Z0。可以通过传输线上输入电压对输入电流的比率值(V/I)来表示。 传输延迟(Propagation delay):指信号在传输线上的传播延时,与线长和信号传播速度有关,记为 tPD。 趋肤效应(Skin effect):指当信号频率提高时,流动电荷会渐渐向传输线的边缘靠近,甚至中间将没有电流通过。与此类似的还有集束效应,现象是电流密集区域集中在导体的内侧。 反射(Reflection):指由于阻抗不匹配而造成的信号能量的不完全吸收,发射的程度可以有反射系数 ρ 表示。 过冲/下冲(Over shoot/under shoot):过冲就是指接收信号的第一个峰值或谷值超过设定电压 —— 对于上升沿是指第一个峰值超过最高电压;对于下降沿是指第一个谷值超过最低电压,而下冲就是指第二个谷值或峰值。 振荡:在一个时钟周期中,反复出现过冲和下冲,我们就称之为振荡。振荡根据表现形式可分为振铃(Ringing)和环绕振荡,振铃为欠阻尼振荡,而环绕振荡为过阻尼振荡。 阻抗匹配(Termination):指为了消除反射而通过添加电阻或电容器件来达到阻抗一致的效果。因为通常采用在源端或终端,所以也称为端接。 振铃 振铃效应(Ringingeffect)就是影响复原图像质量的众多因素之一,其典型表现是在图像灰度剧烈变化的临域出现类吉布斯(Gibbs)分布的震荡。 振铃现象,来源于变压器漏感和寄生电容引起的阻尼振荡。由于变压器的初级有漏感,当电源开关管由饱和导通到截止关断时会产生反电动势,反电动势又会对变压器初级线圈的分布电容进行充放电,从而产生阻尼振荡,即产生振铃。变压器初级漏感产生反电动势的电压幅度一般都很高,其能量也很大,如不采取保护措施,反电动势一般都会把电源开关管击穿,同时反电动势产生的阻尼振荡还会产生很强的电磁辐射,不但对机器本身造成严重干扰,对机器周边环境也会产生严重的电磁干扰。 串扰:串扰是指当信号在传输线上传播时,因电磁耦合对相邻的传输线产生的不期望的电压噪声干扰,这种干扰是由于传输线之间的互感和互容引起的。 信号回流(Return current):指伴随信号传播的返回电流。 自屏蔽(Self shielding):信号在传输线上传播时,靠大电容耦合抑制电场,靠小电感耦合抑制磁场来维持低电抗的方法称为自屏蔽。 前向串扰(Forward Crosstalk):指干扰源对牺牲源的接收端产生的第一次干扰,也称为远端干扰(Far-end crosstalk)。 后向串扰(Forward Crosstalk):指干扰源对牺牲源的发送端产生的第一次干扰,也称为近端干扰(Near-end crosstalk)。 屏蔽效率(SE):是对屏蔽的适用性进行评估的一个参数,单位为分贝。吸收损耗:吸收损耗是指电磁波穿过屏蔽罩的时候能量损耗的数量。 反射损耗:反射损耗是指由于屏蔽的内部反射导致的能量损耗的数量,他随着波阻和屏蔽阻抗的比率而变化。 校正因子:表示屏蔽效率下降的情况的参数,由于屏蔽物吸收效率不高,其内部的再反射会使穿过屏蔽层另一面的能量增加,所以校正因子是个负数,而且只使用于薄屏蔽罩中存在多个反射的情况分析。 差模 EMI:传输线上电流从驱动端流到接收端的时候和它回流之间耦合产生的 EMI,就叫做差模 EMI。 共模 EMI:当两条或者多条传输线以相同的相位和方向从驱动端输出到接收端的时候,就会产生共模辐射,既共模 EMI。 发射带宽:即最高频率发射带宽,当数字集成电路从逻辑高低之间转换的时候,输出端产生的方波信号频率并不是导致 EMI 的唯一成分。该方波中包含频率范围更宽广的正弦谐波分量,这些正弦谐波分量是工程师所关心的 EMI 频率成分,而最高的 EMI 频率也称为 EMI 的发射带宽。 电磁环境:存在于给定场所的所有电磁现象的总和。 电磁骚扰:任何能引起装置、设备或系统性能降低或者对有生命或者无生命物质产生损害作用的电磁现象。 电磁干扰:电磁骚扰引起设备、传输通道和系统性能的下降。 电磁兼容性:设备或者系统在电磁环境中能正常工作且不对该环境中任何事物构成不能承受的电磁骚扰的能力。 系统内干扰:系统中出现由本系统内部电磁骚扰引起的电磁干扰。 系统间干扰:有其他系统产生的电磁干扰对一个系统造成的电磁干扰。 静电放电:具有不同静电电位的物体相互接近或者接触时候而引起的电荷转移。 建立时间(Setup Time):建立时间就是接收器件需要数据提前于时钟沿稳定存在于输入端的时间。 保持时间(Hold Time):为了成功的锁存一个信号到接收端,器件必须要求数据信号在被时钟沿触发后继续保持一段时间,以确保数据被正确的操作。这个最小的时间就是我们说的保持时间。 飞行时间(Flight Time):指信号从驱动端传输到接收端,并达到一定的电平之间的延时,和传输延迟和上升时间有关。 Tco:是指器件的输入时钟边缘触发有效到输出信号有效的时间差,这是信号在器件内部的所有延迟总和,一般包括逻辑延迟和缓冲延迟。缓冲延迟(buffer delay):指信号经过缓冲器达到有效的电压输出所需要的时间 抖动(Jitter):信号的某特定时刻从其理想时间位置上的短期偏离为抖动。 时钟抖动(Clock Jitter):时钟抖动是指时钟触发沿的随机误差,通常可以用两个或多个时钟周期之间的差值来量度,这个误差是由时钟发生器内部产生的,和后期布线没有关系。 时钟偏移(Skew):是指由同样的时钟产生的多个子时钟信号之间的延时差异。 钟: 假时钟是指时钟越过阈值(threshold)无意识地改变了状态(有时在 VIL 或 VIH 之间)。通常由于过分的下冲(undershoot)或串扰(crosstalk)引起。 电源完整性(Power Integrity): 指电路系统中的电源和地的质量。 同步开关噪声(Simultaneous Switch Noise):指当器件处于开关状态,产生瞬间变化的电流(di/dt),在经过回流途径上存在的电感时,形成交流压降,从而引起噪声,简称 SSN。也称为 Δi 噪声。 地弹(Ground Bounce):指由于封装电感而引起地平面的波动,造成芯片地和系统地不一致的现象。同样,如果是由于封装电感引起的芯片和系统电源差异,就称为电源反弹(Power Bounce)。 PLL(Phase Locked Loops,锁相环路):一种反馈控制系统,也是闭环跟踪系统,其输出信号的频率跟踪输入信号的频率。当输出信号频率与输入信号频率相等时,输出电压与输入电压保持固定的相位差值。它由鉴相器(PD, Phase Detector)、环路滤波器(LP, Loops Filter)、和压控振荡器(VCO, Voltage Control Oscillator)三部分组成。 CRU(Clock Recovery Unit,时钟恢复单元):当需要测试一个高速串行信号眼图时,需要一个时钟恢复单元,从被测信号中恢复出. 事实上,一个真实的高速器件内部就有一个时钟恢复单元。 ISI(Inter-Symbol interference,码间干扰):不同长度的连续“1”与“0”在带宽有限的系统中受到不同的衰减,导致长连续的“1”或“0”到达比短“1”与短“0”更高的电平,在接续这些长“1”或长“0”后的跳变,信号需要比短“1”与短“0”更多的时间才能到达门限电平,这些时间上的偏离就导致信号的抖动,不同长短“1”与“0”之间的干扰导致数据相关抖动即 ISI。 DCD(Data dependant distortion,数据信赖失真、占空比失真):因上升沿速率与下降沿速率的不对称性所造成的时钟周期上的偏离,即占空比失真。 眼图:一些列数字信号在示波器上累积而显示的图形。它包含丰富的信息,体现了数字信号的整体特征,能够很好的评估数字信号的品质,因而眼图分析是高速互联系统信号完整性分析的核心。 参考与致谢 高速信号 PCB 设计 高速电路设计很难学?熟悉这 48 个基本概念,你就入门了 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

麦轮小车

麦轮小车 —— 如何造一辆可遥控的麦克纳姆轮小车。 嵌入式系统的课程要求我们设计小车底盘,于是我造了一辆麦克纳姆轮的小车。 原理 麦克纳姆轮: 麦轮驱动的特点是可以全方向平滑移动,适应狭小/不利转弯的地形;缺点是功率损耗大、贵、加工难、维护麻烦,寿命也相较短。 转向原理: 元件清单 名称 参考链接 麦克纳姆轮小车底盘(带 TT 电机) 链接 Arduino UNO 无 L293D 电机驱动 无 HC-06 蓝牙 无 9g 舵机 无 HC-SR04 超声波 无 11.1V 锂电池 无 代码实现 小车主控用的是 Arduino UNO. 项目文件:My-Arduino-projects / 麦轮小车 L293D 库文件:AFMotor.rar 代码: //by YX Lin #include <AFMotor.h> //L293D 驱动库文件 #include <Servo.h>//舵机库文件 #define SR04_Trig 11 #define SR04_Echo 12 int distance = 0; int delay_time = 300; int micro_delay_time = 100; int pos = 0; int motor_speed = 200; AF_DCMotor motor1(1); AF_DCMotor motor2(4); AF_DCMotor motor3(3); AF_DCMotor motor4(2); Servo myservo; void setup() { Serial.begin(9600); myservo.attach(2); motor1.setSpeed(motor_speed); motor2.setSpeed(motor_speed); motor3.setSpeed(motor_speed); motor4.setSpeed(motor_speed); pinMode(SR04_Trig, OUTPUT); pinMode(SR04_Echo, INPUT); //serve(); } void loop() { if (Serial.available()) { Serial.println("Hello"); char x = Serial.read(); if (x == 'W') move_forward(); if (x == 'S') move_backward(); if (x == 'D') move_right(); if (x == 'A') move_left(); if (x == 'E') right_front(); if (x == 'Q') left_front(); if (x == 'C') rotate_right(); if (x == 'Z') rotate_left(); if (x == 'X') off(); if (x == 'F') serve(); if (x == 'V')sr04(); //超声波测距 Serial.println("ok"); } delay(5); } void move_forward() { motor1.run(FORWARD); motor2.run(FORWARD); motor3.run(FORWARD); motor4.run(FORWARD); delay(delay_time); off(); } void move_backward() { motor1.run(BACKWARD); motor2.run(BACKWARD); motor3.run(BACKWARD); motor4.run(BACKWARD); delay(delay_time); off(); } void move_right() { motor1.run(FORWARD); motor2.run(BACKWARD); motor3.run(FORWARD); motor4.run(BACKWARD); delay(delay_time); off(); } void move_left() { motor1.run(BACKWARD); motor2.run(FORWARD); motor3.run(BACKWARD); motor4.run(FORWARD); delay(delay_time); off(); } void right_front() { motor1.run(FORWARD); motor2.run(RELEASE); motor3.run(FORWARD); motor4.run(RELEASE); delay(delay_time); off(); } void left_front() { motor1.run(RELEASE); motor2.run(FORWARD); motor3.run(RELEASE); motor4.run(FORWARD); delay(delay_time); off(); } void rotate_right() { motor1.run(FORWARD); motor2.run(BACKWARD); motor3.run(BACKWARD); motor4.run(FORWARD); delay(micro_delay_time); off(); } void rotate_left() { motor1.run(BACKWARD); motor2.run(FORWARD); motor3.run(FORWARD); motor4.run(BACKWARD); delay(micro_delay_time); off(); } void off() { motor1.run(RELEASE); motor2.run(RELEASE); motor3.run(RELEASE); motor4.run(RELEASE); } void serve() { for (pos = 0; pos <= 180; pos += 5) { // goes from 0 degrees to 180 degrees // in steps of 1 degree myservo.write(pos); // tell servo to go to position in variable 'pos' delay(15); // waits 15ms for the servo to reach the position } for (pos = 180; pos >= 0; pos -= 5) { // goes from 180 degrees to 0 degrees myservo.write(pos); // tell servo to go to position in variable 'pos' delay(15); // waits 15ms for the servo to reach the position } } void sr04() { digitalWrite(SR04_Trig, LOW); //给 Trig 发送一个低电平 delayMicroseconds(2); //等待 2 微妙 digitalWrite(SR04_Trig, HIGH); //给 Trig 发送一个高电平 delayMicroseconds(10); //等待 10 微妙 digitalWrite(SR04_Trig, LOW); //给 Trig 发送一个低电平 distance = ((float(pulseIn(SR04_Echo, HIGH)) * 17 ) / 100); //把回波时间换算成毫米,并减去距离差值 if (distance < 9999 && distance > 0) { Serial.print("测距:"); Serial.println(distance); } else { Serial.println("距离过大"); } } 蓝牙遥控:下载 Arduino bluetooth controller 这个 App,按代码设置相应的键位,就可以遥控了。 FAQ Q:项目后期有跟进吗? A:有,我打算寒假把代码移植到 STM32 上面,并实现用 PS2 手柄遥控。 总结 小车总体能实现基本功能,但蓝牙的遥控有距离限制,也无法做得相对平滑。靠以后的算法慢慢优化了。 参考与致谢 麦克纳姆轮浅谈 原文地址:https://wiki-power.com/ CC BY-NC-SA 4.0 协议保护,转载请注明出处。

2025/9/17
articleCard.readMore

Hello blog

终于,我还是给知识库加上了博客的功能。 在听了 捕蛇者说 的播客节目「个人知识管理体系系列」后,我思考了一番,发现之前倾向的单一知识库的做法,存在一些弊端: 日常一些零碎的观点或想法,不适合提出来长篇大论、单独成文。 知识库的文风比较正式,需要引经据典、咬文嚼字,这样一来写作的周期也会被拉长,这也削弱了零碎写作的积极性。 我希望把博客当 gist 用,简单记录一些零碎观点或想法。

2025/9/17
articleCard.readMore

如何不长痘

最近因为吃了一顿麦当劳上火感冒了,在养病的几天里,我发现脸上的痘渐渐消了,而且也没有新长痘。 之前小发也跟我讨论过,于是我想了想,大概是这几个原因: 足够睡眠、不熬夜。在那几天里,我每天晚上十一点半睡,早上七八点醒。 饮食清淡。那几天吃的都很清单,基本上都是汤面、汤饭,也不吃辣,不吃冷饮雪糕,所以一点儿上火或生寒的元素都不存在。 一直到现在我都保持着这些做法,所以到现在也不怎么长痘。 一旦知道自己没长痘,整个人就精神多了,待人接物也自信了许多。这也反过来督促自己该早睡早起、饮食清淡。这是一个积极的正向循环,希望我能坚持下去。

2025/9/17
articleCard.readMore

买了一台 NAS

我从闲鱼代理买了一台 DS220+。直接原因是因为,Google Photos 从六月以后取消了无限上传额度,且我也慢慢意识到,把从小到大整整几百个 G 的照片,都托付给垄断公司,是非常不保险的做法。甚至可以说,只要他们想,是可以找个借口,把用户数据丢掉的。 不仅仅是照片,项目仓库、音乐、电影等等,我都急切需要一个反脆弱的数据存放方式。 「让我的数字资产比我活得更久。」这是我的目标。 最开始,我仅仅是把数据存在电脑单一硬盘上,但如果不巧碰上硬盘坏了无法修复,或者往极端点想,电脑被偷了,那数据就永远丢失了。大多数人会想到这个问题,并选择冷备份的办法。但是我们都知道,数据是不断更新的,冷备份有周期性,一旦在备份开始前发生意外,那么这一个周期的数据(甚至恰好有关键数据)也是找不回来的。而且这种办法非常不 geek,繁琐的流程应该交给机器来解决。 后来我尝试用各种局域网 sync 工具和 git 的方法,但前者方案并不完善,而 git 虽然安全可靠,但不适合处理非二进制的大文件(所以我现在仅仅用 git 来处理项目仓库)。 所以我索性上了白群晖,NAS 本地储存 + Cloud Sync 加密上传各大网盘,一步到位。而群晖的 Photos 套件,跟 Google Photos 的用户习惯相差无几,不难入手。 数据的迁移还是挺花时间的,需要有耐心。这星期内我也会出炉一篇文章,讲讲我是如何「永久」保存数据的。

2025/9/17
articleCard.readMore

不要自己感动自己

这些年我一直提醒自己一件事情,千万不要自己感动自己。大部分人看似的努力,不过是愚蠢导致的。什么熬夜看书到天亮,连续几天只睡几小时,多久没放假了,如果这些东西也值得夸耀,那么富士康流水线上任何一个人都比你努力多了。人难免天生有自怜的情绪,唯有时刻保持清醒,才能看清真正的价值在哪里。 —— 于宙《我们这一代人的困惑》 该工作工作,该学习学习,该睡觉睡觉,该玩就放开玩。

2025/9/17
articleCard.readMore

为什么要抵制智能推荐算法

我认为,对人工智能的恐惧,大多数情况下,就是对资本主义的恐惧。我们担心资本主义将如何通过技术来利用我们。 -- Ted Chiang,美国科幻小说作家

2025/9/17
articleCard.readMore

关于新能源行业的一些观点

其实在互联网工作了这么多年,各个巨头无非都在抢一个东西 —— 流量入口,车是未来的流量入口,互联网公司争抢造车这块市场也无非是这个原因。 在我看来,未来 3-5 年之内,新造车的战局就会稳定下来,到时候国内应该会有 1-2 家特别大的新能源车公司,就像之前的大众集团一样,吃掉大部分的市场,就像当年的美团、滴滴一样。 其实造车行业在各个行业吸了很多血,包括金融、互联网以及其他行业,人、财、物都往这个行业聚拢,洗牌之后可能并不需要这么多的从业人员。人是会跟着行业趋势走的,如果这个行业洗牌后依然能保持不错的增长,我会在这个行业工作比较长的时间。

2025/9/17
articleCard.readMore

内卷与未来的职业趋势

经济不景气,更有利于早点去朝阳行业。 早早去站位,早早去占坑。 本科生去了,几年后,就会发现,读研的同学还没有你混的好。 内卷,是无意义的做功。 一群人在无意义的做功,我们只要找到新方向的风口,过去占位。 占位,不卷。等到占稳了位置,就会有人卷过来。 到时候门槛水涨船高,但进入的早,便能卡住位置。 熟悉历史规律,自然能够找到合理的策略。 就像是在历史上,历次大萧条后,都会出现的洗牌。 对普通人来说,这恰恰是珍贵的机会。 —— 「立华说」

2025/9/17
articleCard.readMore

RoboMaster 赛后随笔

终于是打完比赛了,今年的成绩较前两年有突破,从南部赛区打进了国赛。但也仅仅是止步于国赛。 今年的问题在于硬实力。战术只能弥补一定的实力差距,带我们进国赛。但若说机器人在场上的基本功能都不能保证,那么无论多好的战术,都是弥补不来的。 最后一场打北科大,可以称得上是终局之战了。一号英雄被击毁,二号工程图传过热抓瞎,三号步兵翻车,五号步兵不能动,哨兵被摧毁,飞镖已打出但没击中前哨战。在操作间里,我们已经知道比赛无望了,所以尝试让四号步兵飞坡,结果也翻车了。最后一分钟金钱到位,只能启动无人机当哨兵用,倒是将敌方击退并造成两百多伤害(自瞄稳健)。无人机打完所有弹丸之后,也无力回天了。 还记得打川大那一局,本来第一局已经输了,但后来却扳回两局。他们三局的飞镖全都打中前哨战,到后来我们完全放弃守塔了。不过最后还是靠着地面推进,硬是赢回了比赛。 希望能一年比一年好吧。

2025/9/17
articleCard.readMore

8 月深圳小记

8 月 28 日的午后,我来到车站等候回学校的火车。转眼间 8 月匆匆过去,我决定记录在深圳的这一个月。 月初,在 RM 比赛因疫情延期了两个月之后,我们的队伍终于来到了深圳。这是我第一次踏上赛场(去年因疫情变成了线上赛),在比赛中有幸作为云台手进入操作间,淋漓尽致地体验了一回比赛的氛围。 刚来到赛场的前两天,我们的准备完全不充分,在适应性训练和第一场比赛之中,各兵种机器人都遇到了大大小小的问题。不过,在接踵而至的比赛中,我们且战且进,逐渐适应了比赛的节奏。也感谢技术组的队员们,在团队士气最低落的时刻,依然默默坚守,修复机器人的各种问题。 小组赛,击败重庆理工和厦门理工后,却与福建工程学院打平,使我们非常被动地去迎战四川大学。在前年的比赛中,我们输给川大,从而无缘国赛。第一局,我们非常没有信心。川大的飞镖一开局就拆掉了我们的前哨战,而高佬的步兵下坎一急就翻车了,我们只能硬撑着局面。虽然第一小局输了,但坤坤发现,似乎我们少一台步兵,却勉强还能打得过。第二局开始了,我看着雷达的画面,十分焦虑,于是在麦克风里对大家说,我们要记住,我们是没有前哨战的,破釜沉舟,背水一战才有可能赢(事实上,三局对面的飞镖都把我们前哨战给拆掉了……)。川大虽然有飞镖这个杀器,但他们的地面单位没有战术配合。于是,我们根据演练了三个多月的战术配合,逐个击破。第二局的扳回,我们信心大增,在第三局的决战中,我们稳中求进,拿下了国赛的门票。 国赛无弱队,我们最终止步于国赛二等的奖项,只能期待明年下一届的比赛了。 打完了比赛,我就拖着行李箱往公司去了。读初中的时候,我开始接触单片机,Seeed 和柴火创客空间于我而言,一直是写在未来的愿望清单上的。 在这里的每一天都充满成就感,因为工作的内容就是兴趣所在,而且还能与优秀的伙伴们一起共事,这实在是一种享受。 在深圳的内卷的大环境下,生活仍然可以有甜点。偶然去了福田市中心的酒展,虽然酒一般般,但还是挺开心的: 周末午后书店的柠檬茶和苏打水: 终于与来深圳打工的朋友们聚了一回,晚上的啤酒搭烧烤还挺不错: 有天下班去地铁站的路上,一片晚霞搭起了一座虹桥,我才发现很久没有抬头仰望过天空了。 8 月底,开学了,接下来该何去何从呢? 回想起在赛场上喊得震天的口号,「脚踏实地,仰望星空」,我已经有了答案。

2025/9/17
articleCard.readMore

当下与永恒

当年,古罗马人在宏伟华丽的浴宫中吹着口哨,认为帝国就像身下的浴池一样,建在整块花岗岩上,将永世延续。 现在人们知道,没有不散的宴席,一切都有个尽头。 —— 刘慈欣《三体 Ⅲ·死神永生》 置身于浓厚的节日气氛里,看着身边欢乐的人们,我也不禁被融入其中。 「如果每一天都能如此快乐就好了」。但仔细一想,如果每天都一样地快乐着,那还能称之为快乐吗?先前读过一段话,「快乐是生活的点缀,无聊和痛苦才是生活的本质」。 远看到人的一生,生命之于宇宙的刻度,是尤其短暂的。如果可以永生,那活着的每天,还会有新鲜感吗? 经历过无聊和痛苦,才能明白快乐的来之不易;人知道生命会有终将逝去的一天,才会去珍惜在这个世界上的每一天。 如何把有限的生命,刻进永恒的宇宙维度,这是我一直在追寻的谜题。 不过,尚存一点我们可以把握的,是去珍惜身边的美好,珍惜你所爱的人,别待失去才追悔。 预祝中秋快乐~ 一杯敬明天 一杯敬過往 一杯敬自由 一杯敬死亡 寬恕我的平凡 驅散了迷惘 好吧天亮之後總是潦草離場 清醒的人最荒唐 …… —— 毛不易《消愁》

2025/9/17
articleCard.readMore

雨下了四年十一个月零两天。间或有细雨绵绵的日子,一开始人人都还身着盛装,带着久病初愈的神情预备庆祝天晴,但很快便习惯了将这些间歇当作滂沱重现的前奏。 🎵Who'll Stop the Rain🎵 那是最昌明的时世,那是最衰微的时世; 每天早晨,太阳升上地平线,爬到最高点再回落,这一天就宣告结束,为下一天让路。 大低谷纪念碑是纪念大低谷的建筑群,是一只只从沙漠中向上伸展的枯树干般的手,其都对着天空做出各种扭曲的姿态。 在疫情汹涌而至前的岁月,大家的目光都向着前方;居家办公的日子里,外面的世界似乎愈发向着低谷在塌陷,瘟疫、战争的阴霾挥之不去,天启四骑士正逐一降临,巴别塔一次次被推倒。在人类漫长的历史岁月里,和平、开放、富足的年代是短暂的、火花一般闪耀了一下,随即跌入漫漫长夜之中。 白昼之光,岂知夜色之深。 危机出现后的一个世纪,曾经在黄金时代生活过的人们都离开了人世。……这个时代在今后一直被人不断地回忆,经历过这段美好岁月的老人像反刍动物似的不断把那段记忆吐出来,甜蜜地咀嚼,最后总是加上一句:「唉,那时咋就不懂得珍惜呢?」而听他们讲述的年轻人目光中充满嫉妒,同时也将信将疑:那神话般的和平、繁荣和幸福,那世外桃源般的无忧无虑,是否真的存在过。 假如某些相当偶然的事件发生,就会很容易就被视为传统,因而再也无法打破,或者几乎牢不可破。 Long as I remember the rain been comin' down Clouds of mystery pourin' confusion on the ground Good men through the ages tryin' to find the sun And I wonder, still I wonder, who'll stop the rain? I went down Virginia, seekin' shelter from the storm Caught up in the fable, I watched the tower grow Five Year Plans and New Deals, wrapped in golden chains And I wonder, still I wonder, who'll stop the rain? Heard the singers playin', how we cheered for more The crowd had rushed together, tryin' to keep warm Still the rain kept pourin', fallin' on my ears And I wonder, still I wonder, who'll stop the rain?

2025/9/17
articleCard.readMore

现代都市与末日田园

🎵Nowwhere Man🎵 He's a real nowhere man, Doesn't have a point of view, 现代都市能解决你的大部分需求: 饿了?去楼下全家买个饭团填饱肚子,或者干脆下馆子 想消费?走几步就能逛 mall 出行?地铁公交网约车能带你去任何地方 生病了?药店医院也不少 在赛博空间里也是一样的。微信、网易云音乐、淘宝……新时代的人们,能够随时享受到它们带来的便利。 曾几何时,我们以为它们是永恒的,不会对我们关闭入场权限,至少也不应该那么突然。 当下载的音乐因版权无法收听,当聊天与文字因敏感而被屏蔽,当现代都市因封锁而休克。我们开始意识到,面对它们的强势,我们是十分被动的。 于是,我们只能开始开垦自己的末日田园。「深挖洞,广积粮」,以末日生存的标准来做灾备,即使这样做会失去很多便利性。 自建博客、导航站、书库、音乐影视库、使用 RSS 订阅与播客,使用 NAS 进行分布式储存备份。 虽然我们尚未有条件去构筑现实世界的末日田园,但是至少可以在赛博空间内先实验一番,首先让精神得到安抚。 文明像一场五千年的狂奔,不断的进步推动着更快的进步,无数的奇迹催生出更大的奇迹,人类似乎拥有了神一般的力量……但最后发现,真正的力量在时间手里,留下脚印比创造世界更难,在这文明的尽头,他们也只能做远古的婴儿时代做过的事:把字刻在石头上。

2025/9/17
articleCard.readMore

硬件行业趋势与个人的选择

对硬件行业的一些观点 供需关系不匹配 我们的教育培养了一种不太正确的思维方式,认为难的东西就更值钱。其实现实中并非如此。一个东西的价格主要是由供需关系决定的。供不应求价格就会上涨,供大于求价格就会下跌。 一个职位的工资高低并不取决于该职位的技术难度,而是取决于该职位的市场价值。而市场价值又是由市场需求来决定。 一个人的技能是否值钱和这个技能的难度是没有一丁点关系的,只和市场需求有关系。市面上如果需要 100000 个熟练前端,但是只能培养出 5000 个熟练前端,这些人的薪资当然高了。反之,如果全中国每年只需要 20 个做编译器的软件工程师,但是每年光做编译器的博士研究生都有 30 个毕业的话。那些本科生是一丁点机会都没有的,无论你在大学四年中学了多么难且艰深的理论,连免费实习的机会都没有,别人嫌你浪费电。 作为基础设施的硬件行业,其本身的发展需要依赖于实实在在的基础科学与工程技术,与业务关联性没有很强,所以其更新换代的速度就没有那么快,也就限制了从业人员需求的增长。所以,即使某些硬件工程的门槛高,也架不住需要的人少呀。 扩张边际效益低、试错成本高、产品开发周期长 对于实体制造业,每扩张一倍,就意味着与之对应的其他各项成本(包括人力成本,机器成本,土地成本等等)至少也要扩张一倍,考虑到效率的因素,扩张的边际成本甚至是在增加的。而且这个过程需要大量的时间准备。 芯片器件集成度变高 芯片厂家的生态、参考设计越来越成熟,应用开发的门槛越来越低。 板级硬件现在都只剩抄抄图,看看芯片说明书。芯片说明书甚至帮你把外围电路都说了个七七八八。只需要一个高级的拼装工。 至于为什么需求这么小,前面也提到了,板级硬件技术发展了这么多年,很多东西都集成化,模块化了,没有硬件工程师发挥创造的舞台了,招一个牛逼的和一般的差不了太多。尤其在联发科创造的 turnkey 解决方案推动下,几乎所有的芯片原厂都会提供全套参考设计,也就是可以抄作业,抄好作业甚至还可以请芯片原厂检查一下作业。一旦作业完成之后,硬件工程师的活就剩下日常打杂,失效分析,产线故障处理,配合软件调试软件之类,再也没有设计与创作的空间。一个产品上市如果需要持续的硬件设计改进,说明这个产品的硬件设计一开始就是一坨屎,这种事情是绝对不允许发生的。而对软件而言,无论什么阶段,都可以持续改进,提高创新。说不定,还能引出一点新问题出来,大不了后续来个 OTA 升级修复就得了,可这些工作都需要人去干吧,需要软件去干吧。 职业发展选择 硬件工程师虽然待遇低,但公司与公司之间差距也是很大的。待遇按供应链分,欧美芯片原厂 > 国内芯片厂(包括台湾省)> OEM&ODM 终端厂 > 方案公司。所以,在跳槽的时候,尽量从右往左跳,工资待遇和技术竞争力会越来越好。凡事都有例外,像 OPPO/VIVO 这样的终端厂硬件待遇长期碾压芯片原厂,但我仍然建议一个硬件工程师至少有一段在芯片原厂的工作经历,以夯实技术,丰富经验,拓展视野,这只有原厂才能给你的,终端厂是给不了。然后再居高临下,傲视天下的姿态下嫁到有钱的终端厂,才是一个完美的结局。 基于以上各家的观点,我们能够得出来的结论是:如果还没入行,快逃,逃往嵌入式软件或纯软件领域;如果已经入行,往上游走,往原厂走,往硬件领域最核心的地方谋发展。 参考与致谢 硬件工程师有哪些发展方向和具体的发展前景? 硬件明明比软件更难,国内的硬件技术也不如软件,为什么硬件工程师待遇还不如软件?

2025/9/17
articleCard.readMore

有限与无限世界

Take a piano. The keys begin, the keys end. You know there are 88 of them, nobody can tell you any different. They are not infinite. You are infinite. And on these keys the music that you can make is infinite. I like that. That I can live by. -- The legend Of 1900 我在构想一个有限的世界,它是被约束在一个小区域内,你只能在其中进行探索,而不能越出其边界。 这样的描述也许过于抽象,但是可以有具体的实例来比喻:它是 iPod 里有限层级且功能很少的菜单、它是封闭式的学校、疫情下不进不出的社区、抑或是《海上钢琴师》中 1900 一生所在的船上。 它们都有一些共同的特征:因为是有限的范围内,所以探索程度会随时间推进而逐渐饱和,且呈现出边际效益递减的趋势。 生活在有限世界中,我们每天都经历着重复的景色。但是,如果你愿意花心思去探索,也许能发现彩蛋,有时转瞬即逝,有时微乎其微,但我们仍能惊叹于它的出现,感受着它带来不一样的体验。 在大学封校的那段日子里,我爬上了学校几乎所有楼的楼顶,仔细欣赏形色各异的落日与景色。在一栋文科楼的楼顶,我发现了围墙上的涂鸦。这种感觉,正如在孤独的银河系中找到了人类以外的其它智慧生命体一般。 这就是有限的世界,每天重复的景色也许会使你感到无聊,但也在无形中让你思考,在已知中发掘未知。 继而说到无限世界。在这里,每一步都可以是全新的探索,沿途的景色可以永不重复,探索永远不会趋向饱和。 现代人生活在无限世界中。我们每天都在摄入新的信息,但我们鲜有想过,如何将它们消化。 以前的世界并没有现在这么过量的信息流,普通人想要获得一些信息需要拼尽全力,因此他们有大把的时间去反复咀嚼自己已经获得的信息。 一本书翻来覆去看几十上百遍,每一句话都会在他们脑中无意识的回想,在日常生活里,在他们那些闲着没事的时间里,突然蹦出来,突然有了新的感悟。 但到了我们这里,我们每天花很少的时间思考,我们追求干货、追求结论,直接将别人整理好的观点拿来用,并对其坚信不疑。 结果每个人的脑中都充满了思想,但这些思想绝大部分都不是自己的,只是一个片面的结论,大家很擅长用这些已经得出来的结论去互相攻击,但却少有人知道这些结论得出来的过程。 人类所有的问题,都源于人无法独自安静地坐在房间里。身处于无限世界中的我们,有时候也需要为自己构建一个有限世界,任思想纷飞、碰撞、绽放出火花。 参考与致谢: 浪费掉的时间,才是自己的

2025/9/17
articleCard.readMore

星夜漫游

🎵Sgt. Peppers Lonely Hearts Club Band🎵 当我踏出实验室时,已是午夜时分。 跨上驾驶位,点火。披头士的 Sgt. Peppers Lonely Hearts Club Band 如同热浪一般,从音响中喷涌而出。好久没回顾经典摇滚了,我想,就接着听这部专辑吧。 最开始喜欢上这首富有张力的摇滚,是源自披头士波普风格的动画 Yellow Submarine. 经典从未消逝,在一次又一次的演绎中得以重生。 Yellow Submarine is the tenth studio album by English rock band the Beatles, released on 13 January 1969 in the United States and on 17 January in the United Kingdom. It was issued as the soundtrack to the animated film of the same name, which premiered in London in July 1968. The album contains six songs by the Beatles, including four new songs and the previously released "Yellow Submarine" and "All You Need Is Love". The remainder of the album is a re-recording of the film's orchestral soundtrack by the band's producer, George Martin. 游弋在城市快速路上,四下空无一人,震耳欲聋的音乐灌满了整个车舱。我置身于自己的黄色潜水艇中,一边琢磨着星空与月夜。或许在百万年前,这片土地也曾是深不可测的海洋。我心无旁骛,发现舱外逐渐现出寒武纪的三叶虫,三叠纪的长颈龙,头顶还有蓝鲸的庞大身影。它们呈半透明态,泛着荧光。它们丝毫不受惊扰,仿佛这片海洋就是自己的常驻之地。 一只胭脂色的水母朝我游过来。虽然我也在漫游,但它仍随我而动,游动姿态是那么的优雅。我很想把手伸出窗外触摸它,但却不想破坏了这般奇幻的美景。鲨鱼在不远处捕食一头海龟,自然的规律一直都存在于曾经或正生存在地球的生物上,人类创造的文明也仅仅是块遮羞布。 云层重新散开,月光再次漫无目的地洒落,夜色寂静如空。 没有鱼群,没有海洋,我恍过神来,到家了。 唯留下清澈的夜空,月明,星稀。

2025/9/17
articleCard.readMore

探索之路 - 2022 小记

2022 年转眼即逝,有趣之事蛮多,挑一些记录下来吧。 在专业领域的探索 2022 年,我在自己的专业领域 - 硬件与嵌入式的基础上,在射频、信号完整性、电源、半导体 ATE 等领域有了新的探索。也画了很多很多的电路板,焊接了数不清的元件。 在我的知识库体系下,各个分类的知识也在蓬勃增长着。 重新思考未来的方向 在职业生涯的路上,我看到供需关系不匹配、扩张边际效益低、试错成本高、开发周期长这一系列的问题,正压缩着硬件解决方案从业者的天花板。 认真调研了一番,我发现往上游的路似乎更好走。 一个人的命运啊,当然要靠自我奋斗,但是也要考虑到历史的进程。 正值半导体行业火热,我决定去试试。于是,我离开了实习的公司。诚然,在 2022 年末看,半导体行业虽然会受经济传导到消费电子市场的影响,带来持续的下行周期,但从长期看来仍然是一个朝阳行业。 抓住每一个机会 江湖上说,半导体行业去原厂香,并且欧美原厂更香。记得有一段时间,我隔三岔五就有面试。在家、在火车上、开车在路上、甚至在毕业旅行在酒店里,我都在与面试官们谈笑风生。 在某一回大厂的面试后,面试官告诉我,有一个好消息和一个坏消息。好消息是我通过了面试,坏消息是此岗位只招实习生。面试官私底下给了我隔壁厂工程师的邮箱,说可以投个简历试试看。看似虚无缥缈的线索,我还是认真准备了简历,即使成功的概率很低,我也要努力去试试看。 后来令我没想到的是,居然能够成功通过面试并拿到 Offer。还记得去年在 RoboMaster 打进国赛后,我们激励自己,抓住机会,输了不亏,赢了血赚。实践再一次证明,这个思路还是非常具有可行性的。 复前行,豁然开朗 新的工作在上海,得开始动身了,这是我第一回去离家这么远的大城市打工。查了查地图,发现还是挺远的,1500 公里的距离,一个人开长途,为了不疲劳驾驶,同时还要给车规划充电,我只好把行程拆分成了好几天。 从深圳到上海,路过惠州、瑞金、上饶、杭州,小跨了半个中国。一路上,我听完了全集「易中天品三国」,在服务区与别的车抢充电桩,途中还因为感冒浑浑噩噩开了两天,终于在某一天的清晨开在了上海的高架路上。 在旅途中,我在西湖边上玩了两天。从南方到北方(广东人看来),一路上看着植被的变化,长途自驾其实还是挺有趣的。 跟 Covid 躲猫猫 疫情三年来,我一直与 Covid 玩躲猫猫。4 月的上海,9 月的广州深圳,我一直在避着毒圈跑,也时时处在幻阳的笼罩下。 所幸运气足够好,也感谢我身体细胞们的共同努力,又苟过一年,我们决赛圈见。 展望 2022 于我而言还是挺幸运的,不过现阶段尚未稳定下来,半场开香槟是不明智的。2023 年将会是一个不错的开始,有什么想法就勇敢去想,大胆放开去做吧。

2025/9/17
articleCard.readMore

ADC - Dynamic Parameters

ADC - Dynamic Parameters This post was originally written in English. Dynamic Parameters ADC's dynamic parameters mainly contain: Signal to Noise Ratio (SNR) Total Harmonic Distortion (THD) Signal to Noise and Distortion Ratio (SINAD) Inter-modulation Error (IM) Signal to Noise Ratio (SNR) Signal to Noise Ratio (SNR) of an ADC is defined as the ratio of the Measured Signal Power's RMS (excluding Harmonic Distortion) to the Noise Power's RMS: \[ SNR(dB)=20log(\frac{V_{Signal(RMS)}}{V_{Noise(RMS)}}) \] Since SNR is an ratio of power, \(20\) in the equation means the square of the ratio of voltage. Although the Harmonic Distortion is not included in the measurement of SNR, but the Quantization, Thermal and other residual noise in converter are included. Total Harmonic Distortion (THD) Total Harmonic Distortion (THD) of an ADC is defined as the ratio of the fundamental to all the harmonic distortion: \[ THD(dB)=20log(\frac{\sqrt{V^2_{2(RMS)}+V^2_{3(RMS)}+...+V^2_{n(RMS)}}}{V_{1(RMS)}}) \] How to Test Dynamic Parameters Test System Setup Test system setup for ADC dynamic parameter tests: Resolution of AC SRC should be at least 2 to 4 bits better than DUT. Tests Concept ADC has a theoretical best ever SNR of: \[ SNR = (6.02N + 1.76) dB \] Where \(N\) is the number of ADC's bits. Procedure of testing the dynamic parameters of an ADC DUT is listed below. 1. Make a continuous input signal with the tester for the ADC to convert It is common practice to ensure that the analog/digital clock are referenced to a common master clock, so that the relationship of the clock sources's frequency is fixed and synchronized, which making test results highly repeatable. 2. Collect a set of samples with the ADC coherently For AC Source: \[ \frac{Fs}{Fi}=\frac{Ns}{Ms} \] Where \(Fs\) is the samping rate of AC Source, \(Fi\) is signal frequency, \(Ns\) is the number of samples (does not have to be a 2x number), \(Ms\) is the number of integer cycles (does not have to be odd). For Digital Capture: \[ \frac{Fs(dut)}{Fi}=\frac{Ncap}{Mc} \] Where \(Fs(dut)\) is the ADC sampling rate also the Digital Capture's sample rate, \(Fi\) is the signal frequency, \(Ncap\) is the number of samples captured (2x number), \(Mc\) is the number of integer cycles (odd). 3. Send the collected set of time samples to the DSP to perform DFT / FFT analysis ? 4. Analyze the frequency bins of interest using equations or tester algorithms for SNR, THD and compare to specification 5. Make a pass / fail decision based on the results References & Acknowledgements Fundamentals of Testing Using ATE The-Fundamentals-of-Mixed-Signal-Testing_Brian-Lowe Original: https://wiki-power.com/ CC BY-NC-SA 4.0 agreement, should be reproduced with attribution.

2025/9/17
articleCard.readMore

ADC - Static Parameters

ADC - Static Parameters This post was originally written in English. Analog to Digital Converter (ADC) is a device to converts analog signals into a sequence of digital data. Though ADC's ideal transfer function should be a straight line, but actually is a uniform staircase, that the number of steps corresponds to the number of digital output codes. Since analog is continuous and digital is discrete, quantization error will be introduced in the procedure. Static Parameters ADC's static parameters mainly contain: LSB Size Full Scale Range (FSR) Offset Error Gain Error Differential Non-Linearity Error (DNE or DNL) Integral Non-Linearity Error (INE or INL) LSB Size The width of one step is defined as 1 Least Significant Bit (LSB). The resolution of an ADC is normally expressed as number of bits (digital output code). An ADC with an n-bit resolution has \(2^n\) possible digital codes (\(2^n\) step levels). \[ LSB=\frac{V_{FST}-V_{ZST}}{2^{bits}-2} \] For an ideal ADC, LSB represents all of the each code's width. Full Scale Range (FSR) For example, for a 3 bit converter, there are: 8 horizontal steps 7 transitions 6 steps between 7 transitions Zero Scale Range Transition Voltage (\(V_{ZST}\)): Voltage of the analog input signal when the first transition is recorded. Full Scale Range Transition Voltage (\(V_{FST}\)): Voltage of the analog input signal when the last transition is recorded. Full Scale Range (FSR): Maximum extreme of the analog input signal supplied to the ADC. \(FSR = (V_{FST}-V_{ZST}) + 2 LSB\), \(V_{FSR(refer to VZS)} = (V_{FST}-0.5LSB)-(V_{ZST}-0.5LSB) + 2 LSB\) Offset Error Offset Error (Zero-Scale Error) is the difference between ideal and actual offset (initial) points. It is measured from the midpoint of the zero step (ideal to actual) for the ADC. Where \[ V_{ZS}=V_{ZST}-0.5LSB \] Gain Error Gain Error is the difference between ideal and actual gain points on the transfer function (after the offset error has been corrected to zero). It is measured from the midpoint of the full step for the ADC. Where \[ V_{FS}=V_{FST}-0.5LSB+2LSB \] Differential Non-Linearity Error (DNL) Differential Non-Linearity Error (DNL) is the difference between an actual step width and an ideal step width (1 LSB). It's a measure of "small-signal" linearity error, and is measured from the difference in the analog input voltage between 2 adjacent transitions and the device's average LSB. Equations to describe DNL: \[ DNL[n]=CodeWidth_n-LSB_{average} \] \[ DNL=(V_{in2}-V_{in1})-LSB_{average} \] another image to decribe DNL: If DNL exceeds is too large, one or more codes will be missing and never receive an output. Integral Non-Linearity Error (INL) Integral Non-Linearity Error (INL) is the cumulative effect at any given input of all differential non-linearity values. It is a measure of "large-signal" linearity error. INL at any point along the curve is the deviation of the ideal linearity line. The deviations are measured at the transition points from one step to the next for the ADC. INL is the deviation of the values of the actual step function to the ideal straight line function. Equations to describe INL: \[ INL[n]=INL_{n-1}+{\frac{DNL_{n-1}+DNL_{n}}{2}} \] \[ INL=[(\frac{BinaryCode}{2^{bits}-1})(V_{FS}-V_{ZS})+V_{offset}]-CodeCentor \] How to Test Static Parameters Test System Setup Test system setup for ADC static parameter tests: Since the ADC voltage-to-code transfer curve is a many-to-one mapping function: We use linear ramp histogram method (code width measurement) practically. The input ramp is slow enough to give a statistically relevant "number of hits per code". Block diagram of signal setup: Tests Concept Procedure of testing the static parameters of an ADC DUT is listed below. 1. Make a ramp wave segment for AC SRC The input ramps goes above and below ±Fs to assure that all codes are covered: 2. Take data between the start (min+1, e.g. 0…01) and the end (max-1, e.g. 1…10) of the ramp. That gives \(2^n – 2\) codes' worth of data Voltage applied must be wider than the full-scale range to cover all transitions. 16 steps in-between each code transition is shown below: for the ideal ADC DUT, 16 output codes are appear in the same times: However, a real device will have a count more than 16 times for wider codes, and less than 16 times for narrower ones (But sum of the total occurrence should be still \(2^{bits}\) times of 16): 3. Calculate for DNL for each step \[ DNL[i]=\frac{Hits[i]-\frac{\sum Hits[i]}{2^n-2}}{\frac{\sum Hits[i]}{2^n-2}} \] Where \(Hits[i]\) represents the Actual Output Code Count, and \(\frac{\sum Hits[i]}{2^n-2}\) represents the Ideal Output Code Count. For an example historam graph as shown below: for \(DNL[1](Code 001)\), Actual Output Code Count = 14 Idea Output Code Count = (14 +18 +15 + 17+ 17 + 15) / (8 -2 ) = 16. Therefore \(DNL[1] (Code 001) = (14-16)/16 \ LSB => -0.125 \ LSB\). 4. Get the max and min DNL 5. Calculate for INL for each step INL is the cumulative value of the first DNL to the DNL[i] (except zero and full scale DNL): \[ INL[i]=DNL[i]+DNL[i-1]+...+DNL[2]+DNL[1] \] Note that \(DNL[0]\) is not used, \[ INL[0]=INL[FullScale]=0 \] For an example graph below, \[ INL[1] = DNL[1] = -0.125 * LSB \] \[ INL[2] = DNL[2] + DNL[1] = 0 * LSB \] \[ INL[3] = DNL[3] + DNL[2] + DNL[1] \\ INL[3]= 0.0625 * LSB \] 6. Get the max and min INL References & Acknowledgements Fundamentals of Testing Using ATE The-Fundamentals-of-Mixed-Signal-Testing_Brian-Lowe Original: https://wiki-power.com/ CC BY-NC-SA 4.0 agreement, should be reproduced with attribution.

2025/9/17
articleCard.readMore

Basics of Fourier Transform

Basics of Fourier Transform This post was originally written in English. There are several algorithms for transforming data from the time domain to the frequency domain as below. Fourier Series A Fourier Series(傅里叶级数) is summarized as creating a complex waveform by summing pure sine waves with different amplitudes and frequencies, and to decompose a complex signal into a sum of sinusoids of different amplitudes and frequencies. Dirichlet Conditions Dirichlet Conditions specify a set of conditions that must be met before a signal can be decomposed into a Fourier Series: The signal is a mathematical function, i.e., one and only one y-point corresponds to each x-point. The signal is periodic. The area bounded by the signal over one period is finite. Decompose into a Fourier Series A complex signal that meets the Dirichlet Conditions can be represented by a sum of sinusoids: \[ f(t)=a_0+A\{\sum_{n=1}^\infty[a_n cos(n \omega_1 t+\phi_n)+b_n sin(n \omega_1 t+\phi_n)]\} \] where: \(a_0\) is the DC component. \(A\) is an overall scale factor for all harmonic components. \(\omega_1\) is the frequency of the fundamental. \(n\) is an integer multiplier of the fundamental frequency for each harmonic term. This proves that not only can we sum a series of sine and cosine waves to create any other wave, but also that the frequencies of the sinusoids are integer multiples (harmonics) of a single fundamental frequency. Discrete Fourier Transform (DFT) Discrete Fourier Transform (DFT): takes amplitude versus time data, and then translates to amplitude versus frequency data. Mathematically, the algorithm is a series summation of the product of each sample times a complex number: \[ X(b)=\sum_{n=0}^{N-1}x[n](cos(2\pi nb/N)-jsin(2\pi nb/N)) \] where: \(n\) is one of \(N\) samples. \(N\) is total number of samples. \(b\) is one of \(B\) frequency bins (each bin represents a frequency range of \(F_s /N\)). \(j\) is the imaginary operator. The DFT algorithm uses each sample point in the summation from 0 to N-1 for each analyzed frequency. All N sample points contain information about all B frequencies, thus each of the B frequencies for which information is desired requires a summation of N time sample products. Because of the reasons above, processing a DFT is slow, because \(N^2\) calculations are necessary. For example, a 2000 point DFT requires 4 million calculations, often floating point calculations, which are slower than integer calculations. Fast Fourier Transform (FFT) Fast Fourier Transform (FFT) remedies the DFT speed problem by skipping over portions of the summations which produce redundant information. Rules for using FFT: The number of sample points must be a power of 2 (\(2^n\)). The number of additions and multiplications is: \(\frac{N}{2}\log_2 N\). References & Acknowledgements Fundamentals of Testing Using ATE The-Fundamentals-of-Mixed-Signal-Testing_Brian-Lowe Original: https://wiki-power.com/ CC BY-NC-SA 4.0 agreement, should be reproduced with attribution.

2025/9/17
articleCard.readMore

Basics of Mixed Signal Test

Basics of Mixed Signal Test This post was originally written in English. Mixed signal contains both analog and digital signals. Devices processing mixed signal typically include ADCs, DACs, analog switches and multiplexers, sample-and-hold amplifiers, and so on. As a part of it, analog signals is signals we use in the real world such as voice or tempurature, it's continuous in both time and amplitude. To process analog signals into computers, we need to convert them to digital signals, as it's discrete in both time and amplitude. Sampling Theory Sampling theory applies to the signal to be periodic, or errors will be introduced. Nyquist Theorem We use Nyquist Theorem(奈奎斯特定理) to gain the minimum sampling frequency when sampling signals: \[ F_s≥2F_i \] We must sample at a rate higher than twice the highest frequency of interest, to be able to recreate a signal from its samples and avoid losing information. If we sample at a frequency that lower that the Nyquist rate, it will exhibit a phenomenon called aliasing(混叠)(unwanted components) when we try to convert it back to a continuous time signal, and some of the frequencies in the original signal may be lost. To minimize aliasing problem, we need to remove the frequency greater than \(\frac{F_s}{2}\) of the signal, via the anti-aliasing filter (e.g. low-pass-filter): Coherent Sampling If a time sample set does not contain a precise integer number of cycles, spectral leakage(频谱泄露) will occur. Coherent sampling(相干采样) is to ensure the continuity of sampling and prevent spectral leakage, it guarantees that a sample set (a series of samples which represent the analog signal) has a fixed and well defined relationship between the sample frequency \(F_s\), the number of samples \(N\), the test signal frequency \(F_i\), and the number of test signal periods sampled \(M\): \[ \frac{M}{N}=\frac{F_i}{F_s} \] The total time required to take all samples is called the Unit Test Period (UTP) and requires \(M\) cycles of the test signal, which has frequency \(F_i\). For an example, if we want to calculate the \(F_s\) of continuous repeating sinewave, where \(F_i\) is 1kHz, \(M=3\) and \(N=16\): So we can conclude that \(F_s=5.333kHz\). Important tips of coherent sampling: Increasing \(M\) and/or \(N\) will increase both accuracy and test time. \(M\) and \(N\) needs to be an integer. \(N\) needs to be a power of 2 when using Fast Fourier Transform (FFT). \(M\) and \(N\) are recommended to be mutually prime(互质)so that each sample gives unique information. Described in the following. If \(M\) and \(N\) are not mutually prime (\(M=3,N=12\)), samples are taken at the same position in every cycle, so there is no new information: If \(M\) and \(N\) aremutually prime (\(M=3,N=16\)), so they are mutually prime and every sample is discrete, so it gives unique information: Common Frequency Analysis Algorithms For \(N\) time-domain signal samples, there are \(N\) frequency-domain signal values, and there are \(N/2\) frequency-domain power spectrum values. A typical spectral components example is shown below: There are several parameters for describing spectral components as follows: Signal To Noise Ratio (SNR)(信噪比) Total Harmonic Distortion (THD)(总谐波失真) Signal to Noise and Distortion (SINAD)(信纳比) Intermodulation Distortion (IM)(互调失真) Spurious Free Dynamic Range (SFDR)(无杂散动态范围) Signal To Noise Ratio (SNR) Signal To Noise Ratio (SNR) is derived by storing the value of the fundamental (signal power) first: Then remove the DC component and harmonics (usually up to 5): Next sum all bins of the remaining power spectrum (the noise power) measured by the RMS value (Root Mean Squared, The analog voltage that is equal to a DC voltage containing the same amount of energy, for a sine wave, the RMS value is 0.707 times the peak value): Ultimately we can conclude that: \[ {SNR}(dB)=10log_{10}(\frac{{Fundamental}}{{Noise\ Power}}) \] SNR is usually expressed in decibels (dB), and is often a positive value (assuming the Fundamental Power is much larger than the Noise Power). Total Harmonic Distortion (THD) Total Harmonic Distortion (THD) is derived by keeping a running sum of the total harmonic power (usually only the first five harmonics, start at the second harmonic): And we can conclude that: \[ {THD}(dB)=10log_{10}(\frac{{Harmonic \ Power}}{{Fundamental}}) \] THD is often a negative value (assuming the Fundamental Power is much larger than the total Harmonic Power). Signal to Noise and Distortion (SINAD) Signal to Noise and Distortion (SINAD) is the same methodology as computing SNR, but now the power of the harmonics is added into, and only zero out the DC component. \[ {SINAD}=\frac{S}{N+D} \] And we can conclued that: \[ \because {SNR}=\frac{S}{N}, {THD}=\frac{D}{S} \] \[ \therefore {SNR}^{-1}+{THD}=\frac {N}{S}+\frac {D}{S}=\frac {N+D}{S}={SINAD}^{-1} \] \[ \therefore {SINAD}=({SNR}^{-1}+{THD})^{-1} \] Intermodulation Distortion (IM) Intermodulation Distortion (IM) occurs when two or more signals are used in a non-linear system. The spectrum will not only consist of the original signals, but will also contain the sum and difference of the input signals along with their harmonics. Spurious Free Dynamic Range (SFRD) Spurious Free Dynamic Range (SFRD) is derived by finding the highest element after the fundamental (ignoring the DC component): Note that the highest element may or may not be a harmonic. So we can conclude that: \[ {SFDR}(dB)=10log_{10}(\frac{{Fundamental}}{{Next \ Highest}}) \] The Spurious Free Dynamic Range is a positive value (assuming the Fundamental Power is much larger than the next highest Spur Power. Architecture of Generic Mixed Signal Tester In the generic mixed signal tester, the AWG (AC src) and WD (AC dig) are both connected to the DUT via relay interconnects through the channel board. Arbitrary Waveform Generator (AWG) Arbitrary Waveform Generator (AWG) is a low distortion signal generator. It contains a DAC to generate an analog signal from the digital data. LPF (Low Pass Filter) is to smooth the waveform and remove high frequency components. A set of data points for a given waveshape is stored in the waveform source memory, each time a clock occurs, a data point will pass to the DAC. Important parameters of AWG: Maximum Peak to Peak Voltage output Waveform resolution (DAC resolution) Band-width Waveform source memory depth Output Impedance Noise, THD, SNR Waveform Digitizer (WD) Waveform Digitizer (WD) samples analog signals, and converts them into digital values. It performs the opposite operation to the AWG. It converts analog signal into digital samples that represent the original analog signal. The low-pass filter limits the bandwidth of the signal in order to remove unwanted frequency components like noise and spurs, also provides anti-aliasing by attenuating spurs that would be aliased into the pass band of the filter during the ADC conversion. Important parameters of WD: Maximum Peak to Peak input Voltage range Waveform resolution (ADC resolution) Band-width Waveform capture memory depth Input Impedance Noise, THD, SNR, spur Clock The analog and digital clocks are derived from a system wide reference clock. If there is no clock synchronization signal, the timing offset may lead to incorrect results. Digital Signal Processor (DSP) Digital Signal Processor (DSP) is a specialized microprocessor to performs mathematical operations on arrays of digital numbers. Various algorithms like DFT and FFT are performed on DSP to transform time domain information into the frequency domain. The architecture of a DSP is optimized to allow fast multiplication, summing, logarithm calculations, squaring, and square root calculations. The tester will carry the stored captured signal to the DSP processor through data buses. References & Acknowledgements Fundamentals of Testing Using ATE The-Fundamentals-of-Mixed-Signal-Testing_Brian-Lowe Original: https://wiki-power.com/ CC BY-NC-SA 4.0 agreement, should be reproduced with attribution.

2025/9/17
articleCard.readMore

Basics of Signal and Power Integrity 🚧

Basics of Signal and Power Integrity 🚧 This post was originally written in English. References & Acknowledgements Signal and Power Integrity - Simplified, 3rd Edition Original: https://wiki-power.com/ CC BY-NC-SA 4.0 agreement, should be reproduced with attribution. Signal Integrity (SI) refers to the quality of the signal on the signal line. Good signal integrity means that the level on the signal line reaches the preset value as expected, no more or less. As clock frequencies and data rates increase, identifying and solving signal-integrity problems becomes critical.

2025/9/17
articleCard.readMore

Basics of VBT Syntax

Basics of VBT Syntax This post was originally written in English. Data Objects TheHdw and TheExec There are two global handles in VBT interface, to operate the hardware of the tester: TheHdw (The Hardware): Support to access and control the instruments, and include more general functions of the hardware, such as alarms. TheExec (The Executive): To control the overall test program-related functions, such as executing the test, handling the test results, and recording datalog. Below are examples of their usage: ' Set the current range of pin p0 TheHdw.DCVI.Pins("p0").CurrentRange = 0.002 ' Get the path of the current output STDF file CurrStdfFile = TheExec.Datalog.Setup.STDFOutputFile Other Data Objects More global handles are included in the VBT interface, such as PinListData, DSPWave, RtaDataObj (Run-Time Adjust Data Object) and so on. We will continue to explore them in future articles. Access By-instrument or By-pin The VBT syntax supports access tester hardware by-instrument or by-pin, they are equivalent in the result. Below are examples of their usage: ' By-instrument Access, applies a single instrument to different pins With TheHdw.instrument .Pins("Vcc").CurrentLimit = 0.75 .Pins("Vee").ForceValue = 3.2 End With ' By-pin Access, defines a pin list and then using different instruments With TheHdw.Pins("Vcc,Vdd,Vee") .instrument1.Disconnect .instrument2.CurrentLimit = 0.75 End With Structure of the VBT code A VBT code file must be named as VBT_xxx, and the name must be unique. The return value of a VBT function is expected to be 0 by default, or may cause unexpected results. For the parameters about timing and levels, you may add them in the Instance Editor or Test Instant sheet, don't need to include in the VBT function. And you can control whether to enable them in the VBT function by following usage: TheHdw.Digital.ApplyLevelsTiming For the test limits, you can use the following code: TheExec.Flow.TestLimit to compare a result value against low/high limits, and send the test result(TL_SUCCESS/TL_ERROR) and other information to the datalog. To see more clearly the basic structure of a VBT test function, here is a sample: Public Function VBTLeakTest(Pins As PinList, ForceVoltage As Double, PrePattern As PatternSet) As Long On Error GoTo errHandler Dim measure_results As New PinListData ' Set up timing and levels for Preconditioning Pattern TheHdw.Digital.ApplyLevelsTiming ConnectAllPins:=True, loadLevels:=True, loadTiming:=True, relaymode:=tlPowered ' Run Preconditioning Pattern and test for Pass/Fail TheHdw.Patterns(PrePattern).test pfAlways, 0 ' Force V, Measure I With TheHdw.DCVI.Pins(Pins) .Mode = tlDCVIModeVoltage ... ' Addition code measure_results = .Meter.Read End With ' Test using limits in flow and write datalog Call TheExec.Flow.TestLimit(resultval:=measure_results, unit:=unitAmp, forceval:=ForceVoltage, forceunit:=unitVolt, ForceResults:=tlForceFlow) ' Reset the variable measure_results = Nothing Exit Function errHandler: If AbortTest Then Exit Function Else Resume Next End Function Multi-site 🚧 PinList Operation 🚧 Tips in VBA Avoid saving code in VBA, because this will create internal hard links in the workbook. Saving in DataTool interface instead. If you meet the error "Procedure Too Large", you may against the Excel restriction of 64K limit per vb file. But actually, it is possible that you forgot to switch the version from 32bit to 64bit of the Windows system. Recommended add Option Explicit on the top of the VBT module, to explicitly declare all variables by using the Dim, Private, Public, ReDim, or Static statements.

2025/9/17
articleCard.readMore

CPR - Fundamental

CPR - Fundamental This post was originally written in English. CPR represents of Core Power Reduction, an adaptive power management technology that determine the optimal product voltage, allow closed loop compensation of DC voltage, temperature variation, process(制程) and aging degradation(老化退化), to optimize device power and performance, CPR core consists of one controller, and a number of sensors embedded into the SoC, to control the VDD level of a chip. The sensors consists of multiple ring oscillators, to estimate the running speed of the chip. Then the controller provide a VDD modification command result to the PMIC, which can be programmed with software.

2025/9/17
articleCard.readMore

Continuity Test

Continuity Test This post was originally written in English. Continuity test contains open/short test and power pin short test. The former checks the signal pins, while the latter checks the power pin. Open/Short Continuity Test Open/short continuity test is to confirm the electronical contact between tester and DUT, and whether if short-circuit existed to other pins or to ground. Test Method Open/short continuity test is performed with testing the protection diodes (diodes to VDD and to GND). Usually use PPMU with VBT code (also can be tested using PE and functional pattern). Test through GND protection diode Force 0V to all other pins that are not tested (include power pin). Force a small negative current (-100uA) on the Pin Under Test (with voltage clamp). Meaure voltage on the Pin Under Test: Higher than max spec(>-0.2V): FAIL (Short) Midband(-1.5V~-0.2V): PASS Lower than min spec(<-1.5V): FAIL (Open) Test through VDD protection diode Force 0V to all other pins that are not tested (include power pin). Force a small positive current (+100uA) on the Pin Under Test (with voltage clamp). Meaure voltage on the Pin Under Test: Higher than max spec(>1.5V): FAIL (Short) Midband(0.2V~1.5V): PASS Lower than min spec(<0.2V): FAIL (Open) Power Pin Short Test Power pin short test is to check if there is a short-circuit from VDD to GND pin, which will cause damagement to DUT or tester. Power pin short test always run immediately after open/short continuity test, and when it fails, device power will be shut off and the DUT will be rejected. Test Method Power Pin Short Test is performed by applying a small voltage to VDD, and measure the current into it, to check if a short-circuit existed. Usually use DCVI with VBT code. Apply a small voltage to VDD (100mV) (with current clamp). Force all other pins to 0V with PPMU. Measure current flowing into VDD pin: Higher than max spec(>20uA): FAIL (Short) Midband(-1uA~20uA): PASS Lower than min spec(<-1uA): FAIL References & Acknowledgements The Fundamentals Of Digital Semiconductor Testing Fundamentals of Testing Using ATE Original: https://wiki-power.com/ CC BY-NC-SA 4.0 agreement, should be reproduced with attribution.

2025/9/17
articleCard.readMore

DAC - Dynamic Parameters

DAC - Dynamic Parameters This post was originally written in English. Dynamic Parameters DAC's dynamic parameters mainly contain: Signal to Noise Ratio (SNR) Total Harmonic Distortion (THD) Signal to Noise and Distortion Ratio (SINAD) Inter-modulation Error (IM) Signal to Noise Ratio (SNR) Signal to Noise Ratio (SNR) of an DAC is defined as the ratio of the Measured Signal Power's RMS (excluding Harmonic Distortion) to the Noise Power's RMS: \[ SNR(dB)=20log(\frac{V_{Signal(RMS)}}{V_{Noise(RMS)}}) \] Since SNR is an ratio of power, \(20\) in the equation means the square of the ratio of voltage. Although the Harmonic Distortion is not included in the measurement of SNR, but the Quantization, Thermal and other residual noise in converter are included. Total Harmonic Distortion (THD) Total Harmonic Distortion (THD) of an DAC is defined as the ratio of the fundamental to all the harmonic distortion: \[ THD(dB)=20log(\frac{\sqrt{V^2_{2(RMS)}+V^2_{3(RMS)}+...+V^2_{n(RMS)}}}{V_{1(RMS)}} \] How to Test Dynamic Parameters Test System Setup Test system setup for ADC dynamic parameter tests: Resolution of AC Digitizer should be at least 2 to 4 bits better than DUT. Tests Concept Procedure of testing the dynamic parameters of an DAC is listed below. 1.Make a continuous input digital data signal (of a Sine wave) with the tester for the DAC to convert It is common practice to ensure that the analog/digital clock are referenced to a common master clock, so that the relationship of the clock sources's frequency is fixed and synchronized, which making test results highly repeatable. 2.Coherently collect a set of samples with the DAC For Digital Source: \[ \frac{Fs(dut)}{Fi}=\frac{N}{M} \] Where \(Fs(dut)\) is the samping rate of Digital Source, \(Fi\) is signal frequency, \(N\) is the number of samples, \(M\) is the number of integer cycles. For AC_Digital Capture: \[ \frac{Fs}{Fi}=\frac{Ncap}{Mc} \] Where \(Fs\) is the DAC sampling rate also the Digital Capture's sample rate, \(Fi\) is the signal frequency, \(Ncap\) is the number of samples captured (2x number), \(Mc\) is the number of integer cycles (odd). 3.Send the collected set of time samples to the DSP to perform DFT / FFT analysis 4.Analyze the frequency bins of interest using equations or tester algorithms for SNR, THD and compare to specification 5.Make a pass / fail decision based on the results References & Acknowledgements Fundamentals of Testing Using ATE The-Fundamentals-of-Mixed-Signal-Testing_Brian-Lowe Original: https://wiki-power.com/ CC BY-NC-SA 4.0 agreement, should be reproduced with attribution.

2025/9/17
articleCard.readMore

DAC - Static Parameters

DAC - Static Parameters This post was originally written in English. Digital to Analog Converter (ADC) is a device to converts a sequence of digital input data into analog signals. Static Parameters DAC's static parameters mainly contain: Zero Scale Output Full Scale Range (FSR) LSB Size Offset Error Gain Error Differential Non-Linearity Error (DNE or DNL) Integral Non-Linearity Error (INE or INL) Zero Scale Output Zero Scale Output is the measured output value when the zero/null level digital input code is presented to the DUT. Full Scale Range (FSR) Range of DAC output voltage between the minimum (\(V_{ZS}\)) and maximum (\(V_{FS}\)) analog outputs is called Full Scale Range (FSR): LSB Size Average change in voltage when in between the input codes is defined as LSB: \[ LSB=\frac{FSR_{measured}}{2^{bits}-1} \] Offset Error Offset Error (Zero-Scale Error) is the voltage difference between ideal and actual offset (initial) points. \[ OffsetError=V_{ZS(Actual)}-V_{ZS(ideal)} \] Gain Error Gain Error is the voltage difference between ideal and actual gain points on the transfer function. \[ GainError=FSR_{Ideal}-FSR_{Actual} \] Where \[ FSR_{Ideal}=V_{FS(ideal)}-V_{ZS(ideal)} \] \[ FSR_{Actual}=V_{FS(Actual)}-V_{ZS(Actual)} \] Differential Non-Linearity Error (DNL) Differential Non-Linearity Error (DNL) is the difference in the output voltage at a specific, compared to the output at the previous input, then minus one device LSB: \[ DNL=(V_{in2}-V_{in1})-LSB_{average} \] where \(V_{in2}\) is the voltage of the upper transition, \(V_{in1}\) is the lower. DNL is a measure of "small-signal" linearity error. Measurement of DNL is made from one step to the next, not each step to the ideal value. Integral Non-Linearity Error (INL) Integral Non-Linearity Error (INL) is the cumulative effect of all differential non-linearity values.It is a measure of "large-signal" linearity error. INL at any point along the curve is the deviation of the ideal linearity line. \[ ExpectedOutput[i]=FSR*InputCode[i]+OffsetError \] \[ INL[i]=\frac{ActualOutput[i]-ExpectedOutput[i]}{LSB_{average}} \] Also, INL can also be expressed as a function of DNL: \[ INL[i]=\sum_{n=1}^{n=i}DNL[n] \] How to Test Static Parameters Test System Setup Test system setup for DAC static parameter tests: Block diagram of signal setup: Tests Concept Procedure of testing the static parameters of an DAC DUT is listed below. 1. Measure the output voltage by applying the digital data inputs from Zero Scale to Full Scale 2. Calculate DNL for each input code \[ DNL[i]=\frac{OutputMeasured[i]-OutputMeasured[i-1]-LSB_{average}}{LSB_{average}} \] Where \[ LSB_{average}=\frac{OutputMeasured[n]-OutputMeasured[0]}{2^{bits}-1} \] 3. Get the max and min DNL 4. Calculate for INL for each step 5. Get the max and min INL References & Acknowledgements Fundamentals of Testing Using ATE The-Fundamentals-of-Mixed-Signal-Testing_Brian-Lowe Original: https://wiki-power.com/ CC BY-NC-SA 4.0 agreement, should be reproduced with attribution.

2025/9/17
articleCard.readMore

DC Parameters

DC Parameters This post was originally written in English. Testing DC parameters is essentially measuring the resistivity of the silicon. They can be tested DC method, with DCVI/PPMU forcing current then measuring voltage, or forcing voltage then measuring current. Will compare the measured value with the spec value out of the tester, then conclude a test result with PASS or FAIL. Items can be tested under DC method are as follows: Power Supply Current Test (IDD) Gross IDD Test Static IDD Test Dynamic IDD Test Quiescent IDD Test (IDDQ) Leakage Test Input Leakage Test (IIL & IIH) Output Tristate Leakage Test (IOZL & IOZH) Level Threshold Test Output Level Threshold Test (VOL/IOL & VOH/IOH) Input Level Threshold Test (VIL & VIH) Optional tests Input Clamp (VI) Output Short-circuit Current (IOS) Test Resistive Inputs Test Output Fanout Test DC parameters can also be tested with digital functional method, will be compared with the spec value by voltage comparator inside the PE (Pin Electronic) during functional test procedure, and conclude a Go/No-Go test result without specific values. Metions that current is defined to positive when flow into DUT, and negative when flow outside of DUT. References & Acknowledgements The Fundamentals Of Digital Semiconductor Testing Fundamentals of Testing Using ATE Original: https://wiki-power.com/ CC BY-NC-SA 4.0 agreement, should be reproduced with attribution.

2025/9/17
articleCard.readMore

Digital Functional Test 🚧

Digital Functional Test 🚧 This post was originally written in English. References & Acknowledgements The Fundamentals Of Digital Semiconductor Testing Fundamentals of Testing Using ATE Original: https://wiki-power.com/ CC BY-NC-SA 4.0 agreement, should be reproduced with attribution. Drive and Compare Timing D0 or Drive On: Start of cycle for each channel D1 or Drive Data: Start of drive pulse for each channel D2 or Drive Return: End of drive pulse for each channel D3 or Drive Off: Time of I/O switch R0 or Compare Start (On): Start of compare window for each channel (window strobe) R1 or Compare End (Off): End of compare window for each channel (window strobe) or edge strobe Troubleshooting of Digital Functional Debug Reduce test frequency. View the actual waveform, modify the position of comparison. Repeat pattern lines for more times in prevent of the influence of setup time. Use Shmoo method to analyze. Switching the order of test execution, in prevent of the interaction between tests. Pay attention to the Pin Electronic Driver Mode Vt, Hi-Z, Largeswing-VT1K or Smallswing-VT? Hi-Z: the balance bridge will be used for driving, and VCOM will be used for current loads. Vt: directly connect to Vt level through a 50Ω resistance. If the DUT output is running at a high speed, using the VT results in fewer reflections seen by the comparator. Check if TDR is calibrated. Defects with pattern itself.

2025/9/17
articleCard.readMore

IDD Test

IDD Test This post was originally written in English. Power supply current (IDD) indicates the current flows from Drain to Drain in a CMOS circuit (named ICC in TTL circuit, means Collector to Collector). IDD can be equivalent as: Static IDD Test Static IDD is a measurement of current from DUT's VDD pin, when the DUT is in static state (the DUT is not active during the test). The value of static IDD indicates the lowest current consumption of the DUT, which is important for battery operated devices, also help to indicate marginal defects. Test Method Static IDD test is performed with applying a voltage of VDDmax and measuring the current value, while the DUT is preconditioned to its lowest current consumption logic state. Apply VDDmax to VDD pin (with current clamp). Precondition DUT to its lowest current consumption logic state. Measure the current flowing into VDD pin: Higher than spec value(>10uA): FAIL Lower than spec value(<10uA): PASS Dynamic IDD Test Dynamic IDD is a measurement of current from DUT's VDD pin, when the DUT is constantly performing some function. Dynamic IDD is also important for battery operated devices. Test Method Static IDD test is performed with applying a voltage of VDDmax and measuring the current value, while the DUT is preconditioned to a continuously working state. Apply VDDmax to VDD pin (with current clamp). Precondition DUT to a continuously working state. Measure the current flowing into VDD pin: Higher than spec value(>50mA): FAIL Lower than spec value(<50mA): PASS Quiescent IDD Test (IDDQ) Quiescent IDD is a measurement of IDD in the quiescent states (the circuit is not switching and inputs are held at static values). As processors shrink , the defect of leakage current becomes much more higher, and IDDQ test may detect minor defects within the core of the circuit that could not other wise be detected. Test Method Apply VDDmax to VDD pin (with current clamp). Precondition DUT to a certain working state (toggle certain function part to on/off such as Bluetooth and Wi-Fi). Measure the current flowing into VDD pin: Higher than spec value: FAIL Lower than spec value: PASS Repeat to test with different working states. References & Acknowledgements The Fundamentals Of Digital Semiconductor Testing Fundamentals of Testing Using ATE Original: https://wiki-power.com/ CC BY-NC-SA 4.0 agreement, should be reproduced with attribution.

2025/9/17
articleCard.readMore

Leakage Test

Leakage Test This post was originally written in English. Leakage test contains input leakage test (IIL & IIH) and output tristate leakage test (IOZL & IOZH). Input Leakage Test (IIL & IIH) Input leakage occurs in a input pin's buffer circuit. IIH is the leakage path from input pin to GND when the DUT is driven to "1", and IIL is the leakage path from VDD to input pin when driven to "0": Actually, the measurement of IIL is the resistance from input pin to VDD, and IIH is the resistance from input pin to GND. Input leakage test is to ensure the pin's input buffer will not source or sink more unwanted current than specified. Test Method (Serial) Serial input leakage test (IIL & IIH) is performed with applying a voltage of VDDmax, and force the specific input pin to VDDmax (for IIH) or 0V (for IIL), while other input pins are forced to oppisite side of the Pin under Test. IIL Test (Serial) Apply VDDmax to VDD pin (with current clamp). Force VDDmax to all input pins except for the Pin under Test. Force 0V to the Pin under Test, and measure the current flow out: Higher than spec value(>-10uA): PASS Lower than spec value(<-10uA): FAIL Repeat to test next pin. IIH Test (Serial) Apply VDDmax to VDD pin (with current clamp). Force 0V to all input pins except for the Pin under Test. Force VDDmax to the Pin under Test, and measure the current flow into: Higher than spec value(>10uA): FAIL Lower than spec value(<10uA): PASS Repeat to test next pin. Test Method (Parallel) Since serial method can identify the leakage between input pins, but it's too inefficient. Parallel test method is more commonly used actually. PPMU is used in parallel method, to drive all input pins to VDDmax (for IIH) or 0V (for IIL) and measure the current of per input pin. The only disadvantage of parallel method is pin to pin leakage will not be detected, because all the pins are forced to the same voltage level at the same time. Output Tristate Leakage Test (IOZL & IOZH) Tristate also named as High-Z or floating state, indicates appear to be high impedance externally of DUT's pin. Output tristate leakage occurs in HIGH or LOW voltage level is applied on the DUT's output pin, while the pin is preconditioned to be disabled. IOZL means the current flow out when the LOW level is applied, and IOZH means the current flow into when the HIGH level is applied. Essentially, IOZL indicates the resistance from an output pin to VDD when disabled, and IOZH indicates the resistance to GND. The test insures the pin will not source or sink more unwanted current than specified. Additionally, a control input (enable signal) is required in this test , to controls the specific output pin to LOW, HIGH or High-Z (disable) state. Test Method (Serial) IOZL Test (Serial) Apply VDDmax to VDD pin (with current clamp). Precondition the specific out pin to Hi-Z (disable) state. Force 0V to the Pin under Test, and measure the current flow out: Higher than spec value(>-10uA): PASS Lower than spec value(<-10uA): FAIL Repeat to test next pin. IOZH Test (Serial) Apply VDDmax to VDD pin (with current clamp). Precondition the specific out pin to Hi-Z (disable) state. Force VDDmax to the Pin under Test, and measure the current flow into: Higher than spec value(>10uA): FAIL Lower than spec value(<10uA): PASS Repeat to test next pin. Test Method (Parallel) Parallel method is more commonly used actually with PPMU, to drive all output pins to VDDmax (for IOZH) or 0V (for IOZL) and measure the current of per output pin. References & Acknowledgements The Fundamentals Of Digital Semiconductor Testing Fundamentals of Testing Using ATE Original: https://wiki-power.com/ CC BY-NC-SA 4.0 agreement, should be reproduced with attribution.

2025/9/17
articleCard.readMore

Level Threshold Test 🚧

Level Threshold Test 🚧 This post was originally written in English. Level threshold test includes Output Level Threshold (VOL & VOH) and Input Level Threshold (VIL & VIH). They are originated from typical TTL and CMOS level threshold: VCC VOL VOH VIL VIH GND TTL (5V) 5.00V 0.40V 2.40V 0.80V 2.00V 0.00V LVTTL (3.3V) 3.30V 0.40V 2.40V 0.80V 1.50V 0.00V CMOS (5V) 5.00V 0.50V (0.1 VCC) 4.50V (0.9 VCC) 1.50V (0.3 VCC) 3.50V (0.7 VCC) 0.00V CMOS (3.3V) 3.30V 0.33V (0.1 VCC) 2.97V (0.9 VCC) 0.99V (0.3 VCC) 2.31V (0.7 VCC) 0.00V CMOS (2.5V) 2.50V 0.40V 2.00V 0.70V 1.70V 0.00V CMOS (1.8V) 1.80V 0.45V 1.35V 0.63V 1.170V 0.00V Output Level Threshold Test (VOL/IOL & VOH/IOH) VOL represents the maximum output voltage when output LOW voltage level, IOL represents the maximum sinking current capability in LOW output state. They actually measures the resistance of the output pin when provide the logic 0, insures it can provide current of IOL without exceeding the voltage of VOL, examining the capability of sink current and stay in a correct logic state. VOH represents the minimum output voltage when output HIGH voltage level, IOH represents the maximum source current capability in HIGH output state.They actually measures the resistance of the output pin when provide the logic 1, insures it can provide current of IOH without less than the voltage of VOH, examining the capability of source current and stay in a correct logic state. Test Method (Serial) VOL/IOL Test (Serial) Apply VDDmin to VDD pin (with current clamp). Precondition specific output pin to logic '0'. Force IOLmax to the Pin under Test (flow into DUT), and measure the voltage on it: Higher than spec value(>0.4V): FAIL Lower than spec value(<0.4V): PASS Repeat to test with different output pins. VOH/IOH Test (Serial) Apply VDDmin to VDD pin (with current clamp). Precondition specific output pin to logic '1'. Force IOHmax to the Pin under Test (flow out of DUT), and measure the voltage on it: Higher than spec value(>2.4V): PASS Lower than spec value(<2.4V): FAIL Repeat to test with different output pins. Input Level Threshold Test(VIL & VIH) References & Acknowledgements The Fundamentals Of Digital Semiconductor Testing Fundamentals of Testing Using ATE Original: https://wiki-power.com/ CC BY-NC-SA 4.0 agreement, should be reproduced with attribution.

2025/9/17
articleCard.readMore

Pattern Syntax Notes 🚧

Pattern Syntax Notes 🚧 This post was originally written in English. A digital pattern file contains mainly 3 parts: Header Statement, Setup Statement and Pattern Module. (Preprocessing statements and Comments are optional). Below is an mostly used example pattern file in .atp format: // example.atp digital_inst = HSDMQ; opcode_mode = single; pinmap_workbook = "..\xx.igxl"; import tset tset1 ; instruments = { (TIC_DATABUS):DigCap 32:format=twos_complement:auto_trig_enable; } vm_vector cpr_test($tset TIC_CLK, TIC_ACK, TIC_REQ_A, TIC_DATABUS) { cpr_test: > tset1 0 X 0 0 .d000000 ; repeat 100 > tset1 0 X 1 1 .rFFFFFF ; > tset1 0 X 0 0 .X ; ((TIC_DATABUS):DigCap = Store) > tset1 0 X 0 0 .V ; // capture HALT > tset1 0 X 0 0 d000000 ; // end } Header Statement Header Statement contains these statements: digital instrument, pin map, compiler control, import tset or label. Here is an example: digital_inst = HSDMQ; // Digital instrument statement opcode_mode = single; // Compile statement import tset tset1, tset1; // import Time sets import subr xxx; // import Subroutines Frequently used parameters: Digital Instrument Statements digital_inst: hsdm(HSD1000, UltraPin800), hsdmq(UltraPin1600), hsdp(UltraPin2200) ... Pin Map Specifications: pinmap_workbook: IG‑XL workbook name, such as "xxx.igxl" sheetname: Pin Map sheet name, such as "pinmap" Compiler Control Statements compressed: yes or no opcode_mode: single or dual or quad(UltraPin1600), every 1/2/4 vectors can include an opcode. save_comments: yes or no version: such as V1.0 Tset and Label Tset: import tset tset1, tset2, ... ; Label: import label label1, label2, ... ; Setup Statement Setup Statement contains pin setup, instruments, scan pin. pin_setup = { gpio_1 2x; //Pin setup: gpio_1 set to 2X mode } instruments = { vcc:DCVS 1; // DCVS instrument tdo:DigCap 32:format=twos_complement:auto_trig_enable; // DigCap instrument } scan_pins = { tdi, tdo; // tdi - scan in, tdo - scan out } Frequently used parameters: Pin State Characters and Microcodes Pin State Characters: 0(Drive Low), 1(Drive High), 2(Drive High Voltage only for UP800), L(Expect Low), H(Expect High), M(Expect Mid-band), V(Expect Valid), X(Mask), W(Window Strobe), D(Drive ADS (DigSrc/MTO)), I(Drive inverse ADS (DigSrc/MTO)), E(Expect ADS (DigSrc/MTO)), C(Expect inverse ADS (DigSrc/MTO)), -(Repeat previous state). DigCap Microcodes: Trig(Start a capture), Store(Store a data sample), Trig, Store(Combination of Trig and Store), Store, Inst_Cond_Strobe(Store and gate the internally generated condition signal to be acted on). Pattern Module A pattern module contains pin list and a set of vectors. There are 2 types of it: vector memory (VM) and memory (SRM): vm_vector [module-name] (pin-list) { vectors } srm_vector [module-name] (pin-list) { vectors } At least 1 pattern module is required in a pattern file. If more than 1, their colummns and pin lists need to be the same. Frequently used parameters: pin-list Pin Items: pin-or-group[.modifier][:radix], radix could be :S(Symbolic, default), :B(Bin), :D(Dec), :O(Oct), :H(Hex) Label: tbd

2025/9/17
articleCard.readMore

Personal Onboarding Workflow (Windows)

Personal Onboarding Workflow (Windows) This post was originally written in English. Settings Initialization Bring up Windows without Microsoft account. Open diagnosis (for dev version). Check for system and driver update System Settings System Multitasking Don't show Edge tabs Display Night Light Remote Desktop - on Personalization Dark theme Background & Lockscreen Taskbar Privacy & security Search permissions - off For developers - on Windows Update Other Settings Ultimate Performance (powershell - powercfg -duplicatescheme e9a42b02-d5df-448d-aa00-03f14749eb61) File Explorer Sidebar NVIDIA and Intel driver settings Language format / time / typing Edge: enable parallel downloading Disable hibernate: powercfg /hibernate off frp Software Install Executable HuoRong Security Synology Drive (with settings) Visual Studio Code Insiders (with settings) (Only for Matebook) Huawei PC Manager (with settings) Logi Options+ (with settings) Powertoys (with backup) Wechat (with settings) Git GitHub Desktop Portable (Sync with Synology Drive) 0_init Clash HiBitUninstaller Win10Apps DriverBooster Altsnap WPD Dism++ HEU KMS Activator OInstall Snipaste PicGo Bamboo SumatraPDF JPEGView Telegram Peazip (with File associations and system menu integration) DeepL Microsoft Store (Only for Matebook) Intel® Graphics Command Center (Beta) Software Uninstall Onedrive (by HiBit Uninstaller) Unnecessary Windows apps (by Win10Apps) Original: https://wiki-power.com/ CC BY-NC-SA 4.0 agreement, should be reproduced with attribution.

2025/9/17
articleCard.readMore

Tester Alarms

Tester Alarms This post was originally written in English. DCVI Alarms Mode (0010) The V/I is programmed to force voltage mode, and reached the current clamp; or is programmed to force current mode, and reached the voltage clamp. Solution: In force voltage mode: check if circuit shorted or has a capacitive load. In force voltage mode: check if circuit opend. Capture (0016) An alarm occurred during a capture. Solution: Check the operation related to the capture.

2025/9/17
articleCard.readMore

TheExec (The Executive) 🚧

TheExec (The Executive) 🚧 This post was originally written in English. TheExec(The Executive) is one of the highest-level objects, which gives access to test executive related properties. Flow TheExec.Flow TestLimit TheExec.Flow.TestLimit(resultVal, lowVal, hiVal, lowCompareSign, highCompareSign, scaletype, unit, formatStr, TName, compareMode, pinName, forceVal, forceunit, customUnit, customForceunit, ForceResults, TNum) Parameters most used: resultVal (required): Which the result value will been written. lowVal, hiVal : The low and high limits. Default is lowVal <= resultVal <= hiVal. unit: The unit of measurement unitAmp unitVolt unitDb unitHz unitTime . TName: A test name to be datalogged. If left blank, test instance's name will be used. pinName: The pin name to be datalogged. forceVal, forceunit: The test condition value and unit. ForceResults: Whether to force a pass or fail or to use the limits specified in a flow table. For an example: TheExec.Flow.TestLimit resultVal:=Vout_Measure, _ unit:=unitVolt, _ Tname:="Output_Voltage", _ pinName:=vout_pin, _ forceval:=vin_pin_voltage, _ forceunit:=unitVolt, _ forceresults:=tlForceFlow, _ lowval:=VOT_LowLimit, _ hival:=VOT_HiLimit

2025/9/17
articleCard.readMore

TheHdw (The Hardware) 🚧

TheHdw (The Hardware) 🚧 This post was originally written in English. TheHdw is an object to access properties and methods related to test system hardware. DCVI TheHdw.DCVI Pins TheHdw.DCVI.Pins(PinList) TheHdw.PPMU 🚧 TheHdw.Digital ApplyLevelsTiming To load the level and timing data. Usage TheHdw.Digital.ApplyLevelsTiming(ConnectAllPins, LoadLevels, LoadTiming, RelayMode, InitPinsHi, InitPinsLo, InitPinsHiZ, PinLevelsSheet, DCCategory, DCSelector, TimeSetSheet, ACCategory, ACSelector, EdgeSetSheet) Parameters ConnectAllPins: Optional Boolean, default as False. True: Connect all device pins. False: Do not connect. LoadLevels: Optional Boolean, default as False. True: Load level values. False: Do not Load. LoadTiming: Optional Boolean, default as False. True: Load timing values. False: Do not Load. RelayMode: Optional tlRelayMode, default as tlUnpowered. Controls the relays' hot switching. tlPowered: Hot switching. Not power down the DUT before setting levels and connecting. tlUnpowered: Avoid hot switching. Power down the DUT before setting levels and connecting. InitPinsHi: Optional String. Set the pins start with high driver state. InitPinsLo: Optional String. Set the pins start with low driver state. InitPinsHiZ: Optional String. Set the pins start with impedance driver state. PinLevelsSheet: Optional String. A Pin Levels sheet. DCCategory: Optional String. DCSelector: Optional String. TimeSetSheet: Optional String. ACCategory: Optional String. ACSelector: Optional String. EdgeSetSheet: Optional String.

2025/9/17
articleCard.readMore

Troubleshooting of ADC and DAC

Troubleshooting of ADC and DAC This post was originally written in English. Why AC Source should be 2-4 bits more resolution than the ADC under test? As an often used definition of ENOB: \[ ENOB=\frac{SINAD-1.76}{6.02} \] So if the ENOB of DAC (in AC Source) get lower, the SINAD will become lower too, means that the noise and distortions will increase relatively, which will affect the accuracy of measurement. Another point is, the resolution of AC Source lower than 2-4 bits will induce higher harmonic distortions, the digital signal at the output of the ADC is deteriorated by both DAC's and ADC's harmonic distortions, and the amplitude of 2nd-harmonic (for an example) could be summed. Cause AC Source with higher resolution will bring lower harmonic distortions, the test output results will become more accurate. Refer to this article: ADC Production Test Technique Using Low-Resolution Arbitrary Waveform Generator Are there other ways to improve measurement accuracy with the AC input in the test of ADC? Reducing the slope of the input ramp wave can improve measurement accuracy. What to do with high base noise in the test of ADC? Increase the number of samples (N) and the number of test signal periods sampled (M), both will also result in more test time. Increase sampling frequency (Fs). It's not possible to distinguish between noise and harmonics if only sample only 1 period of signal. 有这条公式吗?噪声精度=采样频率/M How to measure the gain error of ADC practically? Histogram method is used practically to measure the gain error, because the theoretical transition edge is hard to detect. Do we need an AC Digitizer with 2-4 bits more resolution in the test of the DAC? No, it's no necessary for a very high resolution AC Digitizer. AC Digitizer that satisfied Nyquist resolution will meet the test standard.

2025/9/17
articleCard.readMore

WeChat

WeChat My WeChat: linyuxuanlin

2025/9/17
articleCard.readMore

机器学习入门 - 基础流程

机器学习入门 - 基础流程 一般而言,传统的编程是告诉计算机一些数据以及计算规律,让计算机输出结果。当规则制定好之后,对于每一次输入,计算机输出的答案应该也是唯一确定的。 flowchart LR classDef default fill:#fff,stroke:#000,stroke-width:2px,font-size:16px,fill: white 规则-->传统编程方法; 数据-->传统编程方法; 传统编程方法-->答案; 而机器学习的方法,是告诉计算机数据和一部分答案(标签),计算机输出答案与规律。这种方法是从已知答案的数据背后寻找某种规则。 flowchart LR classDef default fill:#fff,stroke:#000,stroke-width:2px,font-size:16px,fill: white 数据-->机器学习方法; 部分答案-->机器学习方法; 机器学习方法-->规则; 机器学习的基本流程大致如下: 数据收集 机器学习就像「神农尝百草」,是一种归纳法(传统编程是演绎法)。而对于归纳法而言,数据是基础,越多越好。数据决定了机器学习的上限,而模型和算法再好,也只是逼近这个上限。 数据预处理 在最初的阶段,需要处理带标签的原始数据,形成用于训练和用于验证的数据集。这一步骤的主要的工作是特征提取和数据清洗。 特征提取是将特征提取出来,作为模型训练的输入。而数据清洗通常的流程有: 去除唯一属性:唯一属性通常是一些 id 编码,这些属性不能刻画样本的分布规律。 处理缺失值:可以选择直接补全缺失值,也可以直接删除含有这个属性的特征。 特征编码:把文字或其他形式的特征转换为数字编码,方便模型处理。比如把 ON/OFF 编码为 1/0. 特征缩放:通过归一化和标准化的手段,将样本属性缩放到某个指定的范围内,避免数量级差异大的属性占据主导地位。 模型的构建和训练 拥有可用的数据集之后,就可以根据需求选择合适的算法模型了。机器学习主要有三种方式:监督学习(Supervised Learning),无监督学习(Unsuoervised learing)和强化学习(RL, Reinforcement Learning)。 监督学习(Supervised Learning):监督意味着已经有标注好的数据集。通过已标注好的数据进行模型训练,从而利用训练好的模型来对新的数据进行预测。监督学习的应用一般分为 回归 和 分类: 回归(Regression):预测一个数字,有无限种可能的结果 分类(Classification):预测分类,只有两种或以上的少数选择,是拟合不同类别之间的分界线。 无监督学习(Unsuoervised learing):无需标注数据(有时候人也不知道问题的准确答案),应用一般有 聚类、降维 和 异常检测(Anomaly Detection) 这几种: 聚类(Clustering):例如给出一堆图片,把相似的图片划分到一起。 降维(Dimensionality Reduction):数据特征过多、维度过高时,要将数据降到合适的低维空间处理,保留最重要的特征数据。主要算法有主成分分析(PCA, Principal Component Analysis)。 强化学习(Reinforcement Learning, RL):把学习的过程作为一个试探评价的环节,会根据具体的环境得到反馈的强化信号(奖赏/惩罚)。让机器不断尝试,从而得到一种趋利避害的策略,形成一套解决问题的最优解。 我们可以对处理好的数据先做一个顶层的分析,是用监督学习还是无监督模型,问题的类型是属于分类还是回归。在实际选择时,也通常会选用不同的模型进行训练,然后比较输出结果并选择最佳的那个。 模型训练的根本,是找到最合适的权重,以最大限度地进行分类(分类问题中)、或使误差尽量小(回归问题中)。 我们以一个包含权重的公式为例: \[ y=ax_1+bx_2+cx_3 \] 其中,\(y\) 就是标签,在训练数据集中已经有正确的标注;而 \(x_1, x_2, x_3\) 即特征值。举个实际的例子: \[ 花的种类=a*花蕊颜色+b*叶子颜色+c*花瓣颜色 \] 在这个阶段的工作,就是通过训练反推出权重 a、b、c,使得这条公式的结果尽量逼近原始输入数据。并且要设定损失函数(Loss Function),设法减小整体误差,实际中常使用均方误差(MSE, Mean Squared Error)来计算损失函数的误差。 模型评估 在上一个阶段把误差降到足够小后即可停止训练,用预处理后的测试数据集来验证模型效果。 预测 在上个阶段模型达到了预期的准确率和覆盖率(召回率)之后,就可以把模型拿来实际使用了。 入门机器学习要两手抓,一方面是算法基础,另一方面是代码练习。这样才能在学习中巩固,把理论基础转化为实际用途。 下一篇文章我们先介绍机器学习环境的配置。 参考与致谢 Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 3rd Edition (https://github.com/ageron/handson-ml3) 《程序员的 AI 书:从代码开始》 《AI 制胜:机器学习极简入门》

2025/9/17
articleCard.readMore

Hello blog

终于,我还是给知识库加上了博客的功能。 在听了 捕蛇者说 的播客节目「个人知识管理体系系列」后,我思考了一番,发现之前倾向的单一知识库的做法,存在一些弊端: 日常一些零碎的观点或想法,不适合提出来长篇大论、单独成文。 知识库的文风比较正式,需要引经据典、咬文嚼字,这样一来写作的周期也会被拉长,这也削弱了零碎写作的积极性。 我希望把博客当 gist 用,简单记录一些零碎观点或想法。

2025/9/17
articleCard.readMore

如何不长痘

最近因为吃了一顿麦当劳上火感冒了,在养病的几天里,我发现脸上的痘渐渐消了,而且也没有新长痘。 之前小发也跟我讨论过,于是我想了想,大概是这几个原因: 足够睡眠、不熬夜。在那几天里,我每天晚上十一点半睡,早上七八点醒。 饮食清淡。那几天吃的都很清单,基本上都是汤面、汤饭,也不吃辣,不吃冷饮雪糕,所以一点儿上火或生寒的元素都不存在。 一直到现在我都保持着这些做法,所以到现在也不怎么长痘。 一旦知道自己没长痘,整个人就精神多了,待人接物也自信了许多。这也反过来督促自己该早睡早起、饮食清淡。这是一个积极的正向循环,希望我能坚持下去。

2025/9/17
articleCard.readMore

买了一台 NAS

我从闲鱼代理买了一台 DS220+。直接原因是因为,Google Photos 从六月以后取消了无限上传额度,且我也慢慢意识到,把从小到大整整几百个 G 的照片,都托付给垄断公司,是非常不保险的做法。甚至可以说,只要他们想,是可以找个借口,把用户数据丢掉的。 不仅仅是照片,项目仓库、音乐、电影等等,我都急切需要一个反脆弱的数据存放方式。 「让我的数字资产比我活得更久。」这是我的目标。 最开始,我仅仅是把数据存在电脑单一硬盘上,但如果不巧碰上硬盘坏了无法修复,或者往极端点想,电脑被偷了,那数据就永远丢失了。大多数人会想到这个问题,并选择冷备份的办法。但是我们都知道,数据是不断更新的,冷备份有周期性,一旦在备份开始前发生意外,那么这一个周期的数据(甚至恰好有关键数据)也是找不回来的。而且这种办法非常不 geek,繁琐的流程应该交给机器来解决。 后来我尝试用各种局域网 sync 工具和 git 的方法,但前者方案并不完善,而 git 虽然安全可靠,但不适合处理非二进制的大文件(所以我现在仅仅用 git 来处理项目仓库)。 所以我索性上了白群晖,NAS 本地储存 + Cloud Sync 加密上传各大网盘,一步到位。而群晖的 Photos 套件,跟 Google Photos 的用户习惯相差无几,不难入手。 数据的迁移还是挺花时间的,需要有耐心。这星期内我也会出炉一篇文章,讲讲我是如何「永久」保存数据的。

2025/9/17
articleCard.readMore

不要自己感动自己

这些年我一直提醒自己一件事情,千万不要自己感动自己。大部分人看似的努力,不过是愚蠢导致的。什么熬夜看书到天亮,连续几天只睡几小时,多久没放假了,如果这些东西也值得夸耀,那么富士康流水线上任何一个人都比你努力多了。人难免天生有自怜的情绪,唯有时刻保持清醒,才能看清真正的价值在哪里。 —— 于宙《我们这一代人的困惑》 该工作工作,该学习学习,该睡觉睡觉,该玩就放开玩。

2025/9/17
articleCard.readMore

为什么要抵制智能推荐算法

我认为,对人工智能的恐惧,大多数情况下,就是对资本主义的恐惧。我们担心资本主义将如何通过技术来利用我们。 -- Ted Chiang,美国科幻小说作家

2025/9/17
articleCard.readMore

关于新能源行业的一些观点

其实在互联网工作了这么多年,各个巨头无非都在抢一个东西 —— 流量入口,车是未来的流量入口,互联网公司争抢造车这块市场也无非是这个原因。 在我看来,未来 3-5 年之内,新造车的战局就会稳定下来,到时候国内应该会有 1-2 家特别大的新能源车公司,就像之前的大众集团一样,吃掉大部分的市场,就像当年的美团、滴滴一样。 其实造车行业在各个行业吸了很多血,包括金融、互联网以及其他行业,人、财、物都往这个行业聚拢,洗牌之后可能并不需要这么多的从业人员。人是会跟着行业趋势走的,如果这个行业洗牌后依然能保持不错的增长,我会在这个行业工作比较长的时间。

2025/9/17
articleCard.readMore

内卷与未来的职业趋势

经济不景气,更有利于早点去朝阳行业。 早早去站位,早早去占坑。 本科生去了,几年后,就会发现,读研的同学还没有你混的好。 内卷,是无意义的做功。 一群人在无意义的做功,我们只要找到新方向的风口,过去占位。 占位,不卷。等到占稳了位置,就会有人卷过来。 到时候门槛水涨船高,但进入的早,便能卡住位置。 熟悉历史规律,自然能够找到合理的策略。 就像是在历史上,历次大萧条后,都会出现的洗牌。 对普通人来说,这恰恰是珍贵的机会。 —— 「立华说」

2025/9/17
articleCard.readMore

RoboMaster 赛后随笔

终于是打完比赛了,今年的成绩较前两年有突破,从南部赛区打进了国赛。但也仅仅是止步于国赛。 今年的问题在于硬实力。战术只能弥补一定的实力差距,带我们进国赛。但若说机器人在场上的基本功能都不能保证,那么无论多好的战术,都是弥补不来的。 最后一场打北科大,可以称得上是终局之战了。一号英雄被击毁,二号工程图传过热抓瞎,三号步兵翻车,五号步兵不能动,哨兵被摧毁,飞镖已打出但没击中前哨战。在操作间里,我们已经知道比赛无望了,所以尝试让四号步兵飞坡,结果也翻车了。最后一分钟金钱到位,只能启动无人机当哨兵用,倒是将敌方击退并造成两百多伤害(自瞄稳健)。无人机打完所有弹丸之后,也无力回天了。 还记得打川大那一局,本来第一局已经输了,但后来却扳回两局。他们三局的飞镖全都打中前哨战,到后来我们完全放弃守塔了。不过最后还是靠着地面推进,硬是赢回了比赛。 希望能一年比一年好吧。

2025/9/17
articleCard.readMore

8 月深圳小记

8 月 28 日的午后,我来到车站等候回学校的火车。转眼间 8 月匆匆过去,我决定记录在深圳的这一个月。 月初,在 RM 比赛因疫情延期了两个月之后,我们的队伍终于来到了深圳。这是我第一次踏上赛场(去年因疫情变成了线上赛),在比赛中有幸作为云台手进入操作间,淋漓尽致地体验了一回比赛的氛围。 刚来到赛场的前两天,我们的准备完全不充分,在适应性训练和第一场比赛之中,各兵种机器人都遇到了大大小小的问题。不过,在接踵而至的比赛中,我们且战且进,逐渐适应了比赛的节奏。也感谢技术组的队员们,在团队士气最低落的时刻,依然默默坚守,修复机器人的各种问题。 小组赛,击败重庆理工和厦门理工后,却与福建工程学院打平,使我们非常被动地去迎战四川大学。在前年的比赛中,我们输给川大,从而无缘国赛。第一局,我们非常没有信心。川大的飞镖一开局就拆掉了我们的前哨战,而高佬的步兵下坎一急就翻车了,我们只能硬撑着局面。虽然第一小局输了,但坤坤发现,似乎我们少一台步兵,却勉强还能打得过。第二局开始了,我看着雷达的画面,十分焦虑,于是在麦克风里对大家说,我们要记住,我们是没有前哨战的,破釜沉舟,背水一战才有可能赢(事实上,三局对面的飞镖都把我们前哨战给拆掉了……)。川大虽然有飞镖这个杀器,但他们的地面单位没有战术配合。于是,我们根据演练了三个多月的战术配合,逐个击破。第二局的扳回,我们信心大增,在第三局的决战中,我们稳中求进,拿下了国赛的门票。 国赛无弱队,我们最终止步于国赛二等的奖项,只能期待明年下一届的比赛了。 打完了比赛,我就拖着行李箱往公司去了。读初中的时候,我开始接触单片机,Seeed 和柴火创客空间于我而言,一直是写在未来的愿望清单上的。 在这里的每一天都充满成就感,因为工作的内容就是兴趣所在,而且还能与优秀的伙伴们一起共事,这实在是一种享受。 在深圳的内卷的大环境下,生活仍然可以有甜点。偶然去了福田市中心的酒展,虽然酒一般般,但还是挺开心的: 周末午后书店的柠檬茶和苏打水: 终于与来深圳打工的朋友们聚了一回,晚上的啤酒搭烧烤还挺不错: 有天下班去地铁站的路上,一片晚霞搭起了一座虹桥,我才发现很久没有抬头仰望过天空了。 8 月底,开学了,接下来该何去何从呢? 回想起在赛场上喊得震天的口号,「脚踏实地,仰望星空」,我已经有了答案。

2025/9/17
articleCard.readMore

当下与永恒

当年,古罗马人在宏伟华丽的浴宫中吹着口哨,认为帝国就像身下的浴池一样,建在整块花岗岩上,将永世延续。 现在人们知道,没有不散的宴席,一切都有个尽头。 —— 刘慈欣《三体 Ⅲ·死神永生》 置身于浓厚的节日气氛里,看着身边欢乐的人们,我也不禁被融入其中。 「如果每一天都能如此快乐就好了」。但仔细一想,如果每天都一样地快乐着,那还能称之为快乐吗?先前读过一段话,「快乐是生活的点缀,无聊和痛苦才是生活的本质」。 远看到人的一生,生命之于宇宙的刻度,是尤其短暂的。如果可以永生,那活着的每天,还会有新鲜感吗? 经历过无聊和痛苦,才能明白快乐的来之不易;人知道生命会有终将逝去的一天,才会去珍惜在这个世界上的每一天。 如何把有限的生命,刻进永恒的宇宙维度,这是我一直在追寻的谜题。 不过,尚存一点我们可以把握的,是去珍惜身边的美好,珍惜你所爱的人,别待失去才追悔。 预祝中秋快乐~ 一杯敬明天 一杯敬過往 一杯敬自由 一杯敬死亡 寬恕我的平凡 驅散了迷惘 好吧天亮之後總是潦草離場 清醒的人最荒唐 …… —— 毛不易《消愁》

2025/9/17
articleCard.readMore

雨下了四年十一个月零两天。间或有细雨绵绵的日子,一开始人人都还身着盛装,带着久病初愈的神情预备庆祝天晴,但很快便习惯了将这些间歇当作滂沱重现的前奏。 🎵Who'll Stop the Rain🎵 那是最昌明的时世,那是最衰微的时世; 每天早晨,太阳升上地平线,爬到最高点再回落,这一天就宣告结束,为下一天让路。 大低谷纪念碑是纪念大低谷的建筑群,是一只只从沙漠中向上伸展的枯树干般的手,其都对着天空做出各种扭曲的姿态。 在疫情汹涌而至前的岁月,大家的目光都向着前方;居家办公的日子里,外面的世界似乎愈发向着低谷在塌陷,瘟疫、战争的阴霾挥之不去,天启四骑士正逐一降临,巴别塔一次次被推倒。在人类漫长的历史岁月里,和平、开放、富足的年代是短暂的、火花一般闪耀了一下,随即跌入漫漫长夜之中。 白昼之光,岂知夜色之深。 危机出现后的一个世纪,曾经在黄金时代生活过的人们都离开了人世。……这个时代在今后一直被人不断地回忆,经历过这段美好岁月的老人像反刍动物似的不断把那段记忆吐出来,甜蜜地咀嚼,最后总是加上一句:「唉,那时咋就不懂得珍惜呢?」而听他们讲述的年轻人目光中充满嫉妒,同时也将信将疑:那神话般的和平、繁荣和幸福,那世外桃源般的无忧无虑,是否真的存在过。 假如某些相当偶然的事件发生,就会很容易就被视为传统,因而再也无法打破,或者几乎牢不可破。 Long as I remember the rain been comin' down Clouds of mystery pourin' confusion on the ground Good men through the ages tryin' to find the sun And I wonder, still I wonder, who'll stop the rain? I went down Virginia, seekin' shelter from the storm Caught up in the fable, I watched the tower grow Five Year Plans and New Deals, wrapped in golden chains And I wonder, still I wonder, who'll stop the rain? Heard the singers playin', how we cheered for more The crowd had rushed together, tryin' to keep warm Still the rain kept pourin', fallin' on my ears And I wonder, still I wonder, who'll stop the rain?

2025/9/17
articleCard.readMore

现代都市与末日田园

🎵Nowwhere Man🎵 He's a real nowhere man, Doesn't have a point of view, 现代都市能解决你的大部分需求: 饿了?去楼下全家买个饭团填饱肚子,或者干脆下馆子 想消费?走几步就能逛 mall 出行?地铁公交网约车能带你去任何地方 生病了?药店医院也不少 在赛博空间里也是一样的。微信、网易云音乐、淘宝……新时代的人们,能够随时享受到它们带来的便利。 曾几何时,我们以为它们是永恒的,不会对我们关闭入场权限,至少也不应该那么突然。 当下载的音乐因版权无法收听,当聊天与文字因敏感而被屏蔽,当现代都市因封锁而休克。我们开始意识到,面对它们的强势,我们是十分被动的。 于是,我们只能开始开垦自己的末日田园。「深挖洞,广积粮」,以末日生存的标准来做灾备,即使这样做会失去很多便利性。 自建博客、导航站、书库、音乐影视库、使用 RSS 订阅与播客,使用 NAS 进行分布式储存备份。 虽然我们尚未有条件去构筑现实世界的末日田园,但是至少可以在赛博空间内先实验一番,首先让精神得到安抚。 文明像一场五千年的狂奔,不断的进步推动着更快的进步,无数的奇迹催生出更大的奇迹,人类似乎拥有了神一般的力量……但最后发现,真正的力量在时间手里,留下脚印比创造世界更难,在这文明的尽头,他们也只能做远古的婴儿时代做过的事:把字刻在石头上。

2025/9/17
articleCard.readMore

硬件行业趋势与个人的选择

对硬件行业的一些观点 供需关系不匹配 我们的教育培养了一种不太正确的思维方式,认为难的东西就更值钱。其实现实中并非如此。一个东西的价格主要是由供需关系决定的。供不应求价格就会上涨,供大于求价格就会下跌。 一个职位的工资高低并不取决于该职位的技术难度,而是取决于该职位的市场价值。而市场价值又是由市场需求来决定。 一个人的技能是否值钱和这个技能的难度是没有一丁点关系的,只和市场需求有关系。市面上如果需要 100000 个熟练前端,但是只能培养出 5000 个熟练前端,这些人的薪资当然高了。反之,如果全中国每年只需要 20 个做编译器的软件工程师,但是每年光做编译器的博士研究生都有 30 个毕业的话。那些本科生是一丁点机会都没有的,无论你在大学四年中学了多么难且艰深的理论,连免费实习的机会都没有,别人嫌你浪费电。 作为基础设施的硬件行业,其本身的发展需要依赖于实实在在的基础科学与工程技术,与业务关联性没有很强,所以其更新换代的速度就没有那么快,也就限制了从业人员需求的增长。所以,即使某些硬件工程的门槛高,也架不住需要的人少呀。 扩张边际效益低、试错成本高、产品开发周期长 对于实体制造业,每扩张一倍,就意味着与之对应的其他各项成本(包括人力成本,机器成本,土地成本等等)至少也要扩张一倍,考虑到效率的因素,扩张的边际成本甚至是在增加的。而且这个过程需要大量的时间准备。 芯片器件集成度变高 芯片厂家的生态、参考设计越来越成熟,应用开发的门槛越来越低。 板级硬件现在都只剩抄抄图,看看芯片说明书。芯片说明书甚至帮你把外围电路都说了个七七八八。只需要一个高级的拼装工。 至于为什么需求这么小,前面也提到了,板级硬件技术发展了这么多年,很多东西都集成化,模块化了,没有硬件工程师发挥创造的舞台了,招一个牛逼的和一般的差不了太多。尤其在联发科创造的 turnkey 解决方案推动下,几乎所有的芯片原厂都会提供全套参考设计,也就是可以抄作业,抄好作业甚至还可以请芯片原厂检查一下作业。一旦作业完成之后,硬件工程师的活就剩下日常打杂,失效分析,产线故障处理,配合软件调试软件之类,再也没有设计与创作的空间。一个产品上市如果需要持续的硬件设计改进,说明这个产品的硬件设计一开始就是一坨屎,这种事情是绝对不允许发生的。而对软件而言,无论什么阶段,都可以持续改进,提高创新。说不定,还能引出一点新问题出来,大不了后续来个 OTA 升级修复就得了,可这些工作都需要人去干吧,需要软件去干吧。 职业发展选择 硬件工程师虽然待遇低,但公司与公司之间差距也是很大的。待遇按供应链分,欧美芯片原厂 > 国内芯片厂(包括台湾省)> OEM&ODM 终端厂 > 方案公司。所以,在跳槽的时候,尽量从右往左跳,工资待遇和技术竞争力会越来越好。凡事都有例外,像 OPPO/VIVO 这样的终端厂硬件待遇长期碾压芯片原厂,但我仍然建议一个硬件工程师至少有一段在芯片原厂的工作经历,以夯实技术,丰富经验,拓展视野,这只有原厂才能给你的,终端厂是给不了。然后再居高临下,傲视天下的姿态下嫁到有钱的终端厂,才是一个完美的结局。 基于以上各家的观点,我们能够得出来的结论是:如果还没入行,快逃,逃往嵌入式软件或纯软件领域;如果已经入行,往上游走,往原厂走,往硬件领域最核心的地方谋发展。 参考与致谢 硬件工程师有哪些发展方向和具体的发展前景? 硬件明明比软件更难,国内的硬件技术也不如软件,为什么硬件工程师待遇还不如软件?

2025/9/17
articleCard.readMore

有限与无限世界

Take a piano. The keys begin, the keys end. You know there are 88 of them, nobody can tell you any different. They are not infinite. You are infinite. And on these keys the music that you can make is infinite. I like that. That I can live by. -- The legend Of 1900 我在构想一个有限的世界,它是被约束在一个小区域内,你只能在其中进行探索,而不能越出其边界。 这样的描述也许过于抽象,但是可以有具体的实例来比喻:它是 iPod 里有限层级且功能很少的菜单、它是封闭式的学校、疫情下不进不出的社区、抑或是《海上钢琴师》中 1900 一生所在的船上。 它们都有一些共同的特征:因为是有限的范围内,所以探索程度会随时间推进而逐渐饱和,且呈现出边际效益递减的趋势。 生活在有限世界中,我们每天都经历着重复的景色。但是,如果你愿意花心思去探索,也许能发现彩蛋,有时转瞬即逝,有时微乎其微,但我们仍能惊叹于它的出现,感受着它带来不一样的体验。 在大学封校的那段日子里,我爬上了学校几乎所有楼的楼顶,仔细欣赏形色各异的落日与景色。在一栋文科楼的楼顶,我发现了围墙上的涂鸦。这种感觉,正如在孤独的银河系中找到了人类以外的其它智慧生命体一般。 这就是有限的世界,每天重复的景色也许会使你感到无聊,但也在无形中让你思考,在已知中发掘未知。 继而说到无限世界。在这里,每一步都可以是全新的探索,沿途的景色可以永不重复,探索永远不会趋向饱和。 现代人生活在无限世界中。我们每天都在摄入新的信息,但我们鲜有想过,如何将它们消化。 以前的世界并没有现在这么过量的信息流,普通人想要获得一些信息需要拼尽全力,因此他们有大把的时间去反复咀嚼自己已经获得的信息。 一本书翻来覆去看几十上百遍,每一句话都会在他们脑中无意识的回想,在日常生活里,在他们那些闲着没事的时间里,突然蹦出来,突然有了新的感悟。 但到了我们这里,我们每天花很少的时间思考,我们追求干货、追求结论,直接将别人整理好的观点拿来用,并对其坚信不疑。 结果每个人的脑中都充满了思想,但这些思想绝大部分都不是自己的,只是一个片面的结论,大家很擅长用这些已经得出来的结论去互相攻击,但却少有人知道这些结论得出来的过程。 人类所有的问题,都源于人无法独自安静地坐在房间里。身处于无限世界中的我们,有时候也需要为自己构建一个有限世界,任思想纷飞、碰撞、绽放出火花。 参考与致谢: 浪费掉的时间,才是自己的

2025/9/17
articleCard.readMore

星夜漫游

🎵Sgt. Peppers Lonely Hearts Club Band🎵 当我踏出实验室时,已是午夜时分。 跨上驾驶位,点火。披头士的 Sgt. Peppers Lonely Hearts Club Band 如同热浪一般,从音响中喷涌而出。好久没回顾经典摇滚了,我想,就接着听这部专辑吧。 最开始喜欢上这首富有张力的摇滚,是源自披头士波普风格的动画 Yellow Submarine. 经典从未消逝,在一次又一次的演绎中得以重生。 Yellow Submarine is the tenth studio album by English rock band the Beatles, released on 13 January 1969 in the United States and on 17 January in the United Kingdom. It was issued as the soundtrack to the animated film of the same name, which premiered in London in July 1968. The album contains six songs by the Beatles, including four new songs and the previously released "Yellow Submarine" and "All You Need Is Love". The remainder of the album is a re-recording of the film's orchestral soundtrack by the band's producer, George Martin. 游弋在城市快速路上,四下空无一人,震耳欲聋的音乐灌满了整个车舱。我置身于自己的黄色潜水艇中,一边琢磨着星空与月夜。或许在百万年前,这片土地也曾是深不可测的海洋。我心无旁骛,发现舱外逐渐现出寒武纪的三叶虫,三叠纪的长颈龙,头顶还有蓝鲸的庞大身影。它们呈半透明态,泛着荧光。它们丝毫不受惊扰,仿佛这片海洋就是自己的常驻之地。 一只胭脂色的水母朝我游过来。虽然我也在漫游,但它仍随我而动,游动姿态是那么的优雅。我很想把手伸出窗外触摸它,但却不想破坏了这般奇幻的美景。鲨鱼在不远处捕食一头海龟,自然的规律一直都存在于曾经或正生存在地球的生物上,人类创造的文明也仅仅是块遮羞布。 云层重新散开,月光再次漫无目的地洒落,夜色寂静如空。 没有鱼群,没有海洋,我恍过神来,到家了。 唯留下清澈的夜空,月明,星稀。

2025/9/17
articleCard.readMore

探索之路 - 2022 小记

2022 年转眼即逝,有趣之事蛮多,挑一些记录下来吧。 在专业领域的探索 2022 年,我在自己的专业领域 - 硬件与嵌入式的基础上,在射频、信号完整性、电源、半导体 ATE 等领域有了新的探索。也画了很多很多的电路板,焊接了数不清的元件。 在我的知识库体系下,各个分类的知识也在蓬勃增长着。 重新思考未来的方向 在职业生涯的路上,我看到供需关系不匹配、扩张边际效益低、试错成本高、开发周期长这一系列的问题,正压缩着硬件解决方案从业者的天花板。 认真调研了一番,我发现往上游的路似乎更好走。 一个人的命运啊,当然要靠自我奋斗,但是也要考虑到历史的进程。 正值半导体行业火热,我决定去试试。于是,我离开了实习的公司。诚然,在 2022 年末看,半导体行业虽然会受经济传导到消费电子市场的影响,带来持续的下行周期,但从长期看来仍然是一个朝阳行业。 抓住每一个机会 江湖上说,半导体行业去原厂香,并且欧美原厂更香。记得有一段时间,我隔三岔五就有面试。在家、在火车上、开车在路上、甚至在毕业旅行在酒店里,我都在与面试官们谈笑风生。 在某一回大厂的面试后,面试官告诉我,有一个好消息和一个坏消息。好消息是我通过了面试,坏消息是此岗位只招实习生。面试官私底下给了我隔壁厂工程师的邮箱,说可以投个简历试试看。看似虚无缥缈的线索,我还是认真准备了简历,即使成功的概率很低,我也要努力去试试看。 后来令我没想到的是,居然能够成功通过面试并拿到 Offer。还记得去年在 RoboMaster 打进国赛后,我们激励自己,抓住机会,输了不亏,赢了血赚。实践再一次证明,这个思路还是非常具有可行性的。 复前行,豁然开朗 新的工作在上海,得开始动身了,这是我第一回去离家这么远的大城市打工。查了查地图,发现还是挺远的,1500 公里的距离,一个人开长途,为了不疲劳驾驶,同时还要给车规划充电,我只好把行程拆分成了好几天。 从深圳到上海,路过惠州、瑞金、上饶、杭州,小跨了半个中国。一路上,我听完了全集「易中天品三国」,在服务区与别的车抢充电桩,途中还因为感冒浑浑噩噩开了两天,终于在某一天的清晨开在了上海的高架路上。 在旅途中,我在西湖边上玩了两天。从南方到北方(广东人看来),一路上看着植被的变化,长途自驾其实还是挺有趣的。 跟 Covid 躲猫猫 疫情三年来,我一直与 Covid 玩躲猫猫。4 月的上海,9 月的广州深圳,我一直在避着毒圈跑,也时时处在幻阳的笼罩下。 所幸运气足够好,也感谢我身体细胞们的共同努力,又苟过一年,我们决赛圈见。 展望 2022 于我而言还是挺幸运的,不过现阶段尚未稳定下来,半场开香槟是不明智的。2023 年将会是一个不错的开始,有什么想法就勇敢去想,大胆放开去做吧。

2025/9/17
articleCard.readMore

机器学习入门 - 基础流程

机器学习入门 - 基础流程 一般而言,传统的编程是告诉计算机一些数据以及计算规律,让计算机输出结果。当规则制定好之后,对于每一次输入,计算机输出的答案应该也是唯一确定的。 flowchart LR classDef default fill:#fff,stroke:#000,stroke-width:2px,font-size:16px,fill: white 规则-->传统编程方法; 数据-->传统编程方法; 传统编程方法-->答案; 而机器学习的方法,是告诉计算机数据和一部分答案(标签),计算机输出答案与规律。这种方法是从已知答案的数据背后寻找某种规则。 flowchart LR classDef default fill:#fff,stroke:#000,stroke-width:2px,font-size:16px,fill: white 数据-->机器学习方法; 部分答案-->机器学习方法; 机器学习方法-->规则; 机器学习的基本流程大致如下: 数据收集 机器学习就像「神农尝百草」,是一种归纳法(传统编程是演绎法)。而对于归纳法而言,数据是基础,越多越好。数据决定了机器学习的上限,而模型和算法再好,也只是逼近这个上限。 数据预处理 在最初的阶段,需要处理带标签的原始数据,形成用于训练和用于验证的数据集。这一步骤的主要的工作是特征提取和数据清洗。 特征提取是将特征提取出来,作为模型训练的输入。而数据清洗通常的流程有: 去除唯一属性:唯一属性通常是一些 id 编码,这些属性不能刻画样本的分布规律。 处理缺失值:可以选择直接补全缺失值,也可以直接删除含有这个属性的特征。 特征编码:把文字或其他形式的特征转换为数字编码,方便模型处理。比如把 ON/OFF 编码为 1/0. 特征缩放:通过归一化和标准化的手段,将样本属性缩放到某个指定的范围内,避免数量级差异大的属性占据主导地位。 模型的构建和训练 拥有可用的数据集之后,就可以根据需求选择合适的算法模型了。机器学习主要有三种方式:监督学习(Supervised Learning),无监督学习(Unsuoervised learing)和强化学习(RL, Reinforcement Learning)。 监督学习(Supervised Learning):监督意味着已经有标注好的数据集。通过已标注好的数据进行模型训练,从而利用训练好的模型来对新的数据进行预测。监督学习的应用一般分为 回归 和 分类: 回归(Regression):预测一个数字,有无限种可能的结果 分类(Classification):预测分类,只有两种或以上的少数选择,是拟合不同类别之间的分界线。 无监督学习(Unsuoervised learing):无需标注数据(有时候人也不知道问题的准确答案),应用一般有 聚类、降维 和 异常检测(Anomaly Detection) 这几种: 聚类(Clustering):例如给出一堆图片,把相似的图片划分到一起。 降维(Dimensionality Reduction):数据特征过多、维度过高时,要将数据降到合适的低维空间处理,保留最重要的特征数据。主要算法有主成分分析(PCA, Principal Component Analysis)。 强化学习(Reinforcement Learning, RL):把学习的过程作为一个试探评价的环节,会根据具体的环境得到反馈的强化信号(奖赏/惩罚)。让机器不断尝试,从而得到一种趋利避害的策略,形成一套解决问题的最优解。 我们可以对处理好的数据先做一个顶层的分析,是用监督学习还是无监督模型,问题的类型是属于分类还是回归。在实际选择时,也通常会选用不同的模型进行训练,然后比较输出结果并选择最佳的那个。 模型训练的根本,是找到最合适的权重,以最大限度地进行分类(分类问题中)、或使误差尽量小(回归问题中)。 我们以一个包含权重的公式为例: \[ y=ax_1+bx_2+cx_3 \] 其中,\(y\) 就是标签,在训练数据集中已经有正确的标注;而 \(x_1, x_2, x_3\) 即特征值。举个实际的例子: \[ 花的种类=a*花蕊颜色+b*叶子颜色+c*花瓣颜色 \] 在这个阶段的工作,就是通过训练反推出权重 a、b、c,使得这条公式的结果尽量逼近原始输入数据。并且要设定损失函数(Loss Function),设法减小整体误差,实际中常使用均方误差(MSE, Mean Squared Error)来计算损失函数的误差。 模型评估 在上一个阶段把误差降到足够小后即可停止训练,用预处理后的测试数据集来验证模型效果。 预测 在上个阶段模型达到了预期的准确率和覆盖率(召回率)之后,就可以把模型拿来实际使用了。 入门机器学习要两手抓,一方面是算法基础,另一方面是代码练习。这样才能在学习中巩固,把理论基础转化为实际用途。 下一篇文章我们先介绍机器学习环境的配置。 参考与致谢 Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 3rd Edition (https://github.com/ageron/handson-ml3) 《程序员的 AI 书:从代码开始》 《AI 制胜:机器学习极简入门》

2025/9/17
articleCard.readMore

Hello blog

终于,我还是给知识库加上了博客的功能。 在听了 捕蛇者说 的播客节目「个人知识管理体系系列」后,我思考了一番,发现之前倾向的单一知识库的做法,存在一些弊端: 日常一些零碎的观点或想法,不适合提出来长篇大论、单独成文。 知识库的文风比较正式,需要引经据典、咬文嚼字,这样一来写作的周期也会被拉长,这也削弱了零碎写作的积极性。 我希望把博客当 gist 用,简单记录一些零碎观点或想法。

2025/9/17
articleCard.readMore

如何不长痘

最近因为吃了一顿麦当劳上火感冒了,在养病的几天里,我发现脸上的痘渐渐消了,而且也没有新长痘。 之前小发也跟我讨论过,于是我想了想,大概是这几个原因: 足够睡眠、不熬夜。在那几天里,我每天晚上十一点半睡,早上七八点醒。 饮食清淡。那几天吃的都很清单,基本上都是汤面、汤饭,也不吃辣,不吃冷饮雪糕,所以一点儿上火或生寒的元素都不存在。 一直到现在我都保持着这些做法,所以到现在也不怎么长痘。 一旦知道自己没长痘,整个人就精神多了,待人接物也自信了许多。这也反过来督促自己该早睡早起、饮食清淡。这是一个积极的正向循环,希望我能坚持下去。

2025/9/17
articleCard.readMore

买了一台 NAS

我从闲鱼代理买了一台 DS220+。直接原因是因为,Google Photos 从六月以后取消了无限上传额度,且我也慢慢意识到,把从小到大整整几百个 G 的照片,都托付给垄断公司,是非常不保险的做法。甚至可以说,只要他们想,是可以找个借口,把用户数据丢掉的。 不仅仅是照片,项目仓库、音乐、电影等等,我都急切需要一个反脆弱的数据存放方式。 「让我的数字资产比我活得更久。」这是我的目标。 最开始,我仅仅是把数据存在电脑单一硬盘上,但如果不巧碰上硬盘坏了无法修复,或者往极端点想,电脑被偷了,那数据就永远丢失了。大多数人会想到这个问题,并选择冷备份的办法。但是我们都知道,数据是不断更新的,冷备份有周期性,一旦在备份开始前发生意外,那么这一个周期的数据(甚至恰好有关键数据)也是找不回来的。而且这种办法非常不 geek,繁琐的流程应该交给机器来解决。 后来我尝试用各种局域网 sync 工具和 git 的方法,但前者方案并不完善,而 git 虽然安全可靠,但不适合处理非二进制的大文件(所以我现在仅仅用 git 来处理项目仓库)。 所以我索性上了白群晖,NAS 本地储存 + Cloud Sync 加密上传各大网盘,一步到位。而群晖的 Photos 套件,跟 Google Photos 的用户习惯相差无几,不难入手。 数据的迁移还是挺花时间的,需要有耐心。这星期内我也会出炉一篇文章,讲讲我是如何「永久」保存数据的。

2025/9/17
articleCard.readMore

不要自己感动自己

这些年我一直提醒自己一件事情,千万不要自己感动自己。大部分人看似的努力,不过是愚蠢导致的。什么熬夜看书到天亮,连续几天只睡几小时,多久没放假了,如果这些东西也值得夸耀,那么富士康流水线上任何一个人都比你努力多了。人难免天生有自怜的情绪,唯有时刻保持清醒,才能看清真正的价值在哪里。 —— 于宙《我们这一代人的困惑》 该工作工作,该学习学习,该睡觉睡觉,该玩就放开玩。

2025/9/17
articleCard.readMore

为什么要抵制智能推荐算法

我认为,对人工智能的恐惧,大多数情况下,就是对资本主义的恐惧。我们担心资本主义将如何通过技术来利用我们。 -- Ted Chiang,美国科幻小说作家

2025/9/17
articleCard.readMore

关于新能源行业的一些观点

其实在互联网工作了这么多年,各个巨头无非都在抢一个东西 —— 流量入口,车是未来的流量入口,互联网公司争抢造车这块市场也无非是这个原因。 在我看来,未来 3-5 年之内,新造车的战局就会稳定下来,到时候国内应该会有 1-2 家特别大的新能源车公司,就像之前的大众集团一样,吃掉大部分的市场,就像当年的美团、滴滴一样。 其实造车行业在各个行业吸了很多血,包括金融、互联网以及其他行业,人、财、物都往这个行业聚拢,洗牌之后可能并不需要这么多的从业人员。人是会跟着行业趋势走的,如果这个行业洗牌后依然能保持不错的增长,我会在这个行业工作比较长的时间。

2025/9/17
articleCard.readMore

内卷与未来的职业趋势

经济不景气,更有利于早点去朝阳行业。 早早去站位,早早去占坑。 本科生去了,几年后,就会发现,读研的同学还没有你混的好。 内卷,是无意义的做功。 一群人在无意义的做功,我们只要找到新方向的风口,过去占位。 占位,不卷。等到占稳了位置,就会有人卷过来。 到时候门槛水涨船高,但进入的早,便能卡住位置。 熟悉历史规律,自然能够找到合理的策略。 就像是在历史上,历次大萧条后,都会出现的洗牌。 对普通人来说,这恰恰是珍贵的机会。 —— 「立华说」

2025/9/17
articleCard.readMore

RoboMaster 赛后随笔

终于是打完比赛了,今年的成绩较前两年有突破,从南部赛区打进了国赛。但也仅仅是止步于国赛。 今年的问题在于硬实力。战术只能弥补一定的实力差距,带我们进国赛。但若说机器人在场上的基本功能都不能保证,那么无论多好的战术,都是弥补不来的。 最后一场打北科大,可以称得上是终局之战了。一号英雄被击毁,二号工程图传过热抓瞎,三号步兵翻车,五号步兵不能动,哨兵被摧毁,飞镖已打出但没击中前哨战。在操作间里,我们已经知道比赛无望了,所以尝试让四号步兵飞坡,结果也翻车了。最后一分钟金钱到位,只能启动无人机当哨兵用,倒是将敌方击退并造成两百多伤害(自瞄稳健)。无人机打完所有弹丸之后,也无力回天了。 还记得打川大那一局,本来第一局已经输了,但后来却扳回两局。他们三局的飞镖全都打中前哨战,到后来我们完全放弃守塔了。不过最后还是靠着地面推进,硬是赢回了比赛。 希望能一年比一年好吧。

2025/9/17
articleCard.readMore

8 月深圳小记

8 月 28 日的午后,我来到车站等候回学校的火车。转眼间 8 月匆匆过去,我决定记录在深圳的这一个月。 月初,在 RM 比赛因疫情延期了两个月之后,我们的队伍终于来到了深圳。这是我第一次踏上赛场(去年因疫情变成了线上赛),在比赛中有幸作为云台手进入操作间,淋漓尽致地体验了一回比赛的氛围。 刚来到赛场的前两天,我们的准备完全不充分,在适应性训练和第一场比赛之中,各兵种机器人都遇到了大大小小的问题。不过,在接踵而至的比赛中,我们且战且进,逐渐适应了比赛的节奏。也感谢技术组的队员们,在团队士气最低落的时刻,依然默默坚守,修复机器人的各种问题。 小组赛,击败重庆理工和厦门理工后,却与福建工程学院打平,使我们非常被动地去迎战四川大学。在前年的比赛中,我们输给川大,从而无缘国赛。第一局,我们非常没有信心。川大的飞镖一开局就拆掉了我们的前哨战,而高佬的步兵下坎一急就翻车了,我们只能硬撑着局面。虽然第一小局输了,但坤坤发现,似乎我们少一台步兵,却勉强还能打得过。第二局开始了,我看着雷达的画面,十分焦虑,于是在麦克风里对大家说,我们要记住,我们是没有前哨战的,破釜沉舟,背水一战才有可能赢(事实上,三局对面的飞镖都把我们前哨战给拆掉了……)。川大虽然有飞镖这个杀器,但他们的地面单位没有战术配合。于是,我们根据演练了三个多月的战术配合,逐个击破。第二局的扳回,我们信心大增,在第三局的决战中,我们稳中求进,拿下了国赛的门票。 国赛无弱队,我们最终止步于国赛二等的奖项,只能期待明年下一届的比赛了。 打完了比赛,我就拖着行李箱往公司去了。读初中的时候,我开始接触单片机,Seeed 和柴火创客空间于我而言,一直是写在未来的愿望清单上的。 在这里的每一天都充满成就感,因为工作的内容就是兴趣所在,而且还能与优秀的伙伴们一起共事,这实在是一种享受。 在深圳的内卷的大环境下,生活仍然可以有甜点。偶然去了福田市中心的酒展,虽然酒一般般,但还是挺开心的: 周末午后书店的柠檬茶和苏打水: 终于与来深圳打工的朋友们聚了一回,晚上的啤酒搭烧烤还挺不错: 有天下班去地铁站的路上,一片晚霞搭起了一座虹桥,我才发现很久没有抬头仰望过天空了。 8 月底,开学了,接下来该何去何从呢? 回想起在赛场上喊得震天的口号,「脚踏实地,仰望星空」,我已经有了答案。

2025/9/17
articleCard.readMore

当下与永恒

当年,古罗马人在宏伟华丽的浴宫中吹着口哨,认为帝国就像身下的浴池一样,建在整块花岗岩上,将永世延续。 现在人们知道,没有不散的宴席,一切都有个尽头。 —— 刘慈欣《三体 Ⅲ·死神永生》 置身于浓厚的节日气氛里,看着身边欢乐的人们,我也不禁被融入其中。 「如果每一天都能如此快乐就好了」。但仔细一想,如果每天都一样地快乐着,那还能称之为快乐吗?先前读过一段话,「快乐是生活的点缀,无聊和痛苦才是生活的本质」。 远看到人的一生,生命之于宇宙的刻度,是尤其短暂的。如果可以永生,那活着的每天,还会有新鲜感吗? 经历过无聊和痛苦,才能明白快乐的来之不易;人知道生命会有终将逝去的一天,才会去珍惜在这个世界上的每一天。 如何把有限的生命,刻进永恒的宇宙维度,这是我一直在追寻的谜题。 不过,尚存一点我们可以把握的,是去珍惜身边的美好,珍惜你所爱的人,别待失去才追悔。 预祝中秋快乐~ 一杯敬明天 一杯敬過往 一杯敬自由 一杯敬死亡 寬恕我的平凡 驅散了迷惘 好吧天亮之後總是潦草離場 清醒的人最荒唐 …… —— 毛不易《消愁》

2025/9/17
articleCard.readMore

雨下了四年十一个月零两天。间或有细雨绵绵的日子,一开始人人都还身着盛装,带着久病初愈的神情预备庆祝天晴,但很快便习惯了将这些间歇当作滂沱重现的前奏。 🎵Who'll Stop the Rain🎵 那是最昌明的时世,那是最衰微的时世; 每天早晨,太阳升上地平线,爬到最高点再回落,这一天就宣告结束,为下一天让路。 大低谷纪念碑是纪念大低谷的建筑群,是一只只从沙漠中向上伸展的枯树干般的手,其都对着天空做出各种扭曲的姿态。 在疫情汹涌而至前的岁月,大家的目光都向着前方;居家办公的日子里,外面的世界似乎愈发向着低谷在塌陷,瘟疫、战争的阴霾挥之不去,天启四骑士正逐一降临,巴别塔一次次被推倒。在人类漫长的历史岁月里,和平、开放、富足的年代是短暂的、火花一般闪耀了一下,随即跌入漫漫长夜之中。 白昼之光,岂知夜色之深。 危机出现后的一个世纪,曾经在黄金时代生活过的人们都离开了人世。……这个时代在今后一直被人不断地回忆,经历过这段美好岁月的老人像反刍动物似的不断把那段记忆吐出来,甜蜜地咀嚼,最后总是加上一句:「唉,那时咋就不懂得珍惜呢?」而听他们讲述的年轻人目光中充满嫉妒,同时也将信将疑:那神话般的和平、繁荣和幸福,那世外桃源般的无忧无虑,是否真的存在过。 假如某些相当偶然的事件发生,就会很容易就被视为传统,因而再也无法打破,或者几乎牢不可破。 Long as I remember the rain been comin' down Clouds of mystery pourin' confusion on the ground Good men through the ages tryin' to find the sun And I wonder, still I wonder, who'll stop the rain? I went down Virginia, seekin' shelter from the storm Caught up in the fable, I watched the tower grow Five Year Plans and New Deals, wrapped in golden chains And I wonder, still I wonder, who'll stop the rain? Heard the singers playin', how we cheered for more The crowd had rushed together, tryin' to keep warm Still the rain kept pourin', fallin' on my ears And I wonder, still I wonder, who'll stop the rain?

2025/9/17
articleCard.readMore

现代都市与末日田园

🎵Nowwhere Man🎵 He's a real nowhere man, Doesn't have a point of view, 现代都市能解决你的大部分需求: 饿了?去楼下全家买个饭团填饱肚子,或者干脆下馆子 想消费?走几步就能逛 mall 出行?地铁公交网约车能带你去任何地方 生病了?药店医院也不少 在赛博空间里也是一样的。微信、网易云音乐、淘宝……新时代的人们,能够随时享受到它们带来的便利。 曾几何时,我们以为它们是永恒的,不会对我们关闭入场权限,至少也不应该那么突然。 当下载的音乐因版权无法收听,当聊天与文字因敏感而被屏蔽,当现代都市因封锁而休克。我们开始意识到,面对它们的强势,我们是十分被动的。 于是,我们只能开始开垦自己的末日田园。「深挖洞,广积粮」,以末日生存的标准来做灾备,即使这样做会失去很多便利性。 自建博客、导航站、书库、音乐影视库、使用 RSS 订阅与播客,使用 NAS 进行分布式储存备份。 虽然我们尚未有条件去构筑现实世界的末日田园,但是至少可以在赛博空间内先实验一番,首先让精神得到安抚。 文明像一场五千年的狂奔,不断的进步推动着更快的进步,无数的奇迹催生出更大的奇迹,人类似乎拥有了神一般的力量……但最后发现,真正的力量在时间手里,留下脚印比创造世界更难,在这文明的尽头,他们也只能做远古的婴儿时代做过的事:把字刻在石头上。

2025/9/17
articleCard.readMore

硬件行业趋势与个人的选择

对硬件行业的一些观点 供需关系不匹配 我们的教育培养了一种不太正确的思维方式,认为难的东西就更值钱。其实现实中并非如此。一个东西的价格主要是由供需关系决定的。供不应求价格就会上涨,供大于求价格就会下跌。 一个职位的工资高低并不取决于该职位的技术难度,而是取决于该职位的市场价值。而市场价值又是由市场需求来决定。 一个人的技能是否值钱和这个技能的难度是没有一丁点关系的,只和市场需求有关系。市面上如果需要 100000 个熟练前端,但是只能培养出 5000 个熟练前端,这些人的薪资当然高了。反之,如果全中国每年只需要 20 个做编译器的软件工程师,但是每年光做编译器的博士研究生都有 30 个毕业的话。那些本科生是一丁点机会都没有的,无论你在大学四年中学了多么难且艰深的理论,连免费实习的机会都没有,别人嫌你浪费电。 作为基础设施的硬件行业,其本身的发展需要依赖于实实在在的基础科学与工程技术,与业务关联性没有很强,所以其更新换代的速度就没有那么快,也就限制了从业人员需求的增长。所以,即使某些硬件工程的门槛高,也架不住需要的人少呀。 扩张边际效益低、试错成本高、产品开发周期长 对于实体制造业,每扩张一倍,就意味着与之对应的其他各项成本(包括人力成本,机器成本,土地成本等等)至少也要扩张一倍,考虑到效率的因素,扩张的边际成本甚至是在增加的。而且这个过程需要大量的时间准备。 芯片器件集成度变高 芯片厂家的生态、参考设计越来越成熟,应用开发的门槛越来越低。 板级硬件现在都只剩抄抄图,看看芯片说明书。芯片说明书甚至帮你把外围电路都说了个七七八八。只需要一个高级的拼装工。 至于为什么需求这么小,前面也提到了,板级硬件技术发展了这么多年,很多东西都集成化,模块化了,没有硬件工程师发挥创造的舞台了,招一个牛逼的和一般的差不了太多。尤其在联发科创造的 turnkey 解决方案推动下,几乎所有的芯片原厂都会提供全套参考设计,也就是可以抄作业,抄好作业甚至还可以请芯片原厂检查一下作业。一旦作业完成之后,硬件工程师的活就剩下日常打杂,失效分析,产线故障处理,配合软件调试软件之类,再也没有设计与创作的空间。一个产品上市如果需要持续的硬件设计改进,说明这个产品的硬件设计一开始就是一坨屎,这种事情是绝对不允许发生的。而对软件而言,无论什么阶段,都可以持续改进,提高创新。说不定,还能引出一点新问题出来,大不了后续来个 OTA 升级修复就得了,可这些工作都需要人去干吧,需要软件去干吧。 职业发展选择 硬件工程师虽然待遇低,但公司与公司之间差距也是很大的。待遇按供应链分,欧美芯片原厂 > 国内芯片厂(包括台湾省)> OEM&ODM 终端厂 > 方案公司。所以,在跳槽的时候,尽量从右往左跳,工资待遇和技术竞争力会越来越好。凡事都有例外,像 OPPO/VIVO 这样的终端厂硬件待遇长期碾压芯片原厂,但我仍然建议一个硬件工程师至少有一段在芯片原厂的工作经历,以夯实技术,丰富经验,拓展视野,这只有原厂才能给你的,终端厂是给不了。然后再居高临下,傲视天下的姿态下嫁到有钱的终端厂,才是一个完美的结局。 基于以上各家的观点,我们能够得出来的结论是:如果还没入行,快逃,逃往嵌入式软件或纯软件领域;如果已经入行,往上游走,往原厂走,往硬件领域最核心的地方谋发展。 参考与致谢 硬件工程师有哪些发展方向和具体的发展前景? 硬件明明比软件更难,国内的硬件技术也不如软件,为什么硬件工程师待遇还不如软件?

2025/9/17
articleCard.readMore

有限与无限世界

Take a piano. The keys begin, the keys end. You know there are 88 of them, nobody can tell you any different. They are not infinite. You are infinite. And on these keys the music that you can make is infinite. I like that. That I can live by. -- The legend Of 1900 我在构想一个有限的世界,它是被约束在一个小区域内,你只能在其中进行探索,而不能越出其边界。 这样的描述也许过于抽象,但是可以有具体的实例来比喻:它是 iPod 里有限层级且功能很少的菜单、它是封闭式的学校、疫情下不进不出的社区、抑或是《海上钢琴师》中 1900 一生所在的船上。 它们都有一些共同的特征:因为是有限的范围内,所以探索程度会随时间推进而逐渐饱和,且呈现出边际效益递减的趋势。 生活在有限世界中,我们每天都经历着重复的景色。但是,如果你愿意花心思去探索,也许能发现彩蛋,有时转瞬即逝,有时微乎其微,但我们仍能惊叹于它的出现,感受着它带来不一样的体验。 在大学封校的那段日子里,我爬上了学校几乎所有楼的楼顶,仔细欣赏形色各异的落日与景色。在一栋文科楼的楼顶,我发现了围墙上的涂鸦。这种感觉,正如在孤独的银河系中找到了人类以外的其它智慧生命体一般。 这就是有限的世界,每天重复的景色也许会使你感到无聊,但也在无形中让你思考,在已知中发掘未知。 继而说到无限世界。在这里,每一步都可以是全新的探索,沿途的景色可以永不重复,探索永远不会趋向饱和。 现代人生活在无限世界中。我们每天都在摄入新的信息,但我们鲜有想过,如何将它们消化。 以前的世界并没有现在这么过量的信息流,普通人想要获得一些信息需要拼尽全力,因此他们有大把的时间去反复咀嚼自己已经获得的信息。 一本书翻来覆去看几十上百遍,每一句话都会在他们脑中无意识的回想,在日常生活里,在他们那些闲着没事的时间里,突然蹦出来,突然有了新的感悟。 但到了我们这里,我们每天花很少的时间思考,我们追求干货、追求结论,直接将别人整理好的观点拿来用,并对其坚信不疑。 结果每个人的脑中都充满了思想,但这些思想绝大部分都不是自己的,只是一个片面的结论,大家很擅长用这些已经得出来的结论去互相攻击,但却少有人知道这些结论得出来的过程。 人类所有的问题,都源于人无法独自安静地坐在房间里。身处于无限世界中的我们,有时候也需要为自己构建一个有限世界,任思想纷飞、碰撞、绽放出火花。 参考与致谢: 浪费掉的时间,才是自己的

2025/9/17
articleCard.readMore

星夜漫游

🎵Sgt. Peppers Lonely Hearts Club Band🎵 当我踏出实验室时,已是午夜时分。 跨上驾驶位,点火。披头士的 Sgt. Peppers Lonely Hearts Club Band 如同热浪一般,从音响中喷涌而出。好久没回顾经典摇滚了,我想,就接着听这部专辑吧。 最开始喜欢上这首富有张力的摇滚,是源自披头士波普风格的动画 Yellow Submarine. 经典从未消逝,在一次又一次的演绎中得以重生。 Yellow Submarine is the tenth studio album by English rock band the Beatles, released on 13 January 1969 in the United States and on 17 January in the United Kingdom. It was issued as the soundtrack to the animated film of the same name, which premiered in London in July 1968. The album contains six songs by the Beatles, including four new songs and the previously released "Yellow Submarine" and "All You Need Is Love". The remainder of the album is a re-recording of the film's orchestral soundtrack by the band's producer, George Martin. 游弋在城市快速路上,四下空无一人,震耳欲聋的音乐灌满了整个车舱。我置身于自己的黄色潜水艇中,一边琢磨着星空与月夜。或许在百万年前,这片土地也曾是深不可测的海洋。我心无旁骛,发现舱外逐渐现出寒武纪的三叶虫,三叠纪的长颈龙,头顶还有蓝鲸的庞大身影。它们呈半透明态,泛着荧光。它们丝毫不受惊扰,仿佛这片海洋就是自己的常驻之地。 一只胭脂色的水母朝我游过来。虽然我也在漫游,但它仍随我而动,游动姿态是那么的优雅。我很想把手伸出窗外触摸它,但却不想破坏了这般奇幻的美景。鲨鱼在不远处捕食一头海龟,自然的规律一直都存在于曾经或正生存在地球的生物上,人类创造的文明也仅仅是块遮羞布。 云层重新散开,月光再次漫无目的地洒落,夜色寂静如空。 没有鱼群,没有海洋,我恍过神来,到家了。 唯留下清澈的夜空,月明,星稀。

2025/9/17
articleCard.readMore

探索之路 - 2022 小记

2022 年转眼即逝,有趣之事蛮多,挑一些记录下来吧。 在专业领域的探索 2022 年,我在自己的专业领域 - 硬件与嵌入式的基础上,在射频、信号完整性、电源、半导体 ATE 等领域有了新的探索。也画了很多很多的电路板,焊接了数不清的元件。 在我的知识库体系下,各个分类的知识也在蓬勃增长着。 重新思考未来的方向 在职业生涯的路上,我看到供需关系不匹配、扩张边际效益低、试错成本高、开发周期长这一系列的问题,正压缩着硬件解决方案从业者的天花板。 认真调研了一番,我发现往上游的路似乎更好走。 一个人的命运啊,当然要靠自我奋斗,但是也要考虑到历史的进程。 正值半导体行业火热,我决定去试试。于是,我离开了实习的公司。诚然,在 2022 年末看,半导体行业虽然会受经济传导到消费电子市场的影响,带来持续的下行周期,但从长期看来仍然是一个朝阳行业。 抓住每一个机会 江湖上说,半导体行业去原厂香,并且欧美原厂更香。记得有一段时间,我隔三岔五就有面试。在家、在火车上、开车在路上、甚至在毕业旅行在酒店里,我都在与面试官们谈笑风生。 在某一回大厂的面试后,面试官告诉我,有一个好消息和一个坏消息。好消息是我通过了面试,坏消息是此岗位只招实习生。面试官私底下给了我隔壁厂工程师的邮箱,说可以投个简历试试看。看似虚无缥缈的线索,我还是认真准备了简历,即使成功的概率很低,我也要努力去试试看。 后来令我没想到的是,居然能够成功通过面试并拿到 Offer。还记得去年在 RoboMaster 打进国赛后,我们激励自己,抓住机会,输了不亏,赢了血赚。实践再一次证明,这个思路还是非常具有可行性的。 复前行,豁然开朗 新的工作在上海,得开始动身了,这是我第一回去离家这么远的大城市打工。查了查地图,发现还是挺远的,1500 公里的距离,一个人开长途,为了不疲劳驾驶,同时还要给车规划充电,我只好把行程拆分成了好几天。 从深圳到上海,路过惠州、瑞金、上饶、杭州,小跨了半个中国。一路上,我听完了全集「易中天品三国」,在服务区与别的车抢充电桩,途中还因为感冒浑浑噩噩开了两天,终于在某一天的清晨开在了上海的高架路上。 在旅途中,我在西湖边上玩了两天。从南方到北方(广东人看来),一路上看着植被的变化,长途自驾其实还是挺有趣的。 跟 Covid 躲猫猫 疫情三年来,我一直与 Covid 玩躲猫猫。4 月的上海,9 月的广州深圳,我一直在避着毒圈跑,也时时处在幻阳的笼罩下。 所幸运气足够好,也感谢我身体细胞们的共同努力,又苟过一年,我们决赛圈见。 展望 2022 于我而言还是挺幸运的,不过现阶段尚未稳定下来,半场开香槟是不明智的。2023 年将会是一个不错的开始,有什么想法就勇敢去想,大胆放开去做吧。

2025/9/17
articleCard.readMore

机器学习入门 - 基础流程

机器学习入门 - 基础流程 一般而言,传统的编程是告诉计算机一些数据以及计算规律,让计算机输出结果。当规则制定好之后,对于每一次输入,计算机输出的答案应该也是唯一确定的。 flowchart LR classDef default fill:#fff,stroke:#000,stroke-width:2px,font-size:16px,fill: white 规则-->传统编程方法; 数据-->传统编程方法; 传统编程方法-->答案; 而机器学习的方法,是告诉计算机数据和一部分答案(标签),计算机输出答案与规律。这种方法是从已知答案的数据背后寻找某种规则。 flowchart LR classDef default fill:#fff,stroke:#000,stroke-width:2px,font-size:16px,fill: white 数据-->机器学习方法; 部分答案-->机器学习方法; 机器学习方法-->规则; 机器学习的基本流程大致如下: 数据收集 机器学习就像「神农尝百草」,是一种归纳法(传统编程是演绎法)。而对于归纳法而言,数据是基础,越多越好。数据决定了机器学习的上限,而模型和算法再好,也只是逼近这个上限。 数据预处理 在最初的阶段,需要处理带标签的原始数据,形成用于训练和用于验证的数据集。这一步骤的主要的工作是特征提取和数据清洗。 特征提取是将特征提取出来,作为模型训练的输入。而数据清洗通常的流程有: 去除唯一属性:唯一属性通常是一些 id 编码,这些属性不能刻画样本的分布规律。 处理缺失值:可以选择直接补全缺失值,也可以直接删除含有这个属性的特征。 特征编码:把文字或其他形式的特征转换为数字编码,方便模型处理。比如把 ON/OFF 编码为 1/0. 特征缩放:通过归一化和标准化的手段,将样本属性缩放到某个指定的范围内,避免数量级差异大的属性占据主导地位。 模型的构建和训练 拥有可用的数据集之后,就可以根据需求选择合适的算法模型了。机器学习主要有三种方式:监督学习(Supervised Learning),无监督学习(Unsuoervised learing)和强化学习(RL, Reinforcement Learning)。 监督学习(Supervised Learning):监督意味着已经有标注好的数据集。通过已标注好的数据进行模型训练,从而利用训练好的模型来对新的数据进行预测。监督学习的应用一般分为 回归 和 分类: 回归(Regression):预测一个数字,有无限种可能的结果 分类(Classification):预测分类,只有两种或以上的少数选择,是拟合不同类别之间的分界线。 无监督学习(Unsuoervised learing):无需标注数据(有时候人也不知道问题的准确答案),应用一般有 聚类、降维 和 异常检测(Anomaly Detection) 这几种: 聚类(Clustering):例如给出一堆图片,把相似的图片划分到一起。 降维(Dimensionality Reduction):数据特征过多、维度过高时,要将数据降到合适的低维空间处理,保留最重要的特征数据。主要算法有主成分分析(PCA, Principal Component Analysis)。 强化学习(Reinforcement Learning, RL):把学习的过程作为一个试探评价的环节,会根据具体的环境得到反馈的强化信号(奖赏/惩罚)。让机器不断尝试,从而得到一种趋利避害的策略,形成一套解决问题的最优解。 我们可以对处理好的数据先做一个顶层的分析,是用监督学习还是无监督模型,问题的类型是属于分类还是回归。在实际选择时,也通常会选用不同的模型进行训练,然后比较输出结果并选择最佳的那个。 模型训练的根本,是找到最合适的权重,以最大限度地进行分类(分类问题中)、或使误差尽量小(回归问题中)。 我们以一个包含权重的公式为例: \[ y=ax_1+bx_2+cx_3 \] 其中,\(y\) 就是标签,在训练数据集中已经有正确的标注;而 \(x_1, x_2, x_3\) 即特征值。举个实际的例子: \[ 花的种类=a*花蕊颜色+b*叶子颜色+c*花瓣颜色 \] 在这个阶段的工作,就是通过训练反推出权重 a、b、c,使得这条公式的结果尽量逼近原始输入数据。并且要设定损失函数(Loss Function),设法减小整体误差,实际中常使用均方误差(MSE, Mean Squared Error)来计算损失函数的误差。 模型评估 在上一个阶段把误差降到足够小后即可停止训练,用预处理后的测试数据集来验证模型效果。 预测 在上个阶段模型达到了预期的准确率和覆盖率(召回率)之后,就可以把模型拿来实际使用了。 入门机器学习要两手抓,一方面是算法基础,另一方面是代码练习。这样才能在学习中巩固,把理论基础转化为实际用途。 下一篇文章我们先介绍机器学习环境的配置。 参考与致谢 Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 3rd Edition (https://github.com/ageron/handson-ml3) 《程序员的 AI 书:从代码开始》 《AI 制胜:机器学习极简入门》

2025/9/17
articleCard.readMore