动态电路是指含有电容电感等储能动态元件的电路,由于动态元件的特性方程当中含有微分积分形式,因此动态电路主要采用微分方程进行描述,其中方程的阶数通常等于电路当中动态元件的个数。本文所指的动态也称为暂态,是指电路从一个稳态变化到另外一个稳态的中间变化过程,也称为过渡过程。而稳态则被称为静态,指电路当中的电压、电流等参数达到一个稳定状态,如果电路不发生变化,就会一直以该状态运行。

本文主要讨论了动态电路的暂态分析正弦交流电路稳态分析含二端口元件电路分析等动态电路分析方面的内容,阅读前应当具备微分积分微分方程复数运算线性代数方程组矩阵傅里叶级数高等数学知识。本文在撰写过程当中,参考阅读了国外大学普遍采用的《Electric Circuits》第 10 版教材。

阅读全文 »

优秀的 PCB 设计者同时也是出色的艺术家,但是伴随 5G 的全面商用以及物联网设备的普及,电路板走线越来越精密,信号频率日益提高,电磁干扰问题日趋严重,PCB 设计人员不得不去面对一个现实问题:PCB 电路板已经开始像一个具有电阻、电容、电感的组件,而非像过去 10 年前那样仅仅作为线路连接的平台。电磁兼容性信号完整性的问题日益突出,对于 PCB 布线与元器件布局的要求越来越高。

本文首先介绍了 PCB 制造工艺与元器件封装相关的知识,然后重点讨论了笔者工作过程当中总结的一些 PCB Layout 方面的基本布线规范与设计原则。当然,信号完整性作为一个比较系统的工程化问题,这些经验与原则并非绝对适用于任意场合,实际布线时仍然需要具体问题具体分析,结合实际的工况进行设计。而对于信号完整性方面的各类繁杂问题,将会专门新开一篇文章另行讨论。

阅读全文 »

物联网(IoT,Internet of Things)通过各种网络以及传感器技术,按照约定的协议将无处不在设备联结起来,进行信息的传输与控制交互,以实现智能化的信息感知、识别、管理,从而构建出万物相联的智能化环境,将网络连接能力渗透到现实世界的方方面面。而且伴随近年来 5G 无线网的逐步商用,通过低延迟、大容量的 5G 无线通信基础设施,物联网技术也必将会在诸多领域为社会带来巨大的创新。

本文所要讨论的 遥测消息传输协议(MQTT,Message Queuing Telemetry Transport) 是用于物联网环境的 OASIS 轻量级消息传输协议,主要应用于受限设备、以及低带宽高网络延迟的场景。采用发布/订阅模式,可以一对多进行消息发布;主要基于 TCP/IP 提供有序、无损的双向连接,并且最小化协议交换,可以有效降低传输开销。目前 MQTT 最新的协议标准为 2019 年发布的 V5.0,相较于早期的 V3.1.1 版本进行了较大改进,并且支持众多的新特性。

阅读全文 »

电子技术发展至今,基础理论方面的突破甚少,进步主要体现在工艺、材料与制程方面。特别是大规模集成电路的广泛应用,过去需要采用大量分立式元器件才能完成的工作,都已经被标准化的模拟、数字集成电路所替代。电子工程师的日常工作内容,逐步从过去各类基础电路的搭建,切换至电子自动化设计 EDA(Electronic Design Automation)、信号完整性 SI(Signal Integrity)、电磁兼容性 EMC(Electro Magnetic Compatibility)等方面。

模拟电子技术作为现代电子工业的理论基石,主要围绕双极性结型晶体管 BJT场效应晶体管 FET 构成的模拟信号放大电路展开,着重分析了其频率响应以及负反馈等特性。伴随近年碳化硅、氮化镓等第三代半导体材料在新能源汽车等领域的广泛应用,模拟电子元件在体积、效率、可靠性方面都取得了显著的提高,本文在写作过程当中参考了《Electronic Devices and Circuit Theory》第 11 版一书。

阅读全文 »

