电子发烧友App

硬声App

0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

电子发烧友网>今日头条>净烟宝YouMe独创四大“黑科技“,多重过滤科技净烟

净烟宝YouMe独创四大“黑科技“,多重过滤科技净烟

收藏

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论

查看更多

相关推荐

基于法动EDA电磁大脑EMOptimizer®独创快速产生模拟/射频电路图及其优化结果

EMOptimizer基于法动EDA电磁大脑,独创快速产生模拟/射频电路图及其优化结果。EMOptimizer由中国射频EDA领军品牌法动EDA研发成功。
2024-03-17 14:56:10360

MES实施的四大疑惑

电子发烧友网站提供《MES实施的四大疑惑.docx》资料免费下载
2024-03-01 15:35:080

pcb应变测试有多重要?一文了解!

pcb应变测试有多重要?一文了解!
2024-02-24 16:26:35570

小白学习FPGA的四大误区

1、不熟悉 FPGA的内部结构,不了解可编程逻辑器件的基本原理。FPGA为什么是可以编程的?恐怕很多菜鸟不知道,他们也不想知道。因为他们觉得这是无关紧要的。他们潜意识的认为可编程嘛,肯定就是像写软件一样啦。软件编程的思想根深蒂固,看到Verilog或者VHDL就像看到C语言或者其它软件编程语言一样。一条条的读,一条条的分析。如果这些菜鸟们始终拒绝去了解为什么FPGA是可以编程的,不去了解FPGA的内部结构,要想学会FPGA恐怕是天方夜谭。虽然现在EDA软件已经非常先进,像写软件那样照猫画虎也能综合出点东西,但也许只有天知道EDA软件最后综合出来的到底是什么。也许点个灯,跑个马还行。这样就是为什么很多菜鸟学了N久以后依然是一个菜鸟的原因。那么FPGA为什么是可以“编程”的呢?首先来了解一下什么叫“程”。启示“程”只不过是一堆具有一定含义的01编码而已。编程,其实就是编写这些01编码。只不过我们现在有了很多开发工具,通常都不是直接编写这些01编码,而是以高级语言的形式来编写,最后由开发工具转换为这种01编码而已。对于软件编程而言,处理器会有一个专门的译码电路逐条把这些01编码翻译为各种控制信号,然后控制其内部的电路完成一个个的运算或者是其它操作。所以软件是一条一条的读,因为软件的操作是一步一步完成的。而FPGA的可编程,本质也是依靠这些01编码实现其功能的改变,但不同的是FPGA之所以可以完成不同的功能,不是依靠像软件那样将01编码翻译出来再去控制一个运算电路,FPGA里面没有这些东西。FPGA内部主要三块:可编程的逻辑单元、可编程的连线和可编程的IO模块。可编程的逻辑单元是什么?其基本结构某种存储器(SRAM、FLASH等)制成的4输入或6输入1输出地“真值表”加上一个D触发器构成。任何一个4输入1输出组合逻辑电路,都有一张对应的“真值表”,同样的如果用这么一个存储器制成的4输入1输出地“真值表”,只需要修改其“真值表”内部值就可以等效出任意4输入1输出的组合逻辑。这些“真值表”内部值是什么? 就是那些01编码而已。如果要实现时序逻辑电路怎么办?这不又D触发器嘛,任何的时序逻辑都可以转换为组合逻辑+D触发器来完成。但这毕竟只实现了4输入1输出的逻辑电路而已,通常逻辑电路的规模那是相当的大哦。那怎么办呢?这个时候就需要用到可编程连线了。在这些连线上有很多用存储器控制的链接点,通过改写对应存储器的值就可以确定哪些线是连上的而哪些线是断开的。这就可以把很多可编程逻辑单元组合起来形成大型的逻辑电路。最后就是可编程的IO,这其实是FPGA作为芯片级使用必须要注意的。任何芯片都必然有输入引脚和输出引脚。有可编程的IO可以任意的定义某个非专用引脚(FPGA中有专门的非用户可使用的测试、下载用引脚)为输入还是输出,还可以对IO的电平标准进行设置。总归一句话,FPGA之所以可编程是因为可以通过特殊的01代码制作成一张张“真值表”,并将这些“真值表”组合起来以实现大规模的逻辑功能。不了解FPGA内部结构,就不能明白最终代码如何变到FPGA里面去的。也就无法深入的了解如何能够充分运用FPGA。现在的FPGA,不单单是有前面讲的那三块,还有很多专用的硬件功能单元,如何利用好这些单元实现复杂的逻辑电路设计,是从菜鸟迈向高手的路上必须要克服的障碍。而这一切,还是必须先从了解FPGA内部逻辑及其工作原理做起。 2、错误理解 HDL语言,怎么看都看不出硬件结构。HDL语言的英语全称是:Hardware Description Language,注意这个单词Description,而不是Design。老外为什么要用Description这个词而不是Design呢?因为HDL确实不是用用来设计硬件的,而仅仅是用来描述硬件的。描述这个词精确地反映了HDL语言的本质,HDL语言不过是已知硬件电路的文本表现形式而已,只是将以后的电路用文本的形式描述出来而已。而在编写语言之前,硬件电路应该已经被设计出来了。语言只不过是将这种设计转化为文字表达形式而已。但是很多人就不理解了,既然硬件都已经被设计出来了,直接拿去制作部就完了,为什么还要转化为文字表达形式再通过EDA工具这些麻烦的流程呢?其实这就是很多菜鸟没有了解设计的抽象层次的问题,任何设计包括什么服装、机械、广告设计都有一个抽象层次的问题。就拿广告设计来说吧,最初的设计也许就是一个概念,设计出这个概念也是就是一个点子而已,离最终拍成广告还差得很远。硬件设计也是有不同的抽象层次,每一个层次都需要设计。最高的抽象层次为算法级、然后依次是体系结构级、寄存器传输级、门级、物理版图级。使用HDL的好处在于我们已经设计好了一个寄存器传输级的电路,那么用HDL描述以后转化为文本的形式,剩下的向更低层次的转换就可以让EDA工具去做了,这就大大的降低了工作量。这就是可综合的概念,也就是说在对这一抽象层次上硬件单元进行描述可以被EDA工具理解并转化为底层的门级电路或其他结构的电路。在FPGA设计中,就是在将这以抽象层级的意见描述成HDL语言,就可以通过FPGA开发软件转化为问题1中所述的FPGA内部逻辑功能实现形式。HDL也可以描述更高的抽象层级如算法级或者是体系结构级,但目前受限于EDA软件的发展,EDA软件还无法理解这么高的抽象层次,所以HDL描述这样抽象层级是无法被转化为较低的抽象层级的,这也就是所谓的不可综合。所以在阅读或编写HDL语言,尤其是可综合的HDL,不应该看到的是语言本身,而是要看到语言背后所对应的硬件电路结构。如果看到的HDL始终是一条条的代码,那么这种人永远摆脱不了菜鸟的宿命。假如哪一天看到的代码不再是一行行的代码而是一块一块的硬件模块,那么恭喜脱离了菜鸟的级别,进入不那么菜的鸟级别。 3、FPGA本身不算什么,一切皆在 FPGA之外这一点恐怕也是很多学FPGA的菜鸟最难理解的地方。FPGA是给谁用的?很多学校解释为给学微电子专业或者集成电路设计专业的学生用的,其实这不过是很多学校受资金限制,卖不起专业的集成电路设计工具而用FPGA工具替代而已。其实FPGA是给设计电子系统的工程师使用的。这些工程师通常是使用已有的芯片搭配在一起完成一个电子设备,如基站、机顶盒、视频监控设备等。当现有芯片无法满足系统的需求时,就需要用FPGA来快速的定义一个能用的芯片。前面说了,FPGA里面无法就是一些“真值表”、触发器、各种连线以及一些硬件资源,电子系统工程师使用FPGA进行设计时无非就是考虑如何将这些以后资源组合起来实现一定的逻辑功能而已,而不必像IC设计工程师那样一直要关注到最后芯片是不是能够被制造出来。本质上和利用现有芯片组合成不同的电子系统没有区别,只是需要关注更底层的资源而已。要想把FPGA用起来还是简单的,因为无非就是那些资源,在理解了前面两点再搞个实验板,跑跑实验,做点简单的东西是可以的。而真正要把FPGA用好,那光懂点FPGA知识就远远不够了。因为最终要让FPGA里面的资源如何组合,实现何种功能才能满足系统的需要,那就需要懂得更多更广泛的知识。目前FPGA的应用主要是三个方向:第一个方向,也是传统方向主要用于通信设备的高速接口电路设计,这一方向主要是用FPGA处理高速接口的协议,并完成高速的数据收发和交换。这类应用通常要求采用具备高速收发接口的 FPGA,同时要求设计者懂得高速接口电路设计和高速数字电路板级设计,具备EMC/EMI设计知识,以及较好的模拟电路基础,需要解决在高速收发过程中产生的信号完整性问题。FPGA最初以及到目前最广的应用就是在通信领域,一方面通信领域需要高速的通信协议处理方式,另一方面通信协议随时在修改,非常不适合做成专门的芯片。因此能够灵活改变功能的FPGA就成为首选。到目前为止FPGA的一半以上的应用也是在通信行业。第二个方向,可以称为数字信号处理方向或者数学计算方向,因为很大程度上这一方向已经大大超出了信号处理的范畴。例如早就在2006年就听说老美将FPGA用于金融数据分析,后来又见到有将FPGA用于医学数据分析的案例。在这一方向要求FPGA设计者有一定的数学功底,能够理解并改进较为复杂的数学算法,并利用FPGA内部的各种资源使之能够变为实际的运算电路。目前真正投入实用的还是在通信领域的无线信号处理、信道编解码以及图像信号处理等领域,其它领域的研究正在开展中,之所以没有大量实用的主要原因还是因为学金融的、学医学的不了解这玩意。不过最近发现欧美有很多电子工程、计算机类的博士转入到金融行业,开展金融信号处理,相信随着转入的人增加,FPGA在其它领域的数学计算功能会更好的发挥出来,而我也有意做一些这些方面的研究。不过国内学金融的、学医的恐怕连数学都很少用到,就不用说用FPGA来帮助他们完成数学_运算了,这个问题只有再议了。第三个方向就是所谓的SOPC方向,其实严格意义上来说这个已经在FPGA设计的范畴之内,只不过是利用FPGA这个平台搭建的一个嵌入式系统的底层硬件环境,然后设计者主要是在上面进行嵌入式软件开发而已。设计对于FPGA本身的设计时相当少的。但如果涉及到需要在FPGA做专门的算法加速,实际上需要用到第二个方向的知识,而如果需要设计专用的接口电路则需要用到第一个方向的知识。就目前SOPC方向发展其实远不如第一和第二个方向,其主要原因是因为SOPC以FPGA为主,或者是在FPGA内部的资源实现一个“软”的处理器,或者是在FPGA内部嵌入一个处理器核。但大多数的嵌入式设计却是以软件为核心,以现有的硬件发展情况来看,多数情况下的接口都已经标准化,并不需要那么大的FPGA逻辑资源去设计太过复杂的接口。而且就目前看来SOPC相关的开发工具还非常的不完善,以ARM为代表的各类嵌入式处理器开发工具却早已深入人心,大多数以ARM为核心的SOC芯片提供了大多数标准的接口,大量成系列的单片机/嵌入式处理器提供了相关行业所需要的硬件加速电路,需要专门定制硬件场合确实很少。通常是在一些特种行业才会在这方面有非常迫切的需求。即使目前Xilinx将ARM的硬核加入到FPGA里面,相信目前的情况不会有太大改观,不要忘了很多老掉牙的8位单片机还在嵌入式领域混呢,嵌入式主要不是靠硬件的差异而更多的是靠软件的差异来体现价值的。我曾经看好的是 cypress的Psoc这一想法。和SOPC系列不同,Psoc的思想史载SOC芯片里面去嵌入那么一小块FPGA,那这样其实可以满足嵌入式的那些微小的硬件接口差异,比如某个运用需要4个USB,而通常的处理器不会提供那么多,就可以用这么一块FPGA来提供多的USB接口。而另一种运用需要6个 UART,也可以用同样的方法完成。对于嵌入式设计公司来说他们只需要备货一种芯片,就可以满足这些设计中各种微小的差异变化。其主要的差异化仍然是通过软件来完成。但目前cypress过于封闭,如果其采用ARM作为处理器内核,借助其完整的工具链。同时开放IP合作,让大量的第三方为它提供IP设计,其实是很有希望的。但目前cypress的日子怕不太好过,Psoc的思想也不知道何时能够发光。 4、数字逻辑知识是根本。 无论是FPGA的哪个方向,都离不开数字逻辑知识的支撑。FPGA说白了是一种实现数字逻辑的方式而已。如果连最基本的数字逻辑的知识都有问题,学习FPGA的愿望只是空中楼阁而已。而这,恰恰是很多菜鸟最不愿意去面对的问题。数字逻辑是任何电子电气类专业的专业基础知识,也是必须要学好的一门课。很多人无非是学习了,考个试,完了。如果不能将数字逻辑知识烂熟于心,养成良好的设计习惯,学FPGA到最后仍然是雾里看花水中望月,始终是一场空的。
2024-02-22 11:00:27

