自己的原文哦~ https://blog.51cto.com/whaosoft/12246143
一、成功部署物联网设备的4要素
接入物联网设备可能是一个复杂的过程。管理员必须始终在各种设备上运行,并确保安全连接。
要安装物联网设备,管理员必须将其连接到本地网络和互联网,以便设备可以执行预期的任务。接下来,他们必须将设备连接到它将使用的特定应用程序。
这些应用程序提供了额外的安全和配置层,管理员在提供IoT设备时必须导航。
要成功部署物联网设备,需要解决以下四个要素:
1. 提前计划数据的存储和使用
物联网设备没有很多内置存储,因此它们必须将收集到的数据上传到基于云的或本地存储系统。这意味着监督物联网部署的管理员应该了解可用的数据存储基础设施的类型,它可以存储多少数据,以及何时备份或删除某些数据存储。
制定一项政策,解决从物联网设备收集的公司数据的使用和所有权问题。如果用户可以在其个人设备上访问公司数据,并可能存储或转发这些数据,请将这种使用与公司数据治理政策保持一致。用户必须清楚地了解数据使用规则,以及违反规则的法律风险。
2. 自动化设备部署和配置
物联网管理员可以依靠api来快速供应设备,并使用零接触供应——这些功能通常包含在物联网管理软件中。
这些选项减少了物联网设备的配置和部署时间,但它们也不是没有挑战。例如,零接触供应(一种自动设置和配置设备的方式)几乎不需要人工干预。不过,管理员应该意识到潜在的配置文件问题,并有强大的安全协议来防止黑客。
3. 使用企业物联网软件进行设备管理
企业物联网设备管理软件维护被授权网络使用和访问的所有设备的列表。它还可以跟踪每个设备的权限并执行安全协议。此外,该软件可以限制访问和/或安装某些应用程序和数据在每个设备的基础上。
除了设备管理之外,企业物联网软件还为管理员提供了关于其物联网基础设施运行方式的见解。通过实时数据和警报,管理员可以了解任何联网物联网设备的健康状况和状态。如果设备脱机或有连接问题,IT团队会收到通知,以便他们可以排除故障并在需要时重新配置硬件。
4. 设置适当的安全级别
物联网设备的默认安全设置通常很宽松。It部门负责加强这些设置,以确保设备符合公司安全和治理标准。
作为供应过程的一部分,颁发新设备密码并设置设备证书。这些证书为物联网设备提供了一个唯一的标识符,可以对设备进行身份验证,并保护设备免受IP攻击。
花点时间在特定设备上设置密码,看看哪些设备需要基于角色的访问,以便正确的用户访问必要的数据。
一旦设备配置并与物联网管理软件集成,就可以为新设备设置自动安全和应用程序更新。设备也应该自动跟踪,这样如果用户丢失或放错了设备,IT部门就可以找到它,并在必要时将其关闭。
二、认识电感器的重要作用与特性
电感器俗称电感,本质上是一个线圈,有空心线圈也有实心线圈,实心线圈有铁芯或者其它材料制成的芯,电感的单位是“H”,简称“亨”。此外,更小的单位是mH,uH,换算方式为1H=1000mH=1000000uH。
电感的常见作用
阻交通直
对于直流电,电感是相当于短路的;而对于交流电,电感是对其有阻碍作用的,交流电的频率越高,电感对它的阻碍作用越大。
变压器
对我们来说最熟悉的电感应用莫过于变压器了,如下图所示为变压器的电路符号。假如左侧线圈匝数为100,右侧匝数为50,如果左侧接220V交流电,那么右侧感应出来的电压为110V,即“匝数比=电压比”而电流却会截然相反;如果左侧流进1A电流,那么右侧会流出2A的电流,即“匝数比=电流的反比”,因为电感只会对电压、电流进行变化,而不能对功率进行变化,如果电压和电流都为正比显然是不合情理的。
RL低通滤波器
所谓低通滤波器是:低频信号可以通过,而高频信号不能通过,电路原理图如下图。输入信号如果是直流电,那么电感相当于一根导线;现在是短路,信号会经过电感,直接输出,而不经过电阻。如果我们逐渐升高电流的频率,由于电感对交流电有阻碍作用,通过电感的信号会慢慢变小,直到达到某一个频率,当高于这个频率之后的电流再也无法通过,这时候就形成了低通滤波器,这个频率就叫做截止频率,公式为 f=R/(2πL)。
RL高通滤波器
高通滤波器的道理和低通的类似,只不过电阻和电感的位置变了,如下图。如果是直流电,会经过电感流回去,这时候如果改变频率,当频率逐渐升高,由于电感对交流电的阻碍作用,当频率达到截止频率时,高频信号不经过电感,而直接把我们需要的高频信号输出。截止频率的计算也是 f=R/(2πL)。
以上列举了一些常用的电感应用,当然电感的作用远远不止这些,以上讲的都是基础,应用的时候考虑的远比以上所说的要多。
十种电感的特性
工字型电感
它的前身是挠线式贴片电感,工字型电感是它们的改良,挡板有效加强储能能力,改变EMI方向和大小,亦可降低RDC。它可以说是讯号通讯电感跟POWER电感的一种妥协。
贴片式的工字型电感主要用于几百kHz至一两MHz的较小型电源切换,如数字相机的LED升压、ADSL等较低频部份的讯号处理或POWER用途。它的Q值有20、30,做为讯号处理颇为适合。RDC比挠线式贴片电感低,作为POWER也是十分好用。当然,很大颗的工字型电感,那肯定是POWER用途了。
工字型电感最大的缺点仍是开磁路,有EMI的问题;另外,噪音的问题比挠线式贴片电感大。
色环电感
色环电感是最简单的棒形电感的加工,主要是用作讯号处理。本身跟棒形电感的特性没有很大的差别,只是多了一些固定物,和加上一些颜色方便分辨感值。因单价算是十分便宜,现时比较不注重体积,以及仍可用插件的电子产品,使用色环电感仍多。
空芯电感
空心电感主要是讯号处理用途,用作共振、接收、发射等。空气可应用在甚高频的产品,故此很多变异要求不太高的产品仍在使用。因为空气不是固定线圈的最佳材料,故此在要求越来越严格的产品趋势上,发展有限。
环形线圈电感
环形线圈电感,是电感理论中很理想的形状。闭磁路,很少EMI的问题,充分利用磁路,容易计算,几乎理论上的好处,全归环形线圈电感。可是,有一个最大的缺点,就是不好挠线,制程多用人工处理。线圈应用的相x关视频推荐:如何制作一个特斯拉线圈。
环形线圈电感最大量的,是用铁粉芯作材料跟树脂等混在一起,使得Air gap均匀分布在铁粉芯内部。
铁粉芯环形线圈电感的优点是环形,但缺点亦是环形。我前面曾说,使用者最喜欢的形状是方形,故此在妥协下环形线圈电感并不是最具优势。
贴片迭层高频电感
贴片迭层高频电感,其实就是空心电感。特性完全相同,不过因为容易固定,可以小型化。
贴片迭层高频电感跟空心电感比较,因为空气不是好的固定物,但空气的相对导磁率是一,在高频很好用,因此找一些相对导磁率是一,又是很好的固定物,那不是很好。
贴片迭层高频电感跟贴片挠线式高频电感的比较,贴片迭层高频电感的Q值不够高是最大的缺点,。
磁棒电感
磁棒电感是空心电感的加强,电感值跟导磁率成正比,塞磁性材料进空心线圈,电感值、Q值等都会大为增加。好处,就自己想象了。如果想不通,或者不想思考,要早点改行喔。磁棒电感是最简单、最基本的电感;30年到100年前,电感有什么应用,它就有什么应用,特性亦是如此。
SMD贴片功率电感
SMD贴片功率电感最主要是强调储能能力,以及LOSS要少。
穿心磁珠
穿心磁珠,就是阻抗器啦,电感是低通组件,可让低频通过,阻挡高频。
贴片磁珠
贴片磁珠就是穿心磁珠的下一代。
贴片高频变压器、插件高频变压器
高频变压器嘛,一般用于开关电源。
三、信号反射问题与相关电路设计技巧
号反射现象
信号传输过程中感受到阻抗的变化,就会发生信号的反射。这个信号可能是驱动端发出的信号,也可能是远端反射回来的反射信号。根据反射系数的公式,当信号感受到阻抗变小,就会发生负反射,反射的负电压会使信号产生下冲。信号在驱动端和远端负载之间多次反射,其结果就是信号振铃。大多数芯片的输出阻抗都很低,如果输出阻抗小于PCB走线的特性阻抗,那么在没有源端端接的情况下,必然产生信号振铃。
什么是过冲(overshoot):过冲就是第一个峰值或谷值超过设定电压——对于上升沿是指最高电压而对于下降沿是指最低电压。
什么是下冲(undershoot):下冲是指下一个谷值或峰值。过分的过冲能够引起保护二极管工作,导致过早地失效。过分的下冲能够引起假的时钟或数据错误(误作)。
过冲非常相关的是振铃,它紧随过冲发生,信号会跌落到低于稳态值,然后可能会反弹到高于稳态,这个过程可能持续一段时间,直到稳定接近于稳态。振铃持续的时间也叫做安定时间。振荡(ringing)和环绕振荡(rounding)的现象是反复出现过冲和下冲。
抑制信号反射等电路设计技巧
如果时钟信号链路比较长,为了解决信号反射问题,会在时钟输出信号上串接一个比如22或者33欧姆的小电阻。
而且随着电阻的加大,振铃会消失,然而信号上升沿不再那么陡峭了,串联电阻是为了减小反射波,避免反射波叠加引起过冲。
这个解决方法叫阻抗匹配,阻抗在信号完整性问题中占据着极其重要的地位。
四、电感四条腿?别奇怪,那是共模电感!
我们常见的电感是两个腿的,叫做差模电感。今天和大家介绍四个腿的共模电感。
差模电流与共模电流
差模电流
在一对差分信号线上,大小相同,方向相反的一对信号,一般是电路中的工作电流,对于信号线就是信号线与信号地线之间流动的电流。
共模电流
在一对差分信号线上,大小相同,方向相同的一对信号(或噪音)。在电路中,一般对地噪音一般都是以共模电流的方式传输的,所以又称为共模噪声。
抑制共模噪声
抑制共模噪声的方法多种多样,除了从源头去减少共模噪声外,通常我们抑制最常用的方法就是使用共模电感来滤除共模噪声,也就是将共模噪声阻挡在目标电路外面。即在线路中串联共模扼流器件。
这样做的目的是增大共模回路的阻抗,使得共模电流被扼流器所消耗和阻挡(反射),从而抑制线路中的共模噪声
共模扼流器或电感的原理
若在以某种磁性材料的磁环上绕上同向的一对线圈,当交变电流通过时,因为电磁感应而在线圈中产生磁通量。
对于差模信号,产生的磁通量大小相同、方向相反,两者相互抵消,因而磁环产生的差模阻抗非常小;
而对于共模信号,产生的磁通量大小和方向均相同,两者相互叠加从而使磁环产生了较大的共模阻抗。
这一特性使得共模电感对于差模信号的影响较小,而对共模噪声具有很好的滤波性能。
差模电流
通过共模线圈,磁力线方向相反,感应磁场削弱,从如下图磁力线方向可以看出—实线箭头表示电流方向,虚线表示磁场方向。
共模电流
通过共模线圈,磁力线方向相同,感应磁场加强,从如下图磁力线方向可以看出—实线箭头表示电流方向,虚线表示磁场方向。
共模线圈的电感或者称为自感系数,我们知道电感是表征产生磁场的能力。
对于共模线圈或者共模电感,当共模电流流过线圈时,由于磁力线方向相同,在不考虑漏感的情况下,磁通量叠加,其原理是互感。
下图红色线圈产生的磁力线穿过蓝色线圈,同时蓝色线圈产生的磁力线也穿过红色线圈,彼此相互感应。
从电感的角度来看,电感量也是成倍增加,磁链代表了总磁通量。
对于共模电感,当磁通量是原来的2倍时,匝数没有发生变化,电流也没没有发生变化,此时电感量增加为原来的2倍,意味着等效磁导率变为原来的2倍。
等效磁导率何以增加一倍,从下面的电感公式来看,由于匝数N不改变、磁路和磁芯截面积由磁芯的物理尺寸决定,因此也没有改变,唯一就是磁导率u增加了一倍,因而可以产生更多的磁通量。
所以,共模电感在共模电流通过时,工作在互感模式下。
在互感的作用下,等效电感量被成倍增加,共模感抗也会成倍增加,因而对共模信号有良好的滤波作用,也就是将共模信号用大阻抗阻挡,不让其通过共模电感,即不让此信号传输到电路的下一级,如下是电感产生的感抗ZL。
认识共模电感在共模模式下的电感量,主要线索是认识互感,一切的磁性元器件。无论什么名称只要把握磁场的变化形式,透过现象看磁场变化的本质,也会容易理解。
再者我们要始终把握磁力线,它是我们认识磁场的直观形式,试想无论同名端或异名端或者互感等概念或磁场现象,我们都是画磁力线去认识他们的——掌握之前讲解的"磁棒绕线法"。
五、充电器不接入电池就不输出电压,是怎样实现的?
对于常见的一些动力电池充电器,如电动车充电器,设计时有时会考虑当充电器的输出端未接入电池时,充电器不输出电压。具体这个功能是怎样实现的呢?请看以下下图:
当充电器的输出端未接入电池时,Q1的基极没有电流回路,Q1不导通,双向二极管DB3不会导通,故可控硅Q2不导通,电源次级输出的充电电压没有形成电流回路,所以此时在充电器的输出端是没有输出电压的。即使此时你在适配器的输出端接入一个电阻负载,同样,此时充电器的输出端也是没有输出电压的,为什么呢?同样的解释,因为可控硅Q2还是没有导通的条件,放电电流回路还是没有形成。
接下来我们看看,当我们在充电器的输出端接入电池时会发生什么?
当我们接入电池时,电池本身会有一定的电量,电池端会有一定的电压,电池的电压会由从电池正极--Q1发射极--Q1基极--R3--电池负极,形成一个电流回路,Q1会导通,如下图:
Q1基极电流回路
当Q1导通后,双向二极管DB3会导通,接着可控硅Q2被触发导通,电源次级输出的充电电压对电池会形成一个电流回路,电池正常充电,如下图:
可控硅触发电流回路
电池充电回路形成
此电路的重点在于利用待充电电池的剩余电量,给Q1的导通提供条件,该电路实现的前提是电池不能完全亏电,必须要有一点电量。
六、了解电容器
电容器是怎么一回事 ? 它是如何装电的,又是如何放电的?怎么同法拉弟扯上关系了?
电容器是这么一回事......
它是一种装电的容器,是一种容纳电荷的器件。
任何两个彼此绝缘且相隔很近的导体(包括导线)间都构成一个电容器
绝缘介质不同,导体间距不同,其装电的本领不同的,这个我们后面再详细说。
我们理解一下
电容器是如何装电又如何放电?
电容器充电示意图
电容器放电示意图
电容器装电的本领 — 静电容量
水桶装水的本领用容积表示,基本单位:立方米.
电容器装电的本领用静电容量表示,基本单位:法拉(F).
1法拉的意思是给1V的电压,这个电容器能装1库仑(6.25×1018个电子)电荷!
在电容器这个领域1法拉太大了……!皮法、纳法和微法才是常用的单位。
1法拉(F)=103毫法(mF)=106微法(uF)=109纳法(nF)=1012皮法(pF)
"为什么用法拉做容量的单位?"
童鞋们总是很认真!
用“法拉”做容量的单位,是让世人缅怀那个名叫“法拉弟”的牛人在电学上无与伦比的牛逼贡献!
让我们看看他有多牛逼......
他的全名叫迈克尔·法拉第——Michael Faraday
他幼年时没有受过正规教育,因家里贫穷只读了两年小学.
牛逼的人都早早退学创业去了!
他22岁开始有幸做了当时科技大咖戴维的仆人,帮老师擦鞋,做实验,跟着这个牛逼的大师在欧洲各国混江湖!
有个牛逼的导师是你是否能牛逼的前提!
他27岁开始在大师戴维的指导下,做了一系列不仅仅是擦鞋的事儿,其中在研究合金钢时首创了金相分析方法,今天科技研究合金都用这个方法….
牛逼的人干啥都像样!
他30岁时,干了一件他自己觉得很牛逼的事,发明一个只要有电通过相关机件就会转动的装置,人类历史上第一台电动机,,装置简陋,但它却是今天世界上使用的所有电动机的祖先。
但由于他没有先向当时的大牛逼导师戴维汇报就自行发表成果,大牛逼导师戴维表示很生气.他被认为不乖被打屁屁了,各门各派向他发出嘘声……
即使你已是个牛逼,但有大牛逼在场时,低调点!
在冷眼、诽谤甚至污辱中郁闷了很多年……, 他只能听服从安排去玩玻璃….,直到大牛逼戴维去世,才又做他喜欢做的事。
他40岁时,干了一件轰动江湖连当时各门各派的大咖们都觉得牛逼的大事,他用实验揭开了电磁感应定律,发明了圆盘发电机。
结构虽然简单,但它却是人类创造出的第一个发电机,现代世界上产生电力的发电机就是从它开始的。
……..他还有很多牛逼的事儿,如最先提出电场概念和电场线概念的。在电化学方面精心试验,总结了两个电解定律,这两个定律均以他的名字命名,构成了电化学的基础。他将化学中的许多重要术语给予了通俗的名称,如阳极、阴极、电极、离子等…….
法位第的劳动成果如同太阳般无私而实在地给人类带来光明动力!
是从法拉第的发明成果开始,才有我们人类社会今天五彩缤纷的世界!
法拉第的贡献惠及每个人,把人类文明提高到空前高度,把文明进程提前几百年……!
用“法拉”做容量的单位,我们就是这样率真地缅怀这个名叫“法拉弟”的牛人!
关于电容器装电的本领——静电容量的大小可以通过公式C=Q/U进行测算,当然现在有很多专用的仪器可以直接测试出来了。
关键是,电容器装电的本领——静电容量,由电极板正对面积、电极板间距和两电极板间的介质种类三决定的,公式关系如下:
即是说,电容器的绝缘介质不同,电极板间距不同,电板板正对面积不同其装电的本领不同的.
还有一点很重要的是,电容器的绝缘介质当存在某方面的优点时总会在另一方面存在缺点。
据此,为提高电容器的装电能力,或适应不同的使用场合,工程师们各显神通,创造出各有五花八门各有特点电容器。
七、红外遥控编解码
红外遥控器原理介绍
红外线遥控是目前使用最广泛的一种通信和遥控手段。由于红外线遥控装置具有体积小、 功耗低、 功能强、 成本低等特点, 因而, 继彩电、 录像机之后, 在录音机、 音响设备、 空调机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。工业设备中, 在高压、 辐射、 有毒气体、 粉尘等环境下, 采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。
红外遥控系统:通用红外遥控系统由发射和接收两大部分组成, 应用编/解码专用集成电路芯片来进行控制操作, 如图1所示。发射部分包括键盘矩阵、 编码调制、 LED红外发送器;接收部分包括光、 电转换放大器、 解调、 解码电路。
红外的简单发射接收原理
在发射端,输入信号经放大后送入红外发射管发射,在接收端,接收管收到红外信号后,由放大器放大处理后还原成信号,这就是红外的简单发射接收原理。
1、红外遥控系统结构
红外遥控系统的主要部分为调制、发射和接收,如下图所示:
红外遥控是以调制的方式发射数据,就是把数据和一定频率的载波进行“与”操作,这样既可以提高发射效率又可以降低电源功耗。
调制载波频率一般在30khz到60khz之间,大多数使用的是38kHz,占空比1/3的方波,载波波形如下图所示,这是由发射端所使用的455kHz晶振决定的。在发射端要对晶振进行整数分频,分频系数一般取12,所以455kHz÷12≈37.9kHz≈38kHz。
目前有很多种芯片可以实现红外发射,可以根据选择发出不同种类的编码。由于发射系统一般用电池供电,这就要求芯片的功耗要很低,芯片大多都设计成可以处于休眠状态,当有按键按下时才工作,这样可以降低功耗芯片所用的晶振应该有足够的耐物理撞击能力,不能选用普通的石英晶体,一般是选用陶瓷共鸣器,陶瓷共鸣器准确性没有石英晶体高,但通常一点误差可以忽略不计。
红外线通过红外发光二极管(LED)发射出去,红外发光二极管(红外发射管)内部构造与普通的发光二极管基本相同,材料和普通发光二极管不同,在红外发射管两端施加一定电压时,它发出的是红外线而不是可见光。
如上图是LED的驱动最简单电路,选用元件时要注意三极管的开关速度要快,还要考虑到LED的正向电流和反向漏电流,一般流过LED的最大正向电流为100mA,电流越大,其发射的波形强度越大。
电路有一点缺陷,当电池电压下降时,流过LED的电流会降低,发射波形强度降低,遥控距离就会变小。
上图所示的射极输出驱动电路可以解决这个问题,两个二极管把三级管基极电压钳位在1.2V左右,因此三级管发射极电压固定在0.6V左右,发射极电流IE基本不变,根据IE≈IC,所以流过LED的电流也基本不变,这样保证了当电池电压降低时还可以保证一定的遥控距离。
2、一体化红外接收头
红外信号收发系统的典型电路如上图所示,红外接收电路通常被厂家集成在一个元件中,成为一体化红外接收头。内部电路包括红外监测二极管,放大器,限幅器,带通滤波器,积分电路,比较器等。红外监测二极管监测到红外信号,然后把信号送到放大器和限幅器,限幅器把脉冲幅度控制在一定的水平,而不论红外发射器和接收器的距离远近。交流信号进入带通滤波器,带通滤波器可以通过30khz到60khz的负载波,通过解调电路和积分电路进入比较器,比较器输出高低电平,还原出发射端的信号波形。注意输出的高低电平和发射端是反相的,这样的目的是为了提高接收的灵敏度。
一体化红外接收头,如下图所示:
红外接收头的种类很多,引脚定义也不相同,一般都有三个引脚,包括供电脚,接地和信号输出脚。根据发射端调制载波的不同应选用相应解调频率的接收头。
红外接收头内部放大器的增益很大,很容易引起干扰,因此在接收头的供电脚上须加上滤波电容,一般在22uf以上。有的厂家建议在供电脚和电源之间接入330欧电阻,进一步降低电源干扰。
红外发射器可从遥控器厂家定制,也可以自己用单片机的PWM产生,家庭遥控推荐使用红外发射管(L5IR4-45)的可产生37.91KHz的PWM,PWM占空比设置为1/3,通过简单的定时中断开关PWM,即可产生发射波形。
红外编解码解析
1、编码格式
现有的红外遥控包括两种方式:PWM(脉冲宽度调制)和PPM(脉冲位置调制)。
两种形式编码的代表分别为NEC 和PHILIPS 的RC-5、RC-6 以及将来的RC-7。
PWM(脉冲宽度调制):以发射红外载波的占空比代表“0”和“1”。为了节省能量,一般情况下,发射红外载波的时间固定,通过改变不发射载波的时间来改变占空比。例如常用的电视遥控器,使用NEC upd6121,其“0”为载波发射0.56ms,不发射0.56ms;其“1”为载波发射0.56ms,不发射1.68ms;此外,为了解码的方便,还有引导码,upd6121 的引导码为载波发射9ms,不发射4.5ms。upd6121 总共的编码长度为108ms。
但并不是所有的编码器都是如此,比如TOSHIBA 的TC9012,其引导码为载波发射4.5ms,不发射4.5ms,其“0”为载波发射0.52ms,不发射0.52ms,其“1”为载波发射0.52ms,不发射1.04ms。
PPM(脉冲位置调制):以发射载波的位置表示“0”和“1”。从发射载波到不发射载波为“0”,从不发射载波到发射载波为“1”。其发射载波和不发射载波的时间相同,都为0.68ms,也就是每位的时间是固定的。
通过以上对编码的分析,可以得出以某种固定格式的“0”和“1”去学习红外,是很有可能不成功的。即市面上所宣传的可以学习64 位、128 位必然是不可靠的。
另外,由于空调的状态远多于电视、音像,并且没有一个标准,所以各厂家都按自己的格式去做一个,造成差异更大。比如:美的的遥控器采用PWM 编码,码长120ms 左右;新科的遥控器也采用PWM 编码,码长500ms 左右。如此大的差异,如果按“位”的概念来讲,应该是多少位呢?64?128?显然都不可能包含如此长短不一的编码。
2、红外遥控编码格式
红外遥控器的编码格式通常有两种格式:NEC 和RC5
NEC 格式的特征:
- 使用38 kHz 载波频率
- 引导码间隔是9 ms + 4.5 ms
- 使用16 位客户代码
- 使用8 位数据代码和8 位取反的数据代码
不过需要将波形反转一下才方便分析:
NEC 协议通过脉冲串之间的时间间隔来实现信号的调制(英文简写PWM)。
逻辑“0”是由0.56ms的38KHZ载波和0.560ms 的无载波间隔组成;逻辑“1”是由0.56ms 的38KHZ 载波和1.68ms 的无载波间隔组成;结束位是0.56ms 的38K 载波。
下面实例是已知NEC类型遥控器所截获的波形:
遥控器的识别码是Address=0xDD20;其中一个键值是Command=0x0E;
注意:波形先是发低位地址再发高位地址。
所以0000,0100,1011,1011 反转过来就是1101,1101,0010,000 十六进制的DD20;
键值波形如下:
也是要将0111,0000 反转成0000,1110得到十六进制的0E;另外注意8 位的键值代码是取反后再发一次的,如图0111,0000 取反后为1000,1111。最后一位是一个逻辑“1”。
RC5 编码相对简单一些:同样由于取自红外接收头的波形需要反相一下波形以便于分析:
反相后的波形:
根据编码规则:
得到一组数字:110, 11010, 001101根据编码定义:
第一位是起始位S通常是逻辑1。
第二位是场位F通常为逻辑1, 在RC5 扩展模式下它将最后6位命令代码扩充到7 位代码(高位MSB) , 这样可以从64 个键值扩充到128 个键值。
第三位是控制位C它在每按下了一个键后翻转, 这样就可以区分一个键到底是一直按着没松手还是松手后重复按。
如图所示是同一按键重复按两次所得波形, 只有第三位是相反的逻辑, 其它的位逻辑都一样。
其后是五个系统地址位:11010=1A, 最后是六个命令位:001101=0D。
八、选用电源滤波器 及 一二阶RC滤波设计
电源滤波器在电磁干扰中应用比较广泛,作用是滤除电源中所夹杂的有效频率以外的干扰频率,最终得到一个特定频率的电源信号或者滤除一个特定频率的电源信号。合理的对滤波器选型可以起到良好的抗干扰作用。建议从以下几个方面进行选型。
1 额定工作电压
滤波器在工作时,输入的电压不能太高,不能超过其长期稳定工作的电压,这个电压参数叫做额定电压。如果输入是220V的,则可以考虑额定电压为250V的滤波器。在选型时,留够余量,防止电压波动造成滤波器损坏。
2 额定工作电流
负载在正常工作时工作电流在一个范围之内,这个数值体现在负载的功耗或者额定电流上。滤波器加在电源和负载之间。所以,滤波器的额定工作电流要大于负载正常工作时的电流,在选型时也要留够余量
3 滤波方式
电源滤波的内部电路是LC滤波电路,可以构成低通滤波、高通滤波、带通滤波以及带阻滤波(陷波)等。在选用滤波方式时,一定要考虑自己的用途。一般情况下,带通滤波器最为常用。
4 插入损耗
插入损耗是衡量电源滤波器性能好坏的一个重要指标,用dB来表示,是指滤波器接入前后负载上功率的比值,dB数越大的话,说明滤波器抑制干扰的能力也就越好。在电源滤波器的规格书上都会有关于共模干扰和差模干扰的插入损耗曲线。
以上几个参数,是与性能紧密相关的参数,除此之外,还有工作温度、漏电流、绝缘电阻以及尺寸等参数,选型时需要注意。
在嵌入式系统中可以说,"无滤波器,不嵌入式",各种传感器信号多多少少会携带一些噪声信号,那么通过滤波器就能够更好的降低和去除噪声,还原真实有用信号,
而无源RC滤波器当然是大部分滤波器中首选的廉价设计,并且能较简单数字化为软件滤波器设计,所以软件与硬件滤波在于一个离散数字化的过程,所以整体设计上大同小异。
然而大部分工作多年的工程师还在盲调RC滤波参数,多多少少感觉有点凄凉,所以下面的内容能够帮助你更好的认识滤波器及设计过程。
当然很多人会问那还有很多复杂一点的滤波器如FIR,IIR等等,其实都打通小异吧
时域和频域
当您在示波器上查看电信号时,您会看到一条线,表示电压随时间的变化。在任何特定时刻,信号只有一个电压值。您在示波器上看到的是信号的时域表示。
典型的示波器跟踪显示非常直观,但也有一定的限制性,因为它不直接显示信号的频率内容。而与时域表示相反就是频域,其中一个时刻仅对应于一个电压值,频域表示(也称为频谱)通过识别同时存在的各种频率分量来传达关于信号的信息。
什么是滤波器?
滤波器是一个电路,其去除或“过滤掉”频率分量的特定范围。换句话说,它将信号的频谱分离为将要通过的频率分量和将被阻隔的频率分量。
如果您对频域分析没有太多经验,您可能仍然不确定这些频率成分是什么,以及它们如何在不能同时具有多个电压值的信号中共存。让我们看一个有助于澄清这个概念的简短例子。
假设我们有一个由完美的5kHz正弦波组成的音频信号。我们知道时域中的正弦波是什么样的,在频域中我们只能看到5kHz的频率“尖峰”。现在让我们假设我们激活一个500kHz振荡器,将高频噪声引入音频信号。
在示波器上看到的信号仍然只是一个电压序列,每个时刻有一个值,但信号看起来会有所不同,因为它的时域变化现在必须反映5kHz正弦波和高频噪音波动。
然而,在频域中,正弦波和噪声是在一个信号中同时存在的单独的频率分量。正弦波和噪声占据了信号频域表示的不同部分(如图1所示),这意味着我们可以通过将信号引导通过低频并阻挡高频的电路来滤除噪声。
图1:正弦波和噪声信号频域的不同部分分布
滤波器的类型
滤波器可以放在与滤波器频率响应的一般特征相对应的广泛类别中。如果滤波器通过低频并阻止高频,则称为低通滤波器;如果它阻挡低频并通过高频,它就是一个高通滤波器。还有带通滤波器,其仅通过相对窄的频率范围,以及带阻滤波器,其仅阻挡相对窄的频率范围(图2)。
图2:各滤波器频域表示
还可以根据用于实现电路的组件类型对滤波器进行分类。无源滤波器使用电阻器,电容器和电感器,这些组件不具备提供放大的能力,因此无源滤波器只能维持或减小输入信号的幅度。另一方面,有源滤波器既可以滤波信号又可以应用增益,因为它包括有源元件,如晶体管或运算放大器(图3)。
图3
这种有源低通滤波器基于流行的Sallen-Key拓扑结构。
本文将探讨无源低通滤波器的分析和设计。这些电路在各种系统和应用中发挥着重要作用。
RC低通滤波器
为了创建无源低通滤波器,我们需要将电阻元件与电抗元件组合在一起。换句话说,我们需要一个由电阻器和电容器或电感器组成的电路。从理论上讲,电阻—电感(RL)低通拓扑在滤波能力方面与电阻—电容(RC)低通拓扑相当。但实际上,电阻—电容方案更为常见,因此本文的其余部分将重点介绍RC低通滤波器(图4)。
图4:RC低通滤波器
如图所示,通过将一个电阻与信号路径串联,并将一个电容与负载并联,可以产生RC低通响应。在图中,负载是单个组件,但在实际电路中,它可能更复杂,例如模数转换器,放大器或示波器的输入级,用于测量滤波器的响应。
如果我们认识到电阻器和电容器形成与频率相关的分压器,就可以直观地分析RC低通拓扑的滤波动作(图5)。
图5:重新绘制RC低通滤波器,使其看起来像分压器
当输入信号的频率低时,电容器的阻抗相对于电阻器的阻抗高;因此,大部分输入电压在电容器上(和负载两端,与电容器并联)下降。当输入频率较高时,电容器的阻抗相对于电阻器的阻抗较低,这意味着电阻器上的电压降低,并且较少的电压传输到负载。因此,低频通过并且高频被阻挡。
RC低通功能的这种定性解释是重要的第一步,但是当我们需要实际设计电路时它并不是很有用,因为术语“高频”和“低频”非常模糊。工程师需要创建通过并阻止特定频率的电路。例如,在上述音频系统中,我们希望保留5kHz信号并抑制500kHz信号。这意味着我们需要一个滤波器,从5kHz到500kHz之间的传递过渡到阻塞。
RC低通滤波器
滤波器不会引起显著衰减的频率范围称为通带,滤波器确实导致显着衰减的频率范围称为阻带。模拟滤波器,例如RC低通滤波器,总是从通带逐渐过渡到阻带。这意味着无法识别滤波器停止传递信号并开始阻塞信号的一个频率。然而,工程师需要一种方便,简洁地总结滤波器频率响应的方法,这就是截止频率概念发挥作用的地方。
当您查看RC滤波器的频率响应图时,您会注意到术语“截止频率”不是很准确。信号光谱被“切割”成两半的图像,其中一个被保留而其中一个被丢弃,不适用,因为随着频率从截止点下方移动到截止值以上,衰减逐渐增加。
RC低通滤波器的截止频率实际上是输入信号幅度降低3dB的频率(选择该值是因为幅度降低3dB对应于功率降低50%)。因此,截止频率也称为-3dB频率,实际上该名称更准确且信息量更大。术语带宽是指滤波器通带的宽度,在低通滤波器的情况下,带宽等于-3dB频率(如图6所示)。
图6
图6表示RC低通滤波器的频率响应的一般特性,带宽等于-3dB频率。
如上所述,RC滤波器的低通行为是由电阻器的频率无关阻抗与电容器的频率相关阻抗之间的相互作用引起的。为了确定滤波器频率响应的细节,我们需要在数学上分析电阻(R)和电容(C)之间的关系,我们还可以操纵这些值,以设计满足精确规格的滤波器。RC低通滤波器的截止频率(fC)计算如下:
图7
我们来看一个简单的设计实例。电容值比电阻值更具限制性,因此我们将从常见的电容值(例如10nF)开始,然后我们将使用该公式来确定所需的电阻值。目标是设计一个滤波器,它将保留5kHz音频波形并抑制500kHz噪声波形。我们将尝试100kHz的截止频率,稍后在文章中我们将更仔细地分析此滤波器对两个频率分量的影响,公式如图8。
图8
因此,160Ω电阻与10nF电容相结合,将为我们提供一个非常接近所需频率响应的滤波器。
计算滤波器响应
我们可以通过使用典型分压器计算的频率相关版本来计算低通滤波器的理论行为。电阻分压器的输出表示如图9:
图9
图10
RC滤波器使用等效结构,但是我们有一个电容器代替R2(图10)。首先,我们用电容器的电抗(XC)代替R2(在分子中)。接下来,我们需要计算总阻抗的大小并将其放在分母中。因此,我们有(图11):
图11
电容器的电抗表示与电流的相反量,但与电阻不同,相反量取决于通过电容器的信号频率。因此,我们必须计算特定频率的电抗,计算公式如下(图12):
图12
在上面的设计实例中,R≈160Ω且C=10nF。我们假设VIN的幅度是1V,这样我们就可以简单地从计算中去掉VIN。首先让我们以正弦波频率计算VOUT的幅度(图12):
图13
正弦波的幅度基本不变。这很好,因为我们的目的是在抑制噪音的同时保持正弦波。这个结果并不令人惊讶,因为我们选择的截止频率(100kHz)远高于正弦波频率(5kHz)。
现在让我们看看滤波器如何成功衰减噪声分量(图14)。
图14
噪声幅度仅为其原始值的约20%。
可视化滤波器响应
评估滤波器对信号影响的最方便方法是检查滤波器频率响应的图。这些图形通常称为波德图,在垂直轴上具有幅度(以分贝为单位),在水平轴上具有频率;水平轴通常具有对数标度,使得1Hz和10Hz之间的物理距离与10Hz和100Hz之间,100Hz和1kHz之间的物理距离相同等等(图15)。这种配置使我们能够快速准确地评估滤波器在很大频率范围内的行为。
图15:频率响应图的一个例子
曲线上的每个点表示如果输入信号的幅度为1V且频率等于水平轴上的相应值,则输出信号将具有的幅度。例如,当输入频率为1MHz时,输出幅度(假设输入幅度为1V)将为0.1V(因为-20dB对应于十倍减少因子)。
当您花费更多时间使用滤波器电路时,此频率响应曲线的一般形状将变得非常熟悉。通带中的曲线几乎完全平坦,然后随着输入频率接近截止频率,它开始下降得更快。最终,衰减的变化率(称为滚降)稳定在20dB/decade-即,输入频率每增加十倍,输出信号的幅度降低20dB。
评估低通滤波器性能
如果我们仔细绘制我们在本文前面设计的滤波器的频率响应,我们将看到5kHz时的幅度响应基本上是0dB(即几乎为零衰减),500kHz时的幅度响应约为-14dB(对应于0.2的增益)。这些值与我们在上一节中执行的计算结果一致。
由于RC滤波器总是从通带到阻带逐渐过渡,并且因为衰减永远不会达到无穷大,我们无法设计出“完美”的滤波器—即对正弦波没有影响并完全消除噪声的滤波器。相反,我们总是需要权衡。如果我们将截止频率移近5kHz,我们将有更多的噪声衰减,但我们想要发送到扬声器的正弦波也会衰减更多。如果我们将截止频率移近500kHz,我们在正弦波频率下的衰减会减少,但噪声频率下的衰减也会减少。
前面我们已经讨论了滤波器修改信号中各种频率分量振幅的方式。然而,除了振幅效应之外,电抗性电路元件总是引入相移。
低通滤波器相移
相位的概念是指周期内特定时刻的周期信号的值。因此,当我们说电路引起相移时,我们的意思是它会在输入信号和输出信号之间产生偏差:输入和输出信号不再在同一时刻开始和结束它们的周期。相移值(例如45°或90°)表示产生的偏差量。
电路中的每个电抗元件都会引入90°的相移,但这种相移不会同时发生。输出信号的相位与输出信号的振幅一样,随着输入频率的增加而逐渐变化。RC低通滤波器中有一个电抗元件(电容器),因而电路最终也会引入90°的相移。
与振幅响应一样,通过检查水平轴表示对数频率的曲线图,可以最容易地评估相位响应。以下描述表示了一般模式,查看图16可以进一步了解详细信息。
- 相移最初为0°。
- 相移逐渐增加,直到在截止频率处达到45°;在这部分响应期间,变化率逐渐增加。
- 在截止频率之后,相移继续增加,但变化率逐渐降低。
- 随着相移逐渐接近90°,变化率变得非常小。
图16
实线是振幅响应,虚线是相位响应。截止频率为100kHz。注意,截止频率下的相移为45°。
二阶低通滤波器
到目前为止,我们假设RC低通滤波器由一个电阻器和一个电容器组成。这种配置是一阶滤波器。
无源滤波器的“阶数”由电路中电抗元件(即电容器或电感器)的数量决定。高阶滤波器具有更多的无功元件,会产生更多的相移和更陡的滚降,而后者是增加滤波器阶数的主要动机。
向滤波器添加一个电抗元件,例如,从一阶到二阶或二阶到三阶,便可将最大滚降增加20dB/十倍。
二阶滤波器通常围绕由电感器和电容器组成的谐振电路构建,这种拓扑结构称为RLC(Resistor-Inductor-Capacitor)。但是,也可以创建二阶RC滤波器。如下图所示,我们需要做的就是将两个一阶RC滤波器级联起来(图17)。
图17
虽然这种拓扑肯定会产生二阶响应,但它没有被广泛使用。正如我们将在下一节中看到的那样,其频率响应通常不如二阶有源滤波器或二阶RLC滤波器。
二阶RC滤波器的频率响应
我们可以尝试根据所需的截止频率设计一阶滤波器,然后从中选择两个串联连接来,从而构成二阶RC低通滤波器。此举确实可以使滤波器表示出类似的总频率响应,最大滚降为40dB/decade而不是20dB/decade。
但是,如果我们更仔细地观察响应,我们会发现-3dB频率出现降低。二阶RC滤波器的行为不符合预期,因为两个滤波阶段不是独立的,因此不能简单地将这两个滤波器连接在一起,并将电路分析为一阶低通滤波器叠加一个相同的一阶低通过滤。
此外,即使我们在两级之间插入缓冲器,使得第一阶RC和第二阶RC可以用作独立滤波器,此时原始截止频率处的衰减将是6dB而不是3dB。这恰恰是因为两阶独立工作而导致的。第一个滤波器在截止频率处具有3dB的衰减,而第二个滤波器加上了另外3dB的衰减(图18)。
图18
二阶RC低通滤波器的基本限制是设计人员无法通过调整滤波器的Q因子来微调从通带到阻带的转换;此参数表示频率响应的阻尼程度。如果将两个相同的RC低通滤波器级联,则整体传递函数对应于二阶响应,但Q因子始终为0.5。当Q=0.5时,滤波器处于过阻尼的边界,这会导致频率响应在过渡区域中“下垂”。二阶有源滤波器和二阶谐振滤波器没有这一限制;设计人员可以控制Q因子,从而微调过渡区域的频率响应。
小结
所有电信号都混合了所需频率分量和不需要的频率分量。不需要的频率分量通常由噪声和干扰引起,并且在某些情况下会对系统的性能产生负面影响。
滤波器是以不同方式对信号频谱的不同部分作出反应的电路。低通滤波器旨在让低频分量通过,同时阻止高频分量。
低通滤波器的截止频率表示滤波器从低衰减变为显著衰减的频率区域。
RC低通滤波器的输出电压可以通过将电路视为由(频率无关)电阻和(频率相关)电抗组成的分压器来计算。
振幅(以dB为单位,在垂直轴上)与对数频率(以赫兹为单位,在水平轴上)的曲线图是检查滤波器理论行为的方便有效的方法,还可以使用相位与对数频率的关系图来确定将要应用于输入信号的相移量。
二阶滤波器的滚降更陡峭;当信号不能在所需频率分量和不需要的频率分量之间提供宽带分离时,这种二阶响应比较有用。
可以通过构建两个相同的一阶RC低通滤波器,然后将一个的输出连接到另一个的输入来创建二阶RC低通滤波器,但最终整体的-3dB频率将低于预期。
九、常见电机的控制算法
BLDC电机控制算法
无刷电机属于自换流型(自我方向转换),因此控制起来更加复杂。
BLDC电机控制要求了解电机进行整流转向的转子位置和机制,对于闭环速度控制,有两个附加要求,即对于转子速度/或电机电流以及PWM信号进行测量,以控制电机速度功率。
BLDC电机可以根据应用要求采用边排列或中心排列PWM信号。大多数应用仅要求速度变化操作,将采用6个独立的边排列PWM信号。这就提供了最高的分辨率。如果应用要求服务器定位、能耗制动或动力倒转,推荐使用补充的中心排列PWM信号。
为了感应转子位置,BLDC电机采用霍尔效应传感器来提供绝对定位感应。这就导致了更多线的使用和更高的成本。无传感器BLDC控制省去了对于霍尔传感器的需要,而是采用电机的反电动势(电动势)来预测转子位置。无传感器控制对于像风扇和泵这样的低成本变速应用至关重要。在采有BLDC电机时,冰箱和空调压缩机也需要无传感器控制。
空载时间的插入和补充
大多数BLDC电机不需要互补的PWM、空载时间插入或空载时间补偿。可能会要求这些特性的BLDC应用仅为高性能BLDC伺服电动机、正弦波激励式BLDC电机、无刷AC、或PC同步电机。
控制算法
许多不同的控制算法都被用以提供对于BLDC电机的控制。典型地,将功率晶体管用作线性稳压器来控制电机电压。当驱动高功率电机时,这种方法并不实用。高功率电机必须采用PWM控制,并要求一个微控制器来提供起动和控制功能。
控制算法必须提供下列三项功能:
- 用于控制电机速度的PWM电压
- 用于对电机进整流换向的机制
- 利用反电动势或霍尔传感器来预测转子位置的方法
脉冲宽度调制仅用于将可变电压应用到电机绕组。有效电压与PWM占空度成正比。当得到适当的整流换向时,BLDC的扭矩速度特性与以下直流电机相同。可以用可变电压来控制电机的速度和可变转矩。
功率晶体管的换向实现了定子中的适当绕组,可根据转子位置生成最佳的转矩。在一个BLDC电机中,MCU必须知道转子的位置并能够在恰当的时间进行整流换向。
BLDC电机的梯形整流换向
对于直流无刷电机的最简单的方法之一是采用所谓的梯形整流换向。用于BLDC电机的梯形控制器的简化框架,如下图所示。
在这个原理图中,每一次要通过一对电机终端来控制电流,而第三个电机终端总是与电源电子性断开。
嵌入大电机中的三种霍尔器件用于提供数字信号,它们在60度的扇形区内测量转子位置,并在电机控制器上提供这些信息。由于每次两个绕组上的电流量相等,而第三个绕组上的电流为零,这种方法仅能产生具有六个方向共中之一的电流空间矢量。随着电机的转向,电机终端的电流在每转60度时,电开关一次(整流换向),因此电流空间矢量总是在90度相移的最接近30度的位置。
梯形控制:驱动波形和整流处的转矩,示意图如下。
因此每个绕组的电流波型为梯形,从零开始到正电流再到零然后再到负电流。
这就产生了电流空间矢量,当它随着转子的旋转在6个不同的方向上进行步升时,它将接近平衡旋转。
在像空调和冰霜这样的电机应用中,采用霍尔传感器并不是一个不变的选择。在非联绕组中感应的反电动势传感器可以用来取得相同的结果。
这种梯形驱动系统因其控制电路的简易性而非常普通,但是它们在整流过程中却要遭遇转矩纹波问题。
BLDC电机的正弦整流换向
梯形整流换向还不足以为提供平衡、精准的无刷直流电机控制。这主要是因为在一个三相无刷电机(带有一个正统波反电动势)中所产生的转矩由下列等式来定义:
转轴转矩= Kt [IRSin(o) + ISSin(o+120) +ITSin(o+240)] 如果相位电流是正弦的:IR = I0Sino; IS = I0Sin (+120o); IT = I0Sin (+240o) 转轴转矩= 1.5I0*Kt(一个独立于转轴角度的常数) |
正弦整流换向无刷电机控制器努力驱动三个电机绕组,其三路电流随着电机转动而平稳的进行正弦变化。选择这些电流的相关相位,这样它们将会产生平稳的转子电流空间矢量,方向是与转子正交的方向,并具有不变量。这就消除了与北形转向相关的转矩纹波和转向脉冲。
为了随着电机的旋转,生成电机电流的平稳的正弦波调制,就要求对于转子位置有一个精确有测量。霍尔器件仅提供了对于转子位置的粗略计算,还不足以达到目的要求。基于这个原因,就要求从编码器或相似器件发出角反馈。
BLDC电机正弦波控制器的简化框图,如下。
由于绕组电流必须结合产生一个平稳的常量转子电流空间矢量,而且定子绕组的每个定位相距120度角,因此每个线组的电流必须是正弦的而且相移为120度。采用编码器中的位置信息来对两个正弦波进行合成,两个间的相移为120度。然后,将这些信号乘以转矩命令,因此正弦波的振幅与所需要的转矩成正比。结果,两个正弦波电流命令得到恰当的定相,从而在正交方向产生转动定子电流空间矢量。
正弦电流命令信号输出一对在两个适当的电机绕组中调制电流的P-I控制器。第三个转子绕组中的电流是受控绕组电流的负和,因此不能被分别控制。每个P-I控制器的输出被送到一个PWM调制器,然后送到输出桥和两个电机终端。应用到第三个电机终端的电压源于应用到前两个线组的信号的负数和,适当用于分别间隔120度的三个正弦电压。
结果,实际输出电流波型精确的跟踪正弦电流命令信号,所得电流空间矢量平稳转动,在量上得以稳定并以所需的方向定位。
一般通过梯形整流转向,不能达到稳定控制的正弦整流转向结果。然而,由于其在低电机速度下效率很高,在高电机速度下将会分开。这是由于速度提高,电流回流控制器必须跟踪一个增加频率的正弦信号。同时,它们必须克服随着速度提高在振幅和频率下增加的电机的反电动势。
由于P-I控制器具有有限增益和频率响应,对于电流控制回路的时间变量干扰将引起相位滞后和电机电流中的增益误差,速度越高,误差越大。这将干扰电流空间矢量相对于转子的方向,从而引起与正交方向产生位移。
当产生这种情况时,通过一定量的电流可以产生较小的转矩,因此需要更多的电流来保持转矩,效率降低。
随着速度的增加,这种降低将会延续。在某种程度上,电流的相位位移超过90度。当产生这种情况时,转矩减至为零。通过正弦的结合,上面这点的速度导致了负转矩,因此也就无法实现。
AC电机算法
标量控制
标量控制(或V/Hz控制)是一个控制指令电机速度的简单方法。
指令电机的稳态模型主要用于获得技术,因此瞬态性能是不可能实现的。系统不具有电流回路。为了控制电机,三相电源只有在振幅和频率上变化。
矢量控制或磁场定向控制
在电动机中的转矩随着定子和转子磁场的功能而变化,并且当两个磁场互相正交时达到峰值。在基于标量的控制中,两个磁场间的角度显著变化。
矢量控制设法在AC电机中再次创造正交关系。为了控制转矩,各自从产生磁通量中生成电流,以实现DC机器的响应性。
一个AC指令电机的矢量控制与一个单独的励磁DC电机控制相似。在一个DC电机中,由励磁电流IF所产生的磁场能量Φ F与由电枢电流IA所产生的电枢磁通ΦA正交。这些磁场都经过去耦并且相互间很稳定。因此,当电枢电流受控以控制转矩时,磁场能量仍保持不受影响,并实现了更快的瞬态响应。
三相AC电机的磁场定向控制(FOC)包括模仿DC电机的操作。所有受控变量都通过数学变换,被转换到DC而非AC。其目标的独立的控制转矩和磁通。
磁场定向控制(FOC)有两种方法:
直接FOC: 转子磁场的方向(Rotor flux angle) 是通过磁通观测器直接计算得到的
间接FOC: 转子磁场的方向(Rotor flux angle) 是通过对转子速度和滑差(slip)的估算或测量而间接获得的。
矢量控制要求了解转子磁通的位置,并可以运用终端电流和电压(采用AC感应电机的动态模型)的知识,通过高级算法来计算。然而从实现的角度看,对于计算资源的需求是至关重要的。
可以采用不同的方式来实现矢量控制算法。前馈技术、模型估算和自适应控制技术都可用于增强响应和稳定性。
AC电机的矢量控制:深入了解
矢量控制算法的核心是两个重要的转换: Clark转换,Park转换和它们的逆运算。采用Clark和Park转换,带来可以控制到转子区域的转子电流。这种做充许一个转子控制系统决定应供应到转子的电压,以使动态变化负载下的转矩最大化。
Clark转换:Clark数学转换将一个三相系统修改成两个坐标系统:
其中ia和ib正交基准面的组成部分,ic是不重要的homoplanar(同平面)部分。三相转子电流与转动参考系的关系如下图所示。
Park转换:Park数学转换将双向静态系统转换成转动系统矢量:
两相α, β帧表示通过Clarke转换进行计算,然后输入到矢量转动模块,它在这里转动角θ,以符合附着于转子能量的d, q帧。根据上述公式,实现了角度θ的转换。
AC电机的磁场定向矢量控制的基本结构
Clarke变换采用三相电流IA, IB 以及 IC,来计算两相正交定子轴的电流Isd和 Isq。这两个在固定座标定子相中的电流被变换成Isd 和Isq,成为Park变换d, q中的元素。其通过电机通量模型来计算的电流Isd, Isq 以及瞬时流量角θ被用来计算交流感应电机的电动扭矩。矢量控制交流电机的基本原理图如下。
这些导出值与参考值相互比较,并由PI控制器更新。
基于矢量的电机控制的一个固有优势是,可以采用同一原理,选择适合的数学模型去分别控制各种类型的AC, PM-AC 或者 BLDC电机。
BLDC电机的矢量控制
BLDC电机是磁场定向矢量控制的主要选择。采用了FOC的无刷电机可以获得更高的效率,最高效率可以达到95%,并且对电机在高速时也十分有效率。
步进电机控制算法
如下是步进电机控制示意图:
步进电机控制通常采用双向驱动电流,其电机步进由按顺序切换绕组来实现。通常这种步进电机有3个驱动顺序:
单相全步进驱动:
在这种模式中,其绕组按如下顺序加电,AB/CD/BA/DC (BA表示绕组AB的加电是反方向进行的)。这一顺序被称为单相全步进模式,或者波驱动模式。在任何一个时间,只有一相加电。
双相全步进驱动:
在这种模式中,双相一起加电,因此,转子总是在两个极之间。此模式被称为双相全步进,这一模式是两极电机的常态驱动顺序,可输出的扭矩最大。
半步进模式:
这种模式将单相步进和双相步进结合在一起加电:单相加电,然后双相加电,然后单相加电…,因此,电机以半步进增量运转。这一模式被称为半步进模式,其电机每个励磁的有效步距角减少了一半,其输出的扭矩也较低。
以上3种模式均可用于反方向转动(逆时针方向),如果顺序相反则不行。
通常,步进电机具有多极,以便减小步距角,但是,绕组的数量和驱动顺序是不变的。
通用DC控制算法
通用电机的速度控制,特别是采用2种电路的电机:
- 相角控制
- PWM斩波控制
相角控制
相角控制是通用电机速度控制的最简单的方法。通过TRIAC的点弧角的变动来控制速度。相角控制是非常经济的解决方案,但是,效率不太高,易于电磁干扰(EMI)。通用电机的相角控制示意图如下。
以上示图表明了相角控制的机理,是TRIAC速度控制的典型应用。TRIAC门脉冲的周相移动产生了有效率的电压,从而产生了不同的电机速度,并且采用了过零交叉检测电路,建立了时序参考,以延迟门脉冲。
PWM斩波控制
PWM控制是通用电机速度控制的,更先进的解决方案。在这一解决方案中,功率MOFSET,或者IGBT接通高频整流AC线电压,进而为电机产生随时间变化的电压。
上图,是通用电机的PWM斩波控制的示意图,相关电路:。其开关频率范围一般为10-20 KHz,以消除噪声。这一通用电机的控制方法可以获得更佳的电流控制和更佳的EMI性能,因此,效率更高。
十、恒流电路设计方案
作为硬件研发工程师相信对恒流电路不会陌生,本文介绍下三种恒流电路的原理图。
三极管恒流电路
三极管恒流电路
三极管的恒流电路,主要是利用Q2三极管的基级导通电压为0.6~0.7V这个特性;当Q2三极管导通,Q1三极管基级电压被拉低而截止,负载R1不工作;负载R1流过的电流等于R6电阻的电流(忽略Q1与Q2三极管的基级电流),R6电阻的电流等于R6电阻两端的0.6~0.7V电压除以R6电阻阻值(固定不变),因此流过R1负载的电流即为恒定不变,即使R1负载的电源端VCC电压是可变的,也能达到恒流的电路效果
运放恒流电路
运放恒流电路
运放的恒流电路,主要是利用运放的“电压跟随特性”,即运放的两个输入引脚Pin3与Pin2电压相等电路特性。
当在电阻R4输入Vin稳定电源电压时,电阻R7两端的电压也为Vin不变,因此无论外界电路如何变化,流过R7电阻的电流是不变的;同三极管恒流电路原理分析一样,R2负载的电流等于R7电阻的电流,所以即使R2负载的电源为可变电压电源,R2负载的电流也是保持固定不变,达到恒流的效果。
除去运用三极管与运放设计的恒流电路,芯片哥介绍另外一种恒流电路设计方案,主要是利用稳压二极管的稳压特性。
稳压二极管恒流电路
稳压二极管恒流电路
稳压二极管的恒流电路中,三极管Q4的基级电压被限定在稳压二极管工作的稳定电压Uzd下,因此R10电阻的电压等于Uzd减去三极管基级与发射级的导通压降0.7V,即U=Uzd-0.7保持恒定不变,所以流过R10电阻的电流在VCC电源即使可变的条件下也是固定不变,也就是R8负载的电流保持不变,达到恒流的效果。
十一、两种单片机编程思想
分层思想
分层的思想,并不是什么神秘的东西,事实上很多做项目的工程师本身自己也会在用。看了不少帖子都发现没有提及这个东西,然而分层结构确是很有用的东西,参透后会有一种恍然大悟的感觉。如果说我不懂LCD怎么驱动,那好办,看一下datasheet,参考一下阿别人的程序,很快就可以做出来。但是如果不懂程序设计的思想的话,会给你做项目的过程中带来很多很多的困惑。
参考了市面上各种各样的嵌入式书籍,MCS-51,AVR ,ARM 等都有看过,但是没有发现有哪本是介绍设计思想的,就算有也是凤毛麟角。写程序不难,但是程序怎么样才能写的好,写的快,那是需要点经验积累的。结构化模块化的程序设计的思想,是最基本的要求。
然而这么将这个抽象的概念运用到工程实践当中恩?那需要在做项目的过程中经历磨难,将一些东西总结出来,抽象升华为理论,对经验的积累和技术的传播都大有裨益。所以在下出来献丑一下,总结一些东西。
就我个人的经验而谈,有两个设计思想是非常重要的。
一个就是“时间片轮的设计思想”,这个对实际中解决多任务问题非常有用,通常可以用这个东西来判断一个人是单片机学习者,还是一个单片机工程师。这个必须掌握。(下文将介绍)。
第二个就是“分层屏蔽的设计思想”即分层思想。下面用扫描键盘程序例子作为引子,引出今天说的东西。
问题的提出
单片机学习板一般为了简单起见,将按键分配的很好,例如整个 4*4 的键盘矩阵分配到 P1 口上面,8条控制线,刚好。这样的话程序也非常好写。只需要简单的:
KEY_DAT= P1;
端口的数据就读进来了。
诚然,现实中没有这么好的事情。在实际的项目应用当中,单片机引脚的复用相当厉害,这跟那些所谓的单片机学习板就有很大的差别了。
另外一个原因,一般设计来说,是“软件配合硬件”的设计流程,简单点说就是,先确定好硬件原理图,硬件布线,最后才是软件的开发,因为硬件修改起来比较麻烦,相对来说软件修改的时候比较好改。这个就是中国传统的阴阳平衡哲学原理。硬件设计和软件设计本来就是鱼和熊掌的关系,两者不可兼得。方便了硬件设计,很可能给写软件带来很大的麻烦。
反过来说,方便了软件设计,硬件设计也会相当的麻烦。如果硬件设计和软件设计同时方便了,那只有两种可能,一是这个设计方案非常简单,二是设计师已经达到了一个非常高的境界。我们不考虑那么多情况,单纯从常用的实际应用的角度来看问题。
硬件为了布线的方便,很多时候会可能将IO口分配到不同的端口上面,例如上面说的4*4键盘,8根线分别分配到 P0 P1 P2 P3 上面去了。那么,开发板的那些扫描键盘程序可以去见鬼了。怎么扫按键?我想起了我刚开始学习的时候,分成3段非常相似的程序,一个一个按键的扫描的经历......
或许有人不甘心,“那些东西我花了很长时间学习的,也用的好好的,怎么能说一句不用就不用?”虽然有点残忍,但是我还是想说“兄弟,接受现实吧,现实是残酷的......”
不过,人区别于低等动物的差别,是人会创造,在碰到困难的时候会想办法解决,于是我们开始了沉思......
最后我们引入初中数学学的“映射”的概念来解决问题。基本思想就是,将不同端口的按键映射到相同端口上面。
按键扫描程序如何分成3个层
最底层的是硬件层,完成端口扫描,20ms延时消抖,将端口的数据映射到一个KEY_DAT寄存器上面,KEY_DAT作为对上层驱动层的一个接口。
中间的一层是驱动层,驱动层只对 KEY_DAT 寄存器的数值进行操作。简单点说,我们无论底层的硬件是怎么接线的,在驱动层都不需要关心,只需要关心 KEY_DAT 这个寄存器的数值是什么就可以了。这样出来的间接效果就是“屏蔽了底层硬件的差异”,所以驱动层写的程序就可以通用了。
驱动层的另外一个功能是为了上层提供消息接口。我们用了类似window程序的消息的概念。这里可以提供一些按键消息,例如:按下消息,松开消息,长按键消息,长按键的时候的步进消息,等等。
应用层属于最上层的程序,这里就是根据项目的不同分别写按键功能程序。它使用的是驱动层提供的消息接口。在应用层写程序的思想就是,我不管下层是怎么工作的,我只关心按键消息。有按键消息来的时候我就执行功能,没有消息来的时候,我就什么也不做。
下面用一个简单的常用的例子,说明我们这个设计思想的用法。
秒表调整时间的时候,要求按着某个按键不放,时间能连续的向上增加。这个东西很实用,实际的家电中用途很广泛。
在看下面的东西之前,大家可以想一下,这东西难吗?相信大家都会很响亮的回答,“不难!!”,然而我再问:“这东西麻烦吗?”我相信很多人肯定会说“很麻烦!!” 这不禁让我想起开始学单片机的时候写这种按键的那程序,乱七八糟的结构。如果不相信的话,可以自己用51写一下哦,那样就更加能体会本文说的分层结构的优越性。
项目要求:
两个按键,分别分配在P10 和P20,分别是“加”“减”按键,要求长按键的时候实现连续加和连续减的功能。
实战:
假设按键上拉,没有按键的时候高电平,有按键的时候低电平,另外,为了突出问题,这里没有将延时消抖的程序写上去,在实际项目中应该加上。C语言函数参数的传递多种多样,这里作为例子,用了最简单的全局变量来传递参数,当然你也可以用 unsigned charReadPort(void)返回一个读键结果,甚至还可以 void ReadPort(unsigned char*pt) 用一个指针变量传递地址而达到直接修改变量的目的。方法是多种多样的,这个决定于每个人的程序风格。
1)开始写硬件层程序,完成映射
#defineKYE_MIN 0X01
#defineKEY_PLUS 0X01
unsignedchar KeyDat;
voidReadPort(void)
{
if (P1 & KEY_PLUS == 0 )
{
KeyDat |= 0x01 ;
}
if (P2 & KEY_MIN == 0 )
{
KeyDat |= 0x02 ;
}
}
C语言应该很容易看懂吧?如果 KEY_PLUS 按下,P10口读到低电平,则 P1 &KEY_PLUS 的结果为 0 (xxxx xxx0 & 0000 0001),满足if 的条件,进入KeyDat |=0x01 是将 KeyDat 的bit0 置一,也就是说,将 KEY_PLUS 映射到 KeyDat 的 bit0
KEY_MIN是同样的道理映射到 KeyDat 的 bit1,如果 KeyDat 的 bit0 为 1 ,则说明 KEY_PLUS 按下,反则亦然。
不需要想的很神秘,映射就是这么一回事。如果还有其他按键的话,用同样办法,将他们全部映射到 KeyDat 上面。
2)驱动层程序编写
如果将 KeyDat想象成 P1 口,那么这个跟学习板那标准的扫描程序不就是一样了吗?对的,这个就是底层映射的目的了。
3)应用层程序编写
根据消息,硬件层是必须分离出来,然而驱动层和应用层的要求就不那么严格了,事实上一些简单的项目没有必要将这两层分离开来,根据实际应用灵活应对就可以了。
其实这样写程序是很方便移植的,根据板子的不同而适当的修改一下硬件层那个 ReadPort 函数就完成了,驱动层和应用层很多代码可以不经过修改直接用,很能提高开发效率的。当然这个按键程序会存在一定的问题,特别是遇到常闭按键和点触按键的混合使用的场合。这个留给大家自己去想了,反正问题总是能找到解决办法的,尽管方法有好有坏。
时间片轮设计思想
先用一个小例子引出今天的主题,想象一下,一个基本的家电控制板,肯定或多或少的会包含 :LED 或者 数码管显示,按键, 继电器或者可控硅的输出 这3部分。数码管需要 10ms到20ms的动态扫描,按键也需要20ms左右的延时消抖,有没有意识到,其实这些时间是同时在进行的。
回想一下咱们的教科书怎么教 按键 的延时消抖的?没错,死循环,绝对是原地踏步死循环,用指令来计时。这样很自然的引发一个问题,单片机在原地踏步死循环的话,那么其它的工作怎么办?如数码管的动态扫描怎么办?
唯有等按键扫描之后再进行了,这样出来的效果,数码管肯定会闪烁的,扫描时间过长了,缩短按键消抖时间也不是解决办法,想象如果咱们还有其它很多工作也是同时做的呢?解决办法之一,就是今天的主题,分时扫描的思想。当然不会是唯一的办法,只不过俺一直在用,觉得这个是非常不错的思想,可以解决很多实际问题。大胆妄言一下,分时扫描的思想也是单片机编程最核心的思想了,信不信就由你自己判断了。
核心思想的实现过程
第一、用RTC中断来计时,RTC的中断时间短一点,我习惯是125us ,为了解红外遥控的码,这个时间是需要的。RTC计时是相当准的,尽量利用。
第二、在RTC的中断服务程序里面放3个(数量自定)记时器(说白了就是计数器),我的习惯是 2ms 5ms 500ms 这3个是作为基准时间,提供给整个系统来调用的,所以必须准确一点,实际用示波器调一下就OK了,不难。
第三、在主程序的循环里面放一个专门处理时间的子程序。(注:单片机是不会停的,永远在不断循环的跑,这个跟学校学的貌似有点不同,俺面试的时候被问过这个问题 ….) 将所有的时间处理都放在时间处理子程序里面做,这样是非常方便的,一个单片机系统最起码需要处理 10~20个不同的时间,也需要10~20个计时器了,而且相当多要求同时不同步工作的,如果每个都单独的话是相当的麻烦。
第四、“程序是跑着来等,而不是站着来等”,这话看来有点玄,一个跟俺一起进去公司的工程师讨论的时候提到的这个问题,俺觉得这个也是分时系统的一个比较重要的思想,所以也这样叫,下面有细说。
第五、下面用程序来说话,注释尽量详细,可以不用看代码,直接看注释就可以了。
先中断服务程序部分
每 125us 中断一次,产生几个基准时间。
(1) ref_2ms寄存器不断的减1,每次中断减1,一共减 16次,所以这里经过的时间是 125us × 16 = 2ms,这个就是所谓的计时/计数器 了。这样就可以靠一个系统的RTC中断,来实现我们需要的很多个定时时间。
(2)置2ms 计时结束标志,这个是提供给时间处理程序用的,这是一个计时器的框架,下面的5ms计时完全相同。
这程序还用了一个块的框架,比较方便的,不过跟今天的主题无关,以后郁闷的时候再上来写写这个。上面的程序就是中断服务程序里面的计时器,分别定时 2ms 5ms 500ms,计时完毕溢出是flag_time 标志来记录的,程序通过读这个标志就可以知道定时的时间是否已经到了。
下面看那个统一的时间服务子程序
上面用了按键20ms消抖的计时器作为例子,如果理解之后就可以发现,我们可以完全模仿那个计时器而在下面放很多很多的计时器,则每5ms 进来一下,每个计时器都同时在计数了,谁先计算完毕就先关掉自己,置相应的标志给其它程序调用,而对其它计时器完全没有影响!这样,我们可以在这里放很多个计时器了,一般来说,十来二十个是没有问题的,完全满足一个单片机系统对多个时间的需求了。
单个计时器的结构很简单,先判断允许计时标志是否进入计时,然后一个专用的寄存器在加1或者减1,加/减相应的数值之后也就是相应的时间到了,关掉计时器,置相应需要用到的标志。
到这里差不多了,俺们需要的时间都可以出来了,这样做是不是非常方便?咱们再来看看在这段时间里单片机在做了什么东西?只有中断计时够 5ms 或者 500ms ,那个溢出标志才有效,才能进入上面的计时程序,其它时间都是在做其它事情。而且进入上面的计时器的时候,可以看出,并不是在那里死循环,只是单纯的加减一下寄存器就退出了,整个过程耗时极其短,看代码不同吧,5us到 20us左右吧,对主程序的执行没有什么影响。
下面看看具体怎么调用
最开始谈过的按键的消抖时间处理问题,现在就用上面介绍的办法来看具体怎么解决问题。
大概是这样的:判断什么时候有健,没有的话跳出,有的话开始延时消抖的计时,第二次进来的时候直接由标志位控制过去判断时间时候够。
同样是等待,这里就是最后一点所说的,咱这是跑着来等,不是站着来等。跟死循环定时比较,在没有定时到20ms 的这段时间里面单片机在做什么?死循环的话,肯定就是在原地等,什么都不做,而看看上面的程序,他只是判断是否定时够,具体的定时在统一的时间子程序里面做,判断没有到时间的话就跳出了,继续跑其它的程序,直到当时间到了,单片机判断出flag_delay,key_flow 符合条件,开始进入按键处理程序了,在这个期间,单片机都在做其它事情,只是一个主循环跑回来判断一次,所以单片机完全有空跑其它的程序,而没有将时间都耗在消抖上面。
主程序循环体
这个就是用到的循环体了,所有功能都做成子程序形式了,需要就挂上去就可以了,比较方便,这样一个总的循环体,单片机就是在不断的执行这个循环体,如果整个程序都采用上面说的分时扫的思想的话,一周循环回来的时间是相当短的,其实是不是跟电脑的思想有点像呢?
电脑再快也并不是同时处理多个任务,而且每次处理一个,然后非常快的速度来循环处理,让我们感觉上他是在同时处理多个程序那样,我想,我最终想表达的思想也就是这个而已。有这个思想支撑下,单片机的程序变得比较容易上手了,剩下的只是集中精力去用程序来实现我们的思想而已,当然,这里只是说一种可行的办法而已,不是说只有这种办法。
十二、嵌入式开发中C语言编程思想
1 编程风格
《计算机程序的构造和解释》一书在开篇写到:程序写出来是给人看的,附带能在机器上运行。
1.1 整洁的样式
使用什么样的编码样式一直都颇具争议性的,比如缩进和大括号的位置。因为编码的样式也会影响程序的可读性,面对一个乱放括号、对齐都不一致的源码,我们很难提起阅读它的兴趣。
我们总要看别人的程序,如果彼此编码样式相近,读起源码来会觉得比较舒适。但是编码风格的问题是主观的,永远不可能在编码风格上达成统一意见。因此只要你的编码样式整洁、结构清晰就足够了。除此之外,对编码样式再没有其它要求。
提出匈牙利命名法的程序员、前微软首席架构师Charles Simonyi说:我觉得代码清单带给人的愉快同整洁的家差不多。你一眼就能分辨出家里是杂乱无章还是整洁如新。这也许意义不大。因为光是房子整洁说明不了什么,它仍可能藏污纳垢!
但是第一印象很重要,它至少反映了程序的某些方面。我敢打赌,我在3米开外就能看出程序拙劣与否。我也许没法保证它很不错,但如果从3米外看起来就很糟,我敢保证这程序写得不用心。如果写得不用心,那它在逻辑上也许就不会优美。
1.2清晰的命名
变量、函数、宏等等都需要命名,清晰的命名是优秀代码的特点之一。命名的要点之一是名称应能清晰的描述这个对象,以至于一个初级程序员也能不费力的读懂你的代码逻辑。我们写的代码主要给谁看是需要思考的:给自己、给编译器还是给别人看?
我觉得代码最主要的是给别人看,其次是给自己看。如果没有一个清晰的命名,别人在维护你的程序时很难在整个全貌上看清代码,因为要记住十多个以上的糟糕命名的变量是件非常困难的事;而且一段时间之后你回过头来看自己的代码,很有可能不记得那些糟糕命名的变量是什么意思。
为对象起一个清晰的名字并不是简单的事情。首先能认识到名称的重要性需要有一个过程,这也许跟谭式C程序教材被大学广泛使用有关:满书的a、b、c、x、y、z变量名是很难在关键的初学阶段给人传达优秀编程思想的;其次如何恰当的为对象命名也很有挑战性,要准确、无歧义、不罗嗦,要对英文有一定水平,所有这些都要满足时,就会变得很困难;此外,命名还需要考虑整体一致性,在同一个项目中要有统一的风格,坚持这种风格也并不容易。
关于如何命名,Charles Simonyi说:面对一个具备某些属性的结构,不要随随便便地取个名字,然后让所有人去琢磨名字和属性之间有什么关联,你应该把属性本身,用作结构的名字。
1.3恰当的注释
注释向来也是争议之一,不加注释和过多的注释我都是反对的。不加注释的代码显然是很糟糕的,但过多的注释也会妨碍程序的可读性,由于注释可能存在的歧义,有可能会误解程序真实意图,此外,过多的注释会增加程序员不必要的时间。如果你的编码样式整洁、命名又很清晰,那么,你的代码可读性不会差到哪去,而注释的本意就是为了便于理解程序。
这里建议使用良好的编码样式和清晰的命名来减少注释,对模块、函数、变量、数据结构、算法和关键代码做注释,应重视注释的质量而不是数量。如果你需要一大段注释才能说清楚程序做什么,那么你应该注意了:是否是因为程序变量命名不够清晰,或者代码逻辑过于混乱,这个时候你应该考虑的可能就不是注释,而是如何精简这个程序了。
2 数据结构
数据结构是程序设计的基础。在设计程序之前,应该先考虑好所需要的数据结构。
前微软首席架构师Charles Simonyi:编程的第一步是想象。就是要在脑海中对来龙去脉有极为清晰的把握。在这个初始阶段,我会使用纸和铅笔。我只是信手涂鸦,并不写代码。
我也许会画些方框或箭头,但基本上只是涂鸦,因为真正的想法在我脑海里。我喜欢想象那些有待维护的结构,那些结构代表着我想编码的真实世界。一旦这个结构考虑得相当严谨和明确,我便开始写代码。
我会坐到终端前,或者换在以前的话,就会拿张白纸,开始写代码。这相当容易。我只要把头脑中的想法变换成代码写下来,我知道结果应该是什么样的。大部分代码会水到渠成,不过我维护的那些数据结构才是关键。我会先想好数据结构,并在整个编码过程中将它们牢记于心。
开发过以太网和操作系统SDS 940的Butler Lampson:(程序员)最重要的素质是能够把问题的解决方案组织成容易操控的结构。
开发CP/M操作系统的Gary.A:如果不能确认数据结构是正确的,我是决不会开始编码的。我会先画数据结构,然后花很长时间思考数据结构。在确定数据结构之后我就开始写一些小段的代码,并不断地改善和监测。在编码过程中进行测试可以确保所做的修改是局部的,并且如果有什么问题的话,能够马上发现。
微软创始人比尔**·**盖茨:编写程序最重要的部分是设计数据结构。接下来重要的部分是分解各种代码块。
编写世界上第一个电子表格软件的Dan Bricklin:在我看来,写程序最重要的部分是设计数据结构,此外,你还必须知道人机界面会是什么样的。
我们举个例子来说明。在介绍防御性编程的时候,提到公司使用的LCD显示屏抗干扰能力一般,为了提高LCD的稳定性,需要定期读出LCD内部的关键寄存器值,然后跟存在Flash中的初始值相比较。需要读出的LCD寄存器有十多个,从每个寄存器读出的值也不尽相同,从1个到8个字节都有可能。如果不考虑数据结构,编写出的程序将会很冗长。
我们分析这个过程,发现能提取出很多相同的元素,比如每次读LCD寄存器都需要该寄存器的命令号,都会经过读寄存器、判断值是否相同、处理异常情况这一过程。所以我们可以提取一些相同的元素,组织成数据结构,用统一的方法去处理这些数据,将数据与处理过程分开来。
我们可以先提取相同的元素,将之组织成数据结构:
这里lcd_command表示的是LCD寄存器命令号;lcd_get_value是一个数组,表示寄存器要初始化的值,这是因为对于一个LCD寄存器,可能要初始化多个字节,这是硬件特性决定的;lcd_value_num是指一个寄存器要多少个字节的初值,这是因为每一个寄存器的初值数目是不同的,我们用同一个方法处理数据时,是需要这个信息的。
就本例而言,我们将要处理的数据都是事先固定的,所以定义好数据结构后,我们可以将这些数据组织成表格:
/*LCD部分寄存器设置值列表*/
lcd_redu_list_struct const lcd_redu_list_str[]=
{
{SSD1963_Get_Address_Mode,{0x20} ,1}, /*1*/
{SSD1963_Get_Pll_Mn ,{0x3b,0x02,0x04} ,3}, /*2*/
{SSD1963_Get_Pll_Status ,{0x04} ,1}, /*3*
{SSD1963_Get_Lcd_Mode ,{0x24,0x20,0x01,0xdf,0x01,0x0f,0x00} ,7}, /*4*/
{SSD1963_Get_Hori_Period ,{0x02,0x0c,0x00,0x2a,0x07,0x00,0x00,0x00},8}, /*5*/
{SSD1963_Get_Vert_Period ,{0x01,0x1d,0x00,0x0b,0x09,0x00,0x00} ,7}, /*6*/
{SSD1963_Get_Power_Mode ,{0x1c} ,1}, /*7*/
{SSD1963_Get_Display_Mode,{0x03} ,1}, /*8*/
{SSD1963_Get_Gpio_Conf ,{0x0F,0x01} ,2}, /*9*/
{SSD1963_Get_Lshift_Freq ,{0x00,0xb8} ,2}, /*10*
};
至此,我们就可以用一个处理过程来完成数十个LCD寄存器的读取、判断和异常处理了:
/**
* lcd 显示冗余
* 每隔一段时间调用该程序一次
*/
void lcd_redu(void)
uint8_t tmp[8];
uint32_t i,j;
uint32_t lcd_init_flag;
lcd_init_flag =0;
for(i=0;i<sizeof(lcd_redu_list_str)/sizeof(lcd_redu_list_str[0]);i++)
{
LCD_SendCommand(lcd_redu_list_str[i].lcd_command);
uyDelay(10);
for(j=0;j<lcd_redu_list_str[i].lcd_value_num;j++)
{
tmp[j]=LCD_ReadData();
if(tmp[j]!=lcd_redu_list_str[i].lcd_get_value[j])
{
lcd_init_flag=0x55;
//一些调试语句,打印出错的具体信息
goto handle_lcd_init;
}
}
}
handle_lcd_init:
if(lcd_init_flag==0x55)
{
//重新初始化LCD
//一些必要的恢复措施
}
}
通过合理的数据结构,我们可以将数据和处理过程分开,LCD冗余判断过程可以用很简洁的代码来实现。更重要的是,将数据和处理过程分开更有利于代码的维护。
比如,通过实验发现,我们还需要增加一个LCD寄存器的值进行判断,这时候只需要将新增加的寄存器信息按照数据结构格式,放到LCD寄存器设置值列表中的任意位置即可,不用增加任何处理代码即可实现!这仅仅是数据结构的优势之一,使用数据结构还能简化编程,使复杂过程变的简单,这个只有实际编程后才会有更深的理解。
3 阅读书目
每年都有亿万计的C程序运行在单片机、ARM7、Cortex-M3这些微处理器上,但在这些处理器上如何编写优质高效的C程序,还要在看看相关书籍。
3.1关于C语言特性
- Stephen Prata 著 云巅工作室 译 《C Primer Plus(第五版)中文版》
- Andrew Koenig 著 高巍 译 《C陷阱与缺陷》
- Peter Van Der Linden 著 徐波 译 《C专家编程》
- 陈正冲 编著 《C语言深度解剖》
3.2关于编译器
- 杜春雷 编著 《ARM体系结构与编程》
- Keil MDK 编译器帮助手册
3.3关于防御性编程
- MISRA-C-:2004 Guidelines for the use of the C language in criticalsystems
- Robert C.Seacord 著 徐波 译 《C安全编码标准》
3.4关于编程思想
- Pete Goodliffe 著 韩江、陈玉 译 《编程匠艺---编写卓越的代码》
- Susan Lammers 著 李琳骁、吴咏炜、张菁《编程大师访谈录》
十三、介绍单片机
MCU是Microcontroller Unit 的简称,中文叫微控制器,俗称单片机,是把CPU的频率与规格做适当缩减,并将内存、计数器、USB、A/D转换、UART、PLC、DMA等周边接口,甚至LCD驱动电路都整合在单一芯片上,形成芯片级的计算机,为不同的应用场合做不同组合控制,诸如手机、PC外围、遥控器,至汽车电子、工业上的步进马达、机器手臂的控制等,都可见到MCU的身影。
单片机出现的历史并不长,但发展十分迅猛。它的产生与发展和微处理器(CPU)的产生与发展大体同步,自1971年美国英特尔公司首先推出4位微处理器以来,它的发展到目前为止大致可分为5个阶段。下面以英特尔公司的单片机发展为代表加以介绍。
1971年~1976年
单片机发展的初级阶段。1971年11月英特尔公司首先设计出集成度为2000只晶体管/片的4位微处理器英特尔4004,并配有RAM、 ROM和移位寄存器, 构成了第一台MCS—4微处理器, 而后又推出了8位微处理器英特尔8008, 以及其它各公司相继推出的8位微处理器。
1976年~1980年
低性能单片机阶段。以1976年英特尔公司推出的MCS—48系列为代表, 采用将8位CPU、 8位并行I/O接口、8位定时/计数器、RAM和ROM等集成于一块半导体芯片上的单片结构, 虽然其寻址范围有限(不大于4 KB), 也没有串行I/O, RAM、 ROM容量小, 中断系统也较简单, 但功能可满足一般工业控制和智能化仪器、仪表等的需要。
1980年~1983年
高性能单片机阶段。这一阶段推出的高性能8位单片机普遍带有串行口,有多级中断处理系统, 多个16位定时器/计数器。片内RAM、 ROM的容量加大,且寻址范围可达64 KB,个别片内还带有A/D转换接口。
1983年~80年代末
16位单片机阶段。1983年英特尔公司又推出了高性能的16位单片机MCS-96系列,由于其采用了最新的制造工艺, 使芯片集成度高达12万只晶体管/片。
1990年代
单片机在集成度、功能、速度、可靠性、应用领域等全方位向更高水平发展。
MCU按其存储器类型可分为无片内ROM型和带片内ROM型两种。对于无片内ROM型的芯片,必须外接EPROM才能应用(典型为8031);带片内ROM型的芯片又分为片内EPROM型(典型芯片为87C51)、MASK片内掩模ROM型(典型芯片为8051)、片内Flash型(典型芯片为89C51)等类型。
按用途可分为通用型和专用型;根据数据总线的宽度和一次可处理的数据字节长度可分为8、16、32位MCU。
目前,国内MCU应用市场最广泛的是消费电子领域,其次是工业领域、和汽车电子市场。消费电子包括家用电器、电视、游戏机和音视频系统等。工业领域包括智能家居、自动化、医疗应用及新能源生成与分配等。汽车领域包括汽车动力总成和安全控制系统等。
对于绝大多数MCU,下列功能是最普遍也是最基本的,针对不同的MCU,其描述的方式可能会有区别,但本质上是基本相同的:
1、TImer(定时器):TImer的种类虽然比较多,但可归纳为两大类:一类是固定时间间隔的TImer,即其定时的时间是由系统设定的,用户程序不可控制,系统只提供几种固定的时间间隔给用户程序进行选择,如32Hz,16Hz,8Hz等,此类TImer在4位MCU中比较常见,因此可以用来实现时钟、计时等相关的功能。
另一类则是Programmable Timer(可编程定时器),顾名思义,该类Timer的定时时间是可以由用户的程序来控制的,控制的方式包括:时钟源的选择、分频数(Prescale)选择及预制数的设定等,有的MCU三者都同时具备,而有的则可能是其中的一种或两种。此类Timer应用非常灵活,实际的使用也千变万化,其中最常见的一种应用就是用其实现PWM输出。
由于时钟源可以自由选择,因此,此类Timer一般均与Event Counter(事件计数器)合在一起。
2、IO口:任何MCU都具有一定数量的IO口,没有IO口,MCU就失去了与外部沟通的渠道。根据IO口的可配置情况,可以分为如下几种类型:
纯输入或纯输出口:此类IO口由MCU硬件设计决定,只能是输入或输出,不可用软件来进行实时的设定。
直接读写IO口:如MCS-51的IO口就属于此类IO口。当执行读IO口指令时,就是输入口;当执行写IO口指令则自动为输出口。
程序编程设定输入输出方向的:此类IO口的输入或输出由程序根据实际的需要来进行设定,应用比较灵活,可以实现一些总线级的应用,如I2C总线,各种LCD、LED Driver的控制总线等。
对于IO口的使用,重要的一点必须牢记的是:对于输入口,必须有明确的电平信号,确保不能浮空(可以通过增加上拉或下拉电阻来实现);而对于输出口,其输出的状态电平必须考虑其外部的连接情况,应保证在Standby或静态状态下不存在拉电流或灌电流。
3、外部中断:外部中断也是绝大多数MCU所具有的基本功能,一般用于信号的实时触发,数据采样和状态的检测,中断的方式由上升沿、下降沿触发和电平触发几种。外部中断一般通过输入口来实现,若为IO口,则只有设为输入时其中断功能才会开启;若为输出口,则外部中断功能将自动关闭(ATMEL的ATiny系列存在一些例外,输出口时也能触发中断功能)。外部中断的应用如下:
外部触发信号的检测:一种是基于实时性的要求,比如可控硅的控制,突发性信号的检测等,而另一种情况则是省电的需要。
信号频率的测量:为了保证信号不被遗漏,外部中断是最理想的选择。
数据的解码:在遥控应用领域,为了降低设计的成本,经常需要采用软件的方式来对各种编码数据进行解码,如Manchester和PWM编码的解码。
按键的检测和系统的唤醒:对于进入Sleep状态的MCU,一般需要通过外部中断来进行唤醒,最基本的形式则是按键,通过按键的动作来产生电平的变化。
4、通讯接口:MCU所提供的通讯接口一般包括SPI接口,UART,I2C接口等,其分别描述如下:
SPI接口:此类接口是绝大多数MCU都提供的一种最基本通讯方式,其数据传输采用同步时钟来控制,信号包括:SDI(串行数据输入)、SDO(串行数据输出)、SCLK(串行时钟)及Ready信号;有些情况下则可能没有Ready信号;此类接口可以工作在Master方式或Slave方式下,通俗说法就是看谁提供时钟信号,提供时钟的一方为Master,相反的一方则为Slaver。
UART(Universal Asynchronous Receive Transmit):属于最基本的一种异步传输接口,其信号线只有Rx和Tx两条,基本的数据格式为:Start Bit + Data Bit(7-bits/8-bits) + Parity Bit(Even, Odd or None) + Stop Bit(1~2Bit)。一位数据所占的时间称为Baud Rate(波特率)。
对于大多数的MCU来讲,数据位的长度、数据校验方式(奇校验、偶校验或无校验)、停止位(Stop Bit)的长度及Baud Rate是可以通过程序编程进行灵活设定。此类接口最常用的方式就是与PC机的串口进行数据通讯。
I2C接口:I2C是由Philips开发的一种数据传输协议,同样采用2根信号来实现:SDAT(串行数据输入输出)和SCLK(串行时钟)。其最大的好处是可以在此总线上挂接多个设备,通过地址来进行识别和访问;I2C总线的一个最大的好处就是非常方便用软件通过IO口来实现,其传输的数据速率完全由SCLK来控制,可快可慢,不像UART接口,有严格的速率要求。
5、Watchdog(看门狗定时器):Watchdog也是绝大多数MCU的一种基本配置(一些4位MCU可能没有此功能),大多数的MCU的Watchdog只能允许程序对其进行复位而不能对其关闭(有的是在程序烧入时来设定的,如Microchip PIC系列MCU),而有的MCU则是通过特定的方式来决定其是否打开,如Samsung的KS57系列,只要程序访问了Watchdog寄存器,就自动开启且不能再被关闭。一般而言watchdog的复位时间是可以程序来设定的。Watchdog的最基本的应用是为MCU因为意外的故障而导致死机提供了一种自我恢复的能力。
全球主流单片机制作商
(排名不分先后,整理为主流厂商,如有缺少请在评论区补充)
1、Freescale+NXP(飞思卡尔+恩智浦):荷兰,主要提供16位、32位MCU。应用范围:汽车电子、LED和普通照明、医疗保健、多媒体融合、家电和电动工具、楼宇自动化技术电机控制、电源和功率转换器、能源和智能电网、自动化、计算机与通信基础设施。
2、Microchip+Atmel(微芯科技+爱特梅尔):美国,主要提供16位、32位MCU。应用范围:汽车电子、工业用、电机控制、汽车、楼宇自动化、家用电器、家庭娱乐、工业自动化、照明、物联网、智能能源、移动电子设备、计算机外设。
3、Cypress+Spansion(赛普拉斯+飞索半导体):美国,主要提供8位、16位、32位MCU。应用范围:汽车电子、家用电器、医疗、消费类电子、通信与电信、工业、无线。
4、ADI(亚德诺半导体):美国,主要提供8位、16位、32位MCU。应用范围:航空航天与国防、汽车应用 、楼宇技术 、通信 、消费电子 、能源 、医疗保健 、仪器仪表和测量 、电机、工业自动化 、安防。
5、Infineon(英飞凌):德国,主要提供16位、32位MCU。应用范围:汽车电子、消费电子、工程、商用和农用车辆、数据处理、电动交通、工业应用、医疗设备、移动设备、电机控制与驱动、电源、面向摩托车电动自行车与小型电动车、智能电网、照明、太阳能系统解决方案、风能系统解决方案。
6、ST Microelectronics(意法半导体):意大利/法国,主要提供32位MCU。应用范围:LED和普通照明、交通运输、医疗保健、多媒体融合、家电和电动工具、楼宇自动化技术电机控制、电源和功率转换器、能源和智能电网、自动化、计算机与通信基础设施。
7、Qualcomm(高通):美国,主要提供16位,32位MCU。应用范围:智能手机、平板电脑、无线调制解调器。
8、Texas Instruments(德州仪器):美国,主要提供16位、32位MCU。应用范围:汽车电子、消费电子、医疗设备、移动设备、通信。
9、Maxim(美信):美国,主要提供32位MCU。应用范围:汽车电子、消费电子、工业应用、安防。
日韩地区
1、Renesas(瑞萨):日本,主要提供16位、32位MCU。应用范围:电脑及外设、消费类电子、健康医疗电子、汽车电子、工业、通信。
2、Toshiba(东芝):日本,主要提供16位、32位MCU。应用范围:汽车电子、工业用、电机控制、无线通信、移动电话、电脑与周边设备、影像及音视频、消费类(家电)、LED照明、安全、电源管理、娱乐设备。
3、Fujitsu(富士通):日本,主要提供32位MCU。应用范围:汽车、医疗、机械,家电。
4、Samsung Electronics(三星电子):韩国,主要提供16位、32位MCU。应用范围:汽车电子、工业用、电机控制、汽车、楼宇自动化、家用电器、家庭娱乐、工业自动化、照明、物联网、智能能源、移动电子设备、计算机外设。
中国地区
▍中国大陆地区
1、希格玛微电子:主要提供32位MCU,应用范围:电信、制造、能源、交通、电力等。
2、珠海欧比特:主要提供32位MCU,应用范围:航空航天:星箭站船、飞行器;高端工控:嵌入式计算机;舰船控制、工业控制、电力设备、环境监控。
3、兆易创新:主要提供32位MCU,应用范围:工业自动化、人机界面、电机控制、安防监控、智能家居、物联网。
4、晟矽微电子:主要提供8位、32位MCU,应用范围:小家电、消费类电子、遥控器、鼠标、锂电池、数码产品、汽车电子、医疗仪器及计量、玩具、工业控制、智能家居及安防等领域。
5、芯海科技:主要提供16、32位MCU,应用范围:仪器仪表、物联网、消费电子、家电、汽车电子。
6、联华集成电路:主要提供8位、16位MCU,应用范围:消费电子、白色家电、工业控制、通信设备、汽车电子、计算机。
7、珠海建荣:主要提供8位MCU,应用范围:家用电器 、移动电源。
8、炬芯科技:主要提供8位至32位MCU,应用范围:平板电脑、智能家居、多媒体、蓝牙、wifi音频。
9、爱思科微电子:主要提供8位、16位MCU,应用范围:消费类芯片、通讯类芯片、信息类芯片、家电。
10、华芯微电子:主要提供8位、4位MCU,应用范围:卫星接收器、手机充电器、万年历、多合一遥控器。
11、上海贝岭(华大半导体控股):主要提供8位、16位、32位MCU,应用范围:计算机周边、HDTV、电源管理、小家电、数字家电。
12、海尔集成电路:主要提供14位、15位、16位MCU,应用范围:消费电子、汽车电子、工业、智能仪表。
13、北京君正:主要提供32位MCU,应用范围:可穿戴式设备、物联网、智能家电、汽车、消费类电子、平板电脑。
14、中微半导体:主要提供8位MCU,应用范围:智能家电、汽车电子、安防监控、LED照明及景观、智能玩具、智能家居、消费类电子。
15、神州龙芯集成电路:主要提供32位MCU,应用范围:电力监控、智能电网、工业数字控制、物联网、智能家居、数据监控。
16、紫光微电子:主要提供8位、16位MCU,应用范围:智能家电。
17、时代民芯:主要提供32位MCU,应用范围:汽车导航、交通监控、渔船监管、电力电信网络。
18、华润矽科微电子(华润微旗下公司):主要提供8位、16位MCU,应用范围:消费电子、工业控制、家电。
19、国芯科技:主要提供32位MCU,应用范围:信息安全领域 、办公自动化领域、通讯网络领域、 信息安全领域。
20、中天微:主要提供32位MCU,应用范围:智能手机、数字电视、机顶盒、汽车电子、GPS、电子阅读器、打印机。
21、华润微电子:主要提供8位、16位MCU,应用范围:家电,消费类电子、工业自动化控制的通用控制电路。
22、中颖电子:主要提供4位、8位、16位、32位MCU,应用范围:家电、电机。
23、灵动微电子:主要提供32位,应用范围:电机控制、蓝牙控制、高清显示、无线充、无人机、微型打印机、智能标签、电子烟、LED点阵屏等。
24、新唐科技:主要提供8位MCU,应用范围:照明、物联网等。
25、东软载波:主要提供8位、32位MCU,应用范围:家电、智能家居、仪器仪表、液晶面板控制器、工业控制等。
26、贝特莱:主要提供32位MCU,应用范围:智能家居、工业控制以及消费类产品领域。
27、笙泉科技:主要提供8位MCU,应用范围:车用、教育、工控、医疗等中小型显示面板。
28、航顺芯片:主要提供8位、32位MCU,应用范围:汽车、物联网等。
29、复旦微电子:主要提供16位、32位MCU,应用范围:智能电表、智能门锁等。
30、华大半导体:主要提供8位、16位、32位MCU,应用范围:工业控制、智能制造、智慧生活及物联网等。
▍中国台湾地区
1、宏晶科技:主要提供32位MCU。应用范围:通信、工业控制、信息家电、语音。
2、盛群半导体:主要提供8位、32位MCU。应用范围:消费电子、LED照明等。
3、凌阳科技:主要提供8位、16位MCU。应用范围:家庭影音。
4、中颖电子:主要提供4位、8位MCU。应用范围:充电器、移动电源、家电、工业控制。
5、松翰科技:主要提供8位、32位MCU。应用范围:摇控器、智能型充电器、大小系统、电子秤、耳温枪、血压计、胎压计、各类量测及健康器材。
6、华邦电子:主要提供8位、16位MCU。应用范围:车用电子、工业电子、网络、计算机、消费电子、物联网。
7、十速科技:主要提供4位、8位、51位MCU。应用范围:遥控器、小家电。
8、佑华微电子:主要提供4位、8位MCU。应用范围:录音集成电路产品、消费电子、家用产品。
9、应广科技单片机:主要提供4位、8位MCU。应用范围:机械、自动化、家电、机器人。
10、义隆电子:主要提供8位、16位MCU。应用范围:消费电子、电脑、智能手机。
任何一款MCU,其基本原理和功能都是大同小异,所不同的只是其外围功能模块的配置及数量、指令系统等。
对于指令系统,虽然形式上看似千差万别,但实际上只是符号的不同,其所代表的含义、所要完成的功能和寻址方式基本上是类似的。
要了解一款MCU,首先需要知道就是其ROM空间、RAM空间、IO口数量、定时器数量和定时方式、所提供的外围功能模块(Peripheral Circuit)、中断源、工作电压及功耗等等。
了解这些MCU Features后,接下来第一步就是将所选MCU的功能与实际项目开发的要求的功能进行对比,明确哪些资源是目前所需要的,哪些是本项目所用不到的。
对于项目中需要用到的而所选MCU不提供的功能,则需要认真理解MCU的相关资料,以求用间接的方法来实现,例如,所开发的项目需要与PC机COM口进行通讯,而所选的MCU不提供UART口,则可以考虑用外部中断的方式来实现。
对于项目开发需要用到的资源,则需要对其Manua*进行认真的理解和阅读,而对于不需要的功能模块则可以忽略或浏览即可。对于MCU学习来讲,应用才是关键,也是最主要的目的。
明确了MCU的相关功能后,接下来就可以开始编程了。
对于初学者或初次使用此款MCU的设计者来说,可能会遇到很多对MCU的功能描述不明确的地方,对于此类问题,可以通过两种方法来解决,一种是编写特别的验证程序来理解资料所述的功能;另一种则可以暂时忽略,单片机程序设计中则按照自己目前的理解来编写,留到调试时去修改和完善。前一种方法适用于时间较宽松的项目和初学者,而后一种方法则适合于具有一定单片机开发经验的人或项目进度较紧迫的情况。
指令系统千万不要特别花时间去理解。指令系统只是一种逻辑描述的符号,只有在编程时根据自己的逻辑和程序的逻辑要求来查看相关的指令即可,而且随着编程的进行,对指令系统也会越来越熟练,甚至可以不自觉地记忆下来。
单片机开发技巧
1、如何减少程序中的bug
对于如何减少程序的bug,应该先考虑系统运行中应考虑的超范围管理参数如下。
- 物理参数:这些参数主要是系统的输入参数,它包括激励参数、采集处理中的运行参数和处理结束的结果参数。
- 资源参数:这些参数主要是系统中的电路、器件、功能单元的资源,如记忆体容量、存储单元长度、堆叠深度。
- 应用参数:这些应用参数常表现为一些单片机、功能单元的应用条件。过程参数:指系统运行中的有序变化的参数。
2、如何提高C语言编程代码的效率
用C语言进行单片机程序设计是单片机开发与应用的必然趋势。如果使用C编程时,要达到最高的效率,最好熟悉所使用的C编译器。先试验一下每条C语言编译以后对应的汇编语言的语句行数,这样就可以很明确的知道效率。在今后编程的时候,使用编译效率最高的语句。各家的C编译器都会有一定的差异,故编译效率也会有所不同,优秀的嵌入式系统C编译器代码长度和执行时间仅比以汇编语言编写的同样功能程度长5-20%。
对于复杂而开发时间紧的项目时,可以采用C语言,但前提是要求你对该MCU系统的C语言和C编译器非常熟悉,特别要注意该C编译系统所能支持的数据类型和算法。虽然C语言是最普遍的一种高级语言,但由于不同的MCU厂家其C语言编译系统是有所差别的,特别是在一些特殊功能模块的操作上。所以如果对这些特性不了解,那么调试起来问题就会很多,反而导致执行效率低于汇编语言。
3、如何解决单片机的抗干扰性问题
防止干扰最有效的方法是去除干扰源、隔断干扰路径,但往往很难做到,所以只能看单片机抗干扰能力够不够强了。在提高硬件系统抗干扰能力的同时,软件抗干扰以其设计灵活、节省硬件资源、可靠性好越来越受到重视。
单片机干扰最常见的现象就是复位,至于程序跑飞,其实也可以用软件陷阱和看门狗将程序拉回到复位状态,所以单片机软件抗干扰最重要的是处理好复位状态。
一般单片机都会有一些标志寄存器,可以用来判断复位原因;另外你也可以自己在RAM中埋一些标志。在每次程序复位时,通过判断这些标志,可以判断出不同的复位原因;还可以根据不同的标志直接跳到相应的程序。这样可以使程序运行有连续性,用户在使用时也不会察觉到程序被重新复位过。
4、如何测试单片机系统的可靠性
当一个单片机系统设计完成,对于不同的单片机系统产品会有不同的测试项目和方法,但是有一些是必须测试的:
- 测试单片机软件功能的完善性
- 上电、掉电测试
- 老化测试
- ESD和EFT等测试
有时候,我们还可以模拟人为使用中,可能发生的破坏情况。例如用人体或者衣服织物故意摩擦单片机系统的接触端口,由此测试抗静电的能力。用大功率电钻靠近单片机系统工作,由此测试抗电磁干扰能力等。
综上所述,单片机已成为计算机发展和应用的一个重要方面,单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。
从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。
此外在开发和应用过程中我们更要掌握技巧,提高效率,以便于发挥它更加广阔的用途。
十四、单片机的串口
无聊又复习一下
MCU系统间常见的通讯方式有:RS232、RS422、RS485、LIN Bus、Bluetooth、Ethernte、wifi等,而大多数的通信接口都可以通过串口来扩展,所以对于单片机系统而言,只要掌握了串口,就掌握了大多数的通信方式,所以今天给大家介绍串口通信。
串行通讯是指仅用一根接收线和一根发送线就能将数据以位进行传输的一种通讯方式。尽管串行通讯的比按字节传输的并行通信慢,但是串口可以在仅仅使用两根线的情况下就能实现数据的传输。
典型的串口通信使用3根线完成,分别是地线、发送、接收。由于串口通信是异步的,所以端口能够在一根线上发送数据同时在另一根线上接收数据。串口通信最重要的参数是波特率、数据位、停止位和奇偶的校验。对于两个需要进行串口通信的端口,这些参数必须匹配,这也是能够实现串口通讯的前提。
最初数据是模拟信号输出简单过程量,后来仪表接口出现了RS232接口,这种接口可以实现点对点的通信方式,但这种方式不能实现联网功能,这就促生了RS485。
我们知道串口通信的数据传输都是0和1,在单总线、I2C、UART中都是通过一根线的高低电平来判断逻辑1或者逻辑0,但这种信号线的GND再与其他设备形成共地模式的通信,这种共地模式传输容易产生干扰,并且抗干扰性能也比较弱。所以差分通信、支持多机通信、抗干扰强的RS485就被广泛的使用了。
RS485通信最大特点就是传输速度可以达到10Mb/s以上,传输距离可以达到3000米左右。大家需要注意的是虽然485最大速度和最大传输距离都很大,但是传输的速度是会随距离的增加而变慢的,所以两者是不可以兼得的。
串口通讯的物理层
串口通讯的物理层有很多标准,例如上面提到的,我们主要讲解RS-232标准,RS-232标准主要规定了信号的用途、通讯接口以及信号的电平标准。
在上面的通讯方式中,两个通讯设备的"DB9接口"之间通过串口信号线建立起连接,串口信号线中使用"RS-232标准"传输数据信号。由于RS-232电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个"电平转换芯片"转换成控制器能识别的"TTL校准"的电平信号,才能实现通讯。
下图为DB9标准串口通讯接口:
DB9引脚说明:
上表中的是计算机端的DB9公头标准接法,由于两个通讯设备之间的收发信号(RXD与TXD)应交叉相连,所以调制调解器端的DB9母头的收发信号接法一般与公头的相反,两个设备之间连接时,只要使用"直通型"的串口线连接起来即可。
串口线中的RTS、CTS、DSR、DTR及DCD信号,使用逻辑 1表示信号有效,逻辑0表示信号无效。例如,当计算机端控制DTR信号线表示为逻辑1时,它是为了告知远端的调制调解器,本机已准备好接收数据,0则表示还没准备就绪。
波特率
波特率是指数据信号对载波的调制速率,它用单位时间内载波调制状态改变的次数来表示;
比如波特率为9600bps;代表的就是每秒中传输9600bit,也就是相当于每一秒中划分成了9600等份。
因此,那么每1bit的时间就是1/9600秒=104.1666...us。约0.1ms。既然是9600等份,即每1bit紧接着下一个比特,不存在额外的间隔。两台设备要想实现串口通讯,这收发端设置的波特率必须相同,否则是没办法实现通讯的。
收发波特率一致可以实现通讯:
收发波特率不一致,导致RX端不能正常接收:
串口通讯的数据结构
起始位: 起始位必须是持续一个比特时间的逻辑0电平,标志传输一个字符的开始,接收方可用起始位使自己的接收时钟与发送方的数据同步。
数据位: 数据位紧跟在起始位之后,是通信中的真正有效信息。数据位的位数可以由通信双方共同约定。传输数据时先传送字符的低位,后传送字符的高位。
奇偶校验位: 奇偶校验位仅占一位,用于进行奇校验或偶校验,奇偶检验位不是必须有的。如果是奇校验,需要保证传输的数据总共有奇数个逻辑高位;如果是偶校验,需要保证传输的数据总共有偶数个逻辑高位。
停止位: 停止位可以是是1位、1.5位或2位,可以由软件设定。它一定是逻辑1电平,标志着传输一个字符的结束。
空闲位: 空闲位是指从一个字符的停止位结束到下一个字符的起始位开始,表示线路处于空闲状态,必须由高电平来填充。
单双工通讯
单工: 数据传输只支持数据在一个方向上传输;
半双工: 允许数据在两个方向上传输,但某一时刻只允许数据在一个方向上传输,实际上是一种切换方向的单工通信,不需要独立的接收端和发送端,两者可合并为一个端口;
全双工: 允许数据同时在两个方向上传输,因此全双工通信是两个单工方式的结合,需要独立的接收端和发送端。
STM32中的串口通讯
STM32串口通信接口有两种,分别是:UART(通用异步收发器)、USART(通用同步异步收发器),对于大容量STM32F10x系列芯片,分别由3个USART和两个UART。
TXD:数据发送引脚;RXD:数据输入引脚
对于两芯片的间的连接,两个芯片GND共地,同时TXD和RXD交叉连接,这样两个芯片间可进行TTL电平通信。
但如果对于芯片和PC机相连,除了共地条件外,不能使用如上的直接交叉连接,虽然两者都有TXD和RXD引脚,但通常PC机使用的是RS232接口(9针),通常是TXC和RXD经过电平转换得到,故如果要使芯片与PC机的RS232接口直接通信,需要将芯片的输入输出端口也电平转换为RS232类型,再交叉连接,二者的电平标准不同:
单片机的点评标准(TTL电平):+5V表示1,0V表示0;
RS232电平标准:+15/+13V表示0,-15/-13表示1。
因此单片机与PC机进行串口通信应该遵循:在单片机串口与上位机给出的RS232口之间,通过电平转换电路实现TTL电平与RS232电平间的转换.
如果使用USB转串口也可以实现串口通讯,USB转串口电路图如下所示