电路分析作为电子信息工程技术专业的的先导课程,主要讨论电路当中的电磁现象及其发生过程,其理论与工程实践紧密相连,分析过程中需要注意电路模型实际电路测量值计算值的差别与联系。由于电路分析技术的本质是数学在电路当中的应用,因此学习过程需要注重将电路分析方法与数学知识相结合。此外,由于每一种电路模型都具备特定的工作条件,所以 在分析过程当中,还需要根据不同工作场景选择合适的电路模型。

电阻电路是指除电源之外,仅包含有电阻元件的电路(或存在电感与电容元件,但是对于电路影响可忽略不计),其中电阻电路的电压电流同频率并且同相位。本文主要讨论了电阻电路分析相关的基本概念与两类约束电路的等效变换电阻电路的分析方法常用电路定理等方面内容。全文在编撰过程当中,参阅了《Introductory Circuit Analysis》第 13 版一书。

阅读全文 »

MathJax 是一款运行于 Web 浏览器当中的开源 JavaScript 数学符号渲染引擎,通过它可以方便的在现代 Web 浏览器当中显示数学公式,目前已经能够解析 LaTexMathML 等标记语言。MathJax 项目发源于 2009 年,目前由 NumFOCUS 基金会主持,并且得到了 MathJax 联盟的支持,该联盟是美国数学协会(AMS)和 工业与应用数学协会(SIAM)的共同合资企业。

LaTeX 是一种高质量的排版格式,可以生成复杂的表格与数学公式,是当前电子与数学出版行业的事实标准。本文以 Pandoc 作为 LaTex 渲染引擎(一款用于标记语言文档转换的命令行工具),分门别类的总结了撰写数学公式所需要经常使用到的 LaTeX 语法,方便写作相关科技类文章时随手查阅。

阅读全文 »

二十一世纪,数字化浪潮席卷了电子工业领域,与传统的模拟电子系统相比,数字系统具备更加优异的精确与可靠性,逐步取代了许多模拟电路的应用场景。数字逻辑电路是对数字信号进行算术与逻辑运算的电路,以逻辑门作为基本电路单元(最早采用 TTL 工艺,伴随半导体工艺技术的不断进步,目前已经逐步被 CMOS 工艺取代),数字电路可以分为组合逻辑电路(基本逻辑门)和时序逻辑电路(逻辑门 + 反馈逻辑回路)两大类。

本篇文章讲解了数字逻辑电路的分析与设计所涉及到的基础理论,首先讲解了数制码制逻辑代数等基础知识,接着重点描述组合逻辑电路时序逻辑电路的分析与设计方法,然后讨论了各种数字集成电路( 含门电路、可编程逻辑元件、半导体存储器)的原理以及使用方法,并且介绍了硬件描述语言可编程逻辑器件的相关知识,最后一部分讲解AD/DA转换以及脉冲波形的产生和转换电路。

阅读全文 »

Shell 既是一套命令行工具(交互式地解释和执行用户输入的命令)也是一种脚本设计语言(定义有变量与参数,并提供了控制、循环、分支结构)。Bash Shell 是由 GUN 官方项目提供的 Shell 解释器,名称源自于 Bourne Again SHell 的英文缩写,整合了传统 Korn Shell 以及 C Shell 的有效特性,并且尽量遵循IEEE POSIX P1003.2/ISO 9945.2规范,同时在编程与交互使用方面提供了大量的功能改进,因而在提供丰富功能的基础之上,展现出了良好的兼容特性,大多数.sh脚本可以无需移植修改即可交由 Bash Shell 来执行。

当用户登入任意一款 Linux 操作系统时,初始化程序init都将会为用户启动一个Bash Shell命令解析器,其即可以用于解析命令行输入并与内核进行交互,也可以作为高效的脚本编程语言,运用其提供的变量、参数、循环、分支等编程语法特性,完成一些批量的自动化的任务处理工作,本文将会围绕 Bash Shell 的脚本编程特性,加以进行详细的分析、说明与示例。

阅读全文 »