OB2734DCCPA-H昂OB电源芯片

深圳市三佛科技有限公司供应OB2734DCCPA-H昂OB电源芯片,原装现货 昂电子于2004年成立,总部位于上海张江高科技园区,专注于模拟及混合信号IC设计,产品线涵盖电源管理
2024-02-21 16:23:41

2024年锂电四大材料走势“划重点”

GGII2023年中国锂电四大关键材料出货量数据及2024年市场走势。
2024-02-21 09:19:26615

TC39x的can报文过滤规则怎么设置?

TC39x的can报文过滤规则怎么设置
2024-02-19 06:12:48

傲颖-超工作台-性能稳定

仪器仪表工作台
jf_12990097发布于 2024-01-31 16:15:13

乾元-超工作台-视频解说

仪器仪表工作台
jf_91458691发布于 2024-01-31 16:12:56

上海程斯-超工作台-视频解说-检测准确

测试仪仪器仪表
jf_62302303发布于 2024-01-31 09:57:24

EMI滤波器:电磁干扰过滤的利器?|深圳比创达电子EMC

EMI滤波器:电磁干扰过滤的利器?|深圳比创达电子EMC
2024-01-29 10:13:13149

关于LTC3350的几个问题求解

输入当前限值 ? 输入当前值的含义是什么 ? 输入当前值的限制与装载当前limt不相同 ? 2. 所有其他数据表位置说明充电当前限值取决于RSnsc,输入当前限值取决于Rsssi 锡。 但以下
2024-01-04 06:00:18

