fish001

  • 2019-05-20
  • 发表了主题帖: AC/DC前端转换器模块中功率因数校正技术介绍

    本帖最后由 fish001 于 2019-5-20 22:28 编辑 根据定义,交流电源的功率因数(PF)定义为流入负载的实际功率(瓦)与电路中的视在功率之比,它是电流和电压的乘积。它表示为PF =实际功率(W)/视在功率(VA)。 PF方程表明它是介于0和1之间的数字。因此,当电流和电压同相和正弦时,PF为1.但是,如果两者都是正弦但不同相,则视在功率大于实际值。功率和PF是电流和电压波形之间的相角的余弦。在实践中,PF = 1是负载是纯电阻和线性的理想情况。实际上,电子系统中的离线AC/DC电源是开关模式,呈现非线性负载。 由于目前大多数电源都是开关模式,因此它们会产生非正弦波形,从而产生输入电流和电压之间的相位角。当电流波形不跟随电压波形时,它会导致PF低于1.除了功率损耗之外,《1 PF会导致谐波沿中性线传播并破坏连接到交流电源线的其他设备。 PF数越低,AC线上的谐波含量越高,反之亦然。因此,有严格的规定来限制交流电源线上允许的谐波失真。例如,欧洲的EN61000-3-2 [1]被引入以限制将电子设备反射的谐波发送回电源。它适用于所有D类电子系统,如PC(包括笔记本电脑和PC显示器),以及消耗超过75 W的无线电和电视接收器.D类是四类(A,B,C和D)之一按EN61000-3-2标准分类,该标准对每个等级施加不同的谐波电流限制。该标准现已在国际上被接受。 为了符合EN61000-3-2等法规的谐波要求并保持较高的整体PF性能,有必要在电子系统中使用的AC/DC前端转换器模块中加入功率因数校正(PFC)功耗超过75 W.实现PFC可实现高PF值并确保低谐波。正如我们将要看到的,目前有许多无源和有源技术可用于AC前端采用的众多电源拓扑结构。 无源PFC 如安森美半导体公布的功率因数校正手册第一章所述[2],控制谐波电流的最简单方法是使用仅在线路频率下通过电流的无源滤波器(例如,50或60赫兹)。该滤波器降低了谐波电流,这意味着非线性器件现在看起来像线性负载。使用内置电容器和电感器的滤波器,功率因数可以接近一致。然而,缺点是滤波器需要大值的高电流电感器和高压电容器,其体积大且昂贵。图1显示了三种不同250 W PC电源的输入谐波,与根据EN/IEC61000-3-2 D类设备规范的限值进行了比较。谐波幅度与这些设备的输入功率成比例。如图所示,无源PFC的性能几乎不符合三次谐波的限制。带有源PFC的单元符合并优于IEC61000-3-2规范。 图1:相比之下,带有源PFC控制器的电源优于被动式PFC超过电源线谐波的IEC61000-3-2规范。 (由安森美半导体公司提供。)尽管设计和使用简单,但无源PFC电路有一些缺点。首先,电感器的体积限制了它在许多应用中的可用性。其次,对于全球运行,需要线电压范围开关。如果没有正确地进行开关选择,则开关的结合使得器具/系统易于发生操作员错误。最后,未被调节的电压轨导致在PFC级之后的DC/DC转换器的成本和效率损失。 有源PFC 除性能外,铜和磁芯材料的成本上升,加上半导体成本的下降,使得有源PFC解决方案的平衡趋于平衡,即使在对成本最敏感的消费设备中也是如此。在下面的方案中(图2),有源PFC电路放置在输入整流器和存储电容之间,然后是DC/DC转换器。具有相关电路的PFC IC对输入电流进行整形,以匹配输入电压波形,实现0.9和更高的PF。 图2:有源PFC控制器电路位于输入整流器和存储电容之间。 (由安森美半导体提供。)从根本上说,有三种不同类型的有源PFC控制器芯片。这些包括临界传导模式(CrM),连续传导模式(CCM)和不连续传导模式(DCM)。有几家制造商提供各种这些有源PFC IC,但每个供应商都提供自己的版本和使用它们的理由。 CrM控制方案将电感电流保持在连续和不连续传导之间的临界极限。因此,一些供应商更喜欢将其称为边界传导模式或BCM。由于在该方案中总是知道波形,所以平均电流和峰值电流之间的关系也是已知的。安森美半导体为高达300 W的中等功率应用提供各种电压模式CrM PFC IC。此类别中的最新产品是MC34262/MC33262控制器。 另一家CrM PFC控制器供应商是Fairchild Semiconductor。其FAN6920MR在单个封装中集成了CrM PFC控制器和准谐振PWM控制器。对于PFC,FAN6920MR使用受控的导通时间技术来提供稳定的DC输出电压,以及执行功率因数校正。 由于峰值电流应力较低,同时纹波电流减小,滤波任务更容易,因此CCM控制在许多应用中广泛使用,范围从中等功率到高功率应用。一些提供基于CCM的PFC控制器的主要供应商包括Fairchild Semiconductor,Infineon Technologies,International Rectifier,NXP Semiconductor,ON Semiconductor,Power Integrations和Texas Instruments。 在DCM空间(也是中低功率应用的首选)中,Cirrus Logic采用数字技术创建了一种非连续模式有源PFC控制器,无需多个无源元件即可实现低成本适用于PC,笔记本适配器和数字电视接收器的PFC解决方案。 CS1500(图3)采用可变导通时间和可变频率算法,以实现接近单位功率因数和低EMI辐射,从而简化EMI滤波。图3:Cirrus Logic的数字PFC控制器执行自适应数字算法,将交流电源输入电流波形整形为与输入电压波形同相。

  • 发表了主题帖: AC-DC适配器和USB PD充电器尺寸将可减50%

          TI最新开发成功的UCC28780有源钳位反激式控制器和UCC24612同步整流器控制器芯片组,工作频率高达1MHz,可帮助将平板电脑、智能手机AC/DC适配器和USB type-c PD充电器的电源尺寸减少50%。而且,在满载情况下可实现高达95%的效率,待机功耗小于40mW。   市场上主流的笔记本电脑体积正变得越来越小,智能手机的屏幕越来越大,与此同时,它们要求的功率却越来越高,从而导致现在面临一个问题,就是AC-DC电源适配器的体积越来越大,携带越来越不方便。这就给当前市面上主流的准谐振反激式拓扑结构带来非常大的挑战。   TI最新开发成功的业内第一个有源钳位反激式控制器解决方案能够很好地克服准谐振反激式拓扑结构带来的挑战,它可以从三个方面帮助缩小电源和充电器解决方案的尺寸。第一个是能够把开关损耗降到最低的同时把EMI降下来。以适当的控制钳位,实现零电压开关(ZVS)。第二个是提升效率,通过循环泄漏能量并将其传递到输出端而不是损耗掉,实现高于传统反激式转换器的效率。第三点则是通过实现更高的功率密度,以更低的开关能耗使开关频率更高,从而允许采用体积更小的无源元件。   这一芯片组由UCC28780有源钳位反激式控制器和UCC24612高频多模式同步整流器控制器构成,两个芯片加起来可实现一个非常高效率有源钳位反激式方案,它的工作频率高达1MHz,可帮助将AC/DC适配器和USB PD充电器的电源尺寸减半。对于需要在小尺寸解决方案中最大化充电效率的电池供电电子设备而言,TI新推出的bq25910 6A三级降压电池充电器可在智能手机、平板电脑和电子销售终端(EPOS)中将解决方案尺寸减小60%。   TI高压电源解决方案副总裁Steve Lambouses表示:“消费者希望以更小的尺寸实现更快速的充电,这些新解决方案不仅能够实现这一目标,而且还能使设计人员以更低的功耗实现比之前更多的功能。”   德州仪器高电压产品系统及应用工程经理John Stevens说:“UCC28780是业界第一个量产的有源钳位反激式控制器,UCC24612则是第一个针对有源钳位反激式拓扑的同步整流控制器。我们通过一个非常高智能的方案来控制开关,能达到很高的效率,超过CoC Tier2和DoE Level VI 这些非常重要的效率标准。”   UCC28780同时支持氮化镓(GaN)和硅(Si)FET,先进的自适应功能使有源钳位反激式拓扑结构满足现代效率标准要求。采用基于输入和输出条件改变操作的多模态控制,将UCC28780与UCC24612搭配后,可以在满负载和轻负载条件下实现并保持高效率。   有源钳位反激式解决方案的三大性能特色是:   · 功率密度提高一倍:该芯片组可在高达1MHz的频率下实现高效运行,与目前的解决方案相比,可将尺寸缩小50%,而且功率密度更高。   · 高效率:多模态控制在满载情况下可实现高达95%的效率,待机功耗小于40mW,超过CoC Tier 2和美国能源部(DoE)VI级能效标准。对于75W以上的设计,工程师还可以将芯片组与新款6引脚功率因数校正(PFC)控制器UCC28056进行搭配。该控制器针对轻载效率和低待机功耗进行了优化,符合强制性国际电工技术委员会(IEC)61000-3-2 交流电流谐波限制规定。   · 简化设计:通过使用自适应零电压开关(ZVS)控制等功能,工程师可以通过结合电阻设置和自整定控制器,轻松设计系统。   John Stevens指出:“基于UCC28780和UCC24612芯片组实现的解决方案,能够减少50%的占用空间,在满负载情况下可以提供95%的效率。还有一个特点是待机功耗小于40mW,可以在全世界每一个地方都符合该地区的待机标准,现在中国也非常重视节能,这是一个很重要的性能指标。”   配合这一芯片组,TI还推出了一款新的PFC控制器UCC28056,以帮助工程师的设计达到最高效率、最低待机功耗以及简化系统设计。UCC28056有最好的效率,在轻载的时候,10%的轻载还可以到90%以上的效果。待机功耗也非常低,只有25mW,允许将PFC永远打开。   John Stevens说:“以往的设计,在轻载或待机时PFC是断掉的,UCC28056则不需要,这是非常重要的功能。这个UCC28056跟我们今天主要介绍的UCC28780和UCC24612达成一个非常完美的组合,可以应用在从小功率到中功率变压器中。”UCC28056的应用市场非常广,从数字电视、游戏台式电脑、适配器到电动工具以及其他AC/DC的应用。TI可以提供整套的解决方案。   这是一个简单的线路,你可以看到UCC28056仿真的元器件非常细小,可以把整个系统做得更小型,不管是从小功率的应用或者大功率的应用里,TI有一整套非常高功率的系统可以支撑。   这是TI现在提供的评估板,相关的参考资料可以在TI的官网上下载。同时,TI还提供65w USB type-c的参考设计。这个参考设计可以达到30w/立方寸的功率密度,实现92%的峰值效率。   三级降压电池充电器可实现更高的充电效率   采用创新的三级功率转换技术,bq25910与传统架构相比,可显着降低热损耗,将充电速度提高50%。   · 小尺寸解决方案:bq25910集成了MOFSET和无损电流感测功能,可减少印刷电路板(PCB)空间,并允许设计人员使用小型0.33μH电感器,从而节省更多空间。   · 更快的充电速度:bq25910可以实现95%的充电效率,可在不到30分钟的时间内将标准智能手机电池从空电量充电至70%。   · 灵活的系统设计:即使将电池放置在系统充电器之外,差分电池电压检测线也可以通过绕过PCB中的寄生电阻实现快速充电,提供更精确的电压测量。

  • 发表了主题帖: 怎么减少开关电源间的电磁干扰?

            开关电源也叫交换式电源、开关变换器,是一种高频化电能转换装置,是电源供应器的一种。其功能是将一个位准的电压,透过不同形式的架构转换为用户端所需求的电压或电流。开关电源的输入多半是交流电源(例如市电)或是直流电源,而输出多半是需要直流电源的设备,例如个人电脑,而开关电源就进行两者之间电压及电流的转换。   开关电源不同于线性电源,开关电源利用的切换晶体管多半是在全开模式(饱和区)及全闭模式(截止区)之间切换,这两个模式都有低耗散的特点,切换之间的转换会有较高的耗散,但时间很短,因此比较节省能源,产生废热较少。理想上,开关电源本身是不会消耗电能的。电压稳压是透过调整晶体管导通及断路的时间来达到。相反的,线性电源在产生输出电压的过程中,晶体管工作在放大区,本身也会消耗电能。开关电源的高转换效率是其一大优点,而且因为开关电源工作频率高,可以使用小尺寸、轻重量的变压器,因此开关电源也会比线性电源的尺寸要小,重量也会比较轻。   开关电源中的电磁干扰分为传导干扰和辐射干扰两种。通常传导干扰比较好分析,可以将电路理论和数学知识结合起来,对电磁干扰中各种元器件的特性进行研究;但对辐射干扰而言,由于电路中存在不同的干扰源的综合作用,又涉及到电磁场理论,分析起来比较困难。   传导干扰可分为共模(CM)干扰和常模(DM)干扰。由于寄生参数的存在以及开关电源中开关器件的高频开通与关断,开关电源在其输入端(即交流电网侧)产生较大的共模干扰和常模干扰。   变换器工作在高频情况时,由于dvldt很高,激发变压器绕组间以及开关管与散热片间的寄生电容,从而产生共模干扰。   根据共模干扰产生的原理,实际应用时常采用以下几种抑制方法:   (1)优化电路元器件布置,尽量减少寄生、糯合电容。   (2)延缓开关的开通、关断时间,但这与开关电源高频化的趋势不符。   (3)应用缓冲电路,减缓dv/dt的变化率。变换器中的电流在高频情况下作开关变化,从而在输人、输出的滤波电容上产生很高的dv/dt,即在滤波电容的等效电感或阻抗上感应出干扰电压,这时就会产生常模干扰。故选用高质量的滤波电容(等效电感或阻抗很低)可以降低常模干扰。   辐射干扰又可分为近场干扰[测量点与场源距离<λ/6(λ为干扰电磁波波长)]和远场干扰(测量点与场源距离>λ/6)。由麦克斯韦电磁场理论可知,导体中变化的电流会在其周围空间产生变化的磁场,而变化的磁场又产生变化的电场。两者都遵循麦克斯韦方程式。而这一变化电流的幅值和频率决定了产生电磁场的大小以及其作用范围。在辐射研究中天线是电磁辐射源,在开关电源电路中,主电路中的元器件、连线都可以认为是天线,可以应用电偶极子和磁偶极子理论来分析。分析时,二极管、开关管、电容等可看成电偶极子;电感线圈可以认为是磁偶极子,再以相关的电磁场理论进行综合分析就可以了。   需要注意的是,不同支路的电流相位不一定相同,在磁场计算时这一点尤其重要。相位不同,一是因为干扰从干扰源传播到测量点存在时延作用(也称迟滞效应);二是因为元器件本身的特性导致相位不同。如电感中电流相位比其他元器件要滞后。迟滞效应引起的相位滞后是信号频率作用的结果,仅在频率很高时作用才较明显(如GHz级或更高);对于功率电子器件而言,频率相对较低,故迟滞效应作用不是很大。   在开关电源产生的两类干扰中,传导干扰由于经电网传播,会对其他电子设备产生严重的干扰,往往引起更严重的问题。常用的抑制方法有缓冲器法,减少搞合路径法,减少寄生元件法等。近年来,随着对电子设备电磁干扰的限制越来越严格,又出现了一些新的抑制方法,主要集中在新的控制方法与新的无源缓冲电路的设计等几个方面。   调制频率控制   干扰是根据开关频率变化的,干扰的能量集中在这些离散的开关频率点上,所以很难满足抑制电磁干扰(EMI)的要求。通过将开关信号的能量调制分布在一个很宽的频带上,产生一系列的分立边频带,则干扰频谱可以展开,干扰能量被分成小份分布在这些分立频段上,从而更容易达到EMI标准。调制频率控制就是根据这种原理实现对开关电源电磁干扰的抑制。   最初人们采用随机频率控制,其主要思想是在控制电路中加入一个随机扰动分量,使开关间隔进行不规则变化。则开关噪声频谱由原来离散的尖峰脉冲噪声变成连续分布噪声,其峰值大大下降。具体办法是,由脉冲发生器产生两种不同占空比的脉冲,再与电压放大器产生的误差信号进行采样选择产生最终的控制信号。   但是,随机频率控制在开通时基本上采用PWM控制的方法,在关断时才采用随机频率,因而其调制干扰能量不便控制,抑制干扰的效果不是很理想。而最新出现的调制频率控制很好地解决了这些问题,其原理是,将主开关频率进行调制,在主频带周围产生一系列的边频带,从而将噪声能量分布在很宽的频带上,降低了干扰。这种控制方法的关键是对频率进行调制,使开关能量分布在边频带的范围,且幅值受调制系数β的影响(调制系数β=△f/fm,△f为相邻边频带间隔,fm为调制频率),一般β越大调制效果越好。   无源缓冲电路设计   开关变换器中的电磁干扰是在开关管开关时刻产生的。以整流二极管为例,在开通时,其导通电源不仅引起大量的开通损耗,还产生很大的dvl巾,导致电磁干扰;而在关断时,其两端的电压快速升高,有很大的dvl巾,从而产生电磁干扰。缓冲电路不仅可以抑制开通时的dvldt、限制关断时的dvl白,还具有电路简单、成本较低的特点,因而得到广泛应用。但是传统的缓冲电路中往往采用有源辅助开关,电路复杂不易控制,并有可能导致更高的电压或电流应力,降低了可靠性。因此许多新的无源缓冲器应运而生。

  • 发表了主题帖: 简单的LM317可调电源

    本帖最后由 fish001 于 2019-5-20 22:33 编辑 可以看到只有非常简单的几个原件,简单!粗暴!LM317—可能每个电子DIY爱好者都有接触过,是使用极为广泛的一类串联集成稳压器。其输出电压:1.25-37VDC;输出电流:5mA-1.5A;芯片内部具有过热、过流、短路保护电路;最大输入-输出电压差:40VDC,最小输入-输出电压差:3VDC;宽电压的输出适合各种各样的场合使用。输入的交流电由D1-D4组成的整流桥进行全桥整流,之后由C4、C1滤波,在送入LM317的第3脚。R1、W1、C3、IC1组成反馈调整网络,使输出端输出一定的直流电压。C4、C5是电源的输出端滤波电容。电源指示灯由R2、D7组成。限流电阻为R2。二极管D5、D6在电路中起保护作用。  材料  LM317、100Ω电阻-R1、2K-R2、5.1K可调电阻-W1、1000μF-C1、220μF-C3/C4、104瓷片电容-C2C5、LED-D7、1N4007-D1D2D3D4D5D6。

  • 发表了主题帖: 电路设计常见误区整理

         电路设计并不是想当然,你脑子一拍就可以设计出来,有没有经验设计出来的东西是相差千里。今天我们来看看电子工程师会出现的下面的几个误区,你是不是也这样想的。     误区一:这板子的PCB 设计要求不高,就用细一点的线,自动布吧。 点评:自动布线必然要占用更大的PCB 面积,同时产生比手动布线多好多倍的过孔,在批量很大的产品中,PCB 厂家降价所考虑的因素除了商务因素外,就是线宽和过孔数量,它们分别影响到PCB 的成品率和钻头的消耗数量,节约了供应商的成本,也就给降价找到了理由。      误区二:这些总线信号都用电阻拉一下,感觉放心些。 点评:信号需要上下拉的原因很多,但也不是个个都要拉。上下拉电阻拉一个单纯的输入信号,电流也就几十微安以下,但拉一个被驱动了的信号,其电流将达毫安级,现在的系统常常是地址数据各32位,可能还有244/245 隔离后的总线及其它信号,都上拉的话,几瓦的功耗就耗在这些电阻上了。      误区三:CPU 和FPGA的这些不用的I/O 口怎么处理呢?先让它空着吧,以后再说。 点评:不用的I/O 口如果悬空的话,受外界的一点点干扰就可能成为反复振荡的输入信号了,而MOS 器件的功耗基本取决于门电路的翻转次数。如果把它上拉的话,每个引脚也会有微安级的电流,所以最好的办法是设成输出(当然外面不能接其它有驱动的信号)。      误区四:这款FPGA还剩这么多门用不完,可尽情发挥吧。 点评:FGPA的功耗与被使用的触发器数量及其翻转次数成正比,所以同一型号的FPGA在不同电路不同时刻的功耗可能相差100 倍。尽量减少高速翻转的触发器数量是降低FPGA功耗的根本方法。      误区五:这些小芯片的功耗都很低,不用考虑。 点评:对于内部不太复杂的芯片功耗是很难确定的,它主要由引脚上的电流确定,一个ABT16244,没有负载的话耗电大概不到1 毫安,但它的指标是每个脚可驱动60毫安的负载(如匹配几十欧姆的电阻),即满负荷的功耗最大可达60*16=960mA ,当然只是电源电流这么大,热量都落到负载身上了。       误区六:存储器有这么多控制信号,我这块板子只需要用OE和WE信号就可以了,片选就接地吧,这样读操作时数据出来得快多了。 点评:大部分存储器的功耗在片选有效时(不论OE和WE如何)将比片选无效时大100 倍以上,所以应尽可能使用CS来控制芯片,并且在满足其它要求的情况下尽可能缩短片选脉冲的宽度。     误区七:这些信号怎么都有过冲啊?只要匹配得好,就可消除了。 点评:除了少数特定信号外(如100BASE-T 、CML ),都是有过冲的,只要不是很大,并不一定都需要匹配,即使匹配也并非要匹配得最好。象TTL 的输出阻抗不到50欧姆,有的甚至20欧姆,如果也用这么大的匹配电阻的话,那电流就非常大了,功耗是无法接受的,另外信号幅度也将小得不能用,再说一般信号在输出高电平和输出低电平时的输出阻抗并不相同,也没办法做到完全匹配。所以对TTL 、LVDS、422 等信号的匹配只要做到过冲可以接受即可。       误区八:降低功耗都是硬件人员的事,与软件没关系。 点评:硬件只是搭个舞台,唱戏的却是软件,总线上几乎每一个芯片的访问、每一个信号的翻转差不多都由软件控制的,如果软件能减少外存的访问次数(多使用寄存器变量、多使用内部CACHE 等)、及时响应中断(中断往往是低电平有效并带有上拉电阻)及其它争对具体单板的特定措施都将对降低功耗作出很大的贡献。       误区九:CPU 用大一点的CACHE ,就应该快了。 点评:CACHE 的增大,并不一定就导致系统性能的提高,在某些情况下关闭CACHE 反而比使用CACHE 还快。原因是搬到CACHE 中的数据必须得到多次重复使用才会提高系统效率。所以在通信系统中一般只打开指令CACHE ,数据CACHE 即使打开也只局限在部分存储空间,如堆栈部分。同时也要求程序设计要兼顾CACHE 的容量及块大小,这涉及到关键代码循环体的长度及跳转范围,如果一个循环刚好比CACHE 大那么一点点,又在反复循环的话,那就惨了。       误区十:存储器接口的时序都是厂家默认的配置,不用修改的。 点评:BSP 对存储器接口设置的默认值都是按最保守的参数设置的,在实际应用中应结合总线工作频率和等待周期等参数进行合理调配。有时把频率降低反而可提高效率,如RAM 的存取周期是70ns,总线频率为40M 时,设3 个周期的存取时间,即75ns即可;若总线频率为50M 时,必须设为4 个周期,实际存取时间却放慢到了80ns。        误区十一:这个CPU 带有DMA 模块,用它来搬数据肯定快。 点评:真正的DMA 是由硬件抢占总线后同时启动两端设备,在一个周期内这边读,那边写。但很多嵌入CPU 内的DMA 只是模拟而已,启动每一次DMA 之前要做不少准备工作(设起始地址和长度等),在传输时往往是先读到芯片内暂存,然后再写出去,即搬一次数据需两个时钟周期,比软件来搬要快一些(不需要取指令,没有循环跳转等额外工作),但如果一次只搬几个字节,还要做一堆准备工作,一般还涉及函数调用,效率并不高。所以这种DMA 只对大数据块才适用。       误区十二:100M的数据总线应该算高频信号,至于这个时钟信号频率才8K,问题不大。 点评:数据总线的值一般是由控制信号或时钟信号的某个边沿来采样的,只要针对这个边沿保持足够的建立时间和保持时间即可,此范围之外有干扰也罢过冲也罢都不会有多大影响(当然过冲最好不要超过芯片所能承受的最大电压值),但时钟信号不管频率多低(其实频谱范围是很宽的),它的边沿才是关键的,必须保证其单调性,并且跳变时间需在一定范围内。     误区十三:既然是数字信号,边沿当然是越陡越好。 点评:边沿越陡,其频谱范围就越宽,高频部分的能量就越大;频率越高的信号就越容易辐射(如微波电台可做成手机,而长波电台很多国家都做不出来),也就越容易干扰别的信号,而自身在导线上的传输质量却变得越差,因此能用低速芯片的尽量使用低速芯片。      误区十四:信号匹配真麻烦,如何才能匹配好呢? 点评:总的原则是当信号在导线上的传输时间超过其跳变时间时,信号的反射问题才显得重要。信号产生反射的原因是线路阻抗的不均匀造成的,匹配的目的就是为了使驱动端、负载端及传输线的阻抗变得接近。但能否匹配得好,与信号线在PCB 上的拓扑结构也有很大关系,传输线上的一条分支、一个过孔、一个拐角、一个接插件、不同位置与地线距离的改变等都将使阻抗产生变化,而且这些因素将使反射波形变得异常复杂,很难匹配,因此高速信号仅使用点到点的方式,尽可能地减少过孔、拐角等问题。

  • 发表了主题帖: 电源模块的分类及特点

           做电源设计的工程师经常会遇到一个难题,就是电源模块的选择和设计。电源模块是可以直接贴装在印刷电路板上的电源供应器,其特点是可为专用集成电路(ASIC)、数字信号处理器 (DSP)、微处理器、存储器、现场可编程门阵列 (FPGA) 及其他数字或模拟负载提供供电。一般来说,这类模块称为负载点 (POL) 电源供应系统或使用点电源供应系统 (PUPS)。由于模块式结构的优点甚多,因此模块电源广泛用于交换设备、接入设备、移动通讯、微波通讯以及光传输、路由器等通信领域和汽车电子、航空航天等。   由于模块式结构的优点甚多,因此模块电源广泛用于交换设备、接入设备、移动通讯、微波通讯以及光传输、路由器等通信领域和汽车电子、航空航天等。尤其近几年由于数据业务的飞速发展和分布式供电系统的不断推广,模块电源的增幅已经超出了一次电源。模块电源具有隔离作用,抗干扰能力强,自带保护功能,便于集成。随着半导体工艺、封装技术和高频软开关的大量使用,模块电源功率密度越来越大,转换效率越来越高,应用也越来越简单。   人们在开关电源技术领域是边开发相关的电力电子器件,边开发开关变频技术,两者相互促进推动着开关电源每年以超过两位数字的增长率向着轻、小、薄、低噪声、高可靠、抗干扰的方向发展。开关电源可分为AC/DC和DC/DC两大类,DC/DC变换器现已实现模块化,且设计技术及生产工艺在国内外均已成熟和标准化,并已得到用户的认可,但AC/DC的模块化,因其自身的特性使得在模块化的进程中,遇到较为复杂的技术和工艺制造问题。   按现代电力电子的应用领域,电源模块有很多,包括:   1、绿色电源模块   高速发展的计算机技术带领人类进入了信息社会,同时也促进了电源模块技术的迅速发展。八十年代,计算机全面采用了开关电源,率先完成计算机电源换代。接着开关电源技术相继进入了电子、电器设备领域。   计算机技术的发展,提出绿色电脑和绿色电源模块。绿色电脑泛指对环境无害的个人电脑和相关产品,绿色电源系指与绿色电脑相关的高效省电电源,根据美国环境保护署l992年6月17日“能源之星"计划规定,桌上型个人电脑或相关的外围设备,在睡眠状态下的耗电量若小于30瓦,就符合绿色电脑的要求,提高电源效率是降低电源消耗的根本途径。就目 前效率为75%的200瓦开关电源而言,电源自身要消耗50瓦的能源。   2、开关电源模块   通信业的迅速发展极大的推动了通信电源的发展。高频小型化的开关电源及其技术已成为现代通信供电系统的主流。在通信领域中,通常将整流器称为一次电源,而将直流-直流(DC/DC)变换器称为二次电源。一次电源的作用是将单相或三相交流电网变换成标称值为48V的直流电源。当前在程控交换机用的一次电源中,传统的相控式稳压电源己被高频开关电源取代,高频开关电源(也称为开关型整流器SMR)通过MOSFET或IGBT的高频工作,开关频率一般控制在50-100kHz范围内,实现高效率和小型化。近几年,开关整流器的功率容量不断扩大,单机容量己从48V/12.5A、48V/20A扩大到48V/200A、48V/400A。   因通信设备中所用集成电路的种类繁多,其电源电压也各不相同,在通信供电系统中采用高功率密度的高频DC-DC隔离电源模块,从中间母线电压(一般为48V直流)变换成所需的各种直流电压,这样可大大减小损耗、方便维护,且安装、增加非常方便。一般都可直接装在标准控制板上,对二次电源的要求是高功率密度。因通信容量的不断增加,通信电源容量也将不断增加。   3、变换器   DC/DC变换器将一个固定的直流电压变换为可变的直流电压,这种技术被广泛应用于无轨电车、地铁列车、电动车的无级变速和控制,同时使上述控制获得加速平稳、快速响应的性能,并同时收到节约电能的效果。用直流斩波器代替变阻器可节约电能(20~30)%。直流斩波器不仅能起调压的作用(开关电源), 同时还能起到有效地抑制电网侧谐波电流噪声的作用。   通信电源的二次电源DC/DC变换器已商品化,模块采用高频PWM技术,开关频率在500kHz左右,功率密度为5W~20W/in3。随着大规模集成电路的发展,要求电源模块实现小型化,因此就要不断提高开关频率和采用新的电路拓扑结构,当前已有一些公司研制生产了采用零电流开关和零电压开关技术的二次电源模块,功率密度有较大幅度的提高。   4、变频器电源   变频器电源主要用于交流电机的变频调速,其在电气传动系统中占据的地位日趋重要,已获得巨大的节能效果。变频器电源主电路均采用交流-直流-交流方案。工频电源通过整流器变成固定的直流电压,然后由大功率晶体管或IGBT组成的PWM高频变换器, 将直流电压逆变成电压、频率可变的交流输出,电源输出波形近似于正弦波,用于驱动交流异步电动机实现无级调速。   国际上400kVA以下的变频器电源系列产品已经问世。八十年代初期,日本东芝公司最先将交流变频调速技术应用于空调器中。至1997年,其占有率已达到日本家用空调的70%以上。变频空调具有舒适、节能等优点。国内于90年代初期开始研究变频空调,96年引进生产线生产变频空调器,逐渐形成变频空调开发生产热点。预计到2000年左右将形成高潮。变频空调除了变频电源外,还要求有适合于变频调速的压缩机电机。优化控制策略,精选功能组件,是空调变频电源研制的进一步发展方向。   5、焊机电源模块   高频逆变式整流焊机电源是一种高性能、高效、省材的新型焊机电源,代表了当今焊机电源的发展方向。由于IGBT大容量模块的商用化,这种电源更有着广阔的应用前景。   逆变焊机电源大都采用交流-直流-交流-直流(AC-DC-AC-DC)变换的方法。50Hz交流电经全桥整流变成直流,IGBT组成的PWM高频变换部分将直流电逆变成20kHz的高频矩形波,经高频变压器耦合, 整流滤波后成为稳定的直流,供电弧使用。   由于焊机电源的工作条件恶劣,频繁的处于短路、燃弧、开路交替变化之中,因此高频逆变式整流焊机电源的工作可靠性问题成为最关键的问题,也是用户最关心的问题。采用微处理器做为脉冲宽度调制(PWM)的相关控制器,通过对多参数、多信息的提取与分析,达到预知系统各种工作状态的目的,进而提前对系统做出调整和处理,解决了当前大功率IGBT逆变电源可靠性。   6、直流电源模块   大功率开关型高压直流电源广泛应用于静电除尘、水质改良、医用X光机和CT机等大型设备。电压高达50~l59kV,电流达到0.5A以上,功率可达100kW。   自从70年代开始,日本的一些公司开始采用逆变技术,将市电整流后逆变为3kHz左右的中频,然后升压。进入80年代,高频开关电源技术迅速发展。德国西门子公司采用功率晶体管做主开关元件,将电源的开关频率提高到20kHz以上。并将干式变压器技术成功的应用于高频高压电源,取消了高压变压器油箱,使变压器系统的体积进一步减小。国内对静电除尘高压直流电源进行了研制,市电经整流变为直流,采用全桥零电流开关串联谐振逆变电路将直流电压逆变为高频电压,然后由高频变压器升压,最后整流为直流高压。   分布供电方式具有节能、可靠、高效、经济和维护方便等优点。已被大型计算机、通信设备、航空航天、工业控制等系统逐渐采纳,也是超高速型集成电路的低电压电源(3.3V)的最为理想的供电方式。在大功率场合,如电镀、电解电源、电力机车牵引电源、中频感应加热电源、电动机驱动电源等领域也有广阔的应用前景。   如今,我国有模块电源生产厂商几百家,以私营企业、小型企业为主,整体竞争力水平较低,行业集中度较低,市场排名前10家厂商的市场占有率不到60%,且多数是国际品牌,本土品牌较少。尤其在中低端模块电源产品市场,行业基本呈现完全竞争状况,而在高端产品市场,由于相应的技术、工艺等的制约,市场集中度较高,市场份额主要被领先的国际跨国公司占领。在模块电源领域,外资企业凭借较高的技术水平,品牌优势和遍及全球的营销网络等迅速抢占国内市场份额,而内资企业则相对逊色,国内电源模块厂商还有很大上升空间。

  • 发表了主题帖: CMOS电路的ESD保护结构设计

         ESD(静电放电)是CMOS电路中最为严重的失效机理之一,严重的会造成电路自我烧毁。论述了CMOS集成电路ESD保护的必要性,研究了在CMOS电路中ESD保护结构的设计原理,分析了该结构对版图的相关要求,重点讨论了在I/O电路中ESD保护结构的设计要求。 1 引言      静电放电会给电子器件带来破坏性的后果,它是造成集成电路失效的主要原因之一。随着集成电路工艺不断发展,CMOS电路的特征尺寸不断缩小,管子的栅氧厚度越来越薄,芯片的面积规模越来越大,MOS管能承受的电流和电压也越来越小,而外围的使用环境并未改变,因此要进一步优化电路的抗ESD性能,如何使全芯片有效面积尽可能小、ESD性能可靠性满足要求且不需要增加额外的工艺步骤成为IC设计者主要考虑的问题。   2 ESD保护原理 ESD保护电路的设计目的就是要避免工作电路成为ESD的放电通路而遭到损害,保证在任意两芯片引脚之间发生的ESD,都有适合的低阻旁路将ESD电流引入电源线。这个低阻旁路不但要能吸收ESD电流,还要能箝位工作电路的电压,防止工作电路由于电压过载而受损。在电路正常工作时,抗静电结构是不工作的,这使ESD保护电路还需要有很好的工作稳定性,能在ESD发生时快速响应,在保护电路的同时,抗静电结构自身不能被损坏,抗静电结构的负作用(例如输入延迟)必须在可以接受的范围内,并防止抗静电结构发生闩锁。     3 CMOS电路ESD保护结构的设计      大部分的ESD电流来自电路外部,因此ESD保护电路一般设计在PAD旁,I/O电路内部。典型的I/O电路由输出驱动和输入接收器两部分组成。ESD 通过PAD导入芯片内部,因此I/O里所有与PAD直接相连的器件都需要建立与之平行的ESD低阻旁路,将ESD电流引入电压线,再由电压线分布到芯片各个管脚,降低ESD的影响。具体到I/O电路,就是与PAD相连的输出驱动和输入接收器,必须保证在ESD发生时,形成与保护电路并行的低阻通路,旁路 ESD电流,且能立即有效地箝位保护电路电压。而在这两部分正常工作时,不影响电路的正常工作。 常用的ESD保护器件有电阻、二极管、双极性晶体管、MOS管、可控硅等。由于MOS管与CMOS工艺兼容性好,因此常采用MOS管构造保护电路。        CMOS工艺条件下的NMOS管有一个横向寄生n-p-n(源极-p型衬底-漏极)晶体管,这个寄生的晶体管开启时能吸收大量的电流。利用这一现象可在较小面积内设计出较高ESD耐压值的保护电路,其中最典型的器件结构就是栅极接地NMOS(GGNMOS,GateGroundedNMOS)。 在正常工作情况下,NMOS横向晶体管不会导通。当ESD发生时,漏极和衬底的耗尽区将发生雪崩,并伴随着电子空穴对的产生。一部分产生的空穴被源极吸收,其余的流过衬底。由于衬底电阻Rsub的存在,使衬底电压提高。当衬底和源之间的PN结正偏时,电子就从源发射进入衬底。这些电子在源漏之间电场的作用下,被加速,产生电子、空穴的碰撞电离,从而形成更多的电子空穴对,使流过n-p-n晶体管的电流不断增加,最终使NMOS晶体管发生二次击穿,此时的击穿不再可逆,则NMOS管损坏。 为了进一步降低输出驱动上NMOS在ESD时两端的电压,可在ESD保护器件与GGNMOS之间加一个电阻。这个电阻不能影响工作信号,因此不能太大。画版图时通常采用多晶硅(poly)电阻。         只采用一级ESD保护,在大ESD电流时,电路内部的管子还是有可能被击穿。GGNMOS导通,由于ESD电流很大,衬底和金属连线上的电阻都不能忽略,此时GGNMOS并不能箝位住输入接收端栅电压,因为让输入接收端栅氧化硅层的电压达到击穿电压的是GGNMOS与输入接收端衬底间的IR压降。为避免这种情况,可在输入接收端附近加一个小尺寸GGNMOS进行二级ESD保护,用它来箝位输入接收端栅电压,如图1所示。      CMOS电路的ESD保护结构设计   http://file2.dzsc.com/data/19/04/09/9207_142047353.png 在画版图时,必须注意将二级ESD保护电路紧靠输入接收端,以减小输入接收端与二级ESD保护电路之间衬底及其连线的电阻。为了在较小的面积内画出大尺寸的NMOS管子,在版图中常把它画成手指型,画版图时应严格遵循I/OESD的设计规则。 如果PAD仅作为输出,保护电阻和栅短接地的NMOS就不需要了,其输出级大尺寸的PMOS和NMOS器件本身便可充当ESD防护器件来用,一般输出级都有双保护环,这样可以防止发生闩锁。 在全芯片的ESD结构设计时,注意遵循以下原则:         (1)外围VDD、VSS走线尽可能宽,减小走线上的电阻;(2)设计一种 VDD-VSS之间的电压箝位结构,且在发生ESD时能提供VDD-VSS直接低阻抗电流泄放通道。对于面积较大的电路,最好在芯片的四周各放置一个这样的结构,若有可能,在芯片外围放置多个VDD、VSS的PAD,也可以增强整体电路的抗ESD能力;(3)外围保护结构的电源及地的走线尽量与内部走线分开,外围ESD保护结构尽量做到均匀设计,避免版图设计上出现ESD薄弱环节;(4)ESD保护结构的设计要在电路的ESD性能、芯片面积、保护结构对电路特性的影响如输入信号完整性、电路速度、输出驱动能力等进行平衡考虑设计,还需要考虑工艺的容差,使电路设计达到最优化;(5)在实际设计的一些电路中,有时没有直接的VDD-VSS电压箝位保护结构,此时,VDD-VSS之间的电压箝位及ESD电流泄放主要利用全芯片整个电路的阱与衬底的接触空间。所以在外围电路要尽可能多地增加阱与衬底的接触,且N+P+的间距一致。若有空间,则最好在VDD、VSS的PAD旁边及四周增加VDD-VSS电压箝位保护结构,这样不仅增强了VDD-VSS模式下的抗ESD能力,也增强了I/O-I/O模式下的抗ESD能力。 一般只要有了上述的大致原则,在与芯片面积折中的考虑下,一般亚微米CMOS电路的抗ESD电压可达到2500V以上,已经可以满足商用民品电路设计的ESD可靠性要求。        对于深亚微米超大规模CMOS IC的ESD结构设计,常规的ESD保护结构通常不再使用了,通常大多是深亚微米工艺的Foundry生产线都有自己外围标准的ESD结构提供,有严格标准的ESD结构设计规则等,设计师只需调用其结构就可以了,这可使芯片设计师把更多精力放在电路  本身的功能、性能等方面的设计。       4 结束语 ESD保护设计随着CMOS工艺水平的提高而越来越困难,ESD保护已经不单是输入脚或输出脚的ESD保护设计问题,而是全芯片的静电防护问题。 芯片里每一个I/O电路中都需要建立相应的ESD保护电路,此外还要从整个芯片全盘考虑,采用整片(whole-chip)防护结构是一个好的选择,也能节省I/OPAD上ESD元件的面积。

  • 发表了主题帖: 电源内部系统的电磁兼容问题分析

          目前的电子产品正在不断的向高性能发展。从多功能的手机,高端的数码相机,到各式各样的游戏机,与以往相比它们现在的功能复杂性不断的增大,除了数字电路以外,还会集成很多通信功能在里面,例如蓝牙等等。这样广泛的功能继承以后,除了普通的辐射以外,内部的EMC问题也是近几年来非常热门的讨论话题。   内部电源系统的EMI产生的原因有以下几点。第一,移动终端的高速芯片不断产生低电压工作,降低了EMC的工作余量。第二,设备和数字设备的共用。第三,接口通信速度的提高。第四,汽车应用中电子控制的普及。   接下来简单介绍一下电源内部系统电磁兼容问题。以笔记本电脑为例,由于它有数字电路和通信电路,内部的电路会产生一些辐射,噪声很容易被周围的天线接收到,接收到这些噪声以后,就会对电路的接收灵敏度产生,这就是我们目前常说的内部系统的电磁兼容问题。   这是产生灵敏度的几个原理,主要的EMC路径都可能会引起周围的噪声影响系统内部的EMC兼容问题。   简单说一下内部系统的EMC兼容问题,EMC分为远场和近场效应,通过对天线的简单分析,就可以很好的帮助解决这个问题。  http://file2.dzsc.com/data/19/04/25/9207_141518067.png  接下来从平板电脑的灵敏度下降开始展开后续的话题。由于各种电路工作时所产生的噪声影响了天线的接收灵敏度,右上角播报语音视频时,它会接收到比较大的噪声能量,红色表示在工作的时候,蓝色表示在待机的时候,待机的时候噪声就会降低很多。左下角的图是在平板终端里面,高清摄像头在工作的时候,(英)天线会接收到噪声的能量,同样红色代表的是工作时的噪声,而蓝色代表的是待机的噪声能量。最后是在LCD工作的时候,我们所看到的噪声能量,红色代表LCD点亮的时候,而蓝色是LCD背光面的时候。   这是现在比较流行的智能手机,它有一个3G的天线,一个高清的摄像头,以及CPU芯片,这些都有可能产生比较高频的辐射噪声,而这辐射噪声被3G的天线耦合接收到的话,就会影响到3G天线的接收灵敏度。第二个是平板电脑,平板电脑在很多时候都会被当做一个音视频处理的多媒体终端来使用,因此播放音乐的时候,一定会影响到客户的使用。常见的平板终端中的噪声,数字电路电源以及天线和音频摆放的大致问题,这些因素对于我们发生问题的时候,找到解决的方法和对策非常重要。这块是电池,这边是主要的处理芯片以及电源管理芯片,而这边是一个音频回路,上面是高清的摄像头,目前常用的平板高清当中,射频部分都使用3G模块,它的接收天线可能非常靠近噪声能量比较高的元器件,或者是芯片,因此使用这样的电子产品进行办公的话,就会有内部的电磁兼容问题,使得天线的接收灵敏度有很明显的下降。   这是目前主流的一款智能手机,这上面的噪声主要于电源管理芯片,其次是主芯片。因此我们必须有效的抑制噪声在800—900的噪声能量,可以发现这个方案对于整体的噪声抑制是最有效的。   第二个同样是智能手机,我们会尝试一些其他的手法来抑制噪声。这是接收端灵敏度的曲线,显然灵敏度有一个明显的改善。   这是刚才提到的音频芯片以及音频线,这是LCD背光控制芯片,它的电源上面追加了一个相关的电流,我们对平板电脑的噪声能量进行分析,红色是追加前的,蓝色是追加后的,发现追加以后噪声能量都会有一个很明显的抑制效果,这就说噪声源是来自于这两个位置。下面列举一下刚才的对策当中所使用到的EMC器件。平板电脑当中在音频线上追加的0202,在音频阶段使用的时候,对音质不会产生太大的影响。这是在LCD上所产生的共模电板,它的长和宽都没有超过一毫米,同时它是采用精细光刻的薄膜工艺进行加工的。   

  • 发表了主题帖: 如何安装使用压力变送器

          在安装使用压力变送器前应详细阅读产品样本及使用说明书,安装时压力接口不能泄露,确保量程及接线正确。压力传感器及变送器的外壳一般需接地,信号电缆线不得与动力电缆混合铺设, 传感器及变送器周围应避免有强电磁干扰。传感器及变送器在使用中应按行业规定进行周期检定。   电容式压力变送器常见故障分析与处理方法电容式压力变送器测量部分敏感部件采用全焊接结构,电子线路部分采用波峰焊接和接插件安装方式,整体结构坚固、耐用,故障甚少。对绝大多数使用者来就,如发现敏感部件出现故障,一般无法自行修复,应与生产厂家联系更换其整体部件。   变送器测量部分的检查变送器测量部分产生的故障,都会引起变送器无输出或输出不正常,因此应首先检查变送器的测量敏感部件。拆下法兰,检查敏感部件隔离膜片有无变形,破损和漏油现象发生。拆下补偿板,不取出敏感部件,检查插针对壳体的绝缘电阻,在电压不超过100V的情况下,绝缘电阻不应小于100MΩ。接通电路和气路,当压力信号为量程上限值时,关闭气源,输出电压和读数值应稳定不动。如果输出电压下降,则说明变送器有泄漏,可用肥皂水检查出泄漏部位。   变送器电路部分的检查接通电源,在给定输入压力信号后,检查变送器输出端电压信号的状态。若无输出电压,应首先检查电源电压是否正常;是否符合供电要求;电源与变送器及负载设备之间有无接线错误。如果变送器接线端子上无电压或极性接反均可造成变送器无电压信号输出。排除上述原因,则应进一步检查放大器板线路中元件有无损坏问题;线路板接插件有无接触不良现象,可采取对照正常仪表的测量电压与故障仪表对应的测量电压相比较的方法,确定故障点,必要的情况下可更换有故障的放大器板。在对流量型变送器检查时,对J型放大器板应特别要注意采取防静电措施。   接通电源,在给定输入压力信号后,若变送器输出过高(大于10VDC),或输出过低(小于2.0VDC),且改变输入压力信号和调整零点、量程螺钉时输出均无反应。对于这类故障,除检查变送器测量部分敏感部件有无异常外,应检查变送器放大器板上“振荡控制电路部分”工作正常与否。高频变压器T1-12之间正常峰值电压应为25~35VP-P;频率约为32kHz。其次检查放大器板上各运算放大器的工作状况;各部分的元器件有无损坏问题等。此类故障需要更换放大器板。变送器在线路设计和工艺装配质量上要求都十分严格,在实际使用中对出现的线路故障,经检查确认后最好与生产厂家联系更换其故障线路板,以确保仪表长期工作的稳定性和可靠性。   现场故障检查施工现场出现的故障,绝大多数是由于压力传感器使用和安装方法不当引起的,归纳起来有几个方面。1.一次元件(孔板、远传测量接头等)堵塞或安装形式不对,取压点不合理。 2.引压管泄漏或堵塞,充液管里有残存气体或充气管里有残存液体,变送器过程法兰中存有沉积物,形成测量死区。3.变送器接线不正确,电源电压过高或过低,指示表头与仪表接线端子连接处接触不良。4.没有严格按照技术要求安装,安装方式和现场环境不符合技术要求。   以上压力传感器及变送器出现的故障都会引起变送器输出不正常或测量不准确,但经过细心检查,严格按照技术要求使用和安装,及时采取有效措施,问题都可以排除,对不能处理的故障,应将变送器送到实验室或生产厂家做进一步检查。

  • 发表了主题帖: 编码器的工作原理及作用

         编码器的工作原理及作用:它是一种将旋转位移转换成一串数字脉冲信号的旋转式传感器,这些脉冲能用来控制角位移,如果编码器与齿轮条或螺旋丝杠结合在一起,也可用于测量直线位移。  编码器产生电信号后由数控制置CNC、可编程逻辑控制器PLC、控制系统等来处理。这些传感器主要应用在下列方面:机床、材料加工、电动机反馈系统以及测量和控制设备。在ELTRA编码器中角位移的转换采用了光电扫描原理。读数系统是基于径向分度盘的旋转,该分度由交替的透光窗口和不透光窗口构成的。此系统全部用一个红外光源垂直照射,这样光就把盘子上的图像投射到接收器表面上,该接收器覆盖着一层光栅,称为准直仪,它具有和光盘相同的窗口。接收器的工作是感受光盘转动所产生的光变化,然后将光变化转换成相应的电变化。一般地,旋转编码器也能得到一个速度信号,这个信号要反馈给变频器,从而调节变频器的输出数据。故障现象: 1、 旋转编码器坏(无输出)时,变频器不能正常工作,变得运行速度很慢,而且一会儿变频器保护,显示“PG断开”...联合动作才能起作用。要使电信号上升到较高电平,并产生没有任何干扰的方波脉冲,这就必须用电子电路来处理。编码器pg接线与参数 矢量变频器与编码器pg之间的连接方式,必须与编码器pg的型号相对应。一般而言,编码器pg型号分差动输出、集电极开路输出和推挽输出三种,其信号的传递方式必须考虑到变频器pg卡的接口,因此选择合适的pg卡型号或者设置合理.  编码器一般分为增量型与绝对型,它们存着最大的区别:在增量编码器的情况下,位置是从零位标记开始计算的脉冲数量确定的,而绝对型编码器的位置是由输出代码的读数确定的。在一圈里,每个位置的输出代码的读数是唯一的; 因此,当电源断开时,绝对型编码器并不与实际的位置分离。如果电源再次接通,那么位置读数仍是当前的,有效的; 不像增量编码器那样,必须去寻找零位标记。  现在编码器的厂家生产的系列都很全,一般都是专用的,如电梯专用型编码器、机床专用编码器、伺服电机专用型编码器等,并且编码器都是智能型的,有各种并行接口可以与其它设备通讯。  编码器是把角位移或直线位移转换成电信号的一种装置。前者成为码盘,后者称码尺.按照读出方式编码器可以分为接触式和非接触式两种.接触式采用电刷输出,一电刷接触导电区或绝缘区来表示代码的状态是“1”还是“0”;非接触式的接受敏感元件是光敏元件或磁敏元件,采用光敏元件时以透光区和不透光区来表示代码的状态是“1”还是“0”。  按照工作原理编码器可分为增量式和绝对式两类。增量式编码器是将位移转换成周期性的电信号,再把这个电信号转变成计数脉冲,用脉冲的个数表示位移的大小。绝对式编码器的每一个位置对应一个确定的数字码,因此它的示值只与测量的起始和终止位置有关,而与测量的中间过程无关。  旋转增量式编码器以转动时输出脉冲,通过计数设备来知道其位置,当编码器不动或停电时,依靠计数设备的内部记忆来记住位置。这样,当停电后,编码器不能有任何的移动,当来电工作时,编码器输出脉冲过程中,也不能有干扰而丢失脉冲,不然,计数设备记忆的零点就会偏移,而且这种偏移的量是无从知道的,只有错误的生产结果出现后才能知道。解决的方法是增加参考点,编码器每经过参考点,将参考位置修正进计数设备的记忆位置。在参考点以前,是不能保证位置的准确性的。为此,在工控中就有每次操作先找参考点,开机找零等方法。这样的编码器是由码盘的机械位置决定的,它不受停电、干扰的影响。  绝对编码器由机械位置决定的每个位置的唯一性,它无需记忆,无需找参考点,而且不用一直计数,什么时候需要知道位置,什么时候就去读取它的位置。这样,编码器的抗干扰特性、数据的可靠性大大提高了。  由于绝对编码器在定位方面明显地优于增量式编码器,已经越来越多地应用于工控定位中。绝对型编码器因其高精度,输出位数较多,如仍用并行输出,其每一位输出信号必须确保连接很好,对于较复杂工况还要隔离,连接电缆芯数多,由此带来诸多不便和降低可靠性,因此,绝对编码器在多位数输出型,一般均选用串行输出或总线型输出,德国生产的绝对型编码器串行输出最常用的是SSI(同步串行输出)。  多圈绝对式编码器。编码器生产厂家运用钟表齿轮机械的原理,当中心码盘旋转时,通过齿轮传动另一组码盘(或多组齿轮,多组码盘),在单圈编码的基础上再增加圈数的编码,以扩大编码器的测量范围,这样的绝对编码器就称为多圈式绝对编码器,它同样是由机械位置确定编码,每个位置编码唯一不重复,而无需记忆。多圈编码器另一个优点是由于测量范围大,实际使用往往富裕较多,这样在安装时不必要费劲找零点,将某一中间位置作为起始点就可以了,而大大简化了安装调试难度。多圈式绝对编码器在长度定位方面的优势明显,已经越来越多地应用于工控定位中。

  • 2019-05-19
  • 发表了主题帖: TI CC6678数字信号处理器 (DSP) 的50种用法

         与DSP的其中一位发明者,Gene Frantz一样,对我来说,了解客户如何将我们的处理器应用到实际环境中是再开心不过的一件事情了。然而,我发现基于KeyStone™ 的TMS320C6678,一款8内核C66x DSP特别有意思,这是因为这款器件是市面上较早的高性能多核DSP之一。虽然有超过100名客户已经在他们的产品中采用了C6678 DSP,但是我可以很肯定地说,对于定点和浮点C6678 DSP来说,至少有50种不同的使用方法!不过也别担心,我不会将这个冗长的列表直接抛给你,我只是想与你分享其中5个最常见的应用。     加快回程速度—Keystone系列无线基站片上系统 (SoC) 已经充斥于无线市场,不过C6678 DSP也在无线回程领域内找到了用武之地。Sub10系统采用C6678 DSP作为其无线回程网络同步平台的基础,依赖这款基于Keystone的DSP实时算法处理和网络对接。     进行全新扫描—由于图像处理是数字信号处理的长项,大量的TI DSP在医疗成像设备中发挥了十分重要的作用,而C6678 DSP也不例外。来看一看,如何将这款Keystone多核DSP应用到你的下一个医疗成像应用中。停留在总线上—或者在使用合成孔径雷达 (SAR) 产品时采用无线传输方式。SAR技术在基于商用和军用雷达的应用中很流行,而由于SAR对先行信号处理和计算密集型处理的严重依赖性,C6678多核DSP成为针对这一函数的最佳内核。来看看如何在SAR函数中充分利用这款高性能DSP。无需讨论太多—我们在智能手机、平板电脑等设备上使用了越来越多的流媒体视频,这使我们现在很少有时间进行面对面的交谈。所有这些视频流严重增加了网络中服务器和内容分发装置的负担,正因如此,诸如H.265的视频压缩/解压缩标准的执行对于实时性能至关重要。C6678在执行视频编码时具有很高效率,并且是一款能耗极低的软件可编程芯片。在C6678 DSP如何成为一款理想的H.265处理引擎方面,我们有更多信息。快速傅里叶变换 (FFT) 是关键—由于航空电子和国防应用对于实时信号处理的依赖程度很高,这些应用与快速傅里叶变换 (FFT) 之间的密切关系也就不言而喻了;在很多情况下会用到超大FFT。查看这份FFT白皮书,了解具有FFT协处理器的C6678 DSP如何成为FFT处理和航空电子与国防应用的理想选择,以及如何以较低功率和小占板面积来保持最优性能。你可以在TI DSP应用页中找到更多内容,了解C6678多核DSP和其它TI DSP在特定解决方案中的应用情况。如果你对于C6678 DSP本身不太熟悉的话,一定要看看这里。在这篇博客中的下一部分,我将讨论C6678的5个主要事实。与此同时,我们很想听一听你是如何使用C6678的?梦想。实施。用DSP实现。

  • 发表了主题帖: C6000 DSP代码进行板级在线编译及下载的方法介绍

         传统的C6000 DSP软件是通过CCS在WINDOWS PC上进行编译调试,测试完毕把编译好的可执行文件烧录到FLASH中。通过设置DSP启动模式从FLASH启动,上电即可实现DSP正常运转。当前ARM处理器性能日益增强,在很多应用中系统中会有ARM+DSP的方案。本文提出一种新思路,通过ARM来在线编译DSP的代码,在线下载DSP的程序,并启动DSP运行。这种方法可以带来以下好处:       1、可以动态更新DSP的代码。通过集成不同的DSP库文件可以实现DSP应用和支持库分离,在DSP运行时才进行库和应用连接,极大的提高DSP软件的灵活性。      2、DSP可以不需要FLASH,有利于节省BOM成本。      下面以AM5728 EVM+C6678 EVM为例实现了DSP程序板级在线编译和下载。C6678是目前TI主推的多核高性能DSP,此芯片有8个C66 DSP CORE,支持多种启动模式SRIO/Ethernet/PCIe/I2C/SPI/Hyperlink。本文使用AM5728 A15 ARM来进行DSP代码的编译连接,通过网口下载到C6678板上,并启动6678的8个DSP CORE运行。一、安装AM5728 EVM运行环境本步会在AM5728 EVM上安装ARM LINUX系统和C6000 DSP的编译器。步骤如下:1、使用最新的AM5728 LINUX SDK,本文测试的版本是ti-processor-sdk-linux-am57xx-evm-05.02.00.10。先制作一张启动SD卡,具体操作方法可以参考SDK USER GUIDE。http://software-dl.ti.com/processor-sdk-linux/esd/AM57X/latest/index_FDS.htmlhttp://software-dl.ti.com/processor-sdk-linux/esd/docs/05_02_00_10/linux/Overview_Getting_Started_Guide.html2、AM5728 EVM可以顺利启动后,下载DSP的编译器到EVM上,这是在ARM下运行的DSP编译器。下载地址如下:http://www.ti.com/tool/download/C6000-CGT-8-3https://e2echina.ti.com/resized-image/__size/1230x300/__key/communityserver-blogs-components-weblogfiles/00-00-00-01-22/1.jpg3、把下载的文件放到AM5728 EVM上面运行安装。安装完毕可以在文件系统/user/bin/下面找到cg6x、hex6x等编译工具。注意:编译器的头文件和库文件默认安装路径在/usr/share/ti/cgt-c6x/include和/usr/share/ti/cgt-c6x/lib4、 至此,AM5728 EVM的环境准备好了,可以编写makefile通过command line的方式来编译C66 DSP的代码,具体实现方法见步骤三。二、准备C6678 EVM本步会把C6678 DSP配置成ETHERNET BOOT的模式:1、C6678 EVM DIP拨码开关配置如下:SW3(pin1, pin2, pin3, pin4): off, on, off, onSW4(pin1, pin2, pin3, pin4): on, on, on, offSW5(pin1, pin2, pin3, pin4): on, on, off, offSW6(pin1, pin2, pin3, pin4): off, on, on, on2、上述步骤1即可实现DSP ETHERNET BOOT,我们也可以用如下的方法来验证是否成功。EVM和PC直连,上电,通过wireshark工具应该可以抓到bootp数据包,如下: https://e2echina.ti.com/resized-image/__size/1230x200/__key/communityserver-blogs-components-weblogfiles/00-00-00-01-22/2.jpg大概3秒一次。(如果收不到这个数据包,可能需要更新EVM的FPGA程序,请联系TI技术支持索取FPGA更新软件。)至此6678已经处在ETHERNET BOOT的启动方式下。三、在AM5728 EVM上编译C6678程序1、在如下地址下载本文用到的DEMO:https://e2echina.ti.com/question_answer/dsp_arm/c6000_multicore/f/53/t/170590可以通过TFTP工具把这个DEMO放到AM5728文件系统中。2、在AM5728 EVM上解压缩后可以看到emac_boot_mc.zip,这是本文用到的测试代码,可以把它解压缩。由于软件编译需要CSL库的支持,可以把最新的CSL库复制到AM5728的文件系统。CSL库下载地址:http://software-dl.ti.com/processor-sdk-rtos/esd/C667x/latest/index_FDS.htmlPC上安装后把pdk_C6678_xxxx这个目录复制到AM5728文件系统。本文把pdk_C6678_1_1_2_6目录复制到文件系统。3、在AM5728 EVM上通过控制台使用如下命令进行编译:cl6x -mv6600 --include_path="/home/root/boot/emac_boot_mc/pdk_C6678_1_1_2_6/packages/" --include_path="/home/root/boot/emac_boot_mc/pdk_C6678_1_1_2_6/packages/ti/csl" --include_path="/usr/share/ti/cgt-c6x/include" --abi=eabi --preproc_with_compile "./core0_start_others.c"cl6x -mv6600 -z --abi=eabi -i"/usr/share/ti/cgt-c6x/include" -i"/usr/share/ti/cgt-c6x/lib" --reread_libs --xml_link_info="emac_boot_mc_linkInfo.xml" --rom_model -o "core0.out" "./core0_start_others.obj" "./core0_start_other.cmd" -llibc.acl6x -mv6600 --include_path="/home/root/boot/emac_boot_mc/pdk_C6678_1_1_2_6/packages/" --include_path="/home/root/boot/emac_boot_mc/pdk_C6678_1_1_2_6/packages/ti/csl" --include_path="/usr/share/ti/cgt-c6x/include" --abi=eabi --preproc_with_compile "./simple.asm"cl6x -mv6600 -z --abi=eabi -i"/usr/share/ti/cgt-c6x/include" -i"/usr/share/ti/cgt-c6x/lib" --reread_libs --xml_link_info="emac_boot_mc_linkInfo.xml" --rom_model -o "core1.out" "./simple.obj" "./core1.cmd" -llibc.acl6x -mv6600 -z --abi=eabi -i"/usr/share/ti/cgt-c6x/include" -i"/usr/share/ti/cgt-c6x/lib" --reread_libs --xml_link_info="emac_boot_mc_linkInfo.xml" --rom_model -o "core2.out" "./simple.obj" "./core2.cmd" -llibc.acl6x -mv6600 -z --abi=eabi -i"/usr/share/ti/cgt-c6x/include" -i"/usr/share/ti/cgt-c6x/lib" --reread_libs --xml_link_info="emac_boot_mc_linkInfo.xml" --rom_model -o "core3.out" "./simple.obj" "./core3.cmd" -llibc.acl6x -mv6600 -z --abi=eabi -i"/usr/share/ti/cgt-c6x/include" -i"/usr/share/ti/cgt-c6x/lib" --reread_libs --xml_link_info="emac_boot_mc_linkInfo.xml" --rom_model -o "core4.out" "./simple.obj" "./core4.cmd" -llibc.acl6x -mv6600 -z --abi=eabi -i"/usr/share/ti/cgt-c6x/include" -i"/usr/share/ti/cgt-c6x/lib" --reread_libs --xml_link_info="emac_boot_mc_linkInfo.xml" --rom_model -o "core5.out" "./simple.obj" "./core5.cmd" -llibc.acl6x -mv6600 -z --abi=eabi -i"/usr/share/ti/cgt-c6x/include" -i"/usr/share/ti/cgt-c6x/lib" --reread_libs --xml_link_info="emac_boot_mc_linkInfo.xml" --rom_model -o "core6.out" "./simple.obj" "./core6.cmd" -llibc.acl6x -mv6600 -z --abi=eabi -i"/usr/share/ti/cgt-c6x/include" -i"/usr/share/ti/cgt-c6x/lib" --reread_libs --xml_link_info="emac_boot_mc_linkInfo.xml" --rom_model -o "core7.out" "./simple.obj" "./core7.cmd" -llibc.a4、把8个.out文件复制到boot目录。四、使用AM5728 EVM制作并下载6678的程序本 步骤可以把8个.out文件通过工具合成一个用于网络发送的文件,并发送到6678EVM上运行。1、AM5728 EVM控制台执行EMACboot_8core.sh脚本,这个脚本可以把8个.out文件合成一个用于网络发送的multi_core.eth文件。脚本如下:hex6x core0.rmdhex6x core1.rmdhex6x core2.rmdhex6x core3.rmdhex6x core4.rmdhex6x core5.rmdhex6x core6.rmdhex6x core7.rmd./mergebtbl core0.btbl core1.btbl core2.btbl core3.btbl core4.btbl core5.btbl core6.btbl core7.btbl multi_core.btbl./bootpacket multi_core.btbl multi_core.eth FF-FF-FF-FF-FF-FF FF-FF-FF-FF-FF-FF2、注意,mergebtbl和bootpacket源码都在boot目录,可以通过编译器交叉编译后放到AM5728 EVM上运行。../ti-processor-sdk-linux-am57xx-evm-05.02.00.10/linux-devkit/sysroots/x86_64-arago-linux/usr/bin/arm-linux-gnueabihf-gcc -o mergebtbl mergebtbl.c../ti-processor-sdk-linux-am57xx-evm-05.02.00.10/linux-devkit/sysroots/x86_64-arago-linux/usr/bin/arm-linux-gnueabihf-gcc -o bootpacket bootpacket.c3、通过交叉编译器编译工具pcsendpkt,这是网络数据包发送工具。../ti-processor-sdk-linux-am57xx-evm-05.02.00.10/linux-devkit/sysroots/x86_64-arago-linux/usr/bin/arm-linux-gnueabihf-gcc -o pcsendpkt pcsendpkt.c4、6678EVM上电,并通过网口直连AM5728 EVM。在AM5728 EVM控制台输入如下命令:ifconfig eth1 192.168.1.10arp -s 192.168.1.12 ff:ff:ff:ff:ff:ff这两个命令分别配置AM5728和6678的IP地址。./pcsendpkt multi_core.eth 192.168.1.12 如下图,表示发送完成。https://e2echina.ti.com/resized-image/__size/1230x200/__key/communityserver-blogs-components-weblogfiles/00-00-00-01-22/3.jpg五、通过CCS JTAG查看6678运行结果。通过仿真器连接6678 CORE1~CORE7任意一个核,可以看到A1寄存器是0x11223344表示启动成功。 https://e2echina.ti.com/resized-image/__size/1230x200/__key/communityserver-blogs-components-weblogfiles/00-00-00-01-22/4.jpg

  • 发表了主题帖: DSP用在何处?它们为什么在数学方面表现得如此出色?它们如何与开源API一同工作?

           很多工程师、用户、甚至是我们的同事都会问到相同的问题。       在我们最新的一期DSP休息时间视频系列中,Arnon和我讨论了这些问题。https://e2echina.ti.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-01-22/4810.C1.png       在开始时,我们讨论了在哪些应用类型中,DSP适合用作处理解决方案。想一想流数据或运行在受限环境中或者。。。地雷侦测器应用?而你的应用也许很有可能适合使用DSP。       然后,我们谈到了开源API(OpenCL、OpenMP和OpenCV)是如何与我们的DSP一同运行的。目前已提供相关技术支持!下载免费的多核软件开发套件 (MCSDK) 或者查看我们的在线MCSDK用户指南,以获取更多信息。Arnon还简单分析了是什么原因使DSP架构在数学运算方面表现得如此出色,以及它与其它类型处理器的不同之处。这可比使用大量的复用器强多了—虽然它们也会有所帮助。       请一定在我们的梦想DSP页面中查看我们之前一期的DSP休息时间视频,看一看我们还回答了哪些问题。 在这个页面中,你开可以找到与TI DSP相关的最新文档和信息。      对DSP有什么疑问吗?请给我们留言,也许我们可以在未来的DSP休息时间视频里回答这些问题。如果这个问题是一个专门的技术问题,请访问e2e.ti.com上的同行工程师论坛,论坛内有比我更聪明、能力更强的工程师为你解答难题。

  • 发表了主题帖: 如何在C2000上使用GPIO模拟I2C通信

      I2C作为一种简单的数字通讯方式,仅需要两根数据线就可以完成近距离主机(Master)与从机(Slave)之间的通讯,节省了MCU引脚以及额外的逻辑芯片,简化了PCB布板难度,因此得到了广泛的应用。近年来,TI也推出了越来越多支持I2C通讯功能的芯片,大大简化了芯片与MCU之间的通讯,方便了系统的设计。     但在实际应用中,针对性能要求较低的应用场合,通常选择外设较为简单的低端主控MCU,可能并不具备I2C接口。对于此类应用,可以通过MCU的IO口进行I2C模拟,与被控器件建立通讯,达到发送控制指令、读取内部寄存器的目的。即使在I2C接口缺失的情况下也能够充分发挥器件的全部功能。     本文基于C2000提供了一种利用GPIO模拟I2C控制被控芯片的解决方案,并附有完整例程。对于绝大多数采用标准I2C通信协议以及部分采用SMBus的芯片均具有参考意义。基于其它MCU的方案也可参考该例程进行移植。一、I2C 通讯协议与GPIO模拟     I2C总线由两条双向信号线构成,分别为数据线(SDA)以及时钟线(SCL),分别用电阻进行上拉,以实现高低电平之间的切换,进行设备之间的数据交交换。I2C允许的工作电压范围较为宽泛,典型电压基准为+3.3V或+5V。常见的I2C总线速率分为以下几种模式:标准模式(100Kbit/s)、快速模式(400Kbit/s)以及高速模式(3.4Mbit/s)等。如图为典型的I2C连接示意图:https://e2echina.ti.com/resized-image/__size/600x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-74/8156.a.png图1 I2C连接示意图         如图2为典型的I2C通讯帧格式示意图。一帧完整的数据发送主要包括起始位、地址位、读/写位、ACK/NCK位、数据位等。下面对各部分进行简要的讲解,并介绍如何通过C2000进行实现。https://e2echina.ti.com/resized-image/__size/600x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-74/7485.b.png图2 I2C连接示意图1.1 起始及结束指令         当某个设备在I2C总线上被配置为主机(Master),该设备可以发送起始及结束信号用来发起或结束一次I2C通信,母线电平示意图如图2所示。起始信号:在SCL为高电平期间,SDA由高电平转换为低电平。结束信号:在SCL为高电平期间,SDA由低电平转换为高电平。 https://e2echina.ti.com/resized-image/__size/600x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-74/0027.c.png 图3 I2C通讯起始及结束信号     在C2000中,可以通过以下代码实现起始信号的发送。其中SCL及SDA分别代表用C2000 GPIO模拟的SDA及SCL总线,具体定义请参考例程部分。 void I2C_Start(void){    Delay(I2CDelay);    SCL_High();   // Set the SCL      SDA_High();   // Set the SDA     Delay(I2CDelay);    SDA_Low();    // Clear the SDA while SCL is high indicates the start signal     Delay(I2CDelay);    SCL_Low();    // Clear the SCL to get ready to transmit}      可以参考以下代码实现结束信号的发送:void I2C_Finish(void){    SDA_Low();    // Clear the SDA     SCL_Low();    // Clear the SCL      Delay(I2CDelay);    SCL_High();   // Set the SCL      Delay(I2CDelay);    SDA_High();   // Set the SDA while SCL is high indicates the finish signal  } 1.2 数据位及地址位       I2C通讯的数据位通常由1-8的数据构成,在主机进行数据的发送以及读取期间,SCL总线时钟信号时钟仍由主机发出,每个SCL高电平期间对应一位数据。在SCL高电平期间,都应该保持SDA上的数据正确,因此在实际的应用中,通常使得SDA的高电平脉宽宽于SCL。       地址位的发送与数据位类似,实际的操作中可以将设备的7位地址位+1位读写位作为一个8位字节进行整体的发送。以BQ25703A为例,默认设备地址为0x6B(7bit)。则在进行读操作时,所要发送的字节为0xD7(1101011b+1b);进行写操作时,所要发送的整体字节为0XD6 (1101011b+0b)。       数据位及地址位的发送均可参考以下发送一个8位byte的实现方法:void I2C_Send_Byte(unsigned char txd){    int t;    SDA_Output();   // Config SDA GPIO as output      SCL_Low();      // Clear the SCL to get ready to transmit      txd&=0X00FF;    // Get the lower 8 bits     for(t=0;t<8;t++)        {            SDA_Data_Register = (txd&0x80)>>7;  // Send the LSB              txd<<=1;            Delay(I2CDelay/2);           SCL_High();   // Set the SCL            Delay(I2CDelay);           SCL_Low();    // Clear the SCL             Delay(I2CDelay/2);        }} 1.3 ACK/NACK指令     Acknowledge(ACK)以及Not Acknowledge(NACK)指令通常发生在一个byte发送结束之后,用于标志一个byte发送的成功或失败。特别需要注意的是,即使是在ACK时钟周期期间,SCL总线时钟信号也是由主机产生的。     ACK: 当一次发送结束,主机释放SDA总线。若发送成功,从机在第9个时钟周期内拉低SDA总线,并在整个高电平期间保持。     NACK: 当一次发送结束,主机释放SDA总线。若发送失败,在第9个时钟周期内SDA始终处于高电平。     在通讯中作为主机的MCU通常只需要实现NACK的发送以及ACK信号的等待,具体可参考以下程序:void I2C_NAck(void){    SCL_Low();    // Clear the SCL to get ready to transmit      SDA_Low() ;    // Clear the SDA      Delay(I2CDelay);    SCL_High();    // Set the SCL      Delay(I2CDelay);    SCL_Low();      // Clear the SCL      Delay(I2CDelay);} Uint16 I2C_Wait_Ack(void){    int ErrTime=0;    int ReadAck=0;    SDA_Input();  // Config SDA GPIO as Input    Delay(I2CDelay);    SCL_High();   // Set the SCL and wait for ACK      while(1)    {         ReadAck = SDA_Data_Register ;  // Read the input           if(ReadAck)        {             ErrTime++;             if(ErrTime>ErrLimit)            {                //Error handler:Set error flag, retry or stop.                  //Define by users                  return 1;             }        }         if(ReadAck==0) // Receive a ACK         {             Delay(I2CDelay);            SCL_Low();   // Clear the SCL for Next Transmit               return 0;         }     }}    基于以上几个基本的I2C通讯操作,就可以发送一个完整I2C数据帧,实现基本的I2C通讯功能,构建了利用GPIO口模拟I2C进行芯片控制的基础。二、I2C模拟器件寄存器写入与读取         在构建了基本的I2C通讯功能之后,就可以利用I2C通讯对Slave进行控制或状态的读取,其本质就是对Slave的内部寄存器进行读写操作。下面以一个典型的带有I2C功能的8位寄存器芯片为例,介绍如何利用前文的基础I2C模拟函数对芯片的内部寄存器进行写入和读取。         I2C 写入:要进行一次I2C写入,MCU首先要发送一个起始位以及一个由7位slave地址位和读写位(0b)组成的8位硬件写地址,而后释放SDA总线。若地址正确,slave将拉低SDA发送一个ACK。此后,MCU发送写入寄存器的地址,并等待slave返回的ACK。响应后,MCU发送8位数据,并在收到ACK响应后发送停止位。 https://e2echina.ti.com/resized-image/__size/800x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-74/0882.d.png图4 I2C写入寄存器帧格式具体实现方法可以参考以下代码: void I2C_Write_Register(unsigned char Device, unsigned char Register,unsigned char Value){        I2C_Start();        I2C_Send_Byte(Device); //Send the device address          I2C_Wait_Ack();       //Wait for the ack signal          I2C_Send_Byte(Register); //Send the register address          I2C_Wait_Ack();       //Wait for the ack signal          I2C_Send_Byte(Value); //Send register value          I2C_Wait_Ack();        I2C_Finish();}          I2C读取:要读取Slave的内部寄存器,MCU首先要与Slave进行一次通信,告知Slave读取的目标寄存器,该过程与进行写入操作类似。MCU首先发送起始位、8位Slave写地址,并在ACK信号后发送8位的目标寄存器地址。在Slave响应该地址后,MCU重新发送一次起始位,以及8位Slave读地址(7位地址+1b),ACK响应后MCU释放SDA总线,并继续发送SCL时钟信号读取SDA上的内容。接收完成后,MCU 发送NACK位以及STOP位结束一次寄存器读取操作。 https://e2echina.ti.com/resized-image/__size/800x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-74/3771.e.png图5 I2C读取寄存器帧格式       8位Byte的读方法可以参考以下代码:unsigned char I2C_Read_Byte(void){    int t,rxData;    unsigned char receive;    SDA_Input();    for(t=0;t<8;t++)    {        SCL_Low();   // Clear the SCL         Delay(I2CDelay);         SCL_High();   // Set the SCL           receive<<=1;         rxData = SDA_Data_Register ;         if(rxData)         {             receive++;         }         Delay(I2CDelay);     }    return receive;}           寄存器的读方法可以参考以下代码: unsigned char I2C_Read_Register(unsigned char Device_Write,unsigned char Device_Read, unsigned char Register){    unsigned char ReadData;    I2C_Start();    I2C_Send_Byte(Device_Write); //Send the device address      I2C_Wait_Ack();             //Wait for the ack signal      I2C_Send_Byte(Register);    //Send the register address      I2C_Wait_Ack();             //Wait for the ack signal      I2C_Start();    I2C_Send_Byte(Device_Read); //Send register value      I2C_Wait_Ack();    SDA_High();                  // Set the SDA      ReadData = I2C_Read_Byte();    I2C_NAck();    Delay(1);    I2C_Finish();    return ReadData;} 三、参考例程       本文附带的例程中包含了完整GPIO模拟I2C通讯的头文件以及函数,下面对例程中的主要内容进行介绍,以方便读者理解。https://e2echina.ti.com/resized-image/__size/450x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-74/6560.f.png图6 I2C通讯程序架构 3.1宏定义1)定义硬件通讯通讯地址及寄存器地址:#define Device_Address_Write 0xC0#define Device_Address_Read 0xC1#define REG_1 0x01#define REG_2 0x02#define REG_3 0x03#define REG_4 0x04 Device_Address_Write硬件写地址:默认地址0x60(7bit)+0bDevice_Address_Read硬件读地址:默认地址0x60(7bit)+0bREG_1 - 4硬件内部寄存器地址    表1 硬件读写地址及寄存器地址     在调用此代码时,只需在.h文件依照所用器件实际情况修改硬件地址及各寄存器地址,就可以很方便地调用相关函数。2)定义I2C通讯速率#define I2CDelay 1    // Define to configure I2C rate I2CDelayI2C通讯时钟高低电平时间        表2 I2C通讯速率     通过改变I2CDelay可以设置I2C通讯时钟的高低电平持续时间,进而改变I2C的通讯速率。实际应用中,该值可以通过实际测试进行调整,以达到理想的通讯速率。3)定义IO口动作#define SDA_High() {GpioDataRegs.GPASET.bit.GPIO7 = 1;EALLOW;GpioCtrlRegs.GPADIR.bit.GPIO7=1;EDIS;}#define SDA_Low() {GpioDataRegs.GPACLEAR.bit.GPIO7 = 1;EALLOW;GpioCtrlRegs.GPADIR.bit.GPIO7=1;EDIS;}//To clear the SDA line. Disable protection for writing register#define SDA_Input() {EALLOW;GpioCtrlRegs.GPADIR.bit.GPIO7=0;EDIS;}  // SDA DIR=Input#define SDA_Output(){EALLOW;GpioCtrlRegs.GPADIR.bit.GPIO7=1;EDIS;}  // SDA DIR=Output#define SDA_Data_Register GpioDataRegs.GPADAT.bit.GPIO7#define SCL_High() {GpioDataRegs.GPASET.bit.GPIO6 = 1;}     //Set the SCL line#define SCL_Low() {GpioDataRegs.GPACLEAR.bit.GPIO6 = 1;}  //Clear the SCL line SDA_High()将SDA对应GPIO置1SDA_Low()将SDA对应GPIO置1SDA_Input将SDA对应GPIO设为输入状态SDA_Output将SDA对应GPIO设为输出状态SDA_Data_RegisterSDA对应GPIO数据寄存器SCL_High()将SCL对应GPIO置1SCL_Low()将SCL对应GPIO置0 表3 IO口动作宏定义         将GPIO口的动作以宏定义的形式定义为SDA、SCL的动作,以增强代码的可读性。在进行程序移植时,只需要根据单片机实际情况将宏定义内的代码更换成对应GPIO口动作的代码,不需要对程序其他部分进行改动。其中EALLOW\EDIS语句是TI C2000产品改变GPIO口方向时需要解除相应的保护,请根据具体情况进行改动。4)定义Delay函数#define Delay(A) DELAY_US(A)        Delay()函数用于进行程序中SDA、SCL的高低电平延时,在例程中实际被定义成DELAY_US()函数。在移植过程需要根据实际情况修改宏定义,更改成适用用户MCU的延时函数,不需要对后续程序进行修改。3.2 I2C通讯功能函数void I2C_Start(void);void I2C_Finish(void);Uint16 I2C_Wait_Ack(void);void I2C_NAck(void);void I2C_Send_Byte(unsigned char xtd);unsigned char I2C_Read_Byte(void); 函数名称功能描述void I2C_Start(void)发送I2C通讯起始信号void I2C_Finish(void)发送I2C通讯结束信号Uint16 I2C_Wait_Ack(void)等待Ack应答信号,返回接收状态void I2C_NAck(void)发送一个NAck信号,用于寄存器读取void I2C_Send_Byte(unsigned char xtd)发送一个字节unsigned char I2C_Read_Byte(void)读取一个字节void Gpio_setup(void)GPIO口配置void I2C_Write_Register(unsigned char Device, unsigned char Register, unsigned char value)I2C 写寄存器函数void I2C_Read_Register(unsigned char Device_Write, unsigned char Device_Read, unsigned char Register)I2C 读寄存器函数 表4 I2C通讯函数四、总结       针对由于MCU缺少I2C接口而不能直接使用I2C与外围芯片进行通讯的问题,本文给出了使用IO模拟I2C接口的方法。首先,从I2C协议入手对数据帧中各个位的逻辑电平进行了详细介绍,并给出基于C2000 GPIO的具体实现方法;在此基础上,以常见的8位I2C通讯Slave为例介绍了内部寄存器的读取逻辑,并给出了实现方法。最后,针对附带的参考例程内容进行了介绍,方便读者参考例程,其它MCU也可以在本例程上进行快速的移植。本文为使用IO模拟I2C需求给出了一种有效的解决方案。

  • 发表了主题帖: C2000浮点运算注意事项——CPU和CLA的差异及误差处理技巧

    C28x+FPU架构的C2000微处理器在原有的C28x定点CPU的基础上加入了一些寄存器和指令,来支持IEEE 单精度浮点数的运算。对于在定点微处理器上编写的程序,浮点C2000也完全兼容,不需要对程序做出改动。浮点处理器相对于定点处理器有如下好处:编程更简单性能更优,比如除法,开方,FFT和IIR滤波等算法运算效率更高。程序鲁棒性更强。 一、IEEE754格式的浮点数C28x+FPU的单精度浮点数遵循IEEE754格式。它包括:1位符号位:0表示正数,1表示负数。8位阶码23位尾数 3130                                                                                    2322                                                  0符号位阶码尾数 表1:IEEE单精度浮点数符号位S阶码E尾数M值000正0100负00或10非0非规格化数(1)01-2540x00000-0x7FFFF正常范围正数(2)11-2540x00000-0x7FFFF正常范围负数(2)02550正无穷大12550负无穷大0或1255非0非数值(NaN) (1)非规格化数值非常小,计算公式为(-1)sx2(E-126)x0.M(2)正常范围数值计算公式为(-1)sx2(E-127)x1.M正常范围数值落在± ~1.7 x 10 -38 to ± ~3.4 x 10 +38范围内。从表1可以看出,IEEE754标准包括:标准数据格式和特殊值,比如非数值(NaN)和无穷大标准舍入模式和浮点运算多平台支持,包括德州仪器C67x系列芯片。 C2000对该标准作了一些简化:状态标志位和比较运算不区分正0和负0非规格化数值被认为是0对非数值(NaN)处理方式和无穷大一样。 IEEE754标准有5种舍入模式,C28x+FPU只支持其中两种:--截断:小数位不管大小全部舍去--就近舍入向偶舍入:这种模式下如果小数位小于5就舍去,大于5就进位,如果小数位为5,则舍入到最近的偶数。表2展示了不同的舍入模式对数据的影响。C28x+FPU编译器默认将微处理器配置为就近舍入向偶舍入模式[1]。表2:不同舍入模式示例模式 / 实际值+11.5+12.5−11.5−12.5就近舍入向偶舍入+12.0+12.0−12.0−12.0就近舍入远离0舍入+12.0+13.0−12.0−13.0截断+11.0+12.0−11.0−12.0向上舍入+12.0+13.0−11.0−12.0向下舍入+11.0+12.0−12.0−13.0   二、浮点C2000芯片运算技巧和注意点浮点数的精度由尾数位决定,绝大多数的数在用浮点数表示时都会有误差,这些误差很小,多数情况下可以忽略,但是在经过多次计算后这个误差可能会大到无法接受。下面用实例来进行说明,下面一段代码定义float类型变量,分别在TI最新的Delfino芯片F28379D的CPU1和CLA1上,将11.7加20001次。float CLATMPDATA=0;int index=20001;   while(index--)   {       CLATMPDATA=CLATMPDATA+11.7;}得到如下结果:https://e2echina.ti.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-74/7571.12.png其中CLATMPDATA1是在CLA中将11.7加20001次得到的结果,CLATMPDATA2是在CPU中将11.7加20001次得到的结果。可以看出两者所得到的结果不同,并且都和正确结果234011.7有较大差距。为何CPU和CLA计算结果不同? CPU和CLA运算结果的不同是由于其对浮点数的舍入模式的不同造成的,前文已经说过,C28x+FPU 编译器默认将CPU配置为就近舍入向偶舍入模式。而CLA不同,CLA默认为截断舍入模式[2]。在CLA的代码中,我们可以通过增加下述代码:__asm(" MSETFLG RNDF32=1");//1为就近舍入向偶舍入,0为截断舍入将CLA的舍入模式更改为就近舍入向偶舍入模式,然后再运行代码,可以得到和CPU同样的结果。 https://e2echina.ti.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-74/6886.13.png        2. 为何CPU和CLA计算结果都有较大误差?如何解决?11.7在用IEEE754格式的浮点数表示时为0x413b3333,其对应的实际值为11.69999980926513671875,可以看出误差很小,但是经过多次累加多次舍入后得到的结果误差较大,对此,我们可以将CLATMPDATA定义为long double型变量(64位),再次运行相同的代码,可以得到如下结果,可以看到误差很小可以忽略。https://e2echina.ti.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-74/7242.14.png需要指出的是,现有的C28x CPU只支持单精度(32位)的硬件浮点运算,对于64位双精度浮点数的运算都是通过软件实现的,所以其运算速率会慢很多。另外CLA不支持64位数。在这个实例中,我们可以分别观察float类型变量和long double类型变量的汇编代码如下:C code: CLATMPDATA2=CLATMPDATA2+11.7;如果CLATMPDATA2是float型变量,则相应的汇编代码为:00c08d:   E80209D8    MOVIZ        R0, #0x413b                                1cycle00c08f:   E2AF0112    MOV32        R1H, @0x12, UNCF  1cycle00c091:   E8099998    MOVXI        R0H, #0x3333                              1cycle00c093:   E7100040    ADDF32       R0H, R0H, R1H                            2cycle00c095:   7700        NOP                                                           1cycle00c096:   E2030012    MOV32        @0x12, R0H                                1cycle如果CLATMPDATA2是long double型变量,则相应的汇编代码为:00c08b:   7680005A    MOVL         XAR6, #0x00005a      1cycle00c08d:   8F00005A    MOVL         XAR4, #0x00005a      1cycle00c08f:   8F40C26A    MOVL         XAR5, #0x00c26a       1cycle00c091:   FF69        SPM          #0                                            1cycle00c092:   7640C0C9    LCR          FD$$ADD                          4cycle(跳转耗时)+25cycle(FD$$ADD函数内部需要25cycle)可以看出CPU对float类型数执行一次加法耗时7个cycle,对long double类型数执行一次加法耗时33个cycle。三、结论1. C2000的CPU和CLA默认的舍入模式不同,在计算浮点数时可能会得到不同的结果,但是我们可以通过代码改变其舍入模式得到相同的结果。2. 单精度浮点数经过多次计算后可能会有较大误差,可以通过将变量定义为64位long double型解决精度问题。3. C28x CPU只支持单精度(32位)的硬件浮点运算,对于64位双精度浮点数的运算都是通过软件实现的,所以其运算速率会慢很多。在下一代的C2000产品中我们会实现对64位双精度浮点数运算的硬件支持。References[1]. TMS320C28x FPU Primer (SPRAAN9A)[2]. TMS320F2837xD Dual-Core Delfino Microcontrollers Technical Reference Manual (SPRUHM8F)

  • 发表了主题帖: DSP28 fir低通滤波器的设计源码

    #include"stdio.h" #include"math.h" #include"DSP28_Device.h" #defineorder 26 #defineN  128          #definepi 3.1415926 floatFIR_LPF[order] ={-1.52864422149721e-05,-0.000133359311426970,-0.000544636220343477,-0.00137835208978255,-0.00218948983490142,-0.00124340086554490,0.00478134865608317,0.0198838342801837,0.0464361812966399,0.0825102845162328,0.120763491355644,0.150360916315540,0.161536936687780,0.150360916315540,0.120763491355644,0.0825102845162328,0.0464361812966399,0.0198838342801837,0.00478134865608317,-0.00124340086554490,-0.00218948983490142,-0.00137835208978255,-0.000544636220343477,-0.000133359311426970,-1.52864422149721e-05}; floats; inti,n; floatinput[N],output[N];   intfs=10000;    intf1=600;    intf2=1500; #definefa 2*pi*f1/fs #definefb 2*pi*f2/fs void inputwave() {     for(n=0;n<N;n++ ) input[n]=sin(fa*n)+sin(fb*n); } voidmain() {   int m=0,n=0;     inputwave();            for(n=0;n<N+order;n++) {   for(s=0,m=0;(m<order)&&(m<n);m++) {    s=FIR_LPF[m]*input[n-m]+s; }         output[n]=s;} while(1);  

  • 发表了主题帖: DSP实现流水灯样式的源码

    源程序如下: /* * main.c * *  Created on: 2018年8月18日 *      Author: LYJCD */ //########################################################################### // // FILE:    Example1_2833xGpioLED.c // // TITLE:   用DSP点亮发光二极管实验 // // //    根据在RAM中调试的需要,这个项目配置成"boot to SARAM".2833x引导模式 //    表如下显示. 常用的还有"boot to Flash"模式,当程序在RAM调试完善后就 //    可以将代码烧进Flash中并使用"boot to Flash"引导模式. // //       $Boot_Table: // //         GPIO87   GPIO86     GPIO85   GPIO84 //          XA15     XA14       XA13     XA12 //           PU       PU         PU       PU //        ========================================== //            1        1          1        1    Jump to Flash //            1        1          1        0    SCI-A boot //            1        1          0        1    SPI-A boot //            1        1          0        0    I2C-A boot //            1        0          1        1    eCAN-A boot //            1        0          1        0    McBSP-A boot //            1        0          0        1    Jump to XINTF x16 //            1        0          0        0    Jump to XINTF x32 //            0        1          1        1    Jump to OTP //            0        1          1        0    Parallel GPIO I/O boot //            0        1          0        1    Parallel XINTF boot //            0        1          0        0    Jump to SARAM            <- "boot to SARAM" //            0        0          1        1    Branch to check boot mode //            0        0          1        0    Boot to flash, bypass ADC cal //            0        0          0        1    Boot to SARAM, bypass ADC cal //            0        0          0        0    Boot to SCI-A, bypass ADC cal //                                              Boot_Table_End$ // // 功能描述: // //   程序编译下载成功后,运行程序时LED灯组会一直闪烁 // // //########################################################################### // 释放日期: 2013.11.11 //########################################################################### #include "DSP2833x_Device.h"     // DSP2833x 头文件 #include "DSP2833x_Examples.h"   // DSP2833x 例子相关头文件 #define D8 GpioCtrlRegs.GPBDAT.bit.GPIO60  //D8代表GPIO60 #define D9 GpioCtrlRegs.GPBDAT.bit.GPIO61  //D9代表GPIO61 #define D10 GpioCtrlRegs.GPCDAT.bit.GPIO64  //D10代表GPIO64 #define D11 GpioCtrlRegs.GPCDAT.bit.GPIO65 //D11代表GPIO65 #define D12 GpioCtrlRegs.GPCDAT.bit.GPIO66  //D12代表GPIO66 #define D13 GpioCtrlRegs.GPCBAT.bit.GPIO67  //D13代表GPIO67 #define D14 GpioCtrlRegs.GPCDAT.bit.GPIO68  //D14代表GPIO68 // 使用前,声明本文件中的相关函数; void delay_loop(void); void Gpio_select(void); void main(void) { // 步骤 1. 初始化系统控制: // 设置PLL, WatchDog, 使能外设时钟 // 下面这个函数可以从DSP2833x_SysCtrl.c文件中找到..    InitSysCtrl(); // 步骤 2. 初始化通用输入输出多路复用器GPIO: // 这个函数在DSP2833x_Gpio.c源文件中被定义了 // 这个函数使GPIO控制类寄存器初始化到默认状态 // InitGpio();  // 本例不用此子函数 // 本例使用下面的GPIO配置    Gpio_select(); // 步骤 3. 清除所有中断初始化中断向量表: // 禁止CPU全局中断    DINT; // 初始化PIE控制寄存器到他们的默认状态. // 这个默认状态就是禁止PIE中断及清除所有PIE中断标志 // 这个函数放在DSP2833x_PieCtrl.c源文件里    InitPieCtrl(); // 禁止CPU中断和清除所有CPU中断标志    IER = 0x0000;    IFR = 0x0000; //初始化PIE中断向量表,并使其指向中断服务子程序(ISR) // 这些中断服务子程序被放在了DSP280x_DefaultIsr.c源文件中 // 这个函数放在了DSP2833x_PieVect.c源文件里面.    InitPieVectTable(); // 步骤 4. 初始化片内外设: // 这个函数可以在DSP280x_CpuTimers.c源文件中找到 //   InitCpuTimers();   // 这个例子仅初始化了Cpu定时器 // 步骤 5. 用户特定的代码    for(;;)    {            //*******让灯先从D8到D14逐一亮******//            GpioDataRegs.GPBDAT.bit.GPIO60=0;            delay_loop();            GpioDataRegs.GPBSET.bit.GPIO60=1;            delay_loop();            GpioDataRegs.GPBDAT.bit.GPIO61=0;            delay_loop();            GpioDataRegs.GPBSET.bit.GPIO61=1;            delay_loop();            GpioDataRegs.GPCDAT.bit.GPIO64=0;            delay_loop();            GpioDataRegs.GPCSET.bit.GPIO64=1;            delay_loop();            GpioDataRegs.GPCDAT.bit.GPIO65=0;            delay_loop();            GpioDataRegs.GPCSET.bit.GPIO65=1;            delay_loop();            GpioDataRegs.GPCDAT.bit.GPIO66=0;            delay_loop();            GpioDataRegs.GPCSET.bit.GPIO66=1;            delay_loop();            GpioDataRegs.GPCDAT.bit.GPIO67=0;            delay_loop();            GpioDataRegs.GPCSET.bit.GPIO67=1;           delay_loop();            GpioDataRegs.GPCDAT.bit.GPIO68=0;            delay_loop();            GpioDataRegs.GPCSET.bit.GPIO68=1;       /******让灯从D14到D8返回*****///            GpioDataRegs.GPCDAT.bit.GPIO68=0;            delay_loop();            GpioDataRegs.GPCSET.bit.GPIO68=1;            delay_loop();            GpioDataRegs.GPCDAT.bit.GPIO67=0;            delay_loop();            GpioDataRegs.GPCSET.bit.GPIO67=1;            delay_loop();            GpioDataRegs.GPCDAT.bit.GPIO66=0;            delay_loop();            GpioDataRegs.GPCSET.bit.GPIO66=1;            delay_loop();            GpioDataRegs.GPCDAT.bit.GPIO65=0;            delay_loop();            GpioDataRegs.GPCSET.bit.GPIO65=1;            delay_loop();            GpioDataRegs.GPCDAT.bit.GPIO64=0;            delay_loop();            GpioDataRegs.GPCSET.bit.GPIO64=1;            delay_loop();            GpioDataRegs.GPBDAT.bit.GPIO61=0;            delay_loop();            GpioDataRegs.GPBSET.bit.GPIO61=1;            delay_loop();            GpioDataRegs.GPBDAT.bit.GPIO60=0;            delay_loop();            GpioDataRegs.GPBSET.bit.GPIO60=1;            delay_loop();            /******GPCSET(设置寄存器)是GpioData(数据寄存器)下的一个小寄存器            GpioDataRegs.GPBDAT.bit.GPIO60=0;            delay_loop();            GpioDataRegs.GPBSET.bit.GPIO60=1; 这两个数是要配套使用不然起不到流水灯流水作用,            delay_loop();**/ /*  D8=0;    D9=1;    D10=0;    D11=1;    D12=0;    D13=1;    D14=0;*/     } } //延迟子函数 void delay_loop() {     Uint32      i;         Uint32      j;         for(i=0;i<32;i++)     for (j = 0; j < 100000; j++) {} } //GPIO初始化函数 void Gpio_select(void) {     EALLOW;         GpioCtrlRegs.GPBMUX2.bit.GPIO60=0;  // GPIO0 = GPIO0 通用的I/0  GPIO48到GPIO口63是要选择GPIOB选择寄存器2         GpioCtrlRegs.GPBDIR.bit.GPIO60=1;  // GPIO0配置为输出口         GpioCtrlRegs.GPBMUX2.bit.GPIO61=0;  // GPIO0 = GPIO0 通用的I/0         GpioCtrlRegs.GPBDIR.bit.GPIO61=1;  // GPIO0配置为输出口         GpioCtrlRegs.GPCMUX1.bit.GPIO64=0;  // GPIO0 = GPIO0 通用的I/0   GPIO64到GPIO79是要选择GPIOC选择寄存器1         GpioCtrlRegs.GPCDIR.bit.GPIO64=1;  // GPIO0配置为输出口         GpioCtrlRegs.GPCMUX1.bit.GPIO65=0;  // GPIO0 = GPIO0 通用的I/0         GpioCtrlRegs.GPCDIR.bit.GPIO65=1;  // GPIO0配置为输出口         GpioCtrlRegs.GPCMUX1.bit.GPIO66=0;  // GPIO0 = GPIO0 通用的I/0         GpioCtrlRegs.GPCDIR.bit.GPIO66=1;  // GPIO0配置为输出口         GpioCtrlRegs.GPCMUX1.bit.GPIO67=0;  // GPIO0 = GPIO0 通用的I/0         GpioCtrlRegs.GPCDIR.bit.GPIO67=1;  // GPIO0配置为输出口         GpioCtrlRegs.GPCMUX1.bit.GPIO68=0;  // GPIO0 = GPIO0 通用的I/0         GpioCtrlRegs.GPCDIR.bit.GPIO68=1;  // GPIO0配置为输出口     EDIS; } //=========================================================================== // No more. //===========================================================================

  • 发表了主题帖: DSP C语言的IIR滤波器程序源码

    分享个DSP C语言的IIR滤波器 单片机源程序如下: #include <math.h> #include <stdio.h> #include "fdacoefs.h" //********************************************* //fs=1000000,fpass=10000,fstop=50000(-80db) //butterworth iir-df1 //********************************************* #define fs 1000000 #define f1 4000//测试正弦频率1 #define f2 50000//测试正弦频率2 #define f_rec 5000//测试方波频率 #define Impulse 1 #define Sine    2 #define Rect    3 #define pi 3.1415926 #define STG_NUM (MWSPT_NSEC-1)/2 #define DAT_NUM 800 float IIR_out[DAT_NUM]; float input_step[STG_NUM+1][3];// n; n-1; n-2 void iir_filter_init(float *ptr,int num) {     int i;                 for(i=0;i<num;i++)         {                 *ptr++=0;         } } float iir_filter(float in) {       int i;           float temp;       input_step[0][0] = in;       for(i=0;i<STG_NUM;i++)       {           temp =NUM[i*2][0]*(input_step[i][0]*NUM[i*2+1][0]+input_step[i][1]*NUM[i*2+1][1]+input_step[i][2]*NUM[i*2+1][2])-                                             input_step[i+1][1]*DEN[i*2+1][1]-input_step[i+1][2]*DEN[i*2+1][2];           temp *= DEN[i*2+1][0];           input_step[i][2]=input_step[i][1];                             input_step[i][1]=input_step[i][0];                                      input_step[i+1][0]=temp;       }       return  temp*NUM[MWSPT_NSEC-1][0];    } float x; int main() {         int i,Test_type;         printf("请选择测试类型:1、冲击测试 2、正弦测试 3、方波测试\n");         scanf("%d",&Test_type);         while(1){                 iir_filter_init(input_step[0],sizeof(input_step)/sizeof(input_step[0][0]));                 switch(Test_type)                 {                         case Rect://方波输入                                 for(i=0;i<DAT_NUM;i++)                                 {                                                                         if(((2*f_rec*i/fs)%2)==0)                                                 x=5000;                                         else                                                 x=-5000;                                                                                                        IIR_out[i]=iir_filter(x);                                                                                                                                                                        }                                        break;                         case Impulse://冲激输入                                 IIR_out[0]=iir_filter(5000);                                 for(i=1;i<DAT_NUM;i++)                                                                                                        IIR_out[i]=iir_filter(0);                                                                                                                                                                                 break;                         case Sine://正弦输入                                                         for(i=0;i<DAT_NUM;i++)                                 {                                         //***************************************************************                                         x=500*(cos(2*pi*f1*i/fs)+cos(2*pi*f2*i/fs)); //正弦测试                                                                                                                                IIR_out[i]=iir_filter(x);                                                                                                                                                                        }                                                 break;                         }         //请在printf前设置断点,以便停止运行 查看输出结果        否则,看不到输出         printf("请选择测试类型:1、冲击测试 2、正弦测试 3、方波测试\n");         scanf("%d",&Test_type);                 }         while(1); }

  • 发表了主题帖: TI上的DSP28335官方例程

    DSP28335官方例程 IIC_RTC DAC ADC_DMA dma_xintf_to_ram sci_loopback usb mcbsp_loopback eqep_freqcal FLASH

  • 发表了主题帖: 边缘上的AI:“协作机器人”如何快速处理传感器数据

          无论是传统的工业机器人系统,还是当今最先进的协作机器人(Cobot),它们都要依靠可生成大量高度可变数据的传感器。这些数据有助于构建更佳的机器学习(ML)和人工智能(AI)模型。而机器人依靠这些模型变得“自主”,可在动态的现实环境中做出实时决策和导航。        工业机器人通常位于“封闭”环境中,出于安全原因,如果该环境中有人类进入,机器人会停止移动。但是限制人类/机器人协作,也使得很多益处无法实现。具有自主运行功能的机器人,可以支持安全高效的人类与机器人的共存。        机器人应用的传感和智能感知非常重要,因为机器人系统的高效性能,特别是ML/AI系统, 在很大程度上取决于为这些系统提供关键数据的传感器的性能。当今数量广泛且日益完善和精确的传感器,结合能够将所有这些传感器数据融汇在一起的系统,就可以支持机器人具有越来越好的知觉和意识。 AI的发展 机器人自动化一直以来都是制造业的革命性技术,将AI集成到机器人中显然将在未来数年中使机器人技术产生巨大变化。本文探讨了当今机器人、自动化和把AI及AI所需数据紧紧链接在一起从而实现智能的最重要技术的某些关键发展趋势,还讨论了如何在AI系统中使用以及融汇不同的传感器。 推动机器人的AI处理技术至边缘计算 ML包括两个主要部分:培训和推理,可以在完全相异的处理平台上执行它们。培训通常是以离线方式在桌面上进行或在云端完成,并且包括将大数据集入神经网络。在此阶段,实时性能或功能都不是问题。培训阶段的结果是在部署时已经有了一个经过培训的AI系统,该系统能够执行特定任务,例如,调查组装线上的瓶颈问题、计算和跟踪一个房间内的人员或确定账单是否是伪造的。 但是,为了让AI实现其在许多行业的应用前景,在推理(执行培训后的ML算法)期间必须实时或近实时完成传感器数据的融合。为此,设计师需要在边缘实施ML和深度学习模型,将推理功能部署到嵌入式系统中。举例来说,在工作场所设立协作机器人(如图1),与人进行密切协作。它需要使用来自近场传感器及视觉传感器的数据,来确保它在成功防止人类受到伤害的同时,支持人类完成对于他们来说有难度的活动。所有这些数据都需要实时处理,但是云的速度达不到协作机器人需要的实时、低延时响应。要攻克这个瓶颈,人们把当今先进的AI系统发展到了边缘领域,即,机器人意味着存在于边缘设备中。https://e2echina.ti.com/resized-image/__size/1230x359/__key/communityserver-blogs-components-weblogfiles/00-00-00-01-16/l.jpg图 1:人类在工厂环境中与协作机器人互动。 这种分布式AI模型依赖于高度集成的处理器,这种处理器具有: 丰富的外围设备组,用于对接不同传感器 高性能处理功能,以运行机器视觉算法 加速深入学习推理的方法。 此外,所有这些功能还必须高效工作,并且功耗相对低,体积相对小,以便由边缘承载它们。 随着ML的普及,我们经过功耗和尺寸优化的“推理引擎”的可获得性也越来越高。这些引擎是专为执行ML推理而专门设计的硬件产品。 集成式片上系统(SoC)在嵌入式空间内通常是好的选择,因为除包裹能运行深度学习推理的各种处理元件外,SoC还集成了使嵌入式应用变得完整的许多必要部件。 让我们来分析一下当今时代中的热门机器人发展趋势。 协作机器人(协作机器人) 接近传统的工业机器人没有外围设备,但是人们一般无法获得它们。与之相反,协作机器人设计用于在运行时与人安全互动,缓慢而优雅地移动。 根据ISO标准TS 15066的定义,协作机器人是一种能够用在协作环境中的机器人,协作操作意味着机器人和人在定义的工作空间内同步工作,进行生产操作(这不包括机器人 + 机器人系统或同地协作、在不同时间进行操作的人与机器人)。定义和部署协作机器人,可预测机器人的实体部分(如实际功能扩展,比方说激光)与操作员的潜在冲突。更重要的是,这会利用传感器来确定操作员的精确位置和速度。 协作机器人制造者必须在机器人系统中实施高水平的环境感应和冗余,以便快速探测和防止可能的冲突。集成式传感器与控制单元连接,将可传感机器人臂与人或其他对象的迫在眉睫的冲突,控制单元将立即关闭机器人。如果任何传感器或其电子电路故障,机器人也将关闭。 物流机器人 物流机器人是在可能有人或没人的环境中操作的移动设备,如仓库、配送中心、港口或园区等。物流机器人提取货物并把货物带到包装站,或者把货物从公司站点的一栋建筑物运送到另一栋建筑物;某些物流机器人还能拣货和包装。这些机器人通常在特定环境中移动,需要传感器进行定位、绘图和防止冲突(特别是与人的冲突)。 直至最近,大多数物流机器人还在使用预定义的路线;而现在它们已经能够基于其他机器人、人和货物的位置来调整它们的导航。超声波、红外线和LIDAR感应目前都是已投入应用的技术。鉴于机器人的移动性,位于其内部的控制单元一般是通过无线方式与中央远程控制通信。物流机器人目前已采用的先进技术,包括ML逻辑、人机协作及环境分析技术等。 劳动力成本上升和严格的政府法规,都促使物流机器人得到了更广泛的应用。它们的受欢迎程度也水涨船高,因为设备和传感器等部件的成本有所下降,集成的成本(和所需时间)也呈下行趋势。 最后一英里交付机器人 在将产品从仓库货架运输到客户门前台阶的过程中,“最后一英里”交付是物流过程的最后一步:将货物最终运抵买家门前的时刻。这不仅对形成何等客户满意度很关键,同时最后一英里交付还是成本高昂和耗时的。 最后一英里交付的成本占据整个货运成本的大头:就其本身而言,使最后一英里交付更高效已经成为开发和实施新机器人技术的重点,它能推动过程改进和提高效率。 机器人中AI的传感器技术 取决于3D机器视觉来将数据馈送到AI技术中。若未能够重建3D图像的机器视觉,且AI将该视觉信息转换成机器人方面的成功动作,则在没有预定位置和运动的情况下抓住对象不可能实现。 当今用于支持机器人中AI的最流行和最相关的传感器技术包括: 飞行时间(ToF)光学传感器:这种传感器基于ToF原理,采用光电二极管(单一的传感器元件或一个阵列)和有源照明来测量距离。把从障碍物反射的光波与发射波进行比较,从而测量延迟,该值即代表距离。此数据有助创建对象的3D地图。 温度和湿度传感器:许多机器人需要测量温度,有的时候还要测量其所在环境与其部件的湿度,包括电机和主AI母板,以此确保它们在安全范围内运行。 超声波传感器:如果机器人在明亮环境下看不到东西或者在很暗的环境中找不到它自己,就说明视觉传感器没有工作。通过传输超声波和聆听从对象上反射回来的回波(类似于蝙蝠操作的原理),超声波传感器可在黑暗或明亮的环境中出色运行,克服光学传感器的局限。 震动传感器:工业震动传感是预防性维护所必要的条件监控的核心部分。集成式电子压电传感器是工业环境中最常用的震动传感器。 毫米波传感器:毫米波传感器使用无线电波及其回波来确定移动物体的方向和距离,方法是测量三个因素:速度、角度和范围。这帮助机器人基于物体接近传感器的快慢来采取更多的预防措施。雷达传感器在黑暗环境中的运行具有卓越性能,它能通过如干壁、塑料和玻璃等材料进行传感。 虽然在工厂车间里人类仍然执行大部分任务,但机器人将适应人类工作、提高自动化程度。为实现这一目标,他们需要配备更多的AI功能,以实时识别和适应各类情况,这只有在AI处在最前沿时才有可能实现。 更多相关资讯请浏览: http://www.ti.com.cn/zh-cn/applications/industrial/factory-automation/overview.html?hqs=SYS-Ind-FA-Robotics19-contrib-lp-20190329-cn

统计信息

已有1211人来访过

  • 芯币:8754
  • 好友:--
  • 主题:2097
  • 回复:695
  • 课时:--
  • 资源:19

留言

你需要登录后才可以留言 登录 | 注册


博浩元电子 2018-10-25
不错,干货
查看全部