Qt 5.14.2 是跨平台应用开发框架 Qt 的最新版本,除了采用基于 C++11 的经典 Qt Widgets 进行桌面应用程序开发以外,还支持通过 Qt Quick 快速开发适用于移动端设备的用户界面,因为 Qt 5 底层图形渲染引擎基于 GPU 硬件加速,所以其能够保持与原生 C++ 近乎等同的运行效率。笔者计划通过两篇文章分别对这 2 种技术进行介绍,但是无论如何,在传统跨平台桌面应用开发领域,Qt Widgets 依然是 Qt5 最为基础与核心的内容。

虽然 Qt 6 发布在即,但是官方声明将会依然保持 API 的兼容与稳定性,因此本文依然基于当前最新的 Qt5 稳定版本撰写。全文将会分别对 Qt Widgets 当中使用较为频繁的窗口部件布局管理应用主窗口事件系统对象模型风格与样式国际化等部分内容进行深入介绍,同时展示完善的示例代码以及程序运行效果,并结合《QtQuick 篇》一文讲解混合编程相关的技术。

阅读全文 »

由于 Material Style 这样富含动画效果的用户界面风格,并不能简单的加入到以静态图形作为主要显示单元的QWidget当中。所以 Qt 官方推出了一种声明式编程语言 QML(Qt 元对象语言,Qt Meta-Object Language),其提供了一种具有更高可读性的声明式语法,并附带了必要的 JavaScript 语句和动态属性绑定支持。QML 的语言特性和引擎框架由 Qt QML 模块提供,该模块同时提供了 QMLC++ 两套接口。

Qt Quick 是一款基于 QML 的应用程序标准库,包含有可视化类型、交互类型、动画、模型和视图、粒子特效等特性,这些都是由 Qt5 上的Qt Quick模块提供,通过import语句即可方便的进行导入。Qt Quick 同样提供了 QMLC++ 两套接口,可以轻松构建具有流畅动画效果的动态 QML 用户界面。而 Qt 5.7 版本以后推出的 Qt Quick Controls 更是提供了丰富的开箱即用控件,让快速开发成为了可能。

阅读全文 »

万众期待的 Raspberry Pi 4B 终于发布,之前由于产品原型的需要,一直计划采购 3B+,后来供应商透露新版 4B 稍晚就会面市,所以稍微等待了一段时间,今天终于拿到了一块 2G 内存的板子。一直以为 4B 只会简单的更新一下 SoC 并增大 DDR 容量,但是实际上还带来了 Type-CBluetooth 5.0Micro HDMIUSB 3.0 乃至 DDR4 等诸多崭新升级。而官方推荐的应用范围,开始从教育渗透至工业领域,逐步发展为一套完整的嵌入式生态链。

本文基于树莓派基金会官方提供的 《Raspberry Pi Documentation》,笔者翻译了其中较为常用的配置章节,便于读者拿到板子以后能够快速上手,并避免使用一些官方不推荐的操作和工具库。此外,本文也会涉及 OpenCVdlib 的编译,以及 Electron 在树莓派上的部署等话题。文章内容将会伴随笔者的日常使用而长期进行更新,欢迎各位爱好者朋友持续关注与勘误。

阅读全文 »

对于国内中小型电子企业的工程师而言,Altium Designer、Pads、Allegro 等商业 EDA 工具的授权费用过于昂贵,且大部分仅提供了 Windows 操作系统版本,缺乏相应的跨平台支持。在电子行业版权问题逐步受到重视的今天,一款易使用、低成本的 EDA 工具对于广大电子工程师显得尤为重要。而 PCB 设计流程与布局布线经验超越 EDA 工具本身,如果没有丰富的元件库与封装库支持,也会面临无米难为炊的困境。

本文介绍的KiCad 是一款基于 GPL 开源许可下的跨平台 EDA 电子设计自动化工具集,能够处理多达 32 个铜层、14 个技术层、4 个辅助层的 PCB 电路板,并且生成加工制造所需要的所有文件(包括照片绘图仪的 Gerber 文件、钻孔文件、元件位置文件等),官方开源社区提供并维护了丰富的第三方库可供选用,而针对开源 EDA 工具普遍存在的自动布线功能偏弱的问题,KiCad 也通过FreeRouting提供了有力支持。文中所涉及原理图与 PCB 样图,皆已共享至笔者的 Github 项目Abrams