电子电路,求分析短路保护怎么能做到芯片不复位

如下图,当H+接一个1欧姆发热丝短路时,我程序能识别到短路也能关断MOS管,但是芯片会低电复位,有没有什么解决方法吗?有做过电子的这块的大佬能不能指点一下啊! (pcb已经量产,小白在实习,拿着它学习程序)
2023-12-20 08:58:17

机械密封的辅助装置-杂质过滤装置详解

过滤操作是分离输送液中含有固体微粒的有效方法。
2023-12-19 18:19:11537

工业级路由器如何网络过滤

工业级路由器如何网络过滤 工业级路由器作为企业和公共场所网络的核心设备,拥有强大的处理能力和安全性,网络过滤是其最基本的安全功能之一。本文将详细介绍工业级路由器网络过滤的原理、分类以及具体实施方法
2023-12-19 14:34:03166

如何在TSMaster中对常用总线报文信号进行过滤

TSMaster软件平台支持对不同总线(CAN、LIN、FlexRay)的报文和信号过滤过滤方法一般有全局接收过滤、数据流过滤、窗口过滤、字符串过滤、可编程过滤,针对不同的总线信号过滤器的使用方法
2023-12-16 08:21:15206

前置过滤器的使用寿命有多长?

前置过滤器的使用寿命有多长? 前置过滤器的使用寿命有多长,这是一个相对而言的概念,因为它的使用寿命取决于多个因素。下面将详细介绍前置过滤器的使用寿命以及影响因素。 一、什么是前置过滤器? 前置过滤
2023-12-11 11:38:01409

Coral3568如何软硬件过滤can帧及优化?

CAN总线调试时,根据数据的重要性,接收端可以专注于接收重要消息,提高效率。CAN报文帧是用一个标识符或一系列标识符来过滤的。可以使用CAN总线软件和芯片硬件过滤规则实现过滤功能。软件过滤
2023-12-08 15:52:37179

springboot过滤器和拦截器哪个先执行

Spring Boot是一个用于构建Java应用程序的开发框架,它提供了许多功能和工具来简化开发和部署过程。其中两个重要的功能是过滤器和拦截器。本文将详细介绍Spring Boot过滤器和拦截器
2023-12-03 15:00:12596

使用pandas进行数据选择和过滤的基本技术和函数

Python pandas库提供了几种选择和过滤数据的方法,如loc、iloc、[]括号操作符、query、isin、between等等
2023-12-01 10:14:15137

关于图像传感器图像质量的四大误区!你踩过几个坑?

关于图像传感器图像质量的四大误区!你踩过几个坑?
2023-11-27 16:56:29198

程斯-空气过滤器液体细菌截留测试仪-视频解说英文

测试仪过滤
sinceritysmart发布于 2023-11-20 14:21:36

AD8605 4级过滤器无法工作怎么解决?

你好,我根据ADI的在线设计精灵设计了一个4级过滤器,详情如下,但是,它发现第二层是输出 0V。为什么?如何调整和测试? u1:ad8605; 单一电源4V; VREF = 2V; 第一阶段输出5mV正弦波, 折合10mV; 第二层的产出是0。
2023-11-17 06:09:55

口罩颗粒物过滤效率测试仪

  GL-1000 口罩颗粒物过滤效率测试仪是用于检测防护口罩的过滤性能,防护过滤效率,过滤效果的检测装置,目前针对于口罩主要是分为空气过滤式口罩和供气式口罩。本检测仪器适用于医疗器械检验中心、安全
2023-11-14 15:55:20

5合1 TYPE-C USB3.1集线器

集线器,铝合金外壳+线材 USB 3.0 C公+端子_线长:15CM_线径OD:4.2_黑色线材_灰 Pantone:10392 C铝壳,铝合金外壳,迅速导出
2023-11-14 14:56:45

购买UPS电源需看四大标准

电子发烧友网站提供《购买UPS电源需看四大标准.pdf》资料免费下载
2023-11-13 10:49:270

什么情况下需要布隆过滤

什么情况下需要布隆过滤器? 先来看几个比较常见的例子 字处理软件中,需要检查一个英语单词是否拼写正确 在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上 在网络爬虫里,一个网址是否被访问过 yahoo
2023-11-11 11:37:49349

PL7501E 双节锂电升压充电管理电路IC 技术支持

,可有效减少整体方案尺寸,降低 BOM 成本 。 PL7501E的升压开关充电转换器的工作频率为 500KHz,转换效率为 90%。 PL7501E内置个环路来控制充电过程,分别为恒压(CV)环路
2023-11-06 14:42:35

给电机或风扇供电需经过滤波器吗?

电气图上的电机、风扇前均经过滤波器需要吗?作用是什么
2023-11-03 06:30:32

为什么SPWM波经过滤波可以得到正弦波?

为什么SPWM波经过滤波可以得到正弦波?能不能通俗一点讲?
2023-11-03 06:03:54

半导体微孔过滤器滤芯:精密过滤的关键

半导体微孔过滤器滤芯是一种高效、精准的过滤装置,能够将液体中的颗粒、细菌和其他杂质进行有效去除。其核心作用主要体现在以下几个方面。
2023-11-02 14:27:23592

单重中断与多重中断介绍

单重中断与多重中断 •单重中断在CPU执行中断服务程序的过程中不能被打断。当有新的更高优先级的中断发生时,正在执行的中断服务程序不会被暂停,转而执行新的中断服务程序。 •多重中断在执行某个中断服务
2023-10-30 16:46:271391

AT32F系列CAN过滤器使用

AT32F系列 CAN过滤器使用演示AT32F系列CAN过滤器的使用方法。
2023-10-27 06:44:36

stm8s208的can过滤器怎么设置?

stm8s208 的 can 过滤器怎么设置?
2023-10-26 08:13:17

电子发热丝推力测试攻略:掌握博森源推拉力测试机关键步骤

推拉力测试机
博森源推拉力机发布于 2023-10-25 16:55:50

Windows文件系统过滤驱动程序介绍

隔离迷你过滤器驱动程序是一个Windows文件系统迷你过滤器驱动程序,它将文件数据的视图与同一文件的实际底层数据分开。隔离迷你过滤器的典型示例是访问透明加密/解密过滤器。隔离迷你过滤器使用“相同堆栈”概念,并通过为每个视图提供唯一的缓存部分来提供不同的视图。
2023-10-24 11:48:55668

