• 嵌入式C编程实现上下文的快速切换

    关注、星标公众号,直达精彩内容来源:网络素材上下文快速切换 - cpost应用我们通常认为,在中断中,不能执行耗时的操作,否则会影响系统的稳定性,尤其对于嵌入式编程。对于带操作系统的程序而言,可以通过操作系统的调度,将中断处理分成两个部分,耗时的操作可以放到线程中去执行,但是对于没有操作系统的情况,又应该如何处理呢比较常见的,我们可能会定义一些全局变量,作为flag,然后在mainloop中不停的判断这些flag,再在中断中修改这些flag,最后在mainloop中执行具体的逻辑,但是这样,无疑会增加耦合,增加程序维护成本。cpostcpost正是应用在这种情况下的一个简单但又十分方便的工具,它可以特别方便的进行上下文的切换,减少模块耦合。cpost链接:❝https://github.com/NevermindZZT/cpost❞cpost借鉴的Android的handler机制,通过在mainloop中跑一个任务,然后在其他地方,可以是中断,也可以是模块逻辑中,直接抛出需要执行的函数,使其脱离调用处的上下文,运行在mainloop中。cpost还支持延迟处理,可以指定函数在抛出后多久执行使用cpost的使用十分简单,这里以使用在嵌入式无操作系统中为例,主要用作中断延迟处理的情况1、配置系统tick配置cpost.h中的宏CPOST_GET_TICK(),配置成获取系统tick,以stm32 hal为例#define     CPOST_GET_TICK()            HAL_GetTick()2、配置处理进程在mainloop调用cpostProcess函数int main(void){    ...    while (1)    {        cpostProcess();    }    return 0;}3、抛出任务在中断等需要进行上下文切换的地方调用cpsot接口,使其在mainloop中运行cpost(intHandler);原理解析cpost的原理其实很简单,其代码量也十分少,总共加起来就只有几十行代码,cpost维护了一个而全局的数组CpostHandler cposhHandlers[CPOST_MAX_HANDLER_SIZE] = {0};其中,数组的每一个元素表示包含了需要执行的函数和参数,当调用cpost接口时,被post的函数和参数会被保存在这个数组中,然后mainloop中运行的cpostProcess函数会遍历这个数组,当满足条件时,执行对应的函数,从而达到上下文切换的目的void cpostProcess(void){    for (size_t i = 0; i = cposhHandlers[i].time)            {                cposhHandlers[i].handler(cposhHandlers[i].param);                cposhHandlers[i].handler = NULL;            }        }    }}其实,cpost的方式,和一开始提到的使用全局的flag进行上下文切换的方法很像,只不过,cpost通过一个数组的维护和直接post函数的方式,省去了维护flag的成本,也不需要将需要执行的函数耦合到mianloop中,从而变得简单易用。完美解耦 - cevent应用对于模块化编程来说,如何实现各模块间的解耦一直是一个比较令人头疼的问题,特别是对于嵌入式编程,由于控制逻辑复杂,并且对程序体积有控制,经常容易写出各独立模块之间相互调用的问题。由此,cpost中的cevent组件,通过模仿Android系统中的广播机制,提供了一种非常简单的模块间解耦实现。原理cevent借鉴的是Android系统的广播机制,一方面,各模块在工作的时候,都会有多个具体的事件点,在高耦合的编程中,可能会在这些地方调用其他模块的功能,比如说,在通信模块接收到指令的时候,需要闪烁一下指示灯。使用cevent,我们可以在这些地方抛出一个事件,当前模块不需要关心在这各地方需要执行哪些其他模块的逻辑,由其他模块,或者用户定义一个事件监听,当具体的事件发生时,执行相应的动作。使用cevent使用注册的方式监听事件,会依赖于编译环境,目前支持keil,iar,和gcc,对于gcc,需要修改链接文件(.ld),在只读数据区添加:_cevent_start = .;KEEP (*(cEvent))_cevent_end = .;1、初始化cevent系统初始化时,调用ceventInitceventInit();2、注册cevent事件监听在c文件中,调用CEVENT_EXPORT导出事件监听CEVENT_EXPORT(0, handler, (void *)param);3、发送cevent事件在事件发生的地方,调用ceventPost抛出事件ceventPost(0);使用cevent解耦模块初始化嵌入式编程中,我们习惯会在程序启动的时候,调用各个模块的初始化函数,其实这也是一种耦合,会造成main函数中出现很长的初始化代码,借助cevent,我们可以对初始化进行优化解耦。1、定义初始化事件定义初始化事件的值,对于初始化,有些模块可能会依赖于其他模块的初始化,会有一个先后顺序要求,所以这里我们可以把初始化分成两个阶段,定义两个事件,当然,如果有更复杂的要求,可以再多分几个阶段,只需要多定义几个事件就行#define     EVENT_INIT_STAGE1       0#define     EVENT_INIT_STAGE2       12、初始化cevent,抛出事件在main函数中初始化cevent,并抛出初始化事件int main(void){    ...    ceventInit();    ceventPost(EVENT_INIT_STAGE1);    ceventPost(EVENT_INIT_STAGE2);    ...    return 0;}3、注册事件监听对所有需要初始化的函数注册事件监听,这里我以对letter-shell注册事件监听为例,分为两个部分,初始化串口和初始化shell。在serial模块中,将串口初始化注册到初始化第一阶段,cevent支持将不大于7个的参数直接传递到注册的监听函数中,下面的注册方式,相当于在EVENT_INIT_STAGE1事件发生的地方,也就是main函数中对应的位置,调用serialInit(

    技术让梦想更伟大 编程

  • 关于UWB的一些科普

    关注、星标公众号,直达精彩内容来源:桃芯科技 | 桃大芯整理:李肖遥最近科技圈有个大新闻:苹果iPhone11集成了UWB芯片。这个非常低调的行业,现在变得异常热闹起来。我们稍微梳理研究了一下相关UWB信息供大家参考,但我们会附带几个观点在文章后面,也许这个更应该被看到。一、   UWB技术相关信息UWB技术的前世UWB(超宽带)概念在1960年就被提出。1973年,第一个UWB系统的专利被授予。从UWB出现到20世纪90年代之前,UWB技术主要用于军事上的雷达系统。民用阶段,UWB行业内的厂商此前都在做B端,目前的典型应用包括工厂、仓储、隧道、司法等各种垂直行业的人员或物资高精度定位。UWB技术特点没有载波的通信系统:UWB是一个非传统的通信系统,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲为信息载体传输数据。带宽极宽 极低功率传输:其频谱范围(3.1GHz—10.6GHz),UWB系统使用间歇的脉冲来发送数据,脉冲持续时间很短,一般在0.20~1.5ns之间,有很低的占空比,系统耗电很低,在高速通信时系统的耗电量仅为几百微瓦至几十毫瓦。如下图所示高速的数据传输:UWB通过在较宽的频谱上传送极低功率的信号,能在10米左右的范围内实现数百Mbit/s至数Gbit/s的数据传输速率,如下图,802.15.3表示的即是UWB技术。抗干扰性能强:UWB采用跳时扩频信号,系统具有较大的处理增益,在发射时将微弱的无线电脉冲信号分散在宽阔的频带中,输出功率甚至低于普通设备产生的噪声。UWB测距原理双向飞行时间法(TW-TOF,two way-time of flight),主要利用信号在两个异步收发机(Transceiver)之间飞行时间来测量节点间的距离。每个模块从启动开始即会生成一条独立的时间戳。模块A的发射机在其时间戳上的Ta1发射请求性质的脉冲信号,模块B在Tb2时刻发射一个响应性质的信号,被模块A在自己的时间戳Ta2时刻接收。由此可以计算出脉冲信号在两个模块之间的飞行时间,从而确定飞行距离S。S=Cx[(Ta2-Ta1)-(Tb2-Tb1)](C为光速)但是单纯的TOF算法有一个比较严格的约束:发送设备和接收设备必须始终同步。这是一个比较棘手的问题,但是一种Double-sidedTwo-way Ranging的算法巧妙的避开了这个问题,它既利用了TOF测距的优良特点,同时又极大的去除了TOF的同步问题,从而为TOF的实用化扫清了道路。UWB的定位原理定位算法中比较成熟的有:TOA(到达时间)、TDOA(到达时间差)、AOA(到达角度或称为DOA估计)定位技术和这三种技术的混合技术。 a)TOA(到达时间)――下面的图非常形象的诠释了TOA算法的原理:然而事情都具有两面性:TOA定位对传播中产生的误差比较敏感,这些误差来自于传播中的反射、多径传播、非视距传播和噪声等干扰,会造成各圆无法相交或相交处不是一个点而是一个区域。同时TOA定位要求移动终端和基站之间在时间上要准确同步,1ns的同步误差将会给定位带来大约0.3米的不确定性。 b)TDOA(到达时间差)对TOA技术加以了改进。TDOA定位不必要进行基站和移动终端之间的同步,而只需要基站之间进行同步。因为基站的位置是固定的,基站之间进行同步与基站和移动终端之间进行同步要容易实现得多。它通过测量出两个不同基站与移动终端的传输时延差来进行定位。假设移动终端的位置与基站1和基站2的距离差为R21=R2-R1,则移动终端的位置必定在以两个基站为焦点,与两个焦点的距离差恒为R21的双曲线上。再通过另一组移动终端与基站1基站3或基站2基站3的TDOA,可以得到另一组双曲线,两组双曲线将最多产生两个交点,再根据先验知识(如半径范围等)判断出移动终端的位置。它的基本原理可以从下面的图得到良好的诠释:c)AOA估计也叫DOA(DirectionofArrival)估计或者方向识别DF(DirectionFinding)。AOA的优点是所需要的基站比较少,最少只要两个基站就可以进行定位。下图很好的诠释了AOA的基本原理:AOA的缺点是当移动终端和基站的距离比较远的时候,即使有微小的定位角度的误差,都会造成比较大的定位距离的偏差。因此AOA定位多见于中、短距离的定位。 混合定位技术就是混合使用上述的两种或三种定位技术,比如TOA-TDOA、 TOA-AOA、TDOA-AOA等,通过检测并提取相关的定位参数,用于定位解算。混合定位技术可以运用多种定位参数实现定位,综合不同定位技术的特点,在各 种定位技术的特性中取长补短,让最终的定位性能得到优化。 二、 UWB市场相关信息UWB产业链现状分离电路板方式早期,UWB定位方案的核心元器件采用的是分离电路板方式,提供此类方案的公司有:Ubisense公司,Ubisense公司是全球实时定位系统(RTLS)的领导者,由剑桥大学贝尔实验室团队组建,其设计和研发在英国,生产和服务在德国。 UWB芯片方式UWB定位芯片出现之后,使得UWB最具技术壁垒与核心的环节得以标准化,因此,直接刺激了大量的企业涌入到UWB定位领域中进行技术的二次开发,以及市场应用的拓展。UWB定位系统组成UWB定位系统主要包含基站(Anchor),标签(Tag)和应用软件(system)。目前UWB定位企业第一梯队的企业都是采用提供整体方案的商业模式,因为对于很多用户来说,希望技术供应商能够供应整体化的解决方案。目前行业里面基站是主要的盈利点;标签量虽然大,但价格比较低,毛利也比较低;应用软件毛利很高,但目前占比比较小。UWB相关企业数估计最近几年,国内做UWB定位技术类企业数量也快速的增加,以下是对当前国内UWB定位技术企业的数量估算。UWB定位行业虽然涌入了大量的玩家,但是UWB的技术方案从芯片到可交付的产品需要时间的积累,一般对于一个新玩家来说,这个周期需要2年左右,此外,也有很多企业,尤其是规模比较大的成熟企业,进入UWB领域更多的是达到技术积累目的,等待应用市场的进一步拓展。UWB目前市场价格及盈利水平在当前UWB企业级定位市场中,项目制的市场环境的特性是方案有很多定制化的内容,报价方式是对整体方案进行打包报价,尤其是很多项目中,还有一些应用软件的开发,因而报价会有很高的灵活性。UWB 2B市场分析定位技术作为一项新兴的技术产业,虽然在早期的市场体量还不够大,但是其发展潜力是巨大的,其市场潜力主要表现在两个方面:第一,  增长水平,最近这几年,企业级UWB定位市场一直保持着一个很高的增长水平,尤其是自2018年开始,行业整体业绩进入了一个快速增长期。第二,  UWB产品能够撬动的市场很大,在企业级项目应用中,UWB定位部分占据的内容往往只是一小部分,整个大项目还有很多其他的建设投入,UWB定位部分在项目的产值占比大概在10%-20%之间,也就意味着, UWB定位市场可以撬动其本身市场产值的5-10倍。 a)  2018年,国内UWB企业级应用市场出货量为百万级,随着新的芯片玩家进入,未来几年,在企业级应用市场,UWB将会保持着超高的发展速度,预计在2022年将会超过千万级的量,达到1200万片左右。b)   预计在2022年,国内UWB企业级应用市场的体量将会超过百亿级别c)   UWB定位市场企业级应用细分领域分析UWB 2C市场展望苹果在官网上只介绍了U1超宽带芯片可用于AirDrop,将手机指向另一个手机,通过测向和定位可以优先连接该手机。其实苹果早些年开始已经进行了多项UWB布局,这个是关于UWB用于汽车车钥匙的专利。2019年苹果相关专利甚至传说苹果要用UWB技术做iBeacon V2。应用层面,网上也有很多例子,我们稍微提一下就OK,感兴趣的可以去查阅。a)  高精度定位的C端应用可以在C端用于停车场找车、找宠物、找娃、找钥匙,也可以用于陌生人社交找人,这简直就是终极找东西的神器。想象下,在车海中快速找到来接我的滴滴快车。这种应用是不需要环境中部署基站的,只需要双方都具有UWB设备。b)无感门禁UWB的时间戳测距原理使得UWB几乎不可能通过被截获复制的方法伪造出自己的位置,那么UWB可以作为安全性很高且便捷的钥匙了。iPhone11可以作为车钥匙,提供比现有无钥匙进入技术安全性更高、定位精度更高的体验。想象下,拿着手机距离车辆5米时车灯自动点亮,距离车门1米时,对应车门自动解锁。如果此时转身,迈开一步离开,车门自动上锁。iPhone11希望连接未来所有汽车,这也许是苹果推出U1芯片的重要原因。C ) 智能锁应用在智能锁上应用也是可能的,三星在19年初CES期间以及发布一款应用UWB技术的智能锁,只是当时还没有手机钥匙,需要佩戴专用的UWB钥匙。随着手机加入UWB芯片,手机作为钥匙的应用前景会很快到来。  d) 无感支付iPhone11也可以通过与POS机安全测距等方式为Apple Pay等支付技术提供更安全的无感支付体验。甚至将来拿了UWB手机的人可以直接过UWB地铁闸机,而无需掏手机出来扫码或刷NFC,类似汽车ETC过闸机一样。 三、 UWB的一些问题UWB技术a) 技术标准向前兼容,而非向后兼容Decawave公司的DW1000支持IEEE 802.15.4-2011标准,明年2020年量产的DW3000芯片将支持最新的IEEE 802.15.4z标准。苹果的U1和NXP新发布的SR100T也都支持IEEE802.15.4z最新标准。802.15.4z在原有标准基础上定义了新的特性,可以提升安全、功耗更低、且传输距离更远。注意IEEE 802.15.4z是向前兼容的,所以iPhone11可以和现在普遍应用的IEEE 802.15.4-2011标准的DW1000对接,但这只是理论上存在可能.b) UWB领域并没有网络层及以上的行业标准虽然同样是采用DW1000芯片的系统,但不同厂家产品是完全不兼容的。定位算法也有很多种,适用不同的场景,并没有一个开源的算法给大家用。往往需要厂家做大量的算法研究工作,并结合各种场景做大量迭代。在苹果未来逐渐开放其U1芯片定位应用的SDK后,预计会有部分改观。 UWB芯片前面的关于UWB的特性是从原理上来说明的,从芯片层面来较实际的应该有一些折扣。拿某款在55nm水平上的芯片为例,从大速率传输的角度看:1.   峰值速率原理上能达到1Gbps,但能做到稳定传输应该在640Mbps左右。2.   射频方面原理上是3-10G的频带,但实现的过程中基本保持在3-4G中的若干375M频段。3.   如果保持-40dBm的发射功率,传输距离基本上是在客厅范围。这也是UWB大速率数据传输中的典型应用,包括电脑投屏,家庭影院等。4.   功耗上看,全频跑应用怎么都得百毫安,功耗不友好。5.   从研发成本上看,UWB至少和WiFi11n甚至WiFi11ac相当,并不简单。6.   当年UWB没能发展是因为,从以上所有性能上看几乎都赢不了WiFi11ac,Intel也退出了他发起的联盟。如果从定位的应用角度看:1.   所有的无线都可以用来定位,高频段的方向性要好一些,但看你用的是3G还是10G。2.   只做定位的话,芯片复杂度能降低多少需要进一步研究,暂不评论。3.   功耗,成本等,目前看比不上其他的无线技术。4.   从B到C要解决功耗,成本的问题。  UWB感想    1.  UWB不是新东西,只是突然被更多的人看见了。    2.  UWB作为民用,出现时的标签是高速率数据传输,定位只是前者失败后的一个替代应用。    3.  被看见了,不代表它会在技术特性,应用和市场等方面就突变了。    4.  UWB从10年前开始,国内也陆续倒过一批企业的,包括芯片设计公司。    5.  不能用网红思维看待技术:        a)  比如AI只是一个随着芯片制造水平提高,计算能力越来越强而衍生的一项技术,它本身并不是一个行业。拿最成功的应用案例来说,这些行业本身是图像识别和处理,或语音识别。所谓AI只是其中的一项技术而已(更专业的名称应该是算法加速器,但没有人爱这个名字)。        b)  比如量子通信最近又被吐槽,但事物本身是清楚的,为啥现在才说。        c)  技术没有高大上,技术是勤奋和严谨。举个简单的例子,如果有谁愿意把USB做好做透,或者把ADC做好做透,我觉得他一定是杰出企业。企业的逻辑是市场足够大,然后你为什么比别人做的好。没用哪家上市技术公司不是接地气的,解决实际问题的,能有正向现金流的。       d)  如果追求高大上,那请准备好10或20年的耐心。或者准备一个志趣相投的爸爸。当然,如果是大企业,探索和储备就变成使命和战略了。对新东西的出现,保持开放和理性是基本素质。作为有相关UWB芯片经验的团队,做不做,什么时候做,还需要进一步分析和调研。来源整理于网络素材,版权归原作者所有,如有侵权,请联系删除,谢谢。‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧  END  ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧关注我的微信公众号,回复“加群”按规则加入技术交流群。欢迎关注我的视频号:点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。

    技术让梦想更伟大 UWB

  • 粉丝回馈,8000元大礼包免费相送

    9月开学季,福利送不停,又给大家送福利了,价值8000元豪礼相送!一、 前言非常感谢大家近期对公众号的支持,暑假也结束了。这次邀请了3个不错的公众号朋友,同时也是电子嵌入式领域的优质公众号,一起给大家送点礼品!同时感谢本次奖品赞助商"正点原子"。正点原子大家应该都不陌生,其嵌入式开发平台(STM32/Linux/FPGA)一直是全网销量榜首,出品的上千讲STM32、Linux、FPGA免费课程传播度非常高。免费视频教程不断更新,刚刚还更新了基于新起点V2平台的手把手教你学FPGA系列视频,更新了130讲教学视频。好了,直接上礼品,本次总共有6种奖品!二、礼品介绍1、MP157 Mini开发板MP157 Mini开发板2、新起点FPGA开发板新起点FPGA开发板3、Nano STM32F103RBT6开发板STM32F103RBT6开发板4、正点原子DAP仿真器DAP仿真器5、正点原子蓝牙4.2串口透传模块蓝牙4.2串口透传模块6、正点原子串口WIFI8266模块串口WIFI8266模块三、礼品数量本次活动联合了4个公众号一起发放礼品。每个号分别送出8份奖品 :MP157 Mini开发板* 1新起点FPGA开发板* 1Nano STM32F103RBT6开发板* 1正点原子DAP仿真器* 1正点原子蓝牙4.2串口透传模块* 2正点原子串口WIFI8266模块* 2可以5个公众号一起抽,也就是说,总共有40份奖品!MP157 Mini开发板* 5新起点FPGA开发板* 5Nano STM32F103RBT6开发板* 5正点原子DAP仿真器* 5正点原子蓝牙4.2串口透传模块* 10正点原子串口WIFI8266模块* 10只要手气好,每个号都中一次。四、获取方式1、点击下方公众号卡片,后台回复关键词:666,获取礼品抽奖链接/海报,对了,五个号都可以抽,只要手气好,连中五个不是梦!2、随机抽取,随机发货。3、2021年9月13日20:10自动开奖;4、开奖后务必在抽奖助手内填写收货地址,若24小时内没有填写地址的视为弃权。点击下方卡片关注,回复「666」点击下方卡片关注,回复「666」点击下方卡片关注,回复「666」点击下方卡片关注,回复「666」点击下方卡片关注,回复「666」最后,再次感谢正点原子的赞助!记得每个号都要抽哦~ 祝各位都抽到大奖~

    技术让梦想更伟大

  • 实践 | Linux内核编译、启动和相关驱动构建

    关注「嵌入式大杂烩」,选择「星标公众号」一起进步!01修改与编译内核前面小哥主要是跟大家讲解了uboot的烧录、使用等等,而对于嵌入式Linux环境而言其实主要是分为三大块 : uboot,Linux Kernel(内核),文件系统,当然高版本的内核存在设备树文件等等,不过感觉还不足以认为是一大块,只能说是驱动的一部分。那么本文就主要是通过uboot把Linux系统运行起来,而挂载根文件系统并进入终端命令行估计得到下一篇文章了。如果大家手上有已经移植或制作OK的Linux内核image和文件系统,只需要将他们烧录到板子上的对应存储位置上,然后设置uboot中的一些启动参数即可完成整个Linux系统的启动。然而每块开发板的外设总会存在或多或少的差异,这样就需要开发人员修改相应的与硬件交互的代码(Linux驱动),或者调整各部分在内存分布的大小与地址等,以适应新的硬件平台,这个过程就叫做移植。看起来移植很高大上,相对Linux内核这么庞大的代码而言还是小部分,毕竟Linux系统在开发过程中都会考虑与硬件相关部分进行的分离,并且大部分开发板都会参考官方发布的单板来进行布局。好了,那么小哥就大致讲解一下这个过程。02移植与烧录内核这里使用的是百问网科技超级老的jz2440开发板,他们提供了对应内核版本的适配其开发板的移植补丁,也就是说在Linux-3.4.2原始的内核源码上通过提供的补丁包自动化的进行代码的修改以适应当前开发板,从单片机的角度看来就是修改一些引脚,配置驱动等等。然而小哥手头板子的NandFlash上存在坏块,uboot,内核、文件系统等都会烧录到NandFlash上,你可以认为就是单片机的Flash,不过单片机的Flash大部分为NorFlash,而由于存在坏块所以对相关的分区进行调整,否则坏块会导致相应的烧录文件不完整而启动失败。由于后面打算移植QT,而之前拿到的补丁包没有移植好触摸驱动和网卡驱动,即使打了之前拿到的补丁还需要继续进行相关代码上的移植,那慢慢来,先把一些适配的补丁打上:1tar jxvf linux-3.4.2.tar.bz22cd linux-3.4.2/3patch -p1  2  Graphics support  ---> 3    Support for frame buffer devices  ---> 4      S3C2410 LCD framebuffer support  配置好以后,记得save到对应的.config即可,这样编译前的配置才能够生效。05触摸驱动编译与移植玩单片机的小伙伴都知道电阻触摸屏,就是通过获得屏幕横纵的AD采样值最终来定位屏幕上的位置,而S3C2440也是存在触摸屏的外设接口的,我们通过配置触摸屏外设接口,即可驱动触摸屏获得相应的ADC值最终定位到屏幕上所点击的位置。在Linux中对于鼠标、触摸等等都属于输入设备,所以这类驱动都可以归为输入子系统input,那么我们只需要注册一个输入子系统即完成了触摸屏驱动。触摸驱动程序主要分为这样几步,首先获得一个输入设备结构体,然后根据触摸的特性进行相关的事件的配置,因为输入系统都是以事件的方式上报给系统,不同的事件当然配置也就不同,配置好了以后就把输入设备结构体注册到系统,以便设备识别。而当所配置的事件一旦条件触发,就会把触发信号和数据通过input_report上报给系统,供系统使用,所以单片机你想做得通用化,也可以直接这么玩,不过考虑到单片机的简洁,还是慎重考虑~虽然我们可以直接把该驱动程序编译成.ko驱动程序,可是这样需要每次内核启动完成以后就需要重新加载驱动,有点麻烦,所以考虑把它编译到Linux内核中。要把驱动程序添加到内核需要做三件事:1)添加源码到相应目录;2)在相应的Kconfig文件中增加编译选项;3)在makefile中增加相应的编译项。前面我们大致编写了源码并且放到了相应的目录,这里就只需要完成后面的两项,这两项可能相应的语法规则刚开始并不是很熟,不过可以查阅相应的知识补充,也可以直接照着其他touch驱动类似编写即可。比如s3c2410的Kconfig如下编写:于是我们可以模仿着把S3C2440类似的添加到后面:第二步完成,接下来在当前目录的Makefile添加编译项目:照着S3C2410的来即可。虽然我们完成上面的三步,但只是完成了能够提供选择的是否编译进内核的驱动选项,在menuconfig菜单中你可以看到,而到底最终是否编译到内核,还需要在menconfig菜单中进行配置选择并保存到config中。1Device Drivers  ---> 2  Input device support  --->  3    Touchscreens  --->至此,触摸的驱动就编写并添加到了内核中。06内核的编译与烧录一切准备就绪,那就是编译内核了,编译内核的目的就是为了获得Linux kernel映像文件,最终烧录到板子上的内容。如下是我使用的编译命令,由于没有把相应的路径放到环境变量,所以这里就制定了编译器路径,比较长。1make uImage CROSS_COMPILE=/home/book/WorkSpace/Qt/src/arm-linux-gcc-4.4.3/opt/FriendlyARM/toolschain/4.4.3/bin/arm-linux- ARCH=arm -j8如果编译过程中遇到什么不理解的error,基本上都是根据所报错误的提示,进行网络查找,一般都可以得到解决,因为大家都遇到过~最后顺利编译内核成功,如下是编译结果:以上的输出信息,我们也可以了解到想要的uImage所在路径,以及文件的大小,类型和入口地址等。我们借助uboot直接通过TFTP服务把uImage先下载到SDRAM中,然后在使用NandFlash命令烧录到Flash中对应的分区即可。其实烧录过程在往期的uboot中已经说得很详细了,这里主要提两点:1)由于uboot是一个单任务的裸机程序,所以连接好网线以后,你的电脑网络状态还是没有连接的,所以需要uboot主动发起网络,电脑端就会有网络链接状态显示了。2)在进行网络通信过程中,要记得关掉电脑主机的防火墙,以便链接失败。我们使用TFTP服务,需要设置好服务器IP,也就是我们的电脑主机IP地址,然后通过TFTP命令获得相应的内核文件,实验结果如下:这样我们就把uimage下载到了SDRAM的0x30000000的位置,接下来我们需要把他烧录到对应的NandFlash的Kernel分区上,使用如下命令:1nand erase.part kernel2nand write 0x30000000 kernel重新启动开发板,即可看到成功启动了内核:但是最终由于我们还没有为Linux系统构建文件系统,系统启动还需要一些必备的启动文件和工具,最终会报错。不过我们今天的目标达到,Linux内核得到了启动,并且移植好了我们想要的一些驱动。 最  后 这里小哥就介绍了一下Linux内核的移植、烧录、相关驱动的相关知识,希望本文能够对你有帮助,下期带来文件系统的构建过程~往期干货:往期推荐嵌入式项目生成器,了解一下!一个清晰的LCD驱动编写思路(附代码分析)RT-Thread和Freertos的区别?程序如何运行?编译、链接、装入?

    嵌入式大杂烩 内核 编译

  • 小知识 | 嵌入式C中#pragma once的作用是什么?

    关注「嵌入式大杂烩」,选择「星标公众号」一起进步!大家好,我是ZhengN。本次给大家分享一个C/C 的小知识——#pragma once。我之前也没用过#pragma once,直到看到同事的代码有用到,所以去了解了一下。分享一篇博文:❝https://blog.csdn.net/fanyun_01/article/details/77413992❞1、#pragma once有什么作用?为了避免同一个头文件被包含(include)多次,C/C 中有两种宏实现方式:一种是#ifndef方式;另一种是#pragma once方式。在能够支持这两种方式的编译器上,二者并没有太大的区别。但两者仍然有一些细微的区别。2、两者的使用方式有何区别?示例代码如下://方式一:#ifndef  __SOMEFILE_H__#define   __SOMEFILE_H__ ... ... // 声明、定义语句#endif//方式二:#pragmaonce ... ... // 声明、定义语句3、两者各有何特点?(1)#ifndef#ifndef的方式受C/C 语言标准支持。它不仅可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件(或者代码片段)不会被不小心同时包含。当然,缺点就是如果不同头文件中的宏名不小心“撞车”,可能就会导致你看到头文件明明存在,但编译器却硬说找不到声明的状况——这种情况有时非常让人郁闷。由于编译器每次都需要打开头文件才能判定是否有重复定义,因此在编译大型项目时,ifndef会使得编译时间相对较长,因此一些编译器逐渐开始支持#pragma once的方式。(2)#pragma once#pragma once 一般由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。你无法对一个头文件中的一段代码作pragma once声明,而只能针对文件。其好处是,你不必再担心宏名冲突了,当然也就不会出现宏名冲突引发的奇怪问题。大型项目的编译速度也因此提高了一些。对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名冲突引发的“找不到声明”的问题,这种重复包含很容易被发现并修正。另外,这种方式不支持跨平台!4、两者之间有什么联系?#pragma once 方式产生于#ifndef之后,因此很多人可能甚至没有听说过。目前看来#ifndef更受到推崇。因为#ifndef受C/C 语言标准的支持,不受编译器的任何限制;而#pragma once方式却不受一些较老版本的编译器支持,一些支持了的编译器又打算去掉它,所以它的兼容性可能不够好。一般而言,当程序员听到这样的话,都会选择#ifndef方式,为了努力使得自己的代码“存活”时间更久,通常宁愿降低一些编译性能,这是程序员的个性,当然这是题外话啦。还看到一种用法是把两者放在一起的:#pragma once#ifndef __SOMEFILE_H__#define __SOMEFILE_H__... ... // 声明、定义语句#endif总结:看起来似乎是想兼有两者的优点。不过只要使用了#ifndef就会有宏名冲突的危险,也无法避免不支持#pragma once的编译器报错,所以混用两种方法似乎不能带来更多的好处,倒是会让一些不熟悉的人感到困惑。选择哪种方式,应该在了解两种方式的情况下,视具体情况而定。只要有一个合理的约定来避开缺点,我认为哪种方式都是可以接受的。而这个已经不是标准或者编译器的责任了,应当由程序员自己或者小范围内的开发规范来搞定。为了避免同一个文件被include多次:1、#ifndef方式 2、#pragma once方式在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别。方式一:#ifndef __SOMEFILE_H__#define __SOMEFILE_H__... ... // 一些声明语句#endif方式二:#pragma once... ... // 一些声明语句#ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。当然,缺点就是如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况。#pragma once则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名碰撞引发的“找不到声明”的问题,重复包含更容易被发现并修正。方式一由语言支持所以移植性好,方式二 可以避免名字冲突。本文来源网络,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。往期干货:往期推荐嵌入式项目生成器,了解一下!一个清晰的LCD驱动编写思路(附代码分析)RT-Thread和Freertos的区别?程序如何运行?编译、链接、装入?

    嵌入式大杂烩 ce

  • 详解开关电源8大损耗

    能量转换系统必定存在能耗,虽然实际应用中无法获得100%的转换效率,但是,一个高质量的电源效率可以达到非常高的水平,效率接近95%。绝大多数电源IC 的工作效率可以在特定的工作条件下测得,数据资料中给出了这些参数。一般厂商会给出实际测量的结果,但我们只能对我们自己的数据担保。图1 给出了一个SMPS 降压转换器的电路实例,转换效率可以达到97%,即使在轻载时也能保持较高效率。采用什么秘诀才能达到如此高的效率?我们最好从了解SMPS 损耗的公共问题开始,开关电源的损耗大部分来自开关器件(MOSFET 和二极管),另外小部分损耗来自电感和电容。但是,如果使用非常廉价的电感和电容(具有较高电阻),将会导致损耗明显增大。选择IC 时,需要考虑控制器的架构和内部元件,以期获得高效指标。例如,图1 采用了多种方法来降低损耗,其中包括:同步整流,芯片内部集成低导通电阻的MOSFET,低静态电流和跳脉冲控制模式。我们将在本文展开讨论这些措施带来的好处。图1. 降压转换器集成了低导通电阻的MOSFET,采用同步整流,效率曲线如图所示降压型SMPS损耗是任何SMPS 架构都面临的问题,我们在此以图2 所示降压型(或buck)转换器为例进行讨论,图中标明各点的开关波形,用于后续计算。降压转换器的主要功能是把一个较高的直流输入电压转换成较低的直流输出电压。为了达到这个要求,MOSFET 以固定频率(fS),在脉宽调制信号(PWM)的控制下进行开、关操作。当MOSFET 导通时,输入电压给电感和电容(L 和COUT)充电,通过它们把能量传递给负载。在此期间,电感电流线性上升,电流回路如图2 中的回路1 所示。当MOSFET 断开时,输入电压断开与电感的连接,电感和输出电容为负载供电。电感电流线性下降,电流流过二极管,电流回路如图中的环路2 所示。MOSFET 的导通时间定义为PWM 信号的占空比(D)。D 把每个开关周期分成[D × tS]和[(1 - D) × tS]两部分,它们分别对应于MOSFET 的导通时间(环路1)和二极管的导通时间(环路2)。所有SMPS 拓扑(降压、反相等)都采用这种方式划分开关周期,实现电压转换。对于降压转换电路,较大的占空比将向负载传输较多的能量,平均输出电压增加。相反,占空比较低时,平均输出电压也会降低。根据这个关系,可以得到以下理想情况下(不考虑二极管或MOSFET 的压降)降压型SMPS 的转换公式:VOUT = D × VINIIN = D × IOUT需要注意的是,任何SMPS 在一个开关周期内处于某个状态的时间越长,那么它在这个状态所造成的损耗也越大。对于降压型转换器,D 越低(相应的VOUT 越低),回路2 产生的损耗也大。1、开关器件的损耗 MOSFET 传导损耗图2 (以及其它绝大多数DC-DC 转换器拓扑)中的MOSFET 和二极管是造成功耗的主要因素。相关损耗主要包括两部分:传导损耗和开关损耗。MOSFET 和二极管是开关元件,导通时电流流过回路。器件导通时,传导损耗分别由MOSFET 的导通电阻(RDS(ON))和二极管的正向导通电压决定。MOSFET 的传导损耗(PCOND(MOSFET))近似等于导通电阻RDS(ON)、占空比(D)和导通时MOSFET 的平均电流(IMOSFET(AVG))的乘积。PCOND(MOSFET) (使用平均电流) = IMOSFET(AVG)² × RDS(ON) × D上式给出了SMPS 中MOSFET 传导损耗的近似值,但它只作为电路损耗的估算值,因为电流线性上升时所产生的功耗大于由平均电流计算得到的功耗。对于“峰值”电流,更准确的计算方法是对电流峰值和谷值(图3 中的IV 和IP)之间的电流波形的平方进行积分得到估算值。图3. 典型的降压型转换器的MOSFET 电流波形,用于估算MOSFET 的传导损耗下式给出了更准确的估算损耗的方法,利用IP 和IV 之间电流波形I²的积分替代简单的I²项。PCOND(MOSFET) = [(IP3 - IV3)/3] × RDS(ON) × D= [(IP3 - IV3)/3] × RDS(ON) × VOUT/VIN式中,IP 和IV 分别对应于电流波形的峰值和谷值,如图3 所示。MOSFET 电流从IV 线性上升到IP,例如:如果IV 为0.25A,IP 为1.75A,RDS(ON)为0.1Ω,VOUT 为VIN/2 (D = 0.5),基于平均电流(1A)的计算结果为:PCOND(MOSFET) (使用平均电流) = 12 × 0.1 × 0.5 = 0.050W利用波形积分进行更准确的计算:PCOND(MOSFET) (使用电流波形积分进行计算) = [(1.753 - 0.253)/3] × 0.1 × 0.5 = 0.089W或近似为78%,高于按照平均电流计算得到的结果。对于峰均比较小的电流波形,两种计算结果的差别很小,利用平均电流计算即可满足要求。2、二极管传导损耗MOSFET 的传导损耗与RDS(ON)成正比,二极管的传导损耗则在很大程度上取决于正向导通电压(VF)。二极管通常比MOSFET 损耗更大,二极管损耗与正向电流、VF 和导通时间成正比。由于MOSFET 断开时二极管导通,二极管的传导损耗(PCOND(DIODE))近似为:PCOND(DIODE) = IDIODE(ON) × VF × (1 - D)式中,IDIODE(ON)为二极管导通期间的平均电流。图2 所示,二极管导通期间的平均电流为IOUT,因此,对于降压型转换器,PCOND(DIODE)可以按照下式估算:PCOND(DIODE) = IOUT × VF × (1 - VOUT/VIN)与MOSFET 功耗计算不同,采用平均电流即可得到比较准确的功耗计算结果,因为二极管损耗与I 成正比,而不是I2。显然,MOSFET 或二极管的导通时间越长,传导损耗也越大。对于降压型转换器,输出电压越低,二极管产生的功耗也越大,因为它处于导通状态的时间越长。3、开关动态损耗由于开关损耗是由开关的非理想状态引起的,很难估算MOSFET 和二极管的开关损耗,器件从完全导通到完全关闭或从完全关闭到完全导通需要一定时间,在这个过程中会产生功率损耗。图4 所示MOSFET 的漏源电压(VDS)和漏源电流(IDS)的关系图可以很好地解释MOSFET 在过渡过程中的开关损耗,从上半部分波形可以看出,tSW(ON)和tSW(OFF)期间电压和电流发生瞬变,MOSFET 的电容进行充电、放电。图4 所示,VDS 降到最终导通状态(= ID × RDS(ON))之前,满负荷电流(ID)流过MOSFET。相反,关断时,VDS 在MOSFET 电流下降到零值之前逐渐上升到关断状态的最终值。开关过程中,电压和电流的交叠部分即为造成开关损耗的来源,从图4 可以清楚地看到这一点。图4. 开关损耗发生在MOSFET 通、断期间的过渡过程开关损耗随着SMPS 频率的升高而增大,这一点很容易理解,随着开关频率提高(周期缩短),开关过渡时间所占比例增大,从而增大开关损耗。开关转换过程中,开关时间是占空比的二十分之一对于效率的影响要远远小于开关时间为占空比的十分之一的情况。由于开关损耗和频率有很大的关系,工作在高频时,开关损耗将成为主要的损耗因素。MOSFET 的开关损耗(PSW(MOSFET))可以按照图3 所示三角波进行估算,公式如下:PSW(MOSFET) = 0.5 × VD × ID × (tSW(ON)  tSW(OFF)) × fS其中,VD 为MOSFET 关断期间的漏源电压,ID 是MOSFET 导通期间的沟道电流,tSW(ON)和tSW(OFF)是导通和关断时间。对于降压电路转换,VIN 是MOSFET 关断时的电压,导通时的电流为IOUT。为了验证MOSFET 的开关损耗和传导损耗,图5 给出了降压转换器中集成高端MOSFET 的典型波形:VDS和IDS。电路参数为:VIN = 10V、VOUT = 3.3V、IOUT = 500mA、RDS(ON) = 0.1Ω、fS = 1MHz、开关瞬变时间(tON  tOFF)总计为38ns。在图5 可以看出,开关变化不是瞬间完成的,电流和电压波形交叠部分导致功率损耗。MOSFET“导通”时(图2),流过电感的电流IDS 线性上升,与导通边沿相比,断开时的开关损耗更大。利用上述近似计算法,MOSFET 的平均损耗可以由下式计算:PT(MOSFET) = PCOND(MOSFET)  PSW(MOSFET)= [(I13 - I03)/3] × RDS(ON) × VOUT/VIN  0.5 × VIN × IOUT × (tSW(ON)  tSW(OFF)) × fS= [(13 - 03)/3] × 0.1 × 3.3/10 0.5 × 10 × 0.5 × (38 × 10-9) × 1 × 106= 0.011 0.095 = 106mW这一结果与图5 下方曲线测量得到的117.4mW 接近,注意:这种情况下,fS 足够高,PSW(MOSFET)是功耗的主要因素。图5. 降压转换器高端MOSFET 的典型开关周期,输入10V、输出3.3V (输出电流500mA)。开关频率为1MHz,开关转换时间是38ns。与MOSFET 相同,二极管也存在开关损耗。这个损耗很大程度上取决于二极管的反向恢复时间(tRR),二极管开关损耗发生在二极管从正向导通到反向截止的转换过程。当反向电压加在二级管两端时,正向导通电流在二极管上产生的累积电荷需要释放,产生反向电流尖峰(IRR(PEAK)),极性与正向导通电流相反,从而造成V × I 功率损耗,因为反向恢复期内,反向电压和反向电流同时存在于二极管。图6 给出了二极管在反向恢复期间的PN 结示意图。图6. 二极管结反偏时,需要释放正向导通期间的累积电荷,产生峰值电流(IRR(PEAK))。了解了二极管的反向恢复特性,可以由下式估算二极管的开关损耗(PSW(DIODE)):PSW(DIODE) = 0.5 × VREVERSE × IRR(PEAK) × tRR2 × fS其中,VREVERSE 是二极管的反向偏置电压,IRR(PEAK)是反向恢复电流的峰值,tRR2 是从反向电流峰值IRR 到恢复电流为正的时间。对于降压电路,当MOSFET 导通的时候,VIN 为MOSFET 导通时二极管的反向偏置电压。为了验证二极管损耗计算公式,图7 显示了典型的降压转换器中PN 结的开关波形,VIN = 10V、VOUT =3.3V,测得IRR(PEAK) = 250mA、IOUT = 500mA、fS = 1MHz、 tRR2 = 28ns、VF = 0.9V。利用这些数值可以得到:该结果接近于图7 所示测量结果358.7mW。考虑到较大的VF和较长的二极管导通周期,tRR 时间非常短,开关损耗(PSW(DIODE))在二极管损耗中占主导地位。图7. 降压型转换器中PN 结开关二极管的开关波形,从10V 输入降至3.3V 输出,输出电流为500mA。其它参数包括:1MHz 的fS,tRR2 为28ns,VF = 0.9V。提高效率基于上述讨论,通过哪些途径可以降低电源的开关损耗呢?直接途径是:选择低导通电阻RDS(ON)、可快速切换的MOSFET;选择低导通压降VF、可快速恢复的二极管。直接影响MOSFET 导通电阻的因素有几点,通常增加芯片尺寸和漏源极击穿电压(VBR(DSS)),由于增加了器件中的半导体材料,有助于降低导通电阻RDS(ON)。另一方面,较大的MOSFET 会增大开关损耗。因此,虽然大尺寸MOSFET 降低了RDS(ON),但也导致小器件可以避免的效率问题。当管芯温度升高时,MOSFET 导通电阻会相应增大。必须保持较低的结温,使导通电阻RDS(ON)不会过大。导通电阻RDS(ON)和栅源偏置电压成反比,因此,推荐使用足够大的栅极电压以降低RDS(ON)损耗,但此时也会增大栅极驱动损耗,需要平衡降低RDS(ON)的好处和增大栅极驱动的缺陷。MOSFET 的开关损耗与器件电容有关,较大的电容需要较长的充电时间,使开关切换变缓,消耗更多能量。米勒电容通常在MOSFET 数据资料中定义为反向传输电容(CRSS)或栅-漏电容(CGD),在开关过程中对切换时间起决定作用。米勒电容的充电电荷用QGD 表示,为了快速切换MOSFET,要求尽可能低的米勒电容。一般来说,MOSFET 的电容和芯片尺寸成反比,因此必须折衷考虑开关损耗和传导损耗,同时也要谨慎选择电路的开关频率。对于二极管,必须降低导通压降,以降低由此产生的损耗。对于小尺寸、额定电压较低的硅二极管,导通压降一般在0.7V 到1.5V 之间。二极管的尺寸、工艺和耐压等级都会影响导通压降和反向恢复时间,大尺寸二极管通常具有较高的VF 和tRR,这会造成比较大的损耗。开关二极管一般以速度划分,分为“高速”、“甚高速”和“超高速”二极管,反向恢复时间随着速度的提高而降低。快恢复二极管的tRR 为几百纳秒,而超高速快恢复二极管的tRR 为几十纳秒。低功耗应用中,替代快恢复二极管的一种选择是肖特基二极管,这种二极管的恢复时间几乎可以忽略,反向恢复电压VF 也只有快恢复二极管的一半(0.4V 至1V),但肖特基二极管的额定电压和电流远远低于快恢复二极管,无法用于高压或大功率应用。另外,肖特基二极管与硅二极管相比具有较高的反向漏电流,但这些因素并不限制它在许多电源中的应用。然而,在一些低压应用中,即便是具有较低压降的肖特基二极管,所产生的传导损耗也无法接受。比如,在输出为1.5V 的电路中,即使使用0.5V 导通压降VF 的肖特基二极管,二极管导通时也会产生33%的输出电压损耗!为了解决这一问题,可以选择低导通电阻RDS(ON)的MOSFET实现同步控制架构。用MOSFET 取代二极管(对比图1 和图2 电路),它与电源的主MOSFET 同步工作,所以在交替切换的过程中,保证只有一个导通。导通的二极管由导通的MOSFET 所替代,二极管的高导通压降VF 被转换成MOSFET 的低导通压降(MOSFET RDS(ON) × I),有效降低了二极管的传导损耗。当然,同步整流与二极管相比也只是降低了MOSFET 的压降,另一方面,驱动同步整流MOSFET 的功耗也不容忽略。IC数据资料 以上讨论了影响开关电源效率的两个重要因素(MOSFET 和二极管)。回顾图 1 所示降压电路,从数据资料中可以获得影响控制器IC 工作效率的主要因素。首先,开关元件集成在IC 内部,可以节省空间、降低寄生损耗。其次,使用低导通电阻RDS(ON)的MOSFET,在小尺寸集成降压IC (如MAX1556)中,其NMOS 和PMOS 的导通电阻可以达到0.27Ω (典型值)和0.19Ω (典型值)。最后,使用的同步整流电路。对于500mA 负载,占空比为50%的开关电路,可以将低边开关(或二极管)的损耗从225mW (假设二极管压降为 1V)降至 34mW。合理选择SMPS IC 合理选择 SMPS IC的封装、控制架构,并进行合理设计,可以有效提高转换效率。4、集成功率开关功率开关集成到IC 内部时可以省去繁琐的MOSFET 或二极管选择,而且使电路更加紧凑,由于降低了线路损耗和寄生效应,可以在一定程度上提高效率。根据功率等级和电压限制,可以把MOSFET、二极管(或同步整流MOSFET)集成到芯片内部。将开关集成到芯片内部的另一个好处是栅极驱动电路的尺寸已经针对片内MOSFET 进行了优化,因而无需将时间浪费在未知的分立MOSFET 上。静态电流电池供电设备特别关注IC 规格中的静态电流(IQ),它是维持电路工作所需的电流。重载情况下(大于十倍或百倍的静态电流IQ),IQ 对效率的影响并不明显,因为负载电流远大于IQ,而随着负载电流的降低,效率有下降的趋势,因为IQ 对应的功率占总功率的比例提高。这一点对于大多数时间处于休眠模式或其它低功耗模式的应用尤其重要,许多消费类产品即使在“关闭”状态下,也需要保持键盘扫描或其它功能的供电,这时,无疑需要选择具有极低IQ的电源。电源架构对效率的提高SMPS 的控制架构是影响开关电源效率的关键因素之一。这一点我们已经在同步整流架构中讨论过,由于采用低导通电阻的MOSFET 取代了功耗较大的开关二极管,可有效改善效率指标。另一种重要的控制架构是针对轻载工作或较宽的负载范围设计的,即跳脉冲模式,也称为脉冲频率调制(PFM)。与单纯的PWM 开关操作(在重载和轻载时均采用固定的开关频率)不同,跳脉冲模式下转换器工作在跳跃的开关周期,可以节省不必要的开关操作,进而提高效率。跳脉冲模式下,在一段较长时间内电感放电,将能量从电感传递给负载,以维持输出电压。当然,随着负载吸收电流,输出电压也会跌落。当电压跌落到设置门限时,将开启一个新的开关周期,为电感充电并补充输出电压。需要注意的是跳脉冲模式会产生与负载相关的输出噪声,这些噪声由于分布在不同频率(与固定频率的PWM 控制架构不同),很难滤除。先进的SMPS IC 会合理利用两者的优势:重载时采用恒定PWM 频率;轻载时采用跳脉冲模式以提高效率,图1 所示IC 即提供了这样的工作模式。当负载增加到一个较高的有效值时,跳脉冲波形将转换到固定PWM,在标称负载下噪声很容易滤除。在整个工作范围内,器件根据需要选择跳脉冲模式和PWM 模式,保持整体的最高效率(图8)。图8 中的曲线D、E、F 所示效率曲线在固定PWM 模式下,轻载时效率较低,但在重载时能够提供很高的转换效率(高达98%)。如果设置在轻载下保持固定PWM 工作模式,IC 将不会按照负载情况更改工作模式。这种情况下能够使纹波保持在固定频率,但浪费了一定功率。重载时,维持PWM 开关操作所需的额外功率很小,远远低于输出功率。另一方面,跳脉冲“空闲”模式下的效率曲线(图8 中的A、B、C)能够在轻载时保持在较高水平,因为开关只在负载需要时开启。对7V 输入曲线,在1mA 负载的空闲模式下能够获得高于60%的效率。图8. 降压转换器在PWM 和空闲(跳脉冲)模式下效率曲线,注意:轻载时,空闲模式下的效率高于PWM模式。优化SMPS开关电源因其高效率指标得到广泛应用,但其效率仍然受SMPS 电路的一些固有损耗的制约。设计开关电源时,需要仔细研究造成SMPS 损耗的来源,合理选择SMPS IC,从而充分利用器件的优势,为了在保持尽可能低的电路成本,甚至不增加电路成本的前提下获得高效的SMPS,工程师需要做出全面的选择。5、无源元件损耗我们已经了解MOSFET 和二极管会导致SMPS 损耗。采用高品质的开关器件能够大大提升效率,但它们并不是唯一能够优化电源效率的元件。图1 详细介绍了一个典型的降压型转换器IC 的基本电路。集成了两个同步整流MOSFET,低RDS(ON) MOSFET,效率很高。这个电路中,开关元件集成在IC 内部,已经为具体应用预先选择了元器件。然而,为了进一步提高效率,设计人员还需关注无源元件—外部电感和电容,了解它们对功耗的影响。6、电感功耗阻性损耗电感功耗包括线圈损耗和磁芯损耗两个基本因素,线圈损耗归结于线圈的直流电阻(DCR),磁芯损耗归结于电感的磁特性。DCR 定义为以下电阻公式:式中,ρ 为线圈材料的电阻系数,l 为线圈长度,A 为线圈横截面积。DCR 将随着线圈长度的增大而增大,随着线圈横截面积的增大而减小。可以利用该原则判断标准电感,确定所要求的不同电感值和尺寸。对一个固定的电感值,电感尺寸较小时,为了保持相同匝数必须减小线圈的横截面积,因此导致DCR 增大;对于给定的电感尺寸,小电感值通常对应于小的DCR,因为较少的线圈数减少了线圈长度,可以使用线径较粗的导线。已知DCR 和平均电感电流(具体取决于SMPS 拓扑),电感的电阻损耗(PL(DCR))可以用下式估算:PL(DCR) = LAVG2× DCR这里,IL(AVG)是流过电感的平均直流电流。对于降压转换器,平均电感电流是直流输出电流。尽管DCR的大小直接影响电感电阻的功耗,该功耗与电感电流的平方成正比,因此,减小DCR 是必要的。另外,还需要注意的是:利用电感的平均电流计算PL(DCR) (如上述公式)时,得到的结果略低于实际损耗,因为实际电感电流为三角波。本文前面介绍的MOSFET 传导损耗计算中,利用对电感电流的波形进行积分可以获得更准确的结果。更准确。当然也更复杂的计算公式如下:PL(DCR) = (IP3 - IV3)/3 × DCR式中IP 和IV 为电感电流波形的峰值和谷值。7、磁芯损耗磁芯损耗并不像传导损耗那样容易估算,很难估测。它由磁滞、涡流损耗组成,直接影响铁芯的交变磁通。SMPS 中,尽管平均直流电流流过电感,由于通过电感的开关电压的变化产生的纹波电流导致磁芯周期性的磁通变化。磁滞损耗源于每个交流周期中磁芯偶极子的重新排列所消耗的功率,可以将其看作磁场极性变化时偶极子相互摩擦产生的“摩擦”损耗,正比于频率和磁通密度。相反,涡流损耗则是磁芯中的时变磁通量引入的。由法拉第定律可知:交变磁通产生交变电压。因此,这个交变电压会产生局部电流,在磁芯电阻上产生I2R 损耗。磁芯材料对磁芯损耗的影响很大。SMPS 电源中普遍使用的电感是铁粉磁芯,铁镍钼磁粉芯(MPP)的损耗最低,铁粉芯成本最低,但磁芯损耗较大。磁芯损耗可以通过计算磁芯磁通密度(B)的最大变化量估算,然后查看电感或铁芯制造商提供的磁通密度和磁芯损耗(和频率)图表。峰值磁通密度可以通过几种方式计算,公式可以在电感数据资料中的磁芯损耗曲线中找到。相应地,如果磁芯面积和线圈数已知,可利用下式估计峰值磁通:这里,B 是峰值磁通密度(高斯),L 是线圈电感(亨),ΔI 是电感纹波电流峰峰值(安培),A 是磁芯横截面积(cm2),N 是线圈匝数。随着互联网的普及,可以方便地从网上下载资料、搜索器件信息,一些制造商提供了交互式电感功耗的计算软件,帮助设计者估计功耗。使用这些工具能够快捷、准确地估计应用电路中的功率损耗。例如,Coilcraft 提供的在线电感磁芯损耗和铜耗计算公式,简单输入一些数据即可得到所选电感的磁芯损耗和铜耗。8、电容损耗与理想的电容模型相反,电容元件的实际物理特性导致了几种损耗。电容在SMPS 电路中主要起稳压、滤除输入/输出噪声的作用(图1),电容的这些损耗降低了开关电源的效率。这些损耗主要表现在三个方面:等效串联电阻损耗、漏电流损耗和电介质损耗。电容的阻性损耗显而易见。既然电流在每个开关周期流入、流出电容,电容固有的电阻(RC)将造成一定功耗。漏电流损耗是由于电容绝缘材料的电阻(RL)导致较小电流流过电容而产生的功率损耗。电介质损耗比较复杂,由于电容两端施加了交流电压,电容电场发生变化,从而使电介质分子极化造成功率损耗。图9. 电容损耗模型一般简化为一个等效串联电阻(ESR)所有三种损耗都体现在电容的典型损耗模型中(图9 左边部分),用电阻代表每项损耗。与电容储能相关的每项损耗的功率用功耗系数(DF)表示,或损耗角正切(δ)。每项损耗的DF 可以通过由电容阻抗的实部与虚部比得到,可以将每项损耗分别插入模型中。为简化损耗模型,图9 中的接触电阻损耗、漏电流损耗和电介质损耗集中等为一个等效串联电阻(ESR)。ESR 定义为电容阻抗中消耗有功功率的部分。推算电容阻抗模型、计算ESR (结果的实部)时,ESR 是频率的函数。这种相关性可以在下面简化的ESR等式中得到证明:式中,DFR、DFL 和DFD 是接触电阻、漏电流和电介质损耗的功耗系数。利用这个等式,我们可以观察到随着信号频率的增加,漏电流损耗和电介质损耗都有所减小,直到接触电阻损耗从一个较高频点开始占主导地位。在该频点(式中没有包括该参数)以上,ESR 因为高频交流电流的趋肤效应趋于增大。许多电容制造商提供ESR 曲线图表示ESR 与频率的关系。例如,TDK 为其大多数电容产品提供了ESR 曲线,参考这些与开关频率对应曲线图,得到ESR 值。然而,如果没有ESR 曲线图,可以通过电容数据资料中的DF 规格粗略估算ESR。DF 是电容的整体DF (包括所有损耗),也可以按照下式估算ESR:无论采用哪种方法来得到ESR 值,直觉告诉我们,高ESR 会降低开关电源效率,既然输入和输出电容在每个开关周期通过ESR 充电、放电。这导致I2× RESR 功率损耗。这个损耗(PCAP(ESR))可以按照下式计算:PCAP(ESR) = ICAP(RMS)2 × RESR式中,ICAP(RMS)是流经电容的交流电流有效值RMS。对降压电路的输出电容,可以采用电感纹波电流的有效值RMS。输入滤波电容的RMS 电流的计算比较复杂,可以按照下式得到一个合理的估算值:ICIN(RMS) = IOUT/VIN × [VOUT (VIN - VOUT)]1/2显然,为减小电容功率损耗,应选择低ESR 电容,有助于SMPS 电源降低纹波电流。ESR 是产生输出电压纹波的主要原因,因此选择低ESR 的电容不仅仅单纯提高效率,还能得到其它好处。一般来说,不同类型电介质的电容具有不同的ESR 等级。对于特定的容量和额定电压,铝电解电容和钽电容就比陶瓷电容具有更高的ESR 值。聚酯和聚丙烯电容的ESR 值介于它们之间,但这些电容尺寸较大,SMPS 中很少使用。对于给定类型的电容,较大容量、较低的fS 能够提供较低的ESR。大尺寸电容通常也会降低ESR,但电解电容会带来较大的等效串联电感。陶瓷电容被视为比较好的折中选择,此外,电容值一定的条件下,较低的电容额定电压也有助于减小ESR。END来源:网络版权归原作者所有,如有侵权,请联系删除。▍

    嵌入式ARM 开关电源

  • 单片机程序:如何用一个按键实现单击\\\\双击\\\\长按?

    本文提供了一个按键实现【单击\双击\长按】的单片机demo程序。芯片采用新唐的N76E003,但理论上可以改成其它MCU。←左右滑动,查看全部代码→#include "N76E003.h"#include "Common.h"#include "Delay.h"#include "SFR_Macro.h"#include "Function_define.h"#define TIMER1_INIT (6663 * 2)UINT8 u8TH1_Tmp, u8TL1_Tmp;UINT8 time_10ms_ok;unsigned char key;#define IO_KEY_INPUT  P10     //按键输入口#define IO_BEEP P30#define N_key    0       //无键#define S_key    1       //单键#define D_key    2       //双键#define L_key    3       //长键#define key_state_0 0#define key_state_1 1#define key_state_2 2#define key_state_3 3unsigned char key_driver( void ){ static unsigned char key_state = key_state_0, key_time = 0; unsigned char key_press, key_return = N_key;  key_press = IO_KEY_INPUT;    //读按键I/O电平 switch ( key_state ) {  case key_state_0:    //按键初始态 if ( !key_press )      key_state = key_state_1;      //键被按下,状态转换到按键消抖和确认状态    break;  case key_state_1:  //按键消抖与确认态 if ( !key_press ) { key_time = 0;      key_state  = key_state_2;      //按键仍然处于按下,消抖完成,状态转换到按下键时间的计时状态,但返回的还是无键事件 }else      key_state = key_state_0;      //按键已抬起,转换到按键初始态。此处完成和实现软件消抖,其实按键的按下和释放都在此消抖的。    break; case key_state_2: if ( key_press ) {      key_return  = S_key;      //此时按键释放,说明是产生一次短操作,回送S_key      key_state  = key_state_0;      //转换到按键初始态    }else if (  key_time >= 100 )    //继续按下,计时加10ms(10ms为本函数循环执行间隔) {      key_return  = L_key;      //按下时间>1000ms,此按键为长按操作,返回长键事件      key_state  = key_state_3;  //转换到等待按键释放状态 } break;  case key_state_3:   //等待按键释放状态,此状态只返回无按键事件 if ( key_press )      key_state = key_state_0;   //按键已释放,转换到按键初始态 break; } return(key_return);}/*============= * 中间层按键处理函数,调用低层函数一次,处理双击事件的判断,返回上层正确的无键、单键、双键、长键4个按键事件。 * 本函数由上层循环调用,间隔10ms * ===============*/unsigned char key_read( void ){  static unsigned char  key_m = key_state_0, key_time_1 = 0;  unsigned char    key_return = N_key, key_temp; key_temp = key_driver(); switch ( key_m ) { case key_state_0: if ( key_temp == S_key ) {      key_time_1  = 0;      //第1次单击,不返回,到下个状态判断后面是否出现双击      key_m = key_state_1; }else      key_return = key_temp;   //对于无键、长键,返回原事件 break; case key_state_1:    if ( key_temp == S_key )   //又一次单击(间隔肯定1000ms,在1s前低层返回的都是无键 if ( key_time_1 >= 50 ) {        key_return = S_key;        //500ms内没有再次出现单键事件,返回上一次的单键事件        key_m = key_state_0;  //返回初始状态 } } break; } return(key_return);}/* * 下面,根据程序分析按键事件的反映时间: * 1、对于长键,按下超过1s马上响应,反映最快 * 2、对于双键,第2次按键释放后马上得到反映。 * 3、对于单键,释放后延时拖后500ms才能响应,反映最慢。这个与需要判断后面是否有双击操作有关,只能这样。实际应用中,可以调整两次单击间隔时间定义,比如为300ms,这样单击的响应回快一点,单按键操作人员需要加快按键的操作过程。如果产品是针对老年人的,这个时间不易太短,因为年纪大的人,反映和动作都比较慢。 * 当然,上面两段可以合在一起。这样做的目的,是为了可以方便的扩展为N击(当然,需要做修改)。可是最底层的就是最基本的操作处理短按和长按,不用改动的。至于双击,还是N击,在中间层处理。这就是程序设计中分层结构的优点。 * 测试代码环境如下: */void Timer1_ISR( void ) interrupt 3     //timer1定时器10ms中断服务{  TH1 = u8TH1_Tmp;  TL1 = u8TL1_Tmp;  P06 = ~P06;         //P0.3 toggle when interrupt time_10ms_ok = 1;}main( void ){ Set_All_GPIO_Quasi_Mode;  TIMER1_MODE1_ENABLE;  //定时器1, 模式1, 16bit定时器, 定时器值满 0xFFFF -> 0x0000 产生中断。  clr_T1M;  //T1M = 0,兼容传统 8051,TIMER1时钟 = Fsys/12 = 16M /12  //set_T1M;  //T1M = 1,TIMER1时钟 = Fsys = 16M u8TH1_Tmp = (65536 - TIMER1_INIT) / 256; u8TL1_Tmp = (65536 - TIMER1_INIT) % 256;  TH1 = u8TH1_Tmp;  TL1 = u8TL1_Tmp;  set_ET1;              //enable Timer1 interrupt  set_EA;               //enable interrupts  set_TR1;             //Timer1 run while ( 1 ) {    if ( time_10ms_ok )    //每10ms执行一次 { time_10ms_ok = 0;      key    = key_read();      //10ms一次调用按键中间层函数,根据返回键值,点亮不同的LED灯,全面测试按键操作是否正常      if ( key == S_key )      //短按 { IO_BEEP = 0; Timer0_Delay1ms( 10 ); IO_BEEP = 1; }      else if ( key == D_key )       //双击 { IO_BEEP = 0; Timer0_Delay1ms( 50 ); IO_BEEP = 1; }      else if ( key == L_key )       //长按 { IO_BEEP = 0; Timer0_Delay1ms( 150 ); IO_BEEP = 1; } } }}END来源:网络版权归原作者所有,如有侵权,请联系删除。▍

    嵌入式ARM

  • STM32替代记:国产芯片替代很容易!

    序:手里有几个STM32F103RET6应用的板子,整天被采购问询是否能用国产替代,成本快搂不住了。这次又拿了HK的样片,作为替代,尝试一下。开始没做任何修改,程序下载了就跑起来,让我还抱怨了一番,感觉是不是拿错片子了。后面静下心来,详细测试了使用的各功能模块,还是有点小问题的,不过非常好修改,作为应急替代使用,应该问题不大。所以,补写个序,告知下本次替代容易至极,如果有同样需求,放心大胆的干吧!随之而来的悲催就是,这几天的工作就大部分的成了拍照,留念,技术内容并不是很多,有ST使用的底子,基本上不需要强制查阅手册之类的文档,完全无压力。本来准备好的替代步骤,技术攻坚,变成了如下的“旅游回忆录”。1、  先把芯片换了再说换之前,先留个ST的影像,一会就换了它。换好了,拿回办公位,我的焊工还算可以吧。只是酒精干了,杂质没有清理干净,引脚有些发白。准备就绪,后面怎么办?网上说的那么的神,直接烧ST的程序,行不行?2、  直接原ST程序直接烧写我无语,直接烧写原ST的程序,不做任何修改,居然能跑起来?那我还玩什么?都准备好一顿操作了,结果,给我直接憋在了开始~~~~红色电源指示,蓝色闪烁程序运行指示。是我出现幻觉了么?这是第一次接触航顺啊,怎么可能这么的顺利。打开MDK,来确认下眼神,确实把ST的程序,烧到了HK的片子里,直接就跑起来。本来是打算挑挑毛病的呢……好吧,既然事实已经如此,那么回过头来,看看当初STM32里到底使用了哪些资源。整个程序基于HAL库,硬件初始化部分。程序是同事开发的,我当前只是尝试验证是否满足芯片替代的条件,程序开发的过程中,兼容了一些产品,初始化的资源,比实际使用的多一点,下面验证下使用到的模块是否正常。GOIO:PC13DMA1: 后来程序测试的过程中,发现并没有使用DMAADC1: ADC_CHANNEL_9 , ADC_CHANNEL_10,ADC_CHANNEL_11USART: COM1 COM4Timer(PWM) : TIM3SPI2:这个实际没有用到,作为预留功能的。DAC: DAC_CHANNEL_13、  既然程序跑起来了,突然觉得没事干了,验证下当前使用的资源,工作是不是正常吧。3.1 IO输出(PC13)直接看程序运行状态指示,闪烁频率正常。   还用到了其他IO,单纯的IO使用,问题不大。3.2 串口数据收发正常。3.3 DAC输出检测电压输出可控,正常。(开始着急了,这也正常?都正常我去哪找毛病?)实测DAC输出正常,但是在HK的应用笔记中,找到如下注意事项,我想,在应用中,还是参考下应用笔记吧。3.4 ADC检测开始没注意,一看ADC采样有数据,貌似正常,差点溜过去。但是,我用了9,10,11三个通道。那么,问题来了,我之前的采样顺序是10,9,11,实际测试发现,通道顺序乱了,导致我的采样数据也乱了。哈哈,终于找到了毛病,可以发泄和吐槽~~~直到这里,才刚刚开始找HK的资源。先换HK的pack,编译尝试一下,设置和芯片选择如下:选M3至此,编译下载,问题没有解决,不是PACK包的事。  接着在在HK的应用笔记中,看到了对多通道ADC使用的过程中的一些描述。那么好,按照应用笔记试试,加延迟。结果,哎,不是我想要的结果啊,这下只能靠自己了~可别让我丢人啊~~还有哪里呢?既然是通道顺序乱了,那么,ADC初始化里~至此,更改完之后,ADC几个通道采样值正常了!!缓口气,前面吹了半天,差点掉链子~但是讲真,我还没搞明白为什么,还特意的找个ST的板子验证了下,用ST的片子,我之前的设置没有问题,用HK的,要改一下,哪位大神,调试过ADC,还望指点~这个后面,再看看HK的手册,既然当前adc的值正常了,这里先跳过了。3.5没耐性了,基本用到的模块也都简单验证了,直接装到整机里,看看效果。替换原设备位置,整机检验,工作2h,设备状态稳定~~~~  暂且认为替代成功,后面的验证,交给质量部门。3.6忽悠忽悠同事,换到他的板子上试试。由于替代比想象的容易,又扔给同事,把芯片换到他的板子上,反馈我的信息是:1、程序直接下载就能用,2、串口,定时器没问题,3、有个i2c的器件,读不到数据(程序中使用了硬件i2c,这个应该不叫事,应用笔记中有提到,实在不行IO模拟也能解决。)4、  浏览航顺官网貌似都完事了,官网都没有打开,有点不合适。也禁不住那个懒惰的小精灵,在头上叫着“是不是可以用ST去开发,然后简单修改就好了?”但是,我要让那个勤劳的小精灵获胜,还是要回到官网去看看~~http://www.hsxp-hk.com/companyfile/23/在这里下载F103的PACK包,同时可以根据自己的需求,下载用户手册和数据手册。航顺官网做的还是很工整的,资料很好找。选型表,这个很多人会问,不用的时候,啥用没有。想找一找的时候,又找不到。记得顺便存一下,或者联系技术支持聊聊天。后面应该会一点点的过度好航顺的库上去,毕竟用谁家的东西,就要用谁家的“灵魂”嘛。5、  小结或许是使用的资源有限,或许是运气好。替代过程,非常的容易,基本上没有过多的查看HK的手册和应用笔记。程序直接下载就能跑起来,功能模块详细测试时,发现adc多通道采集时,通道采集顺序与预期不符,也是简单修正初始化部分,就能正常。感觉如果产品已经定型,寻求芯片替代的话,真的可以考虑,硬件不用修改,软件测试下功能模块就好了,要求严格的话,测试下整机和环境适应性,应该问题不大。在测试过程中,选用ST和HK的pack进行编译,暂时没有发现不适应的状态,不过,我这里是初步测试,应急使用可以参照,后期替换的过程中,应该会慢慢的转到HK的库上来。后面附上,我下载的HK的应用笔记,供参考。(点击“阅读原文”内下载文件)END本文系21ic论坛蓝V作者Gavin3389原创撰写▍

    嵌入式ARM STM32

  • PCB设计:单板上时钟晶体下面铺地的好处

    单板上时钟设计的注意事项,主要从三方面考虑。01布 局1)时钟晶体和相关电路应布置在PCB的中央位置并且要有良好的地层,而不是靠近I/O接口处。不可将时钟产生电路做成子卡或者子板的形式,必须做在单独的时钟板上或者承载板上。如下图所示,绿色框中部分下一层最好不要走线。 2)在PCB时钟电路区域只布与时钟电路有关的器件,避免布设其他电路,晶体附近或者下面不要布其他信号线:在时钟发生电路、晶体下使用地平面,若其他信号穿过该平面,违反了映像平面功能,如果让信号穿越这个地平面的话,就会存在很小的地环路并影响地平面的连续性,这些地环路在高频时将会产生问题。3)对于时钟晶体、时钟电路,可以采用屏蔽措施进行屏蔽处理。4)若时钟外壳为金属,则PCB设计时一定要在晶体下方铺铜,并保证此部分与完整的地平面有良好的电气连接(通过多孔接地)。5)时钟晶体下面铺地的好处:晶体振荡器内部的电路会产生射频电流,如果晶体是金属外壳封装的,直流电源脚是直流电压参考和晶体内部射频电流回路参考的依靠,通过地平面释放外壳被射频辐射产生的瞬态电流。总之,金属外壳是一个单端天线,最近的映像层、地平面层有时两层或者更多层做为射频电流对地的辐射耦合作用是足够的。晶体下铺地对散热也是有好处的。6)时钟电路和晶体下铺地将提供一个映像平面,可以降低对相关晶体和时钟电路产生共模电流,从而降低射频辐射,地平面对差模射频电流同样有吸收作用,这个平面必须通过多点连接到完整的地平面上,并要求通过多个过孔,这样可以提供低的阻抗,为增强这个地平面的效果,时钟发生电路应该与这个地平面靠近。7)SMT封装的晶体将比金属外壳的晶体有更多的射频能量辐射:因为表贴晶体大多是塑料封装,晶体内部的射频电流会向空间辐射并耦合到其他器件。02特殊情况与后果1)共用时钟走线对快速上升沿信号及时钟信号采用辐射状拓扑连接好于采用单个公共驱动源的网络串接,每个走线应该根据其特性阻抗采取端接措施来布线。2)时钟传输线要求与PCB分层时钟走线原则:在紧邻时钟走线层安排完整的映像平面层,减小走线的长度并进行阻抗控制。错误的跨层走线和阻抗不匹配会导致:线使用过孔和跳转导致映像回路的不完整性。映像平面上由于器件信号管脚上电压随着信号的变化而变化产生的浪涌电压。如果走线没有考虑3W原则的话,不同时钟信号会引起串扰。03布线1)时钟线一定要走在多层PCB板的内层。并且一定要走带状线;如果要走在外层,只能走微带线。2)走在内层能保证完整的映像平面,它可以提供一个低阻抗射频传输路径,并产生磁通量,以抵消它们的源传输线的磁通量,源和返回路径的距离越近,则消磁就越好。由于增强了消磁能力,高密PCB板的每个完整平面映像层可提供6-8dB的抑制。3)时钟布多层板的好处:有一层或者多层可以专门用于完整的电源和地平面,可以设计成好的去藕系统,减小地环路的面积,降低了差模辐射,减小了EMI,减小了信号和电源返回路径的阻抗水平,可以保持全程走线阻抗的一致性,减小了邻近走线间的串扰等。END来源:网络版权归原作者所有,如有侵权,请联系删除。▍

    嵌入式ARM 单板 时钟 晶体

  • 相见恨晚!C语言的驱动法编程详细解析(超多代码案例)

    数据压倒一切。如果选择了正确的数据结构并把一切组织的井井有条,正确的算法就不言自明。编程的核心是数据结构,而不是算法。——Rob Pike说明本文基于这样的认识:数据是易变的,逻辑是稳定的。本文例举的编程实现多为代码片段,但不影响描述的完整性。本文例举的编程虽然基于C语言,但其编程思想也适用于其他语言。此外,本文不涉及语言相关的运行效率讨论。1 概念提出所谓表驱动法(Table-Driven Approach)简而言之就是用查表的方法获取数据。此处的“表”通常为数组,但可视为数据库的一种体现。根据字典中的部首检字表查找读音未知的汉字就是典型的表驱动法,即以每个字的字形为依据,计算出一个索引值,并映射到对应的页数。相比一页一页地顺序翻字典查字,部首检字法效率极高。具体到编程方面,在数据不多时可用逻辑判断语句(if…else或switch…case)来获取值;但随着数据的增多,逻辑语句会越来越长,此时表驱动法的优势就开始显现。例如,用36进制(A表示10,B表示11,…)表示更大的数字,逻辑判断语句如下:if(ucNum < 10){ ucNumChar = ConvertToChar(ucNum);}else if(ucNum == 10){ ucNumChar = 'A';}else if(ucNum == 11){ ucNumChar = 'B';}else if(ucNum == 12){ ucNumChar = 'C';}//... ...else if(ucNum == 35){ ucNumChar = 'Z';}当然也可以用switch…case结构,但实现都很冗长。而用表驱动法(将numChar存入数组)则非常直观和简洁。如:CHAR aNumChars[] = {'0', '1', '2', /*3~9*/'A', 'B', 'C', /*D~Y*/'Z'};CHAR ucNumChar = aNumChars[ucNum % sizeof(aNumChars)];像这样直接将变量当作下数组下标来读取数值的方法就是直接查表法。注意,如果熟悉字符串操作,则上述写法可以更简洁:CHAR ucNumChar = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[ucNum];使用表驱动法时需要关注两个问题:一是如何查表,从表中读取正确的数据;二是表里存放什么,如数值或函数指针。前者参见1.1节“查表方式”内容,后者参见1.2节“实战示例”内容。1.1 查表方式常用的查表方式有直接查找、索引查找和分段查找等。1.1.1 直接查找即直接通过数组下标获取到数据。如果熟悉哈希表的话,可以很容易看出这种查表方式就是哈希表的直接访问法。如获取星期名称,逻辑判断语句如下:if(0 == ucDay){ pszDayName = "Sunday";}else if(1 == ucDay){ pszDayName = "Monday";}//... ...else if(6 == ucDay){ pszDayName = "Saturday";}而实现同样的功能,可将这些数据存储到一个表里:CHAR *paNumChars[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};CHAR *pszDayName = paNumChars[ucDay];类似哈希表特性,表驱动法适用于无需有序遍历数据,且数据量大小可提前预测的情况。对于过于复杂和庞大的判断,可将数据存为文件,需要时加载文件初始化数组,从而在不修改程序的情况下调整里面的数值。有时,访问之前需要先进行一次键值转换。如表驱动法表示端口忙闲时,需将槽位端口号映射为全局编号。所生成的端口数目大小的数组,其下标对应全局端口编号,元素值表示相应端口的忙闲状态。1.1.2 索引查找有时通过一次键值转换,依然无法把数据(如英文单词等)转为键值。此时可将转换的对应关系写到一个索引表里,即索引访问。如现有100件商品,4位编号,范围从0000到9999。此时只需要申请一个长度为100的数组,且对应2位键值。但将4位的编号转换为2位的键值,可能过于复杂或没有规律,最合适的方法是建立一个保存该转换关系的索引表。采用索引访问既节省内存,又方便维护。比如索引A表示通过名称访问,索引B表示通过编号访问。1.1.3 分段查找通过确定数据所处的范围确定分类(下标)。有的数据可分成若干区间,即具有阶梯性,如分数等级。此时可将每个区间的上限(或下限)存到一个表中,将对应的值存到另一表中,通过第一个表确定所处的区段,再由区段下标在第二个表里读取相应数值。注意要留意端点,可用二分法查找,另外可考虑通过索引方法来代替。如根据分数查绩效等级:#define MAX_GRADE_LEVEL (INT8U)5DOUBLE aRangeLimit[MAX_GRADE_LEVEL] = {50.0, 60.0, 70.0, 80.0, 100.0};CHAR *paGrades[MAX_GRADE_LEVEL] = {"Fail", "Pass", "Credit", "Distinction", "High Distinction"};static CHAR* EvaluateGrade(DOUBLE dScore){ INT8U ucLevel = 0; for(; ucLevel < MAX_GRADE_LEVEL; ucLevel ) { if(dScore < aRangeLimit[ucLevel]) return paGrades[ucLevel]; } return paGrades[0];}上述两张表(数组)也可合并为一张表(结构体数组),如下所示:typedef struct{ DOUBLE aRangeLimit; CHAR *pszGrade;}T_GRADE_MAP;T_GRADE_MAP gGradeMap[MAX_GRADE_LEVEL] = { {50.0, "Fail"}, {60.0, "Pass"}, {70.0, "Credit"}, {80.0, "Distinction"}, {100.0, "High Distinction"}};static CHAR* EvaluateGrade(DOUBLE dScore){ INT8U ucLevel = 0; for(; ucLevel < MAX_GRADE_LEVEL; ucLevel ) { if(dScore < gGradeMap[ucLevel].aRangeLimit) return gGradeMap[ucLevel].pszGrade; } return gGradeMap[0].pszGrade;}该表结构已具备的数据库的雏形,并可扩展支持更为复杂的数据。其查表方式通常为索引查找,偶尔也为分段查找;当索引具有规律性(如连续整数)时,退化为直接查找。使用分段查找法时应注意边界,将每一分段范围的上界值都考虑在内。找出所有不在最高一级范围内的值,然后把剩下的值全部归入最高一级中。有时需要人为地为最高一级范围添加一个上界。同时应小心不要错误地用“

    嵌入式ARM C语言 代码 编程

  • IT应用真相|旷视 徐福记,这或许是人工智能史上最甜蜜的落地

    2020年格外特殊,疫情突如其来、新基建的话题持续火热,在此推动之下,AI、5G、云计算交织发展,催生了大量新场景、新应用。作为一家人工智能产品与解决方案公司,旷视在持续推进AI技术创新研发的同时,始终聚焦1 3战略,面向城市物联网、供应链物联网与个人物联网三大领域,推出了一系列软硬一体的产品与方案,并逐步务实落地。 这一次我们就打算聊一聊有关AI落地的那些事儿。「AI应用真相」栏目将通过vlog的方式走进一线,用镜头记录下在产品与解决方案交付现场有关团队、有关客户的故事,用直观的画面为你讲述幕后的人与技术。 首期的主角是徐福记。我们先来看一个短片: 旷视徐福记之旅 当糖果王国用上AI科技 作为国内最知名的糖果糕点公司之一,徐福记生产的沙琪玛、凤梨酥、酥心糖、巧克力等食品都是国人再熟悉不过的舌尖记忆。为了能够一睹这样一家比电影里糖果工厂还夸张的糖果王国,小编也是连跑带飞的跨越1900公里,从北京来到东莞。眼下的徐福记,产品目录中已经涵盖了1300多种产品,年产能达到20万吨。 离厂区还有好几百米,小编就已经闻到了空气中的香甜。在这样的工厂里工作,每天都是节日的气息。 不过,虽然是糖果行业的产能王者,徐福记也有自己的业务痛点。徐福记的产品包含糖果、糕点、沙琪玛、果冻、巧克力等众多品类,相对于单纯的口香糖、软硬糖或巧克力,这些产品有的体积大、有的密度大、有的需要额外填充物。换句话说,在包装、运输和仓储层面,徐福记相对很多其他产品类型单一的糖果企业需要付出更高成本。 据徐福记智能制造经理石秋香的介绍:徐福记的生产有很明显的淡旺季之分。2017年,淡季的时候东莞工厂拥有5000多名员工,而到了每年10月到次年2月的旺季,工厂员工总数会暴增至7000多名。多出来的这两千员工绝大多数要投入到包装、搬运、仓储等环节中去。 面对这样的“高成本、大批量”痛点,彼时已经走上自动化、数字化建厂之路的徐福记开始寻找更先进解决方案。为此,石秋香带领的智能制造团队开始在网上搜索“AI 智能公司”这样的关键词,希望能够借助智能制造、人工智能等技术来提升工厂效率。而在这“AI 智能公司”之中,对徐福记做出最佳响应的正是旷视。 通过派遣工程师驻场理清徐福记储运场景的业务流程和逻辑,旷视为徐福记定制化开发出解决方案:通过河图管理系统调度管理人工智能AGV机器人,从而实现降本增效。 25台物流机器人 1名员工 =每天240吨产能全无忧 在充分调研之后,工程师为徐福记提出的方案是由25台AGV型物料搬运机器人以及运行在后端AI服务器上的河图系统所组成的。部署完成后,25台AGV每天的工作流程就是: 穿过厂房的闸门,将装有糖果的托盘运至货运缓冲区,并将不同类型的糖果托盘分类码放整齐; 缓冲区内唯一一名员工手持PDA完成货物的扫码和后台登记; 待相同种类的糖果累计到一定量时呼叫货车将糖果转运至仓库; 将装有糖果的托盘从货运缓冲区运至待装载区,并码放整齐; 叉车将糖果搬运至货车之上,货车开走后再将空托盘运回生产线; 开始新一轮循环; 电量低于30%时自动进入充电桩充电,充电完成后继续工作。 作为不知疲倦的优秀员工,AGV能够突破996的限制,实现真正的007;在工作中,心怀感恩的AGV也会快乐的用喇叭播放动感音乐给自己加油鼓劲,也提醒周边的人要小心避让。如果有人硬要站在AGV的面前,那么好脾气的AGV也会自动停车,礼让行人;待行人走后,AGV才会小心翼翼的继续上路。 在后台的电脑上,河图系统实时显示着AGV的活动路径和运行状态。除此之外,每台AGV的实时运行位置、轨迹、剩余电量和设备健康情况均有记录,河图还能对AGV采取各类紧急控制措施,你也能看到结合PDA扫描结果而得到的每台机器人全部历史详细货运列表。根据各个时期产能和产品的不同情况,后台管理人员可以对货运策略和规则。 而在服务层面,旷视不仅为徐福记提供了7x24小时的电话支持服务,更制定了P4-P1四个级别的安全预案;在发生P1级别的故障时,旷视工程师能在3-5小时赶赴用户现场为用户提供高标准的原厂服务,在48小时内解决问题,保证用户生产的高度可靠。 对于这套人工智能物流方案的效果,石秋香给出了非常直接的对比数字:旷视的AGV举重能力达到了800公斤,每天的运输量大约在240吨,运行里程在几十公里左右。25台AGV直接节省了货运缓冲区的18个工人,而在完成与工厂现有ERP系统的对接之后,这一数字将提升至节省23人;基本可以认为一台物流机器人可以对应一个员工的工作量。 面对众多优势,徐福记也表示未来将会把河图系统和MegBot系列物料搬运机器人扩展部署至更多生产线,提升徐福记的整体自动化水平。 徐福记,在智能制造的道路上一骑绝尘 通过对徐福记的走访,小编不仅吃到了最正宗的沙琪玛,更深入了解了徐福记的AI发展规划。 实际上,徐福记在缺陷监测环节同样应用了旷视的AI视觉解决方案。相对于让人工用肉眼长时间看果冻、饼干等小物件时产生的视觉疲劳和疏漏,AI既可以7x24小时连续工作,对缺陷的检测准确率也更高。经过2年的运行和对比,徐福记已经在产能提升42%的情况下达到了每年的异常批次件数下降40%的成绩。这一升一降所带来的不仅是口味的提升,更是口碑的提升。 通过在生产环境中部署AI,徐福记旺季时的员工总数已从7000多人下降至5000多人,淡季时的员工总数则从5000多人下降至2500人左右。而这样的生产效率持续提升则是徐福记继续领航国内糖果产业的基石。 今年9月旷视正式与徐福记签署战略合作协议,将凭借旷视在AI和物流领域的技术积累和行业经验,帮助徐福记从3大方向加快企业转型升级:建立业务流程信息化平台,打通数据孤岛,实现互联互通;新技术应用,实现无人无灯运作,达成降本增效;数字化运营,数字驱动运营管理,加快赋能转型。 AI时代,积跬步、至千里 过去的一百年,人类经历了很多个时代。当福特推出每个家庭都能负担得起的汽车时,我们说汽车时代已经来临;当PC价格跌破1000美元,我们说信息化时代已经来临;当每个人的兜里都装着智能手机时,我们说移动互联网时代已经来临。而当越来越多的企业用户开始使用高效、可靠的AI解决方案来提升效率,减少高强度重复劳动的同时释放更多人的创造力,AI的时代也将离我们更近一步。 2020年10月,旷视在北京发布了包含7个产品、4种导航方式的全套物料搬运机器人AGV产品序列,并推出了与之对应的河图2.0管理控制系统。与此同时,由我们联合7家单位共同发起的人工智能物流产业联盟也正式成立。联盟首批成员30余家、涵盖物流行业的产学研用领域。 一直以来,旷视围绕着“1 3”核心战略,依托AI生产力平台Brain 和深度学习框架天元,不断推进AI商业化落地,为个人物联网、城市物联网和供应链物联网等三大业务领域的客户赋能。在这样战略的指导下,旷视人正在不断用AI算法、软硬结合及生态创新为更多企业和生产场景创造更多样化的价值。 面对用户,我们总是谦逊服务;面对技术,我们总是充满自信;而面对未来,我们选择一步一个脚印。 因为,旷视相信,只有积跬步,才能至千里。

    Linux阅码场 人工智能

  • 芯片短缺!价格爆涨?不想踩坑的进来~

    大家好,我是小麦,去年和今年由于疫情的影响,晶圆的短缺,导致芯片价格暴涨,同时物料的价格也水涨船高。还非常容易买到假货,这一点确实让人难以接受。假货导致项目中出现问题,这中间会有巨大的时间成本,不管公司的项目还是自己的DIY项目,遇到这种事情,无论是谁都会心力交瘁。所以我一般都是优先考虑物料的质量。不过现在是卖方市场,物料也难搞。最近我同学的一个小项目,买的一批MOS管,不良率居然高达 20%,然后就进行了一波拆件返工,这中间损耗的大量时间成本,人工成本,坑出了一部血泪史了。当然,我也踩过不少元器件质量的坑。从我大一刚接触电子的时候开始,我就踩坑了。那时候我参加学校举行的电子设计大赛,做了一个基于51单片机的电子万年历。时钟芯片用的是 DS1302,把日期和时间显示到LCD1602上,那个时候啥也不会,调试的时候发现时钟芯片工作不稳定,会出现一些问题。后来换同一个批次的不同芯片,发现问题出在芯片上,坑啊。当时我物料都是在某bao上购买的,虽然便宜,但是质量良莠不齐。DS1302比较便宜,如果那时候买个MCU芯片不能用。那是真的肉疼好几天,这一分一毫用的都是自己的生活费。所以大家买元件的话,在经济条件允许下,还是尽量选一些靠谱的。最近我尝试了一下BOM一条龙服务物料采购平台——云汉芯城,亲测感觉很不错。它是一家提供电子元器件产品技术选型、电子物料采购、PCBA一站式电子元器件采购平台,不仅器件齐全,价格公道而且都是正品。云汉芯城,元器件一站式采购平台,提供优质的元器件采购服务云仓海量现货 主动被动一站采购2小时发货 周末无休下单即享账期 贷款月结在这个缺货节骨眼上,云汉芯城为您提供找料服务,百名采购 千家供应商24小时全球找料,不单单是元器件,还有各种模块和开发板。正好这个平台最近也在搞活动:新用户免费抽大奖,所有的奖品都是实实在在的,路过的一定要抽个奖再走,别浪费自己的好运气!长按识别二维码免费抽奖不多说了,我去参加活动了,点击阅读原文,即可购买!

    小麦大叔 芯片

  • 想要走得快,全靠大佬带

    人人都是极客这是个神奇的男人,喜欢扒内核的底裤,网络上风靡的著作《扒开 Linux 内存管理的底裤》,《扒开 Linux 进程管理的底裤》,《扒开 Linux 中断管理的底裤》就出自他手。他用简练的语言和详细的绘图把枯燥的操作系统以裸体的形式展现在你面前。他就是 Peter,芯片大厂资深工程师,幸福物联技术合伙人,谷歌社区优秀讲师,腾讯云社区评审,CSDN 博客专家。【人人都是极客】是难得的内核交流平台,Peter 手把手和你一起撸 Linux 内核的来龙去脉,后续还会增加设计 CPU 的专栏。Linux原创文章汇总Linux内存管理Linux进程管理拥有 EMBA 的 Peter 在技术之外还会分享职场进阶,宏观经济和商业理财的剖析。认知.成长如果你有面试或者职业发展的困惑也可以找 Peter 聊哦。超经典的大厂面试题,内核全集,网络剖析指南等,公众号回复 peter 即可免费领取。强烈建议大家关注他的公众号,获取海量学习资料!▼点击下方名片关注公众号▼高效程序员一去、二三里,国产操作系统(Deepin/UOS)大佬,架构师兼项目经理。相信学过C 的小伙伴一定知道这个名字,我们帅气的亮哥。不仅技术强悍,人也超级 Nice,可以随时去撩哦!作为 CSDN 知名专家,亮哥已持续写作10 年 了,每日分享各种技术干货「C /Python/Linux/Qt 等」,经典专栏有很多,例如: 趣味设计模式、 C  进阶、C 音视频开发、Qt 企业级开发、玩转 Linux、GitHub 开源推荐 ......强烈‬建议大家关注他的公众号,有趣、好玩、靠谱!(关注回复“1024”,即可获取海量学习资源!)▼点击下方名片关注公众号▼工程师进阶笔记公众号:工程师进阶笔记,号主温工,从事嵌入式物联网技术开发多年,会画板子,能拿烙铁,专业写代码,热衷于技术分享和职场提升。从大学毕业到现在,待过民企、外企、上市公司,从刚毕业实习进工厂画板子拿烙铁,再到敲键盘复制粘贴写代码,再到现在逐渐摆脱技术思维学习各种管理知识。温工的从业经历:聊一聊我自己的从业经历和感悟致力成为一名终身学习者,有一点技术强迫症,在分享技术的同时,也分享自己对生活和职场的思考和见解!技术文章汇总:工程师进阶笔记 | 原创技术专辑汇总,可供下载。▼点击下方名片关注公众号▼老吴的嵌入式之旅专注于分享嵌入式 Linux 相关的知识点。号主老吴,从事嵌入式软件开发多年,积极拥抱开源社区和热衷技术分享。分享技术的同时,也分享自己对生活和人生的思考和见解,欢迎关注!专辑 | Linux 系统编程专辑 | Linux 驱动开发专辑 | Linux 内核品读专辑 | 每天一点 C专辑 | 开源软件专辑 | Qt 入门▼点击下方名片关注公众号▼朱老师IT充电站【朱老师IT充电站】微信公众号由朱有鹏老师建立,目标是帮助IT类相关专业大学生和从业者全方位成长。公众号内可获取朱老师物联网大讲堂课程资料、课程介绍等,不定期更新朱老师原创文章及视频,内容涉及当前IT行业热点技术(譬如5G、物联网、AI人工智能等),个人学习路线规划、职业发展规划,学习方法和技巧思路,IT行业的产品起底解密,行业发展分析和点评等,并且会推送岗位内推信息。总之,IT充电站关注一名IT行业从业者的技术、思维、知识、技能等全方位的成长。想要不断提升自己,升职加薪走向人生巅峰,关注IT充电站吧!往期文章汇总: IT 人成长之路学长们的工作内推▼点击下方名片关注公众号▼

    小麦大叔

  • MATLAB到底有多厉害?

    前言:刚开始玩电机的时候也不喜欢MATLAB,每次都是直接码代码,然后去转电机。效果不好就在代码里改来改去,晕晕乎乎调了一周进展也不大。这种情况就是陷入了调参数的怪圈,恶性循环进而打击自信,进步也很缓慢。后来学会了simulink,才明白学习FOC一定要配合MATLAB,进步快很多。正文:1、理解离散系统:在FOC中经常涉及到上个开关周期的角度,电压,或者预测下个周期的角度,电流,一般都是通过延时模块实现。图1 delay延时模块为什么要使用这个模块呢?比如一般PWM比较值寄存器被改写后都是使能了预装载,采样后触发计算到比较值生效可以延时0.5个开关周期Ts,也可以延时1个开关周期Ts,或者1.5个Ts。不同的延时对于控制效果有什么区别呢?只需要在simulink定义延时时间即可,非常方便对比不同的方案下的区别。这种调试在实物上实现要复杂很多!2、实现参数自整定:把所有的环路参数放在m文件里,在运行工程前,修改电机参数,环路参数等等,先运行m文件,可以实现参数自整定。要修改参数也只用改m文件,类似宏定义一样,环路的参数自整定和这个也差不多了。图2 m文件实现参数自整定3、强大示波器功能:simulink的示波器功能非常强大,可以不限制查看任意波形,这在实物调试中也很难做到,除非去开发上位机配合查看,但是也有通道和数据量的限制。一般ARM M0的平台也没有资源去开发上位机。图3 相电压和相电流尤其是现在比较通用的直流侧单电阻采样波形,可以清晰看到每个扇区对应的电流波形和单电阻波形的对应关系:图4 单电阻采样波形4、模块化的平台,缩短开发周期:一般开发一种新的观测器,阅读文献之后,经过simulink验证。在搭建好平台之后,把观测器,速度环,电流环,转矩补偿等等封装成各自的模块。需要验证哪个模块,即进行对应的修改。经过simulink验证的方法,基本都可以在实物中实现。如果simulink仿真失败,基本就直接放弃了。一般一个新的观测器仿真需要一到两周,可以大大缩短开发周期。在搭建了完整的仿真平台后,实物和仿真模型基本可以做到95%以上的对应,除了一些非线性相关的因素,因为在仿真中无法模拟,需要在实物中实现。对于有经验的开发人员,拿到了离散的仿真模型,基本就等于拿到了代码。当然如果模型在连续域仿真,会以很大的计算量得出很好的波形,掩盖环路中实际存在的很多问题。毕竟控制系统实际是以离散的形式在计算和工作。图5 多个模型集成到一个框图图6 滑模模型,和公式一一对应5、s函数代码级仿真:如果有足够的精力,simulink是可以实现c语言代码级仿真的。用s函数替代离散模块,代码放在s函数里,完全可以实现跟实物对应的仿真。移植到实物中代码也可以快速调试通过。s函数运行的指令是在命令窗口输入:”mex xx.c“,xx是s函数文件名。图7 s函数框图6、在线参数变化的仿真:一般来,Ld和Lq会随着电流出现饱和特性,所以可以通过m文件编程,实现Ld和Lq在线根据电流查表确定电感值。但是实际的无感FOC控制依然使用固定值,电机模型使用的饱和模型,这样子可以评估无感FOC的控制方法对电感饱和是否敏感,或者对电感的敏感程度。图8 Ld在线查表提供一种方法作参考:用如下文档里的代码生成电感表格:https://ww2.mathworks.cn/help/physmod/sps/ref/elec_generateidealpmsmfluxdata.html将表格导入如何可编辑的电机模型即可:https://ww2.mathworks.cn/help/autoblks/ref/fluxbasedpmsm.html?requestedDomain=zh表格需要自己对应代码整理一下。7、模拟MCU的运行方式:使用Simulink离散模块搭建的方式,可以模拟MCU的硬件执行的结构。一般MCU最重要的是主频和中断,分别对应Simulink的最上层执行时间和定时执行的中断部分。如下图:图9 powergui模块设置仿真步长和类型使用powergui模块设置成离散模式,设置仿真步长5e-7,相当于仿真最上层是2MHz的执行频率,这个2M就类似于MCU的主频,显示,电机模型本体响应的计算就以这个频率执行。然后通过脉冲模块设置定时触发执行的控制模块,就相当于是定时执行的中断:图10 Pulse Generator模块使用Pulse Generator模块,执行周期1e-4,相当于中断频率10k,控制环路都放在中断里,就跟MCU的运行结构非常类似了。执行频率对于离散控制来说是核心参数,不同的执行频率仿真结果区别很大。千万不要在powergui里设置成continous仿真模式,那样会通过很高的计算频率掩盖环路的问题,与实际产品中电机运行状态不符。8、评估环路的阶跃响应:在伺服中比较常见的测试电流环带宽,一般测试交流给定幅相曲线。以阶跃响应为例,可以把电机角度固定成0,电流解耦角度和逆变角度都强制给0,然后电流环的Id给参考,测试Id环路的参考和反馈,即可得到节约响应。如下图:图11 电流环阶跃响应9、评估参数敏感性:以磁链模型为例,当电机模型磁链跟计算使用磁链相等时,观测角度和误差如下:图12 磁链准确时的观测误差当温度上升,磁链降低到只有计算值的80%,再去比较估算角度和误差,就能判断控制方法对磁链的变化敏感程度。图13 磁链下降时的观测误差总结:对于研究电机控制来说,前期的主要工作放在文献和仿真上,到了代码已经是很后期的工作了。这种工作并不是靠代码量来决定工作进展,也许研究了一个月就改了一行代码却能够解决大问题。对于我来说,如果不让我使用simulink我觉得自己就基本失业了,工作也没有任何乐趣可言。转电机并不是无脑的去写代码做实验,而是通过simulink去打磨模型,通过模型的搭建深入理解了方法才去开始实物阶段的实验。要想深入理解FOC,使用MATLAB是必经之路,没有捷径可走。模型对电机的诠释是无法用实验来代替的。到现在为止,MATLAB的功能也许我才用了不到1‰。如果单纯能把MATLAB玩得很溜,我觉得年薪百万也不是难题。至少我的工作离不开MATLAB。往期文章:基于磁链模型的非线性观测器HFI高频注入代码解读产品级IPMSM高频注入低速无传感器控制方法作者简介:虚怀若谷,热爱永存!我是转子磁场定向,十年FOC开发经验,精通永磁同步电机和异步电机无感控制。可提供长期技术顾问咨询或者项目开发,商务合作请加V: PMSM_RFO

    小麦大叔 MATLA

  • 学会这个,薪资翻倍

    随着云原生时代的到来,各大厂纷纷上云,甚至有人说,未来的软件就是生在云上,长在云上的。在这种云原生时代大势下,衍生出来的 Kubernetes 工程师、云原生工程师的薪资也水涨船高,大厂不惜花重金聘请优秀的云原生技术人才。 可以说,作为云原生的核心技术,Docker 和 Kubernetes 是所有想要投身云原生行业的技术人员的必备技能。但你可能会说,我是搞开发/运维的,云原生、Kubernetes 跟我没关系,这你可就大错特错了。微博和京东的运维工程师要求你懂 Kubernetes,爱奇艺和京东的 Golong 工程师必备技能是 Kubernetes,如果想去百度和腾讯做架构工程师,你还是得会 Kubernetes 和 Docker。还有人问:云原生学完是不是只能找运维开发?对后端开发有用吗?eBay资深架构师孟凡杰说:云原生的世界里没有纯后台开发,只管业务逻辑的世界越来越小。比如你做Java开发,微服务架构下的 Spring Cloud你至少要懂, Spring Cloud现在也支持 K8s native 的服务发现,也在被Istio取代,所以未来应该是相通的,除非把自己局限在代码逻辑的部分,否则学习云原生技术栈就是有用的。云原生技术如此重要,但现在网上有关 Kubernetes 的学习资料杂乱无章,你要是搜一下 Kubernetes 入门能出来好几条不一样的学习方法,看着看着就把自己看懵了。没有基础的同学根本不知道在哪里学,从哪里开始学,好不容易慢慢理解,想要实战深入理解吧,却又上不了手,不知道自己哪里出了问题。如果你也遇到了这些烦恼,那我推荐你来看极客时间与 eBay 资深架构师孟凡杰联合推出的 「6 小时掌握 Docker 和 K8s 架构核心」。从最基础的容器核心开始,到 Kubernetes 的核心架构原则、核心对象和控制器模式, 6 小时让老师手把手带你掌握容器技术与 Kubernetes 的架构核心,上手云原生时代最重要的技能。这个课程非常适合想要了解 k8s 和 Docker 的同学,我也特意为你申请了几个免费名额。 6h课程,干货满满扫描下方二维码免费领取课程 配套学习资料资深讲师带你学习 讲师:孟凡杰他是 eBay 的资深架构师,负责 Kubernetes 的架构和开发工作,专注于网络、多集群、服务治理和服务网格等方向。他是 Kubernetes 开源项目的代码贡献者,参与了社区集群联邦的开发和服务控制器重构等工作。他拥有 10 多年的从业经验,先后就职于 IBM、EMC、eBay 等公司,对资源管理、作业调度、网络技术有着非常深入的了解。他是 CNUTCon 的明星讲师,也是《Kubernetes 生产化实践之路》图书的作者。他不仅技术厉害,而且还能给你讲明白。 通过6h课程你将获得深入理解容器技术的实现细节;掌握 Kubernetes 的核心组件;熟悉 Kubernetes 对象定义的通用原则和核心对象特性。 适合人群想理解容器技术优势和实现细节的云原生小白;想了解 Kubernetes 架构原则的软件架构工程师;想了解 Kubernetes 基本操作的研发和运维。如何领取课程扫描二维码,添加学习助理,即可免费领取课程除了以上内容,还有个好消息要告诉大家,孟凡杰老师主讲的云原生训练营有偿招募兼职助教,你将获得:免费旁听极客时间云原生训练营课程并且得到讲师一对一的指导。一年两次互联网一线大厂内推机会。报名极客时间其它课程享受员工内部优惠价格。全周期 8000 元的助教服务费(税前)。申请链接 https://jinshuju.net/f/KqqREz↓↓↓ 点击原文链接申请

    小麦大叔

发布文章