阅读全文 »

相对于采用 LQFP48 封装的 STM32F103C8T6 微控制器,采用 LQFP144 封装的 STM32F103ZET6 时钟频率虽然同为72MHz,但提供了更加丰富的片上外设资源,例如高达512KbytesFlash 程序存储器和64KbytesSRAM 数据存储器,以及 12 通道DMA控制器,内置 2 个基本定时器 2 个高级定时器 4 个通用定时器,以及 3 个12bitADC 与 2 个12bitDAC 转换器,同时还支持多达 3 组 SPI、2 组 I²C、 5 组USART、1 组CAN、1 组 SDIO 接口和 1 组全速 USB2.0 接口。

本文基于 ST 官方近年力推的 HAL(Hardware Abstraction Layer)与 LL(Low-layer)开发库,结合 STM32CubeIDE 提供的图形化配置工具,参考意法半导体官方文档《STM32F103xE Data Sheet》和《STM32F103xx Reference Manual》以及《Description of STM32F1 HAL & LL drivers》,并且结合《ARM Cortex-M3 & Cortex-M4 权威指南》一书,对于微控制器片上外设资源的编程方法进行了详细的分析与示例。

阅读全文 »

Arduino 是一款目前非常成熟的物联网产品原型开发工具,其硬件设计、IDE 工具、微控制器核心库皆基于开源协议发布,其中,Eagle 原理图以及 PCB 布线遵循 Creative Commons Attribution Share-Alike 许可,而 IDE 环境的源代码基于 GPL 协议,微控制器的 C/C++ 库则是基于 LGPL 协议。自从 2005 年首块 Arduino 开发板发布以来,已经推出了众多满足不同需求的硬件以及软件库,开源社区也日渐活跃与丰富。

Arduino Uno 是整个 Arduino 家族当中使用最为广泛、文档最为齐全的一款硬件产品,基于 Microchip 微芯公司的 8AVR 单片机 ATmega328P,工作电压为5V,采用16MHz的无源谐振器,并拥有32 KBFlash 存储器(其中0.5KB用于Bootloader程序),以及2KBSRAM1KBEEPROM。本文采用的 Arduino 硬件是于 2011 年发布的 Arduino Uno R3 版本,是当前国内市场运用最为广泛的一款型号。

阅读全文 »

Android 可以采用 Kotlin、Java、C++ 语言编写应用程序,Android SDK 会将这些代码连同相应的数据和资源文件编译为 Android 软件包,即一个带有.apk后缀的归档文件,也就是 Android 应用程序的安装文件。本质上 Android 系统是一种多用户的 Linux 系统,每个应用程序都运行在独立的 Linux 用户 ID进程之下,从而为每个 Android 应用都提供了独立的安全沙盒,体现了最小权限的设计原则。

鉴于 Google 官方提供了完善的文档,本文并不过多过深的涉及 Android SDK 开发的具体知识细节,仅会在简单介绍 Android 开发当中的一些基本概念之后,着重分析经典/低功耗蓝牙NFCWIFI指纹识别5G 等硬件外设的通信协议概念以及相应的实现步骤,并且展示一些比较典型的应用场景与示例代码,从而为读者在进行物联网相关项目的开发时,在移动设备应用控制端提供即有的现成经验。

阅读全文 »

STLink 是由意法半导体公司推出的在线调试编程器,采用5VUSB2.0全速接口进行供电与数据传输,可以方便的对内部固件进行升级,同时支持以 JTAGSWD 模式连接至 STM32 系列微控制器,或者以 SWIM 模式连接至 STM8 系列微控制器,操作温度介于0 ~ 50℃之间。由于 ST 公司极为重视中国市场,因此 STLink 的销售价格相对其它国外大厂的在线仿真设备要实惠许多,基本成为国内嵌入式工程师人手上必备的工具。