如何设置AT32F4xx系列CAN过滤器?

AT32F4系列CAN过滤器配置方法
2023-10-23 08:01:15

TSMaster几种过滤器的对比及使用

TSMaster的4种过滤器://硬件过滤器:可以在硬件端针对数据位进行筛选过滤,硬件过滤。在硬件端阻止接收一部分不需要的报文,留更多带宽对其他报文进行接收。//数据流过滤器:过滤总线数据流,软件
2023-10-21 08:21:471177

ADMV8513:520 MHz至1300 MHz、数字金枪鱼、带-包过滤器数据表 ADI

电子发烧友网为你提供ADI(ADI)ADMV8513:520 MHz至1300 MHz、数字金枪鱼、带-包过滤器数据表相关产品参数、数据手册,更有ADMV8513:520 MHz至1300 MHz
2023-10-08 16:34:18

什么型号的粉尘传感器可以用作空气过滤器上的探头?

什么粉尘传感器可以用作空气过滤器上的探头
2023-10-07 07:45:02

一种嵌入式Linux系统多重备份与恢复机制

提出了一种嵌入式 Linux系统多重备份与恢复机制。采用在一片NAND Flash 上划分多个系统镜像区(包括内核和文件系统),在U-Boot和系统镜像中添加多重备份与恢复机制。当运行中的镜像区域
2023-09-20 07:01:25

PADS Layout软件中过滤器的使用方法

我们的PADS Layout 类似于PADS Logic一样都存在一个过滤器,我们可以根据想要选中对象的种类以及类型去确定光标选择。首先可以在菜单栏中找到过滤器选项,在“编辑-筛选条件”如图3-27所示。
2023-09-19 16:14:08522

海思 PQTools 电平矫正方法

来源:易百纳技术社区 一 什么是电平?电平:黑色的最小值,sensor感光全零数据时,对应sensor输出的最小信号值 形成的原因:1 sensor将模拟信号转换到数字信号时,由于转换精度限制
2023-09-11 15:07:55

智能水肥一体化首部系统之过滤器介绍

叠片式过滤器水流通过过滤进水口进入过滤器内,通过过滤叠片时过滤叠片在弹簧力和水力的作用下被紧紧地压在一起,杂质颗粒被截留在叠片交叉点,经过过滤的水从过滤器主通道中流出,此时单向膈膜阀处于开启状态。
2023-09-08 15:27:56303

CLM32L003 最新规格书

CLM32L003应用:小家电、充电器、遥控器、电子、燃气报警器、数显表、温控器、记录仪、电机驱动、智能门锁、迷你手电筒 ,手持电风扇。详细内容请查看规格书。
2023-09-05 10:38:21

用中位过滤器执行简单的ADC取样减少噪音

应用:示例代码通过使用中子过滤器,实施ADC取样减少噪音。 BSP 版本: NUC230/240 Series BSP CMSIS v3.01.001 硬件: NuEdu-EVB-NUC240
2023-08-30 06:23:23

使用过滤器电容器和诱导器来抑制受辐射的EMI

使用过滤器电容器和诱导器来抑制受辐射的EMI 抑制电磁干扰的最常用方法之一是使用过滤电容器和感应器,这一条探讨了如何通过讨论这些过滤部件的阻力特性和设计方法,在双活桥转换器中对这些过滤部件加以管理
2023-08-25 15:40:07398

CAN通信官方例子单个通道单个ID过滤,怎么才能设置一个通道全部ID都可以接收?

CAN通信官方例子单个通道单个ID过滤,怎么才能设置一个通道全部ID都可以接收?
2023-08-23 07:08:18

用中位过滤器执行简单的ADC取样减少噪音

应用:示例代码通过使用中子过滤器,实施ADC取样减少噪音。 BSP 版本: NUC230/240 Series BSP CMSIS v3.01.001 硬件: NuEdu-EVB-NUC240
2023-08-22 06:33:41

【赋能IoT生态系列5之4】多重网络智控模块升级方案

【赋能IoT生态系列5之4】多重网络智控模块升级方案
2023-08-14 15:48:31286

新唐对应四大物联网安全攻击之保护措施

新唐对应四大物联网安全攻击之保护措施
2023-08-10 11:02:48294

Numpy基础之数组过滤功能介绍

在numpy中,数组可以看作是一系列数值的有序集合,可以通过下标访问其中的元素。 处理数组的过程中,经常需要用到数组过滤功能。
2023-08-09 16:28:15297

SIMATIC S7-1500 PLC多重背景的应用1-2

使用多重背景实现功能:电动机的启停控制和水位A/D转换数值高于3000时,报警输出。
2023-08-03 09:59:11527

构成电路必备四大件,是哪四大吗?

电源开关接线电压
学习电子知识发布于 2023-08-02 14:38:29

电杆上为何发着光?为何冒着?为何吱吱作响?

电源电路元器件
学习电子知识发布于 2023-08-01 21:32:50

SIMATIC S7-1500 PLC多重背景的应用1

使用多重背景实现功能:电动机的启停控制和水位A/D转换数值高于3000时,报警输出。
2023-07-31 09:47:51303

制作了一个刹车带的直流电机调速器

电子diy
学习电子知识发布于 2023-07-24 22:35:42

局部放电检测仪

 一,简介HM50W局部放电检测仪是我所总结多年局放测量经验研制,系统具备超声波局部放电检测、暂态地电压局部放电检测、特高频局部放电检测和高频局部放电检测四大功能。采用声发射检测技术、暂态
2023-07-11 13:03:12

程斯-电线电缆密度测试仪 符合技术要求

工业自动化
csizhineng发布于 2023-07-01 14:54:06

聊聊布隆过滤

布隆过滤器是一个精巧而且经典的数据结构。
2023-06-30 10:03:28315

NUC230 CAN总线如何配置过滤器和掩码?

有用过新塘单片机的小伙伴吗,第一次用新塘的单片机,CAN总线配置过滤器和掩码不知如何配置,有用过的,指点一下
2023-06-27 06:01:56

四大因素解析:常规阻抗控制为什么只能是10%?

级厚度偏差渐严。覆铜板(不包括铜箔)厚度偏差分个等级(A、B、C、D),从A级至D级厚度偏差渐严。华秋严格选用生益/建滔 A 级 FR4板材,从源头上控制来料偏差,控制板材对阻抗公差的影响。 二
2023-06-25 10:25:55

DS2740是一款电量计

DS2740非常适合于为成本敏感的应用提供高精度电流通过量数据,以便于电池容量的监视。电流采用双向测量,动态范围高达15位(DS2740U)或13位(DS2740BU),流量在单独的16位寄存器
2023-06-15 11:53:29

CAN模块的接收过滤是如何编写的?

我现在使用NUC131芯片,按电梯例程进行了调试,收、发都已OK。 现在想问下,CAN模块的接收过滤是如何编写的?例程里没有这块内容。 我查了CAN.C的库函数,有一个: int32_t
2023-06-13 07:28:06

赛锐特 空气过滤器完整性测试仪# 独家拍摄

过滤
sinceritysmart发布于 2023-06-12 16:40:19

程斯-空气过滤器完整性测试仪 行业经验丰富

过滤
csizhineng发布于 2023-06-12 13:27:06

负极市场四大趋势研判

锂电产业链走过一季度产能出清调整,二季度整体需求提振,四大主材领域自4月开始订单回暖显著。
2023-06-11 09:54:12586

过滤件滤性能试验仪视频# 厂家实拍

仪器仪表测量仪器工业自动化
sinceritysmart发布于 2023-06-09 13:21:25

博途的多重背景调用

当函数块 (FB) 调用另一个函数块时,可其实例数据存储在调用函数块的背景数据块中。这种块调用又称之为多重实例。
2023-06-08 15:50:561986

陶瓷过滤机PLC如何实现数据采集与远程监控

陶瓷过滤机是一种新型、高效、节能的固液分离设备,主要是由过滤板、辊筒系统、搅拌系统、给排矿系统、真空系统等组成的,主要在有色金属矿的铅、锌、铜、钼、硫等精矿脱水。 通过对陶瓷过滤机上的控制器PLC
2023-06-07 10:38:33464

xilinx vivado调用cordic IP核进行实现时报错多重驱动?

用vivado2019.2建立工程,工程中调用cordic IP核进行atan求解,功能仿真时正常且满足要求;综合时正常;实现时报错提示多重驱动。 如果经cordic计算后的输出值不用于后续的操作
2023-06-06 17:17:37

充电的结构及原理分别有哪些?

充电的结构: 充电是由三个部分组成,电芯部分、电路板部分(升压系统和充电管理系统)和外壳部分。 1、移动电源电芯:电芯是移动电源的核心部分,也就是移动电源的电量储存器,其实也是由电池组
2023-06-06 15:12:24

PyTorch教程21.6之用于个性化排名的神经协同过滤

电子发烧友网站提供《PyTorch教程21.6之用于个性化排名的神经协同过滤.pdf》资料免费下载
2023-06-06 09:30:270

过滤式手柄焊接球阀产品性能特征

过滤式手柄焊接球阀采用整体全焊式,不会有任何泄露现象呈现;过滤网和球体一体构造设计,使过滤功用与流体控制功用集于一体。
2023-06-03 16:01:46438

过滤器模式是指什么?

过滤器模式是指通过构造一系列不同的标准实现类,通过这些标准实现类把目标对象(通常是多个)按照对应的标准进行过滤,从而得到想要的对象(或对象组)。
2023-06-01 14:32:18850

具有负载断开控制的20V同步升压转换器PL30502

PL30502是砾微电子推出的20V同步升压转换器,内置栅极驱动器,可断开负载。 PL30502集成了两个低导通电阻功率FET:一个7mΩ的开关FET和一个7mΩ的整流FET。PL30502
2023-05-30 14:54:09

5v转3.3v常用稳压芯片 单片机5v转3.3v

电池供电设备中,AH53XX稳压芯片能够有效地将电池输出的电压转换为稳定的3.3V输出,使其能够供电给各种芯片或模块,实现多种功能。例如,通过将该芯片应用于-雾传感器中,可以及时检测到-雾,并发
2023-05-18 16:01:10

电容为什么能过滤波?多大的电容滤掉怎样的波呢?

电容为什么能过滤波?多大的电容滤掉怎样的波呢?
2023-05-15 14:32:56

一文解析布隆过滤器设计原理

布隆过滤器 是一个很长的二进制向量 和一系列随机映射函数 ,用于检索一个元素是否在一个集合中 。 它的空间效率 和查询时间 都远远超过一般的算法 ,但是有一定的误判率 (函数返回 true , 意味着元素可能存在,函数返回 false ,元素必定不存在)。
2023-05-12 11:14:14366

00016 电工必知的四大电流知识 #电气 #电工

电工技术
学习电子知识发布于 2023-05-06 23:20:30

工业物联网解决方案:过滤布材料工厂数据采集方案

过滤布材是选矿、选煤、化工、制药、食品、环保、污水处理等行业过滤、压滤工艺的理想材料,常常配置于压滤机、真空加压过滤机、离心机及带式过滤机等设备,因此要求制造工厂实现不同滤布厚度、过滤精度、材质
2023-04-25 17:29:16426

XPD977D65 共享充电协议芯片-65W共享1C2A方案

供应XPD977D65 共享充电协议芯片-65W共享1C2A方案,更多产品手册、应用料资请向富满微代理骊微电子申请。>>  
2023-04-25 16:38:13

电容为什么能过滤波?多大的电容滤掉怎样的波呢?

电容为什么能过滤波?多大的电容滤掉怎样的波呢?
2023-04-20 17:28:44

求一种充电电路的设计方案

  设计一个充电的电路需要考虑以下几个因素:  电池:充电需要用电池来存储电能,因此需要选择合适的电池类型,如锂离子电池、镍氢电池等。同时,需要考虑电池的容量、电压、电流等参数,以确保充电
2023-04-20 11:44:12

MAFL-011018 三缸过滤

  MAFL-011018MoCA 三重过滤器MACOM 的 MAFL-011018 是一款专为 MoCA 应用而设计的表面贴装三缸过滤器。设计用于在空间受限的 CPE 应用中
2023-04-19 14:50:14

求助,LS1043ARGMII和PCIe带宽?

带 2GB DDR3 的定制 LS1043A 板。我们在 PCIe 通道和 2 GbE RGMII 端口上有一个 M.2 WiFi 卡。他们中的任何一个都会使用 iPerf 自行完成一个 Gb(RGMII 端口是的,WiFi 卡的速度约为 800Mbps)。如果我们再添加一个通道(即,如果我们运行 RGMII1 并在 RGMII2 上启动 iPerf),则两个 RGMII 通道均报告大约 460Mbps。如果我们添加 WiFi,则所有三个都显示为 ~300Mbps。IOW,这些通道之间共享的总带宽似乎为 1Gbps。这是预期的吗?架构中是否存在导致这种情况的瓶颈? 感谢 @yipingwang。起初我们使用默认值然后尝试:iperf3 -c-B-t 0 -p 5201 --length 9018和iperf3 -c-B-t 0 -p 5201 --set-mss 1460 两者都没有提供任何改进。请问使用了哪些参数或命令行参数来纠正RDB上的问题?
2023-04-18 07:30:13

详解域控制器的四大支柱

域控制器的四大支柱分别是车载以太网、自适应Autosar、高性能处理器和集中式E/E架构。
2023-04-15 17:15:092309

如何设置iMXRT1176 FlexCAN过滤器位?

我目前正在使用 iMXRT1176 的 FlexCAN 模块,并试图了解如何为消息缓冲区设置 id 过滤器位。 我的理解是,例如,我可以向寄存器 RXMGMASK 写入一个掩码,以确定我想将哪些位
2023-03-29 08:39:00

如何为S32K144设置模型,以便当过滤器表中有超过1个有效ID时CAN Rx FIFO正常工作?