本文详细介绍 Keil uVision 5 开发环境下 ST-LINK/V2 版本的调试编程器使用方法,并介绍了相关接口的详细定义与接线方法,文中部分内容翻译至意法半导体官方提供的《用于 STM8 与 STM32 的 ST-LINK/V2 在线调试编程器用户手册》,以确保使用方法与解释的规范性。

阅读全文 »

GNU Make用于控制如何从程序的源代码文件编译并链接为可执行文件,通过make命令从名称为makefile的文件中获取构建信息,该文件定义了一系列规则来指定源文件的编译先后顺序、是否需要重新编译、甚至于进行更为复杂的操作。通过makefile文件可以方便的实现工程的自动化编译,只需要执行make命令即可完成编译动作,从而极大的提高了开发人员的工作效率。

CMake 3.17是一款源代码构建管理工具,最初作为各种 Makefile 方言的生成器,后来逐步发展为现代化的构建系统,广泛用于 C 和 C++ 工程源代码的构建。官方提供的《CMake Tutorial》 为开发人员提供了一个循序渐进的指南,涵盖了 CMake 构建过程中常见问题的解决方案。如果需要构建从第三方发布的源代码包,则可以参考《User Interaction Guide》。而《Using Dependencies Guide》则主要针对需要使用第三方库的开发人员。

阅读全文 »

自本世纪六十年代开始,数字半导体技术席卷了全球电子工业,伴随工艺与制程的持续演进,高频高速电子信号的处理需求愈加旺盛,电子技术的发展重心逐步由模拟时代,过渡至全面的数字化阶段。虽然模拟电路以及分立式电子元器件的使用频率逐年下降,但是在电磁兼容性处理、开关电源设计等场景当中,传统的模拟电子技术以及相关分立式元器件依然扮演着不可或缺的角色。

本文定位为一篇导论性质的文章,用于帮助当前开发团队里的嵌入式软件工程师,快速了解模拟数字电子技术相关的术语与概念,因此行文中并不涉及各类电路原理的深入数学分析,仅仅言简意赅的汇总了日常工作相关的模拟、数字电路知识。文章中的部分公式与原理图摘取自维基百科,写作过程当中参考了《Practical Electronics for Inventors》第 4 版一书。

阅读全文 »

意法半导体提供的Nucleo F767ZI是一款基于 Cortex M7 高性能内核与 LQFP144 封装的 STM32F767ZIT6U 微控制器评估板,旨在为开发人员提供了一种灵活廉价的方式搭建产品原型,从而为后期产品选型提供帮助。微控制器配套的 CUBESTM32Cube_FW_F7_V1.15.0还分别提供有针对于该评估板的 HALLL 示例工程,便于开发者快速上手。

该评估板提供了兼容 Arduino™Uno V3 提供的 ST Zio 连接器(黑色插座)以及引用微控制器全部资源的 ST Morpho 扩展接口(两侧焊盘),同时板载有 ST-LINK V2 调试编程器,以及 3 枚用户 LED 和 2 个用户按键外加 1 只 32.768kHz 外置晶振;此外还搭载了全速的 USB OTG 和以太网接口 RJ45

嵌入式 Linux 是将日益流行的 Linux 操作系统进行裁剪与修改,使之能在嵌入式硬件上运行的一种操作系统,拥有许多开源的参考与移植,也出现了 RTLinux 等实时性更强的发行版本。嵌入式 Linux 应用开发过程当中,会大量运用到 C 语言去开发原生的 Linux 应用程序,从而获得较小的存储空间占用,以及更高的执行效率,并且能够兼顾较好的代码维护效率。

本文首先会介绍文件 IO进程与进程间通信多线程网络编程等 Linux 原生应用程序开发的内容,然后分门别类的对串口GPIOSPII2C 等常用的协议开发进行了介绍。阅读本文前需要具备 C 编程语言基础,并且理解 GNU 编译器、链接器、调试器的相关概念。

阅读全文 »