在 S32K144 上,对于过滤表中超过 1 个 ID 元素,我无法让 CAN Rx FIFO 正常工作。我使用 R2022a 为 S32K144EVB (EVB) 创建了一个简单模型来演示该
2023-03-28 07:02:04

【鲁班猫创意氛围赛】 有无害环境卫士

大佬们好,分享一下我用鲁班猫做ros主控,stm32f407做底层驱动的一个ros小车。 目的是识别烟雾并净化:净化是用的负离子发生器(效果如文章顶部视频,净化还是很顶的),外加扇叶将其扩散出去。同时也具有环境气体浓度(质量)检测的功能。 b站链接: https://www.bilibili.com/video/BV1hh4y1n7Fz/?vd_source=4fa660ff7e4423139e6ebdbd4dece6c7 这是我去年12月底开始做的,入坑鲁班猫算是比较早了。在读大三学生。正奥里给考研中。。。 最底下还塞了一块vet6和一块esp32. 板子上加了个风扇,为了散热快。 鲁班猫1s做ROS主控用于ros建图(gmapping)和导航,同时接入NPU做抽烟监测,模型是yolov5自己训练的模型转化成rknn部署在板子上。 功能部分即功能层的stm32与串口屏、esp32通信部分。功能层的主要目的是获取传感器数据和通过继电器控制小车前端的负离子发生器和两个加快负离子扩散的风扇。这里的stm32相当于一个中转,用的是rt—thread实时操作系统,版本是4.0.2(写的比较早,当时的rtt还有小bug,现在已经很好用了。) 开启三个串口:一个用于读取传感器,一个用于接收和发送指令给串口屏,一个用于给esp32传输数据,通过esp32将数据发送到巴法云平台,做接入小程序中转。 篇幅有限,代码放在了网盘上。 链接:https://pan.baidu.com/s/1ltgypPMq9heezk412r4IKw?pwd=jhzs 提取码:jhzs 因为用的是rtt,移植性很高,故只写了应用层的main.c函数。如下: 气体传感器如下(所用的是串口协议) #include <rtthread.h> / *串口1用来调试* / #define DBG_TAG \"main\" #define DBG_LVL DBG_LOG #include <rtdbg.h> #include <string.h> #include <serial.h>//此处有坑,要改头文件路径为rt-thread/components/drivers/include/drivers #include <stdio.h> #include \"stdlib.h\" #defineleft_motor_run{rt_pin_write(6,PIN_LOW );rt_pin_write(7,PIN_HIGH);} #defineleft_motor_back{rt_pin_write(6,PIN_HIGH );rt_pin_write(7,PIN_LOW);} #definestoping{rt_pin_write(6,PIN_HIGH );rt_pin_write(7,PIN_HIGH);rt_pin_write(16,PIN_HIGH );rt_pin_write(17,PIN_HIGH);} #defineright_motor_run{rt_pin_write(16,PIN_LOW );rt_pin_write(17,PIN_HIGH);} #defineright_motor_back{rt_pin_write(16,PIN_HIGH );rt_pin_write(17,PIN_LOW);} #define key1_openrt_pin_write(51,PIN_LOW );//d3 #define key1_closert_pin_write(51,PIN_HIGH ); #define key2_openrt_pin_write(52,PIN_LOW );//d4 #define key2_closert_pin_write(52,PIN_HIGH ); #define key3_openrt_pin_write(53,PIN_LOW );//d5 #define key3_closert_pin_write(53,PIN_HIGH ); /*micropython esp32与rtt串口DMA传输数据时有坑, * 需在drv_usart.c找到HAL_UART_RxCpltCallback和HAL_UART_RxHalfCpltCallback将dma_isr(&uart->serial)注释掉, * 能降低数据错误率*/ / *串口2的变量 115200* / struct serial_configureuar2_configs = RT_SERIAL_CONFIG_DEFAULT; rt_sem_t sem2; rt_device_t uar2_dev; rt_thread_t uar_2_th; rt_thread_t uar_2_deal; char buffer[128] = {0}; rt_size_t rxlen2 = 0; / *串口3的变量 9600* / struct serial_configureuar3_configs = MY_SERIAL_CONFIG_DEFAULT; rt_sem_t sem3; rt_device_t uar3_dev; rt_thread_t uar_3_th; uint8_t buffer3[17] = {0}; rt_size_t rxlen3 = 0; / *串口4的变量 115200* / struct serial_configureuar4_configs = RT_SERIAL_CONFIG_DEFAULT; rt_sem_t sem4; rt_device_t uar4_dev; rt_thread_t uar_4_th; rt_uint8_t buffer4[256] = {0xff}; rt_size_t rxlen4 = 0; //char deal; rt_uint8_t deal ; char wheater[8]; char humidity[4]; char temperature[4]; char wind_speed[4]; char shi[3]; char miao[3]; char fen[3]; char wheater_deal[23]=\"main2.g3.txt=\"\"; char humidity_deal[18]=\"main2.g1.txt=\"\"; char temperature_deal[17]=\"main2.g0.txt=\"\"; char wind_speed_deal[19]=\"main2.g2.txt=\"\"; char shi_deal[15] = \"main.z1.val=\"; char miao_deal[15] = \"main.z0.val=\"; char fen_deal[15] = \"main.z2.val=\"; char end[2]=\"\"\"; char xf_end[3];//串口屏控制帧尾 void uar2_thread_entry(void *parameter)//串口2DMA线程入口 { rt_size_t len = 0; /*发送ch2o数据*/ rt_device_write(uar4_dev,0,ch2o_date,sizeof(ch2o_date)); rt_device_write(uar4_dev,0 ,xf_end,sizeof(xf_end)); /*end*/ /*发送tvoc数据*/ rt_device_write(uar4_dev,0 ,tvoc_date,sizeof(tvoc_date)); rt_device_write(uar4_dev,0 ,xf_end,sizeof(xf_end)); /*end*/ /*发送pm2.5数据*/ rt_device_write(uar4_dev,0 ,pm2_5_date,sizeof(pm2_5_date)); rt_device_write(uar4_dev,0 ,xf_end,sizeof(xf_end)); /*end*/ /*发送pm10数据*/ rt_device_write(uar4_dev,0 ,pm10_date,sizeof(pm10_date)); rt_device_write(uar4_dev,0 ,xf_end,sizeof(xf_end)); /*end*/ /*发送temp数据*/rt_device_write(uar4_dev,0,temp_date,sizeof(temp_date)); rt_device_write(uar4_dev,0 ,xf_end,sizeof(xf_end)); /*end*/ /*发送humi数据*/ rt_device_write(uar4_dev,0,humi_date,sizeof(humi_date)); rt_device_write(uar4_dev,0 ,xf_end,sizeof(xf_end)); /*end*/ memset(buffer4, 0, sizeof buffer4); // } } } rt_err_t uar3_rxback(rt_device_t dev, rt_size_t size)//串口3接收//回调函数9600 { rxlen3 = size; rt_sem_release(sem3); return RT_EOK; } void uar4_thread_entry(void *parameter)//串口4DMA线程入口 { rt_size_t len = 0; while(1) { rt_sem_take(sem4, RT_WAITING_FOREVER); len = rt_device_read(uar4_dev, 0, buffer4, rxlen4); buffer4[len] = \'\\\\0\'; rt_kprintf(\"%c\\\\n\",len); if (buffer4[0] == 0x02) { deal=0x02; rt_device_write(uar2_dev,0 ,&deal,16); rt_kprintf(\"uart4\"); deal=0; } if (buffer4[0] == 0x01) { deal=0x01; rt_device_write(uar2_dev,0 ,&deal,16); rt_kprintf(\"uart4\"); deal=0; } if (buffer4[0] == 0x03) { deal=0x03; //memset(buffer,0,sizeof(buffer)); rt_device_write(uar2_dev,0 ,&deal,16); rt_kprintf(\"uart4\"); deal=0; } switch(buffer4[0]) { case 0x44: key1_open;break; case 0x55: key1_close;break; case 0x66: key2_open;break; case 0x77: key2_close;break; case 0x88: key3_open;break; case 0x99: key3_close;break; } } } rt_err_t uar4_rxback(rt_device_t dev, rt_size_t size)//串口4接收回调函数 { rxlen4 = size; rt_sem_release(sem4); return RT_EOK; } void clearmachine_and_motor_pin_init() { rt_pin_mode(6,PIN_MODE_OUTPUT );//a6 rt_pin_mode(7,PIN_MODE_OUTPUT );//a7 rt_pin_mode(16,PIN_MODE_OUTPUT );//b0 rt_pin_mode(17,PIN_MODE_OUTPUT );//b1 rt_pin_mode(28, PIN_MODE_INPUT);//b12 left rt_pin_mode(29,PIN_MODE_INPUT);//b13right rt_pin_mode(51,PIN_MODE_OUTPUT );//d3 rt_pin_mode(52,PIN_MODE_OUTPUT );//d4 rt_pin_mode(53,PIN_MODE_OUTPUT );//d5 key1_close; key2_close; key3_close; } int main(void) { clearmachine_and_motor_pin_init();//引脚初始化 /*串口2 DMA初始化*/ uar2_dev = rt_device_find(\"uart2\"); if (uar2_dev == NULL) { LOG_E(\"rt_device_find[uart2] FAILED...\\\\\\\\\\\\\\\\n\"); return -EINVAL; } rt_device_open(uar2_dev, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_DMA_RX); rt_device_control(uar2_dev, RT_DEVICE_CTRL_CONFIG, (void *)&uar2_configs); rt_device_set_rx_indicate(uar2_dev, uar2_rxback); uar_2_th = rt_thread_create(\"uar2_rx_thread\", uar2_thread_entry, NULL, 4096, 10, 5); rt_thread_startup(uar_2_th); sem2 = rt_sem_create(\"sem2\", 1, RT_IPC_FLAG_FIFO); if(sem2 == RT_NULL){ LOG_E(\"sem2 rt_sem_create failed...\\\\\\\\\\\\\\\\n\"); return -ENOMEM; } LOG_D(\"sem2 rt_sem_create successed...\\\\\\\\\\\\\\\\n\"); /*串口2 DMA初始化结束*/ //uar_2_deal = rt_thread_create(\"uar2_deal\", uar2_deal_entry, NULL, 512, 13, 5); //rt_thread_startup(uar_2_deal); /*串口3 DMA初始化9600*/ uar3_dev = rt_device_find(\"uart3\"); if (uar3_dev == NULL) { LOG_E(\"rt_device_find[uart3] FAILED...\\\\\\\\\\\\\\\\n\"); return -EINVAL; } rt_device_open(uar3_dev, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_DMA_RX); rt_device_control(uar3_dev, RT_DEVICE_CTRL_CONFIG, (void *)&uar3_configs); rt_device_set_rx_indicate(uar3_dev, uar3_rxback); uar_3_th = rt_thread_create(\"uar3_rx_thread\", uar3_thread_entry, NULL, 4096, 12, 5); rt_thread_startup(uar_3_th); sem3 = rt_sem_create(\"sem3\", 1, RT_IPC_FLAG_FIFO); if(sem3 == RT_NULL){ LOG_E(\"sem3 rt_sem_create failed...\\\\\\\\\\\\\\\\n\"); return -ENOMEM; } LOG_D(\"sem3 rt_sem_create successed...\\\\\\\\\\\\\\\\n\"); /*串口3 DMA初始化结束*/ /*串口4 DMA初始化*/ uar4_dev = rt_device_find(\"uart4\"); if (uar4_dev == NULL) { LOG_E(\"rt_device_find[uart4] FAILED...\\\\\\\\\\\\\\\\n\"); return -EINVAL; } rt_device_open(uar4_dev, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_DMA_RX); rt_device_control(uar4_dev, RT_DEVICE_CTRL_CONFIG, (void *)&uar4_configs); rt_device_set_rx_indicate(uar4_dev, uar4_rxback); uar_4_th = rt_thread_create(\"uar4_rx_thread\", uar4_thread_entry, NULL, 4096, 11, 5); rt_thread_startup(uar_4_th); sem4 = rt_sem_create(\"sem4\", 4, RT_IPC_FLAG_FIFO); if(sem4 == RT_NULL){ LOG_E(\"sem4 rt_sem_create failed...\\\\\\\\\\\\\\\\n\"); return -ENOMEM; } LOG_D(\"sem4 rt_sem_create successed...\\\\\\\\\\\\\\\\n\"); /*串口4 DMA初始化结束*/ return RT_EOK; } 最后是串口屏显示,同时数据也能在微信小程序上查看 接下来是鲁班猫1s做ros主控的部分。 1、移植轮趣大佬的ros源码: 根据我现有的硬件:思岚a1雷达、一个usb rgb摄像头选择合适的功能包,然后开始移植。 中途会出现很多错误。例如缺少部分功能包,sudo apt install ros-noetic-(包名)【我的ros版本是noetic】。 2、移植完毕后发现大佬们并没有使用鲁班猫上的npu。所以我尝试了用npu跑yolov5在debain10的环境下用python接口效果如下: Python与c++接口将图片监测改成实时摄像头的代码: 只需更改cv.Capture()函数的摄像头设备号即可。 链接:https://pan.baidu.com/s/1gauOezF-X8ZuvU4b0I4v4A?pwd=jhzs 提取码:jhzs Python接口的yolov7只需更改yolov5代码的锚点即可 以下只列出主函数部分,完整的在链接里。 import urllib import time import sys import numpy as np import cv2 from rknnlite.api import RKNNLite #from PIL import Image RKNN_MODEL = \'mask.rknn\' IMG_PATH = \'./test.jpg\' OBJ_THRESH = 0.25 NMS_THRESH = 0.45 IMG_SIZE = 640 ......(省略中间部分) if __name__ == \'__main__\': # Create RKNN object rknn = RKNNLite() # init runtime environment print(\'--> Load RKNN model\') ret = rknn.load_rknn(RKNN_MODEL) #ret = rknn.init_runtime(target=\'rv1126\', device_id=\'256fca8144d3b5af\') if ret != 0: print(\'Load RKNN model failed\') exit(ret) print(\'done\') ret = rknn.init_runtime() if ret != 0: print(\'Init runtime environment failed!\') exit(ret) print(\'done\') capture = cv2.VideoCapture(9) ref, frame = capture.read() if not ref: raise ValueError(\"error reading\") fps = 0.0 while(True): t1 = time.time() # ref, frame = capture.read() if not ref: break # BGRtoRGB frame = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB) ############# img = frame img, ratio, (dw, dh) = letterbox(img, new_shape=(IMG_SIZE, IMG_SIZE)) img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # Inference print(\'--> Running model\') outputs = rknn.inference(inputs=[img]) input0_data = outputs[0] input1_data = outputs[1] input2_data = outputs[2] input0_data = input0_data.reshape([3, -1]+list(input0_data.shape[-2:])) input1_data = input1_data.reshape([3, -1]+list(input1_data.shape[-2:])) input2_data = input2_data.reshape([3, -1]+list(input2_data.shape[-2:])) input_data = list() input_data.append(np.transpose(input0_data, (2, 3, 0, 1))) input_data.append(np.transpose(input1_data, (2, 3, 0, 1))) input_data.append(np.transpose(input2_data, (2, 3, 0, 1))) boxes, classes, scores = yolov5_post_process(input_data) img_1 = cv2.cvtColor(img, cv2.COLOR_RGB2BGR) #img_1 = img_1[:,:,::-1] if boxes is not None: draw(img_1, boxes, scores, classes) fps= ( fps + (1./(time.time()-t1)) ) / 2 print(\"fps= %.2f\"%(fps)) #img_1 = cv2.putText(frame, \"fps= %.2f\"%(fps), (0, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) cv2.imshow(\"video\",img_1[:,:,::-1]) c= cv2.waitKey(1) & 0xff if c==27: capture.release() break print(\"Video Detection Done!\") capture.release() cv2.destroyAllWindows() 但这还没有接到ros中,为此我去翻rknn的github找到了接入ros的方法。 Ros功能包如下: Launch文件: Yolov5.launch <param name=\"model_file\" value=\"yolov5s-640-640.rknn\"/> <param name=\"display_output\" value=\"$(arg display_output)\"/> <param name=\"prob_threshold\" value=\"0.35\"/> <param name=\"chip_type\" value=\"$(arg chip_type)\"/> <remap from=\"/camera/image_raw\" to=\"$(arg camera_topic)\"/> Camrea.Launch <param name=\"video_device\" value=\"/dev/$(arg device)\" /> <param name=\"image_width\" value=\"640\" /> <param name=\"image_height\" value=\"480\" /> <param name=\"framerate\" value=\"30\" /> <param name=\"pixel_format\" value=\"yuyv\" /> <param name=\"camera_frame_id\" value=\"usn_cam\" /> <param name=\"io_method\" value=\"mmap\"/> <param name=\"camera_name\" value=\"usn_cam\"/> 启动摄像头 默认的摄像头设备号为video0 鲁班猫为video9 1、roslaunch rknn_ros camera.launch 2、roslaunch rknn_ros camera.launch device:=video9(可传参或者改launch) 3、roslaunch rknn_ros yolov5.launch chip_type:=RK3566 链接: 链接:https://pan.baidu.com/s/1QhfRjDs1sftAB0Q-TS5dBA?pwd=jhzs 提取码:jhzs 不出意外改好板子型号和对应的video就能用了。 可打开rviz或者rqt_image_view查看。 模型是我自己训练的,链接如下: 链接:https://pan.baidu.com/s/1FSJyW6kp4cy3-yakTq_Q4g?pwd=jhzs 提取码:jhzs YOLOV5配置和使用: 官方的源码是不建议的: 用这个: https://gitcode.net/mirrors/airockchip/yolov5?utm_source=csdn_github_accelerator 这是瑞芯微官方推荐的源码,但是也需要更改。 yolov5-master\\\\models下的yolo.py 找到 def forward(self, x): 函数,更改为: def forward(self, x): z = []# inference output for i in range(self.nl): if os.getenv(\'RKNN_model_hack\', \'0\') != \'0\': z.append(torch.sigmoid(self.m[i](x[i]))) continue x[i] = self.m[i](x[i])# conv \'\'\' bs, _, ny, nx = x[i].shape# x(bs,255,20,20) to x(bs,3,20,20,85) x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous() if not self.training:# inference if self.onnx_dynamic or self.grid[i].shape[2:4] != x[i].shape[2:4]: self.grid[i], self.anchor_grid[i] = self._make_grid(nx, ny, i) y = x[i].sigmoid() if self.inplace: y[..., 0:2] = (y[..., 0:2] * 2 + self.grid[i]) * self.stride[i]# xy y[..., 2:4] = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i]# wh else:# for YOLOv5 on AWS Inferentia https://github.com/ultralytics/yolov5/pull/2953 xy, wh, conf = y.split((2, 2, self.nc + 1), 4)# y.tensor_split((2, 4, 5), 4)# torch 1.8.0 xy = (xy * 2 + self.grid[i]) * self.stride[i]# xy wh = (wh * 2) ** 2 * self.anchor_grid[i]# wh y = torch.cat((xy, wh, conf), 4) z.append(y.view(bs, -1, self.no)) if os.getenv(\'RKNN_model_hack\', \'0\') != \'0\': return z return x if self.training else (torch.cat(z, 1),) if self.export else (torch.cat(z, 1), x) \'\'\' return x[0],x[1],x[2] 这样就可以在pt权重转onnx时去掉最后一个Detect层。 pt转onnx指令 python export.py --weights yolov5s.pt --img 640 --batch 1 --opset 11 --include onnx 红色字体部分换成要转换的权重文件例如我的就是: **python export.py --weights ** **weights/best.pt ** --img 640 --batch 1 --opset 11 --include onnx opset选择11。 这样出来的模型是有三个节点的模型,才是可用的。 可用netron查看: netron:https://netron.app/(浏览器网址) 将模型拖到页面可查看。 有三个输出节点。 且要记好三个节点的名字。 在官方要求的ubuntu pc端上进行模型转换。 我这里有个改好的yolov5源码(里面是我训练的抽烟监测模型) 网盘链接如下: 链接:https://pan.baidu.com/s/1fXKNoXhu4m1SmTr4fc-afg?pwd=jhzs 提取码:jhzs Chatgpt部分是b站机器人阿杰github开源项目。 https://www.bilibili.com/video/BV12M4y1R76M/?spm_id_from=333.788 效果如图: 呜。。。不要看问得什么 整车的sw模型链接:soildwork2020及以上版本可直接打开 链接:https://pan.baidu.com/s/1KqB1SOD418dCvyDaZFMgpg?pwd=jhzs 提取码:jhzs当时还理想化的撸了个履带,可后来发现打印出来根本用不了,故放弃,换成了轮子。 放链接是希望能够帮到像我一样步步踩坑的菜鸟级选手。我是老踩坑怪了。 有不当的地方,还望大佬们海涵。
2023-03-24 20:05:14

已全部加载完成