MCU起航
lazybeach
关注数: 521
粉丝数: 1,238
发帖数: 6,137
关注贴吧数: 49
[2021.07]单片机出售/转手/广告相关专用贴 为了更规范本吧版面,单片机出售/转手/广告之类的请统一发送到此帖内本帖只提供平台,对出售转让物品概不负责,所以请吧友甄别,此帖外相关贴子一律删除处理!
[2021.06]单片机出售/转手/广告相关专用贴 为了更规范本吧版面,单片机出售/转手/广告之类的请统一发送到此帖内本帖只提供平台,对出售转让物品概不负责,所以请吧友甄别此帖外相关贴子一律删除处理
【05-13 | 神兽申请】单片机吧申请神兽超级验证马 正文:吧内存在大量毕*&设&*代()^做(),使用小号循环发信息 吧名:单片机 申请人ID:lazybeach 申请理由:清理不良信息 不良信息截图:
[2021.01]单片机出售/转手/广告相关专用贴 为了更规范本吧版面,单片机出售/转手/广告之类的请统一发送到此帖内本帖只提供平台,对出售转让物品概不负责,所以请吧友甄别此帖外相关贴子一律删除处理
[2020.11]单片机出售/转手/广告相关专用贴 为了更规范本吧版面,单片机出售/转手/广告之类的请统一发送到此帖内本帖只提供平台,对出售转让物品概不负责,所以请吧友甄别此帖外相关贴子一律删除处理
关于吧里的IC厂家-咱们聊聊 吧里经常出现一些IC厂家的AD,例如替换stm32,例如某充电IC,例如某8位单片机。一开始我们是统一删除的,持续了一段时间,类似的帖子依然有。 后来提供了专门用于发广告的广告贴,但是认真看的没多少。IC广告依然到处都是。 经过讨论,现在我想,咱们可以换个方式: 方式1:我们可以搞个活动,你们提供一些免费或者低价的测试板,给吧里用户。当然,做为回报,可以要求吧内成员写一篇试用体会,同时贴吧也能提供加精和置顶的协助。当然,具体细节还有很多。 方式2:没有经费搞活动,我们也能理解。多个广告请发在一个帖子内,否则影响吧内体验,吧务会删除
[2020.10]单片机出售/转手/广告相关专用贴 为了更规范本吧版面,单片机出售/转手/广告之类的请统一发送到此帖内 本帖只提供平台,对出售转让物品概不负责,所以请吧友甄别 此帖外相关贴子一律删除处理
基于ESP32的NES掌机
[2020.9]单片机出售/转手/广告相关专用贴 为了更规范本吧版面,单片机出售/转手/广告之类的请统一发送到此帖内 本帖只提供平台,对出售转让物品概不负责,所以请吧友甄别 此帖外相关贴子一律删除处理
吧内广告的发布位置!大家务必看一遍,否则容易误删 吧内允许大家发布一些二手物品、厂家宣传、芯片、招聘、店铺的广#告,但仅限于在广告贴内发布,其他位置除非有吧主允许,否则禁止发布。 违规的帖子,会提醒一次,几个小时后如果作者不删,吧内管理员会删掉。 位置如下,如果你是电脑端登陆:每个月初,吧主或小吧会发布当月的广告贴。
近期吧内项目发布、招聘、带人学习帖子较多,大家注意资金安全! 最近吧内出现了一些帖子,有的是项目发布,说找人做项目。行业间的交流、交*易,我们是不干预的,但为了防止大家受*~骗,请大家在交易时注意资金安全 招聘信息也较多,有兼职的,有全职的,信息大部分说的比较含糊。也请大家注意。 偶尔还有一些帖子,说免费带人学习单片机。对于这样的贴主,如果是真的,我是非常高兴地,技术分享,没有坏处。但如果是假的,以带人学习为名,实际是卖*东*西,也欢迎大家举报。 个人希望上述类型的帖子,发帖前尽量给我私信,我先审核下。但原则上,貌似也没有权利要求大家这样做,但还是希望大家在分享、学习技术的同时,保护好自己!
[2020.8]单片机出售/转手/广告相关专用贴 为了更规范本吧版面,单片机出售/转手/广告之类的请统一发送到此帖内 本帖只提供平台,对出售转让物品概不负责,所以请吧友甄别 此帖外相关贴子一律删除处理
VS Code的keil插件使用方法_真香! 本文首发我的个人博客-MCU起航,属于本人原创。现在转载到贴吧,大家看着玩就行!也欢迎大家分享自己的文章,如果是转载别人的,请标明一下出处! 以下是正文: 作为一个51单片机或STM32单片机的使用者,keil一直是我们的必备的一款工具之一。但kei的一些问题也一直存在,被人吐槽最多的就是编辑器功能单一、提示功能不强、对中文支持不友好。当然,还有一些爱美的童鞋,说它界面丑陋。 而VS Code作为一款微软出品的、界面友好的编辑器,一直深受程序员的喜爱。现在我们可以通过安装插件的方式,在VS Code上进行51或者STM32的程序编译、下载。方法如下! 1、首先在插件页面搜索“keil”,找到并安装该插件。我这里已经安装好了,所以显示的是“Uninstall”,第一次搜索时显示的应该是“Install”。插件比较小,一分钟左右就可以下载、安装好。 2、配置插件,接入电脑上的keil 可执行文件的绝对路径。删掉上图中插件搜索框中的“keil”字符,显示出所有的插件。然后鼠标右键点击Keil Assistant,弹出菜单,点击:Extension Settings.在弹出的设置框里添加keil的可执行文件的路径,如下图:这里有两个路径,上面是C51的,下面是MDK的,都懂吧!我这里以STM32为例,添加的是我电脑上的MDK的可执行文件的路径,如下:3、修改编码配置。keil的使用过程中经常遇到的问题就是,中文经常乱码。在当前设置页面,输入“encoding”,如下:找到编解码相关的配置,在“Auto Guess Encoding”前面的框里打勾,这样的话,就能自动识别当前文件的编码类型了。当然,有可能识别的不准,还需要自己手动修改。 4、打开一个STM32工程。如下所示,点击位置3的加号,弹出打开工程的对话框。如下,第一次打开,默认是“C51”,需要改成keil MDK,否则找不到工程文件。修改后,打开工程,如下:上图的1、2、3分别对应build、download、rebuild。左边框里是相关的文件,此时我们可以愉快的撸代码、编译、下载了。如下,完成了代码的下载:当前插件还不支持调试,希望能尽快解决这个问题。
招人-帮朋友公司招一个DSP软件工程师 主要负责DSP程序的开发与维护,如果懂一些硬件更好。 岗位描述: 1.设计DSP驱动软件开发方案并完成相关文档编写; 2.负责DSP驱动软件架构设计、代码移植开发优化、测试及维护 任职资格: 1.熟练掌握C、汇编,有较强的编程能力以及良好的编程习惯; 2.了解DSP体系架构、熟悉DSP的开发技术、对TI公司 28377、28335等DSP有比较深入的了解; 3.了解DSP产品外围电路、有CAN、PCIE、SATA等接口理论知识; 4.熟练使用CCS等DSP软件开发工具。 工作地点:北京市昌平区 提供住宿、餐补。 经验要求:应届生或一两年工作经验都可以 待遇:7K到12K 有意者,请把简历发到我邮箱:2246080671#qq。com(#换成@)
招人-帮朋友公司招一个DSP软件工程师 主要负责DSP程序的开发与维护,如果懂一些硬件更好。 岗位描述: 1.设计DSP驱动软件开发方案并完成相关文档编写; 2.负责DSP驱动软件架构设计、代码移植开发优化、测试及维护 任职资格: 1.熟练掌握C、汇编,有较强的编程能力以及良好的编程习惯; 2.了解DSP体系架构、熟悉DSP的开发技术、对TI公司 28377、28335等DSP有比较深入的了解; 3.了解DSP产品外围电路、有CAN、PCIE、SATA等接口理论知识; 4.熟练使用CCS等DSP软件开发工具。 工作地点:北京市昌平区国家电网 提供住宿、餐补。 经验要求:应届生或一两年工作经验都可以 待遇:7K到12K 有意者,请把简历发到我邮箱:2246080671#qq。com(#换成@)
招募小吧主了!现在为了进一步促进本吧的发展,开始招募小吧主, 招募小吧主了! 现在为了进一步促进本吧的发展,开始招募小吧主,感兴趣的童鞋可以考虑!
一个单片机爱好者和国产EDA工具的故事 本文首发我的个人博客-MCU起航,属于本人原创。现在转载到贴吧,大家看着玩就行!也欢迎大家分享自己的文章,如果是转载别人的,请标明一下出处! 以下是正文: 哈喽大家好,我是MCU起航。看到这样的开头,熟悉我的朋友肯定就猜到了:我又要讲故事了!是的,最近看到朋友圈一篇文章传的比较火《没了美国EDA软件,我们就不能做芯片?看一线工程师怎么说!》 心里确实有点压抑,某些国家对我们的技术封锁从未停止,甚至随着我们的强大,这些封锁越来越明显。 首先说一下,EDA工具有很多。有用来设计芯片的,有用来仿真的,有用来编程的,也有用来设计电路的。而我只是个嵌入式行业从业者,所以这次故事的主角,自然就是用来画板子的工具了。 时间大约是2016年下半年,十月份或者十一月份。当时在用某工具画板子,画到一半,老婆大人有事要去小姨家住两天,需要我陪同。那我自然要跟着,于是收拾东西。图怎么办?自然要放在笔记本里接着画。 但是那天很邪门! 笔记本之前没装过某工具,现装的。但是装完以后,相关的EDA工程文件就是打不开。卸载之后,重新安装,还是同样的问题。气得我当时想砸电脑!但是想想我那可怜的余额、爱购物的媳妇,忍! 然后开始想替换方案。 之前画流程图的时候,因为懒得安装visio,于是找了一个在线画流程图的工具:processon。它是通过浏览器来在线绘制流程图,免费用户最多只能在线存储9个流程图,用着还凑合(白嫖的,我很知足)。 也就是从那时候开始,我开始注意一些在线办公的工具。 咱们国家的网络是很神奇的,当你在网上搜索一样东西之后,接下来的几天里,你上网的时候弹出的各种广告,都和你之前搜索的关键词有关。你们都懂得… 而也就是那个时候,一个工具进入了我的视线:easyeda。而它,就是LCEDA的前身!它同样是一个基于浏览器的工具,可以在线操作,无需安装,可以多人协同办公,支持AD文件的导入,内部有超多的原理图和PCB库(自从用了这个工具,我已经很久没有自己画封装了)。所以,只要你有电脑,有网,有浏览器,就能办公! 不过当时我比较谨慎,一来它名不见经传,二来我比较懒,不想随便换工具。但是直到那天,要去媳妇的小姨家,而某工具忽然不给力。没办法,我就试了一下。而这一试,让我目睹了easyeda(LCEDA)磕磕绊绊发展的四年。 easyeda的创始人叫老贺,曾经是一名大学老师。某次课上,他正在教他的学生使用EDA工具制图,这时他的学生问了他一个问题:老师,为什么中国没有自己的EDA工具? 是啊,为什么? 师者,传道、受业、解惑。可能这一次,他觉得没法回答学生的问题。所以,老贺决定自己来设计一款中国人自己的EDA工具。 于是从2011年开始,老贺逐渐把自己的精力投入到了EDA工具的开发,期间由于资金问题,甚至变卖了自己的网站。直到2014年,easyeda终于问世。而我接触到它时,已经是2016年的下半年了。 那个时候的它,界面风格比较朴素。当时我没有截图,找几个网上的图(从一篇2015年的文章中搬运的),咱们看下: 那个时候的easyeda刚刚问世,虽然老贺对它期望很高,但难免存在一些问题。我印象里,当时并没有专门的售后QQ群,也没有在线客服,可能也是资金问题吧。一旦有什么使用上的问题,全靠邮件联系。所以早期的时候,使用上有什么不清楚的地方,我都是靠发邮件和对方联系。 而且,我当时心里隐隐有种担忧:这种小公司,发个邮件,不会半个月才给回复吧。 然而现实是,基本上我当天发的邮件,大部分当天晚上都会回复。所以,虽然当时的easyeda名气不是很大,但是回复邮件速度足够快,某些功能确实好用。因此我也慢慢开始放心,逐渐把越来越多的项目放在这里开发。 可能是我这种爱发邮件的用户引起了他的注意,觉得我会成为他们的种子用户,所以某次邮件沟通完之后,老贺给我打了个电话,聊了聊,用他的原话说:给我们的产品吐吐槽! 我这人反应比正常人慢半拍,你要是给我一天的时间来找你们的槽点,我能找的很好。临时找的话,就一般了。所以简单聊了几句,提了一些建议就结束了。那次通话时间不长,留给我的印象只有三点: 1、南方人的口音 2、技术人的腼腆 3、对自己产品的期望咦,我好像知道了老贺是哪里的口音了! 2016年底,一天下午,我在立创商城买完元器件,去他们社区闲逛。无意中刷到了一篇帖子:帖子发布时间是2016年7月份,但是我临近春节的时候才看到。而且隐隐间,我觉得嘉立创将来会跟easyeda发生一些什么~~~ 嘉立创我是2013年开始接触的,最开始是打样。价格合适,速度也快。而且他们的在线ERP系统提交板子信息、计价、审核、查进度,用起来确实方便。后来开始用立创商城,因为做完板子需要买元件焊接,而且只要你的板子还没有进行到“字符”这一项工艺,那么买的元件就能和板子一起发货。后来因为立创商城规模大了,有多个仓库,这个功能也就取消了。 果然,2017年三月份,我在从北京回家的路上玩手机,又刷到一条信息:预感成真了! 我立刻在Q上给老贺发信息,进行确认!老贺只回了两个字:是的! 其实,从嘉立创说要自己开发EDA工具的时候,我就大致猜到了它的目的。从商业角度不难理解。一个电子产品的设计,包括几个部分:原理图、PCB绘制,制板,元器件采购,焊接,程序调试。 除去原理图、PCB绘制和程序调试这样的不可控阶段,制板、元器件采购和焊接,都属于可商业化的环节。而这三个环节,嘉立创都已经涉足,并且发展迅猛,几乎形成了一个完整的商业闭环。也就是说,但凡是电子产品设计过程中遇到的需求,嘉立创基本都能解决。就我个人来说,制板、SMT、元器件采购,基本都在嘉立创完成。原因很简单,只有两个字:省心! 虽然我可以通过一些渠道买到便宜的料,然后自己焊接,但是打样阶段总这么搞,终究会累的。也有人会抱怨立创商城的价格贵,呵呵,你跟得捷电子和贸泽电子对比过吗? 那,他们为什么还需要easyeda? 注意我的措辞,刚刚说商业闭环的时候,修饰词是“几乎”。一个电子产品的设计,是从原理图的绘制开始。如果能在设计原理图的初始阶段,商家就告诉用户我这里有什么、SMT支持哪些料,既方便了用户的方案验证,又给自己的商城、SMT带来了订单,这是一个双赢的结局。而只有在设计最开始的阶段,引入商家的服务(免费的EDA工具),才能更方便的推荐、开展后续的环节,进而真正形成一个完整的电子产业闭环。 对老贺来说,他的easyeda之前的宣传方向一直都是海外。虽然拥有了几十万的用户,但盈利一直是个难题。据说并购之前的那段时间,老贺每个月都为团队的工资发愁。看来当老板也挺不容易的啊! 并购之后,easyeda可以直接为嘉立创的几十万工程师提供免费的设计服务,而且是完全国人自主的EDA工具,不用担心版权的问题。而立创商城可以通过easyeda的海外影响力,推广自己的海外市场。 额,一不小心说多了。 大概从2017年上半年开始,我会时不时的跟朋友推荐这个工具。不过大部分人都和我最初一样,觉得安于现状挺好,懒得换。愿意接受或者尝试的,只有一小部分。我总结了一下,主要分几种: 1、受到版权困扰的。这个问题我在交流群里经常看到有人在抱怨,而且这几年越来越多的公司收到某软件公司的警告。没办法,没有授权就是没有授权。 2、学生。毕设期间,想快速画原理图和PCB的。easyeda提供了模块的功能,以前你画一个最小系统怎么也要20分钟。而easyeda里,有别人已经画好的、免费分享的最小系统模块,直接选中、放置,结束,前后也就一分钟。 3、极客。愿意体验新鲜事物的。 4、需要团队协作的项目。easyeda的团队协作功能是非常好用的,也是老贺强烈推荐的。我之前曾经有几个项目是和别人合作完成的,我人在河北,他人在北京,但是通过团队协作的方式,沟通上几乎没有任何问题。 并购之后,easyeda的海外域名不变,依然是easyeda。com。而为了更好的服务国内的工程师,他们在国内搭建了服务器,启用了一个新的域名,也就是现在相对比较常见的域名:lceda。立创EDA的首字母缩写! 注意,是lceda。cn,不是lceda。com。 并购之前,easyeda的版本更新是比较慢的,我印象里要两三个月更新一次。并购之后,更新速度快的吓人。有时候半个月一更新;有时候一周一更新;有时候,我今天发现一个bug,反映上去,第二天就更新了。看来资金充裕之后,做事效率确实不一样。 2017年初的时候,嘉立创喊出了口号,要在2017年中,也就是6月份的时候,实现SMT的第四阶段,也就是SMT要支持立创商城所有的贴片元件。作为一个见证了1、2、3阶段的人,我深刻的感受到,他们一直在孜孜不倦的……………….给自己挖坑。因为前面几个阶段基本都拖延了好几个月才完成,现在又来,呵呵~~~ 不过我无所谓,已经习惯了。我更关注的是,LCEDA与嘉立创SMT的配合。做过SMT的人都知道,生产时需要提供几个文件: 1、制板文件,一般是gerber; 2、BOM,也就是物料清单 3、坐标文件,也就是一个元件在一个板子上的位置和角度。 三者缺一不可。LCEDA可以导出这三个文件,但是并购之前以及并购之后刚开始的几个月,导出的坐标文件是不能直接用的,需要手动修改一些参数的名称,然后才能被嘉立创的SMT系统识别。虽然耽误不了几分钟,但操作的不顺畅还是让人感觉不是很爽。 我印象里,大概是2017年底,具体时间记不清楚了,嘉立创的SMT和LCEDA完成了SMT环节上的配合。不再需要手动修改,从LCEDA导出BOM和坐标文件(前提是要符合嘉立创的规范),不再需要手动修改,直接就能导入到嘉立创的SMT系统里。这种顺畅的感觉,犹如一个便秘多日的病人,忽然通畅了一般~~~~ 看到这,有人会说:你讲了这么多,全是好听的,没被坑过? 没被坑过是不可能的。并购之后,我被坑过两次。大概是2018年中的时候,当时是因为他们的铺铜算法做了调整,导致我应该铺铜的地方,没有铺上,打样出来后,完全不能用。 并购之前我没遇到过问题,并购之后反而遇上了,你说尴尬不? 其实这反而说明lceda正在以新的团队,新的方式做事。可能刚开始会有一些问题,但只要把最初的阶段克服掉,我相信后面会越来越好。而且这也导致我养成一个习惯,每次打样时,以生成的gerber文件为准。 当时被坑的怎么办?我记得还被客户在电话里怼了一顿~~~ 于是我厚着脸皮去找老贺~~~能够感受到,老贺正在以一种较真到极致的态度,死磕自己的产品。而LCEDA,也以一种更快的速度在升级、更新,以一种全新的姿态告诉这个世界:我们是认真的! 也许我们国家需要更多的这样的人。 所以,2018年,LCEDA在以一种飞快的速度进行着更新,增加了用户界面、改版了编辑器界面、增加了版本管理的功能、元件库增加对立创商城的支持、增加了3D预览、增加了交叉选择和布局传递、增加了拼板功能、优化了边框设计等等等等。东西太多了,有的可能没注意到,有可能不是2018年的,但已经不重要了。 2018年底,2019年初,工作需要,对一个四层板进行修改。这个板子之前是别人画的,现在交给我和一个同事负责。我尝试把它导入到LCEDA里面,以团队协作的方式来推进。结果,遇到了一个之前没遇到过的问题。 之前的板子尺寸都比较小,一般也就10*10以内,而且以两层板为主。这次的尺寸是18*14,四层板,网络的数量将近700个,焊盘数量直接超过了两千个,超过了当时LCEDA的目标极限。导入后最直接的效果就是打开PCB工程时,慢的没脾气。经常等着等着,弹出一个浏览器长时间没反应的对话框,问你是关闭还是继续等待。而且,即便PCB打开了,无论是拖动元件,还是画线,那种卡顿的感觉,让人仿佛回到了网络的石器时代。还好我这个人比较佛系,要不然又要砸电脑了。耐着性子画了几天,终于受不了了,找LCEDA客服沟通。在客户小哥的建议下,改了一些配置,好用了一些,否则画那个图真的会让我抑郁。在那时看来,LCEDA对大文件的支持能力还是略显单薄。所以,2019年,我对LCEDA的关注点就是打开、处理大文件能力的支持。可能也是受到我这种“爱挑事”的用户的“挑衅”,他们也开始对大文件的处理能力的优化。 每次更新我都很期待,当然,时不时的也会有“惊喜”:总的来说,这一年虽然速度和流畅性上没有大的改进,但总算是有些进步,可以干活了。以前有问题的时候,经常麻烦老贺,现在有问题,总找这位客服。毕竟老贺是负责人,不能总干客服的活,一个人要有一个人的定位。话说回来,不知道老贺现在在团队里做什么~~~ 而且这位客服兄弟基本上天天加班,看来团队很忙碌:就他这个目标,我怕是……….希望嘉立创能考虑下,给你们的员工解决一下终身大事…………. 终于,2019年12月份,LCEDA发帖——《立创EDA真香警告:新PCB引擎强势来袭!流畅得不像话!》 看到这个标题,我就知道,他们离翻身的时候不远了! 看完帖子后得知,原来他们在2018年就开始考虑这个问题了,而经过了一年左右的时间,终于找到了可以用来解决的方案。我当时去试用页面进行了体验,体验中的PCB文件比我当时的文件还要大很多。而运行的速度真的是流程异常,画面缩放时那种顺滑的感觉,犹如在看视频。当前,该引擎只出了一个试用的DEMO,还没有达到正式使用的阶段。 问及什么时候能投入使用,当时客服给出的回答是最快也要2020年中旬。所以,从那时开始,我就盼着新的引擎能快点投入使用。 后面的事情大家都知道了,2020年初,我们的国家遭遇了新冠,全国进入了停工停产的阶段。然后,有很多人奔赴武汉… 再后来,就是现在了。前几天,又看到一则新闻:如果是十年前,我看到这样的信息可能会有些生气,但现在基本已经过了那个阶段了。我相信,会有一些年轻人,默默地记住这天,默默地做一些事,默默地坚持很多年,直到我们可以无视他们所有的小动作。 截止到本文发布,我又咨询了一下客服,最快今年年底新引擎就能用上了!
ESP8266_07基于PWM的呼吸灯 这是我2019年写的学习笔记,首发我的博客:MCU起航,现在转载到贴吧,大家感兴趣的看看就行。 这一节主要就是一个内容:PWM的用法。 先看手册上对PWM功能的介绍(以下内容转自乐鑫手册): ESP8266系统的PWM( Pulse Width Modulation)由FRC1在软件上实现,可实现同频 率、不同占空比的多路PWM,可用来控制彩灯、蜂鸣器和电机等设备。 说明:FRC1是一个23bts的硬件定时器。 PWM的特性如下所示。 使用NM( Non Maskable Interrupt)中断,更加精确。 可扩展最多8路PVM信号 >14bit分辨率,最小分辨率45ns。 无需配置寄存器,调用函数接口即可完成配置。 注意:PWM驱动接口不能跟硬件定时器(hw_timer)接口函数同时使用,因为二者共用一个硬件定时器。 参数说明 最小分辨率:45ns(近似对应于硬件 PWM 的输入时钟频率为22.72 MHZ ) :>14 bit PWM @1 KHZ PWM 周期:1000 us (1 KHz )~10000 us (100 Hz) 先说频率范围,100HZ~1KHZ,这个频率实在是有些低。不过据说有些人能用到二三十K,不知道真的假的。由于本人比较懒,没有测,所以上面的说法仅供参考。 然后是用法,依然使用万能的三色LED做演示,做一个呼吸灯。最终实现的效果,上电后,三个LED依次从暗到亮,熄灭,下一个~~~ 另外,官方的SDK里面,提供了一个IoT_Demo的例程,里面有用PWM实现呼吸灯的代码。所以这里参考例程,进行一定的修改。 使用之前包含下面的头文件,同时把user_light.c文件拷到user目录下: #include "user_light.h"#include "pwm.h" 先说PWM的用法,很简单,只有三步。但因为我用了user_light.c里面的结构体,所以多加一步,先定义一个结构体。 1、定义一个结构体,存放PWM相关参数。 struct light_saved_param light_param; 结构体类型定义如下: struct light_saved_param { uint32 pwm_period; uint32 pwm_duty[PWM_CHANNEL]; }; PWM_CHANNEL是一个宏定义,定义PWM通道个数,这里是3.结构体里面可以设置PWM的周期,以及每个通道的占空比。 2、定义一个二维数组 uint32 io_info[][3] = { {PWM_0_OUT_IO_MUX,PWM_0_OUT_IO_FUNC,PWM_0_OUT_IO_NUM},{PWM_1_OUT_IO_MUX,PWM_1_OUT_IO_FUNC,PWM_1_OUT_IO_NUM},{PWM_2_OUT_IO_MUX,PWM_2_OUT_IO_FUNC,PWM_2_OUT_IO_NUM}, }; 这一步的意义在于,你要让哪几个IO输出PWM。数组的格式要记住,但凡用到PWM,都要以这样的格式进行定义。举例来说,第一行: PWM_0_OUT_IO_MUX,PWM_0_OUT_IO_FUNC,PWM_0_OUT_IO_NUM 分别是:管脚名、管脚功能、管脚编号。直接看肯定看不懂,因为都是宏定义,如下: #define PWM_0_OUT_IO_MUX PERIPHS_IO_MUX_MTDI_U #define PWM_0_OUT_IO_NUM 12 #define PWM_0_OUT_IO_FUNC FUNC_GPIO12 有人会觉得烦,说你搞这么多宏定义累不累? 但其实不是我搞的,IoT_Demo的例程里已经写好了,直接用就可以。而且,这个格式相对比较规范,所以还是建议使用。 3、PWM初始化 pwm_init(light_param.pwm_period, light_param.pwm_duty ,PWM_CHANNEL,io_info); 共有四个参数: 第一个参数:PWM的周期,这里写的是1000,单位是us。所有通道的周期都是一样的。 第二个参数:PWM的占空比,上面周期是1000,那占空比的最大值是多少? 如果答1000,那你就太年轻了!它这里有个计算公式,也需要记住(别记了,还是查手册吧) duty = period*1000/45 period是1000,带入计算的到22222.所以占空比的取值范围是0~22222. 第三个参数:通道个数,也就是说,你要输出几路PWM? 第四个参数:PWM各个通道的GPIO的硬件参数,也就是前面定义的那个数组。 4、启动PWM pwm_start(); 看函数名就能看懂了,不解释。 注意事项:手册里对该函数的描述是参数更新,所以但凡涉及到更新的(周期、占空比),改完之后,一定要调用一下这个函数。 经过前面四步,PWM就开始输出了。但是,咱们要做的是呼吸灯,呼吸灯是要定时修改PWM的占空比的,怎么改?再来一次pwm_init? NO! pwm_init只能初始化的时候调用一次,严禁多次调用。修改占空比使用下面的函数: pwm_set_duty(duty, channel); 函数名如此简单,我已经懒得解释了。第一个参数略过,直接看第二个,channel,要写多少? 首先,这里定义了三个通道,定义的时候在数组里按照从0开始的规则,对三个通道自动进行了编号,分别是:0,1,2. 所以,你想改哪个通道,写入哪个编号即可。 注:参考手册2c-esp8266_non_os_sdk_api_reference_cn的157页,和esp8266-technical_reference_cn的100页。 保存、清理、编译、下载一条龙,然后重新上电,你会发现呼吸灯开始变化。到此,PWM的用法说完了。
ESP8266_06硬件定时器与IO中断 这是我2019年写的学习笔记,首发我的博客:MCU起航,现在转载到贴吧,大家感兴趣的看看就行。 这一节主要有两部分内容:1、GPIO的中断用法;2、硬件定时器的使用。 先说定时器,前面说过了软件定时器的用法,如果你已经掌握了,那么硬件定时器基本是差不多的。都要设置回调函数、定时时间,区别的话,不用定义结构体,同时要选择中断源。 GPIO的中断也很好理解,跟单片机的管脚用法基本一样,设置为输入模式,开启中断等等~如何演示? 依然使用三色LED,同时板上还有一个按键。所以这里实现一个按键控制LED闪烁开关的程序。按一下按键,LED开始闪烁,再按一下,停止闪烁,并熄灭。 先说GPIO配置为输入、中断的用法,分6步,使用之前包含“user_interface.h”文件: 1、设置管脚4为GPIO模式 PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U,FUNC_GPIO4); 函数PIN_FUNC_SELECT的功能是选择管脚功能,第一个参数是管脚的名字,第二个参数是管脚对应的功能。 2、设置GPIO4为输入模式 GPIO_DIS_OUTPUT(GPIO_ID_PIN(4)); 3、禁止所有的IO中断 ETS_GPIO_INTR_DISABLE(); 4、设置中断处理函数 ETS_GPIO_INTR_ATTACH(GPIO_intr_handler,NULL); 5、配置GPIO4为下降沿触发的中断方式 gpio_pin_intr_state_set(GPIO_ID_PIN(4),GPIO_PIN_INTR_NEGEDGE); 6、使能GPIO中断 ETS_GPIO_INTR_ENABLE(); 注:参考手册esp8266-technical_reference_cn的20页。 然后是硬件定时器的使用: 使用方法也很简单,共分3步: 1、选择中断源,选择定时器是否自动填充 hw_timer_init(0,1); 该函数共有两个参数: 参数1:选择中断源。0,使用 FRC1 中断源,1,使用 NMI 中断源 参数2:是否自动填装。0,不自动填充,1,自动填充。 2、设置回调函数 hw_timer_set_func(LED_TURN); 3、启动定时器,设置定时时间,单位us hw_timer_arm(1000000); 注:参考手册2c-esp8266_sdk_api_guide_cn_v1.5.4的21页。 下载了例程的童鞋会看到,我给定时器在不同情况下设置了两个回调函数: hw_timer_set_func(LED_TURN); hw_timer_set_func(LED_OFF); 第一个函数LED_TURN实现的是LED定时闪烁,第二个函数LED_OFF实现的是LED熄灭。熄灭的时候,定时器依然在跑,只是管脚始终都拉低了。有人会问,你把定时器关掉不行吗?弄这么麻烦? 这个~~~ 如果我告诉你SDK里面没有硬件定时器关闭的函数,你信吗? 事实就是这样,我翻了一遍hw_timer.c文件,里面只有开启定时器的函数,没有关闭的函数。但是,它提到了控制哪个寄存器的哪一位能开启定时器,所以,感兴趣的童鞋可以自己写一个硬件定时器关闭的函数。 保存、编译、下载一条龙,然后重新上电,按一下按键,你会发现LED开始闪烁,再按一下,LED熄灭了。到此,硬件定时器和GPIO中断的用法说完了。 除此之外,再说一下“ICACHE_FLASH_ATTR”的用法。 打开ESP8266的SDK,你会看到很多函数前面加了这个东西。这是啥?(以下内容摘自乐鑫论坛) 这是SDK内部定一个的一个宏。简单来说,添加了 "ICACHE_FLASH_ATTR" 宏的函数,将存放在 IROM 中,CPU 仅在调用到它们的时候,将它们读到 cache 中运行;没有添加 "ICACHE_FLASH_ATTR" 宏的函数,将在一开始上电运行时,就加载到 IRAM 中运行。 由于空间有限,无法将所有代码都一次性加载到 IRAM 中运行,因此在大部分函数前添加 "ICACHE_FLASH_ATTR" 宏,放在 IROM 中。 请注意,不要在中断处理函数中调用带有 "ICACHE_FLASH_ATTR" 宏的函数,否则将引起异常。
基于stm32的内部flash生成的优盘 基于stm32的内部flash生成的优盘
基于stm32f103c8t6的USB键盘 基于stm32f103c8t6的USB键盘
基于stm32f103c8t6的USB鼠标 基于stm32f103c8t6的USB鼠标
STM32CubeMX使用内部flash生成优盘 本文首发我的个人博客-MCU起航,属于本人原创。现在转载到贴吧,大家看着玩就行!也欢迎大家分享自己的文章,如果是转载别人的,请标明一下出处! 以下是正文: 哈喽大家好,我是单片机爱好者MCU起航。这次说下如何通过STM32CubeMX软件,在5分钟的时间内,把你的单片机变成一个迷你优盘。 首先,通过STM32CubeMX软件配置单片机外射。型号依然是STM32F013C8T6,GPIO、RCC、SYS、Connectivity部分和之前的STM32的USB鼠标设置一样,参照前面的部分。其次,中间件,也就是Middleware部分,修改一下。一个是Class For FS IP,这里选择:Mass Storge Class,然后是下面的Class Parameters这里,之前的值是512,现在改为1024.为什么是1024,后面会说。 除此之外,VID和PID要和之前的不一样,然后配置一下时钟。第三,修改堆栈上限。之前的值是0x200,0x400,因为要模拟优盘,操作大量数据,这部分空间已经不够了,全部改为0x1000. 然后就可以生成工程了。第四,添加自定义部分代码。 /* USER CODE BEGIN PRIVATE_DEFINES */ #define FLASH_START_ADDR 0x08004000 // #define FLASH_PAGE_NBR 48 // 48K /* USER CODE END PRIVATE_DEFINES */ 主要有两个内容,一个是flash的起始地址,另一个是扇区的个数。 因为本工程代码不多,编译完成后代码量在12K左右,所以给程序文件预留16K的空间足够了。同时,STM32F103C8T6的flash总共64K,所以还剩48K。而STM32F103C8T6的flash,一个扇区大小是1024字节。这就是为什么第二步那里,Class Parameters的值要改成1024. 所以根据这些信息,可以知道优盘空间的起始地址是0x08004000,扇区个数是48.第五,修改容量获取函数。 第六,修改读优盘函数。 第七,修改写优盘函数。 贴吧看代码的效果实在是不行,我就不放代码了。 好了,保存,编译、下载、上电。 把USB线插入电脑,首先会弹出一个提示框,要求你格式化优盘:点击:格式化磁盘。弹出“格式化 可移动磁盘”的对话框,磁盘容量是48K,跟我们当初计算的大小一样。没有问题,点击:开始。很快,格式化完成了,点确定即可。这时,你会在你的电脑上看到一个容量28K的可移动磁盘。刚才还48,现在怎么一下子缩水成28?其实,是因为格式化的时候,电脑要向磁盘写入FAT文件系统,而文件系统要占用一定的磁盘容量。有了文件系统,我们就能方便的操作优盘,而不像操作EEPROM那样费劲。 这时,你可以打开优盘,创建一个TXT文件:保存,关闭。弹出优盘,再插上,你会发现你之前创建的TXT文件还在,说明优盘创建成功! 至此,优盘的例程操作完了。其实,单片机内部的flash空间是很小的,虽然能模拟成优盘,但存不了什么东西。所以这一例程的意义在于,我们熟悉了如何使用STM32CubeMX软件来把一些存储设备模拟成优盘,方便使用。例如,我们可以把外部的TF卡或者外部flash模拟成优盘,这样使用起来非常方便。 完整的工程源码,我上传到了网盘,我尝试下能否放在二楼,如果放不出来,说明被度娘吞了,你懂的~~~
ESP8266_05ESP8266有几个串口? 这是我2019年写的学习笔记,首发我的博客:MCU起航,现在转载到贴吧,大家感兴趣的看看就行。 问题:ESP8266有几个串口? 答:一个半。 先说一个完整的,这个比较常用。 以第三节生成的工程为例。咱们做一些修改。在软件左侧的Project Explorer打开app->user,除了user_main.c和Makefile,其它C文件都删掉。打开user_main.c文件,去掉文件头多余的头文件,添加如下两个和串口相关的头文件:函数user_init(void)内,除了初始化相关的函数,其余都去掉。添加串口初始化函数,设置波特率为115200,同时打印输出“Hello world!”保存、清理、编译一条龙,生成bin文件。 注意事项:user_main.c里面和系统初始化、系统配置相关的函数或定义不要动,如user_pre_init(void)、at_partition_table[]。如果是SDK2.2的话,你把这些删掉是没影响的,但是3.0不可以。 接下来说那半个UART,为什么说它是半个? 因为它只有一个发送管脚,TXD。其实从串口的初始化函数可以看出来,模块上面不止一个UART口: uart_init(BIT_RATE_115200, BIT_RATE_115200); 咱们通常用来下载程序,或者输出调试信息的那个端口就是UART0,那么另一个自然就是UART1。对应的IO管脚在哪里? 打开uart.c文件,找到uart_init(void) 函数。可以发现:它的UART1的输出管脚是GPIO2,如果要使用这个功能的话,把第340行的注释取消就可以,此时UART0只能做为程序下载接口,无法再输出调试信息。
ESP8266_04管脚控制与软件定时器 这是我2019年写的学习笔记,首发我的博客:MCU起航,现在转载到贴吧,大家感兴趣的看看就行。 这一节主要有两部分内容:1、管脚的控制;2、软件定时器的使用。 先说定时器,ESP8266内部的定时器分为软件定时器和硬件定时器。手册中指出硬件定时器其实就跟单片机里的timer一样,而软件定时器纯粹由软件实现,咱们可以理解为单片机里面类似for循环之类的循环延时函数。 定时器理解了,管脚控制就简单了,先上一下我这里的模块原理图:原理很简单,板上有一个三色的LED,所以这里实现一个定时实现LED开关的程序。先说GPIO的用法,分俩步。使用之前包含“user_interface.h”文件: 1、设置管脚为普通的GPIO模式 PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12); 函数PIN_FUNC_SELECT的功能是选择管脚功能,第一个参数是管脚的名字,第二个参数看起来像管脚编号,但其实是管脚对应的功能。 在编译器中选中FUNC_GPIO12,按F3,会打开eagle_soc.h文件,在这个文件里你会发现,无论是FUNC_GPIO12,FUNC_GPIO13,还是多少,对应的宏定义都是3: #define FUNC_GPIO12 3 2、设置管脚方向和电平 gpio_output_set(BIT12, BIT13, BIT12|BIT13, 0): 该函数的功能是设置GPIO属性,共有四个参数,没有用到的填0即可。 第一个参数,设置输出为高的位; 第二个参数,设置输出为低的位; 第三个参数,设置使能输出的管脚; 第四个参数,设置使能输入的管脚。 所以上面一行代码的意思是:设置GPIO12和GPIO13为输出,12输出高,13输出低。同理,下面一行代码的意思是:设置GPIO12为输入。 gpio_output_set(0, 0, 0, BIT12): 注:参考手册2c-esp8266_sdk_api_guide_cn_v1.5.4的152页。 然后是软件定时器的使用,使用之前包含如下两个头文件: #include "ets_sys.h" //内有timer结构体的定义 #include "osapi.h" 使用方法也很简单,共分四步: 1、定义一个软件定时器的结构体 os_timer_t LED_timer; //定义一个软件定时器的结构体,用于实现周期操作 2、关掉该定时器的定时功能 os_timer_disarm(&LED_timer); //配置之前,先关闭 3、设置该定时器的回调函数。使用定时器,必须设置回调函数。 os_timer_setfn(&LED_timer, (os_timer_func_t *)LED_TURN, NULL); 该函数共有三个参数: 第一个,你要设置哪个定时器?LED_timer 第二个,定时器定时时间到了之后,要执行哪个函数:LED_TURN 第三个,回调函数的参数,没有的话写NULL即可。 完了,也很简单。等等!定时的时长是多少?别急。 4、使能定时器,并设置时长,是否循环执行。 os_timer_arm(&LED_timer, 3000, 1); 该函数共有三个参数: 第一个,你要使能哪个定时器? LED_timer 第二个,时长多长? 3000,单位是毫秒。另有微秒的函数,可自行研究。 第三个,这三秒定时的功能只运行一次,还是循环执行? 1,循环;0,一次。 第三步里,提到了一个函数LED_TURN,这个函数就是开启或关闭LED的函数:到此,软件定时器的用法说完了。 注:参考手册2c-esp8266_sdk_api_guide_cn_v1.5.4的23页。 依次clean和build一下,生成bin文件,下载后可看到板上的LED,依次亮灭。
ESP8266_03 SDK与Makefile的基本用法 这是我2019年写的学习笔记,首发我的博客:MCU起航,现在转载到贴吧,大家感兴趣的看看就行。文章中部分链接已取消,想看的可以去我的博客。 有人问用什么板子合适,还有的直接问我买。这个,建议大家买个二三十的模块就行,可以是NodeMcu,也可以是安信可的模块加一个底板,没必要买太贵的。 还有的人手里拿着某某物联网平台的板子,问能不能用,只要是基于ESP8266的,都可以,但是你要找到板子配套的原理图。 好了,下面是正文。 先说一下什么是SDK? 定义(转自网络):一般都是一些软件工程师为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件时的开发工具的集合。 再看一下乐鑫内部对SDK的描述:ESP8266 Software Development Kit (SDK) 是乐鑫为开发者提供的物联网 (IoT) 应用开发平台,包括基础平台以及上层应⽤开发示例,如智能灯、智能开关等。 SDK 的基础平台按照是否基于操作系统可分为:non-OS 和 RTOS 两种版本。 简单来说,这是一个已经搭建好的工程框架,包含完整的源文件和头文件。同时,提供了一些例程供用户参考。 那么,SDK在哪里下载? 找厂家!芯片厂家是乐鑫,所以去乐鑫官网找。这里为了节省时间,我直接放上链接(还是取消吧,感兴趣的可以去我的博客看链接): 注:本文写于2019年7月12日星期五,当前的ESP8266 NONOS SDK已经更新到了3.0.0 后续的教程也主要基于NONOS的版本。 下载解压后,可以看到下面几个文件:接下来,需要进行一些操作,然后才能导入到AiThinker_IDE里。其实下面的操作主要参考安信可的网址: 但由于安信可的教程比较旧,所以这里做了一些调整。 1. 将 sdk 目录下的 driver_lib 重命名为 app2. 拷贝 \examples\IoT_Demo 下的所有文件到刚才的 app 目录(提示覆盖则确认),完成后目录结构如下:3. 将ESP8266_NONOS_SDK/third_party 这个文件夹删掉。 接下来,我们启动AiThinker_IDE,将项目导入 导入项目 1. 选择 File→Import2. 点开C/C++分支,并选中Existing Code as Makefile Project3. 去除C++支持,选中 Cygwin GCC 点击Browser,选中ESP8266_NONOS_SDK-3.0.0所在的目录4. 点击 Finish 完成ESP8266_NONOS_SDK-release-v3.0.0_01的导入 如下图:编译项目 鼠标选中项目名称,点击右键出现菜单:Build Project :编译项目 Clean Project:清理项目 选中编译项目,控制台输出如下图即编译成功真的能编译成功? 那是不可能的。 安信可官网说的是能编译成功,但针对的可能是比较老的SDK版本,如果你使用3.0版本的SDK,肯定是会报错的。报错如下:打开根目录下的makefile文件,找到第29行,把等号后面的值改掉。SDK3.0里面写的是0,改成多少?根据你模块的FLASH大小来修改:如果是8MBIT,改为2;如果是16MBIT,改为3;如果是32MBIT,改为4. 这个关系不用背下来,makefile文件向下翻到第82行,你会看到它有一个说明:它这里写的值的单位是BYTE。改完之后,再次编译,你会发现编译成功了:接下来,思考另一个问题:为什么有人生成的bin文件是这样的?其实,安信可官网曾经说过。可生成两种形式的bin文件,一种是不支持在线升级的,一种是支持在线升级的。刚才这个图,就是支持在线升级的。那么,如何生成这种bin文件? 打开根目录下的makefile文件,找到第25、26行。当第25行为new的时候,如果第26行是1,那么生成的是支持在线升级的,如果是0,那就不支持在线升级。除此之处,当我们使用一些特殊功能的源文件的时候,也需要在Makefile里添加相应的库文件。所以,这里建议大家,多看几遍Makefile文件,不需要完全看懂,但要知道基本用法。 至此,关于ESP8266的环境搭建、程序下载、固件配置,基本用法都说了一下。后面,逐步开始敲代码的过程。
ESP8266_02程序的编译与下载 这是我2019年写的学习笔记,首发我的博客:MCU起航,现在转载到贴吧,大家感兴趣的看看就行。 这一节主要看下如何对ESP8266的程序进行编译和下载,首先打开 AiThinker_IDE.exe。如下图所示,咱们选中其中一个现有的工程文件进行编译:工程选择:esp8266_helloworld,依次打开包含的文件夹:user,以及user下面的user_main.c文件。 这里的user_main.c文件,就相当于单片机工程里的main.c文件;而文件里的user_init(void)函数,就相当于单片机程序里的main函数。理解了这两点,剩下的就好理解了。 user_init(void)函数里面只包含了三行代码:第一行通过串口打印当前SDK的版本,第二行打印当前程序的编译时间。 第三行稍微麻烦一点,它是在注册系统初始化完成的回调函数。如果是搞单片机的,估计大部分是第一次听说回调函数。关于回调函数,这里摘抄一段网上讲的比较好的说明: 对普通函数的调用: 调用程序发出对普通函数的调用后,程序执行立即转向被调用函数执行,直到被调用函数执行完毕后,再返回调用程序继续执行。从发出调用的程序的角度看,这个过程为“调用-->等待被调用函数执行完毕-->继续执行” 对回调函数调用: 调用程序发出对回调函数的调用后,不等函数执行完毕,立即返回并继续执行。这样,调用程序和被调用函数同时在执行。当被调函数执行完毕后,被调函数会反过来调用某个事先指定函数,以通知调用程序:函数调用结束。这个过程称为回调(Callback),这正是回调函数名称的由来。 回调函数与普通函数的区别在于调用者不同。普通函数的调用是直接或者间接由main函数发起的。回调函数由系统发起调用,与main函数无关。 回到程序里,system_init_done_cb是调用程序,system_done是回调函数,而system_done内部又注册了一个回调函数,实现了一个定时输出hello world的功能。 程序是直接就能用的,咱们编译看一下。鼠标右键点击左侧工程栏里的esp8266_helloworld,在弹出的页面先点击:Clean Project,执行完成之后,再点击Build Project。编译完成之后,下方的输出框会有类似信息输出:这里生成的是bin文件,而不是hex文件。注意user1.2048.new.3.bin生成的位置,在工程目录下的bin/upgrade里。 这里说一下,编译器生成的bin文件,根据Makefile里面的配置不同,分为两种:一种是不支持云端升级的,一种是支持云端升级的。Makefile如何配置,后面会讲,这一节主要说和下载相关的东西。 使用乐鑫提供的下载工具,链接如下: http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fwiki.ai-thinker.com%2F_media%2Fesp8266%2Fflash_download_tools_v3.6.4.rar&urlrefer=c8cbabd8dd7ef2d11530382ef82697d8 同时要准备一个串口助手,用来显示接收到的信息。 注意:串口助手的波特率要能支持78400. 下载软件打开后如图所示:选择最上面的按钮,点击,弹出下面的工具框:第一次使用这个工具的人,看到上图可能会有点懵!因为我同时选中了四个bin文件,这就意味着要给芯片烧录四个文件。和单片机的程序烧录不一样,单片机一般一次只烧一个hex文件,而这里,根据配置不同,你可能一次要烧录4~5个bin文件。 怎么回事? 这几个文件里面,有两个是编译器编译生成的,有2~3个是SDK里面自带的(包括系统参数和启动程序),如果同时有多个版本,建议使用最新版。 参照下面的截图,以及上面生成bin文件的截图,可以知道当前程序是支持云端升级的模式,需要下载5个bin文件。同时,你会发现,根据flash的大小不同,即便是同一个文件,它的烧录地址也有可能不同。具体如何配置,参照上图。 注意:虽然上图给出了eagle.irom0test.bin、user1.bin、user2.bin这三个文件在不同flash下的地址,但是每次编译器编译完成后,会再次输出分配好的地址。这里以编译器输出地址为主。 那么,怎么知道你的ESP8266的FLASH是多大空间?依然参照截图,安信可不同型号的模块,flash的大小都在这里表明了。 注意:flash大小的单位是bit,不是byte。意味着,32Mbit=4Mbyte。打开工程文件所在路径(这是我的路径,你要找你的): C:\AiThinkerIDE_V0.5\cygwin\home\aithinker\project\esp8266_helloworld\bin\upgrade 你会发现只有一个user1.2048.new.3.bin,它对应上图中的user1.bin,是咱们要的,剩下四个文件都没有!不要急,看上面的截图你会找到提示:由乐鑫在SDK中提供。 所以找到ESP8266_NONOS_SDK,打开路径: C:\AiThinkerIDE_V0.5\cygwin\home\aithinker\project\ESP8266_NONOS_SDK\bin 你会发现你要的这都有了:boot.bin有两个,一个是1.2版本,一个是1.6版本,尽量用新的。但是,还有个问题,user2.bin在哪?笔者推测,这是因为hello world这个程序代码量太小,所以没有生成这么多需要烧录的bin文件,因此空着就行。 我们对下载软件进行配置,SPI SPEED,SPI MODE,这两个位置参照截图里的配置,SPI FLASH一定要根据你手里的模块选择。每个bin文件的下载地址一定要写对,否则程序无法正常运行。 注意:SPI MODE这里,它表示的其实是ESP8266芯片和flash芯片的连接方式,一般以DOUT和QIO居多。如果你不确定,建议你的模块买回来之后,先不要烧程序,先上电看一下串口打印的信息,里面有说明。如下所示:硬件连接方面,使用一条USB转串口线,一端连接你的ESP8266模块,另一端连接电脑,根据电脑里显示的端口号选择串口号。玩过单片机的应该都懂,如果不会,重新学一下基础。 同时,官方要求把GPIO0和GPIO15管脚拉低,GPIO2置高。但是笔者在使用过程中发现,只要把GPIO0和GPIO15接到GND,其它管脚悬空即可。 然后,先点击软件上的START按钮,再给模块供电,这时模块自动进入下载过程(有点像STC的冷启动)。如果无法下载,建议多尝试几次,或者参照安信可的网站内容。 下载完成后,要把GPIO0悬空,否则无法正常工作,同时给模块重新上电,可以看到串口输出相关信息: ets Jan 8 2013,rst cause:2, boot mode:(3,7)load 0x40100000, len 2408, room 16tail 8chksum 0xe5load 0x3ffe8000, len 776, room 0tail 8chksum 0x84load 0x3ffe8310, len 632, room 0tail 8chksum 0xd8csum 0xd82nd boot version : 1.6SPI Speed : 40MHzSPI Mode : DOUTSPI Flash Size & Map: 16Mbit(512KB+512KB)jump to run user1 @ 1000rf cal sector: 507rf[112] : 00rf[113] : 00rf[114] : 01SDK ver: 2.0.0(656edbf) compiled @ Jul 19 2016 17:58:40phy ver: 1055, pp ver: 10.2SDK version:2.0.0(656edbf) , Compile time:Jul 5 2019 14:34:40mode : softAP(5e:cf:7f:c3:f1:49)add if1dhcp server start:(ip:192.168.4.1,mask:255.255.255.0,gw:192.168.4.1)bcn 100[2019-07-05 15:02:42.575]# RECV ASCII> Hello world ! Hello world ! 其中的“SDK version:2.0.0(656edbf) , Compile time:Jul 5 2019 14:34:40”对应user_init函数里前两行打印的信息。而下面,每隔3秒,串口会打印一个“hello world”并换行! 注意,串口波特率要设置为78400。本片教程主要参照乐鑫的文档:3a-esp8266_sdk_flash_tool_user_guide_cn_v1.0,以及安信可网站(度娘不稳定,就不随便放链接了) 至此,编译与下载过程讲解完毕。
小度音响控制esp8266!
手机APP控制8266,控制LED开关~
【05-15 | 求助咨询】吧主的帖子管理工具不好用,你们都这样吗? 你好,我是某个贴吧的吧主,刚上任。我看到“帖子管理工具”里,有很多“疑似有问题的主题”,想审核一下,删除广告,但是使用的时候,一直提示系统问题,你们也这样吗?
基于STM32CUBE的USB键盘例程 本文首发我的个人博客-MCU起航,属于本人原创。现在转载到贴吧,大家看着玩就行!也欢迎大家分享自己的文章,如果是转载别人的,请标明一下出处! 以下是正文: 前面说了USB鼠标,这次趁热打铁,说一下USB键盘。依然只说如何修改,不说背后的原理。原因你懂的,涉及的知识点太多了。 首先,STM32CubeMX的配置部分不说了,和USB鼠标部分的一样。唯一需要注意的一点是,VID和PID这两个值要改一下,否则主机(也就是电脑)会以为你还是鼠标。其次,生成工程后打开,修改usbd_hid.c文件。配置集合(USBD_HID_CfgFSDesc)要做一些改动,首先是长度:这是个宏定义,之前是34,现在变成41. 然后是端点数,之前是1,现在改成2.接着是接口协议,之前是2(鼠标),现在改成1(键盘)。 再接着是报告描述符长度:之前是:HID_MOUSE_REPORT_DESC_SIZE,长度是74,现在改成: HID_KEYBOARD_REPORT_DESC_SIZE,长度63. 还有就是端点每次发送的数据包长度:之前是4,不够用了,现在改成16. 最后配置集合中增加一部分端点描述符,因为USB键盘对主机来说,不光有输入,还有输出。所以,增加的这部分端点描述符,用来描述输出。 /******************** Descriptor of Mouse Output endpoint ********************/0x07, /*bLength: Endpoint Descriptor size*/USB_DESC_TYPE_ENDPOINT, /*bDescriptorType:*/0x01,0x03, /*bmAttributes: Interrupt endpoint*/0x10,0x00,HID_FS_BINTERVAL, /*bInterval: Polling Interval */ 第三,修改HID描述符中的报告描述符长度:上面提到了,之前是鼠标描述符,长度74,现在改成键盘描述符,长度63. 第四,把USB鼠标的报告描述符删掉,换成USB键盘的报告描述符。 不会写USB键盘的报告描述符怎么办? 之前提到一个USB报告描述符自动配置的工具,打开!里面有各种例程,我们直接复制一个USB键盘的报告描述符即可。生成.h文件如下: __ALIGN_BEGIN static uint8_t HID_KEYBOARD_ReportDesc[HID_KEYBOARD_REPORT_DESC_SIZE] __ALIGN_END ={ 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x06, // USAGE (Keyboard) 0xa1, 0x01, // COLLECTION (Application) 0x05, 0x07, // USAGE_PAGE (Keyboard) 0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl) 0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x01, // LOGICAL_MAXIMUM (1) 0x75, 0x01, // REPORT_SIZE (1) 0x95, 0x08, // REPORT_COUNT (8) 0x81, 0x02, // INPUT (Data,Var,Abs) 0x95, 0x01, // REPORT_COUNT (1) 0x75, 0x08, // REPORT_SIZE (8) 0x81, 0x03, // INPUT (Cnst,Var,Abs) 0x95, 0x05, // REPORT_COUNT (5) 0x75, 0x01, // REPORT_SIZE (1) 0x05, 0x08, // USAGE_PAGE (LEDs) 0x19, 0x01, // USAGE_MINIMUM (Num Lock) 0x29, 0x05, // USAGE_MAXIMUM (Kana) 0x91, 0x02, // OUTPUT (Data,Var,Abs) 0x95, 0x01, // REPORT_COUNT (1) 0x75, 0x03, // REPORT_SIZE (3) 0x91, 0x03, // OUTPUT (Cnst,Var,Abs) 0x95, 0x06, // REPORT_COUNT (6) 0x75, 0x08, // REPORT_SIZE (8) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x65, // LOGICAL_MAXIMUM (101) 0x05, 0x07, // USAGE_PAGE (Keyboard) 0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated)) 0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application) 0x81, 0x00, // INPUT (Data,Ary,Abs) 0xc0 // END_COLLECTION }; 第五,函数USBD_HID_Setup中,需要修改一部分代码:获取报告描述符的部分,之前这里是鼠标的报告描述符信息,现在换成了键盘的。 第六,main.c文件中,添加头文件,并定义相关的数组: /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "usbd_hid.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ uint8_t KeyBoard[8] = {0,0,4,0,0,0,0,0}; uint8_t KeyBoard01[8] = {0,0,0,0,0,0,0,0}; extern USBD_HandleTypeDef hUsbDeviceFS; /* USER CODE END PTD */ 第七,主函数中循环发送英文字母A~Z。 while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ if(KeyBoard[2] >= 29) { KeyBoard[2] = 4; } else{ KeyBoard[2]++; } USBD_HID_SendReport(&hUsbDeviceFS,(uint8_t*)&KeyBoard01,sizeof(KeyBoard));HAL_Delay(15);USBD_HID_SendReport(&hUsbDeviceFS,(uint8_t*)&KeyBoard,sizeof(KeyBoard01));HAL_Delay(15);USBD_HID_SendReport(&hUsbDeviceFS,(uint8_t*)&KeyBoard01,sizeof(KeyBoard));HAL_Delay(1000); } 为什么4~29对应英文字母A~Z? USB官网的文件hut1_12v2中,对键盘的每个按键对应的值,都有一个详细的定义,看第53页,我这里截一部分图:最后,保存、编译、下载、上电!新建一个TXT文档,看键盘自动输出字母,爽不爽?完整的工程源码,我上传到了网盘,我尝试下能否放在二楼(也可以去我的博客找),如果放不出来,说明被度娘吞了,你懂的~~~
超迷你平衡车-地心一号的行走视频~
基于STM32CubeMX的USB鼠标例程 本文首发我的个人博客-MCU起航,属于本人原创。现在转载到贴吧,大家看着玩就行!也欢迎大家分享自己的文章,如果是转载别人的,请标明一下出处! 以下是正文: 最近在玩STM32CUBE的USB功能,用起来还是挺方便的。只要配置一下,设备描述符、配置描述符、接口描述符什么的,都能给你自动生成,其中还包括比较复杂的报告描述符。 这次给大家演示一下如何用STM32CUBE的配置,自动生成一个USB鼠标的过程。这里多说一句,USB是一套比较复杂的协议,单靠一两个例程是不可能完全理解的。至少要找本书,再配着USB官网的各种协议啃几天,才算入门。 所以这个例子起到的是一个抛砖引玉的过程,如果你真的感兴趣,就去找相关资料学习。STM32CubeMX的便利,在很多方面都给了我们很大的帮助!当然,如果有感兴趣的想继续学的,可以留言,我会试着写一些这方面的文章。 首先,软件版本我用的是STM32CubeMX的5.3.0,并不是最新版。为什么没用最新的?最新版有个很恶心的bug,好像是打不开工程,记不清了。 打开STM32CUBE,选择一个芯片。这里我选的是STM32F103C8T6。其次,RCC这里外部高速时钟,外部默认都接8MHZ。第三,SYS这里,调试接口选择Serial Wire。我个人习惯用SW接口,你们随意。第四,GPIO这里,我把PA15设置为推挽输出,默认高电平。这是和我的硬件电路相关的。首先要明确的一点是,STM32F103C8的这个片子,只支持USB的FS模式,也就是全速(FULL SPEED)模式。 USB主机(也就是电脑)如何知道USB设备支持全速模式?只要在USB设备的D+数据线上接一个1.5K的上拉电阻即可。而我这里这个上拉电阻的电源端是接到了STM32的PA15上面。如图:所以,如果你的板子上,上拉电阻默认接到VCC,这一步就不用管了。没有的话,自己想办法~~~ 第五,Connectivity选项里,选择USB,然后右侧Device(FS)前面打勾,下面不用管。第六,中间件(Middleware)这里,选择USB。右侧上面选择Human Interface Device Class,也就是俗称的HID。 下面要注意几个地方! VID和PID分别代表厂商(Vender )编号和产品(PID)编号,VID不能随便用,要花钱向USB协会申请,所以这里仅供学习使用。PID还好,由厂商自己定义。 manufacturer_string是厂商字符串,product_string是产品字符串,configuration_string是配置字符串,interface_string是接口字符串,这四个是可以手动修改的。放心改,不要钱。我随便改了两个。 还有一个LANGID_STRING,它表示USB设备支持什么语言。我这里没有动,默认选择英语。7、修改时钟。USB那里需要48M的时钟,别的无所谓。照着改吧!8、生成工程。工程名称和路径,不用说了,那个是基本的。主要是框住的这两个位置,根据你的代码习惯和编译器(KEIL还是IAR)来进行选择。9、修改代码。打开工程,找到main.c,添加一些代码。 /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "usbd_hid.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ uint8_t MouseData01[4] = {0,0,0,0}; extern USBD_HandleTypeDef hUsbDeviceFS; /* USER CODE END PTD */ 主函数里: while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ MouseData01[0] = 0x01; USBD_HID_SendReport(&hUsbDeviceFS,(uint8_t*)&MouseData01,sizeof(MouseData01)); HAL_Delay(1000); MouseData01[0] = 0x00; USBD_HID_SendReport(&hUsbDeviceFS,(uint8_t*)&MouseData01,sizeof(MouseData01)); HAL_Delay(1000); } 好了,保存、编译、下载、上电。你会发现,板子上电的时候电脑右下角弹出一个“发现新设备”的提示框。 然后你的屏幕上的光标位置,每隔1秒,自动点一下鼠标左键。 很多人到这里,其实是蒙的!!! 为什么? 自始至终,STM32CubeMX里,和主函数里没出现鼠标相关的函数(除了我们自定义的一个带鼠标字符的数组),怎么就出来一个鼠标? 为什么不是键盘? 为什么不是优盘? 这个我可以回答,因为你选的是HID,而不是存储类设备。 为什么不是游戏手柄? 其实,你可以理解为,这是官方提供给我们的一个鼠标例程。这里简单说下USB设备上电的过程: 1、设备插入后,USB主机自动对设备进行复位,使设备地址为零。 2、USB主机对地址为零的设备提问:你是个什么东西? 3、USB设备说:我的PID是XX,VID是XX,USB协议是2.0等等。 4、USB主机再次对设备进行复位,然后给复位后的设备分配一个地址。 5、USB主机向新地址提问:你是个什么东西? USB设备回答:… 6、两次回答一样,说明USB设备的地址分配成功。USB主机继续提问,获取其它描述符。 7、USB设备,在向主机回复配置集合的时候,表明自己的身份:你好,我是个鼠标! 也就是说,在配置集合中,有信息说明这个设备是鼠标,我们看下。在usb_hid.c文件中,有一个数组:USBD_HID_CfgFSDesc,其中一行:单是这个还不够,还要结合报告描述符。也在这个文件内,名字是HID_MOUSE_ReportDesc。内容如下(格式比较乱,看不看随意): __ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] __ALIGN_END ={0x05, 0x01,0x09, 0x02,0xA1, 0x01,0x09, 0x01,0xA1, 0x00,0x05, 0x09,0x19, 0x01,0x29, 0x03,0x15, 0x00,0x25, 0x01,0x95, 0x03,0x75, 0x01,0x81, 0x02,0x95, 0x01,0x75, 0x05,0x81, 0x01,0x05, 0x01,0x09, 0x30,0x09, 0x31,0x09, 0x38,0x15, 0x81,0x25, 0x7F,0x75, 0x08,0x95, 0x03,0x81, 0x06,0xC0, 0x09,0x3c, 0x05,0xff, 0x09,0x01, 0x15,0x00, 0x25,0x01, 0x75,0x01, 0x95,0x02, 0xb1,0x22, 0x75,0x06, 0x95,0x01, 0xb1,0x01, 0xc0}; 是不是很懵逼?这都是啥?怎么没有注释? 别问我,我也不知道。可能是研发人员懒,也可能是他们忘了。 无论是配置集合,还是报告描述符,这里都不做解释,因为一两篇文章根本说不完。这里只说一点,由于报告描述符的规定,鼠标设备向电脑发送数据的时候,一般是发送4个字节的数据。 字节1:无符号字符型,低三位分别表示鼠标的左、右、中键是否被按下,1按下,0抬起。 字节2:有符号字符型,表示鼠标在x方向的移动。 字节3:有符号字符型,表示鼠标在y方向的移动。 字节4:有符号字符型,表示鼠标滚轮的移动。 所以,我在上面的代码中循环将第一个字节的值设为0和1,就能看到屏幕上的光标每隔一秒,触发一下鼠标左键。 好了,不知不觉说的有点多。还好大部分都是图片,看起来不难理解。总结起来,就是个发送数据的过程。 还是那句话,USB协议比较复杂,只靠一两篇文章是学不会的。例程我上传到了网盘,我尝试下能否放在二楼(也可以去我的博客找),如果放不出来,说明被度娘吞了,你懂的~~~
单片机吧灌水转帖! 开了灌水水贴专贴,新人及升经验者专用
C51和M3的while语句效率分析 上面两段示例代码中,循环次数都一样,但是在有些平台中,时空效率却大不相同。以51架构单片机为例,我们来分析它编译出来的汇编代码。从上述的汇编代码中,我们发现用“++”和“--”的两段while循环代码,在空间上前者比后者多了4条指令共5个字节,时间上多花费了8次*4=32个指令周期,如果循环次数进一步加大,这一差距就不能忽视。 为何会有如此之多的差异?其本质原因是因为C51拥有一条“复合指令DJNZ”,其定义如下,意为:将“寄存器或者某个ram内的byte变量”的值减1,完事后判断不为0则跳转”。该指令融合了“算术运算 + 逻辑运算 + 跳转”三个功能。所以,你该知道,大牛的代码while用"--和0比较",一般的代码就是“++和var比较”或者用“for循环”。 一般来说,不管什么平台,判断0总是效率较高的,毕竟cpu的状态寄存器都有个Zero状态位。 --------------------------------------------------------------------- 而对于M3平台,两段代码并没有带来明显的时空差异。这两段汇编,前者之所以比后者多了一句“UXTB r1,r1”,因为加法的值需要32位和8位的数值转换,归零的减法不需要。这又应那个原则:“零值”操作效率较高。 因此,一个软件工程师,需要对其操作平台的指令系统有足够的熟悉,对基本C语句的汇编转换了然于心,才能写出高质、高效的代码。老工程师的价值,也体现在此。 另外值得一提的是,在这个实验中我发现一个比较有意思的现象:在函数while_dec中变量声明兼初始化代码“uint8_t i = 0;”,紧随其后就是“i = 8”的覆盖赋值代码。而它在C51平台编译器上,却产生了一个冗余代码“CLR A”,令人困惑。在M3平台的编译中,就没有这样的现象了。不管怎样,随着编译器越来越智能,变量声明时即刻初始化,是一个非常好的编程习惯,它不会对代码空间增加额外的负担。
单片机吧吧主竞选:NO.0001号候选人
五分钟带你了解舵机的控制原理 1、什么是舵机 舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。目前在高档遥控玩具,如航模,包括飞机模型,潜艇模型;遥控机器人中已经使用得比较普遍。舵机是一种俗称,其实是一种伺服马达。2、工作原理 控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。当然我们可以不用去了解它的具体工作原理,知道它的控制原理就够了。就象我们使用晶体管一样,知道可以拿它来做开关管或放大管就行了,至于管内的电子具体怎么流动是可以完全不用去考虑的。 3、舵机的控制 舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度伺服为例,那么对应的控制关系是这样的: 0.5ms----------- 0度 1.0ms----------- 45度 1.5ms----------- 90度 2.0ms-----------135度 2.5ms-----------180度小型舵机的工作电压一般为4.8V或6V,转速也不是很快,一般为0.22/60度或0.18/60度,所以假如你更改角度控制脉冲的宽度太快时,舵机可能反应不过来。如果需要更快速的反应,就需要更高的转速了。 舵机上有三根线,分别为VCC、GND、信号线。而不需要另外接驱动模块,直接用单片机的管脚控制就行了。控制信号一般要求周期为20ms的PWM信号。 如果要更为精确的控制舵机(转动角度差<=1度),则需要控制输出PWM信号的占空比, 例如:我可以把0~180分为1024份(可以任取,决定与定时器的时钟频率),范围为0.5ms~2.5ms 则可以得到0.09度/us,因此可以由 PWM=0.5+N*0.09(N是角度)控制舵机转动0~180度间的任意角度。
充电器的 D+,D- USB 接线方案 先说一下苹果充电器的原理:充电器插头一端插在 220V 交流电的插座上,另一端用苹果专用的数据线接到 iPhone/iPad 上。 220V 交流电先通过整流电路和滤波电路变成 300V 高压直流电,再经过开关管变成高 频高压脉冲,然后通过变压器转换为低压(比如 5V)脉冲。 5V 的低压脉冲再经过一个整 流、稳压电路,变成 5V 稳定的直流电。在从 220V 交流电变为 5V 直流电的整个过程中,变压器、整流电路、稳压电路只是起到一个改变电能形态的作用。 如果稳压电路输出 5V 的一端( USB 接口)没有接上 iPad 或者 iPhone(术语称为负载), 就不会有电流流过,也就不会消耗电能。接上负载之后,充电器输出端子的正负极才有电 流,流过充电器的电流大小取决于负载的状态:只要在力所能及的范围内,负载需要多大 的电流,充电器就提供多大的电流。 如果负载需要的电流超过了充电器能够提供的电流上限,那么充电器就会一直输出这个最大的电流。这是因为,充电器内部通常会设计保护电路,一旦输出电流过大,就会触发保护机制,暂停电流输出。不过,苹果公司为了让旗下 的所有充电器和数码产品能够尽量混用,想出了一个奇招: 仔细观察一下充电器的 USB 接口,你会发现一共有四个窄金属条,称为四个引脚。这四个 引脚分别连接 5V 电源、 D+数据线正信号、 D-数据线负信号和 GND 地。 ,标准 USB 引脚,电压分别是: vcc,D-,D+,GROUD。对应电压是+5V,0,0,0 IPHONE,5V,2.7V,2V,0 这样最大充电电流 1A IPAD 5V,2V,2.7V,0 充电电流2A 一般兼容 USB 接口的充电器, D+和 D-两个引脚是悬空的,任何设备只要插上这样的充电 器,就会从 5V 和 GND 两个引脚获得电能。而苹果的充电器则在 D+和 D-两个数据引脚上 增加了分压电阻,使充电的设备能够在充电时从这两条数据线上读到两个电压。 iPhone 或 者 iPod 对应的 5V1A 充电器, D+上的电压是 2V, D-是 2.7V;而 iPad 使用的 5V2.1A 的充 电器, D+电压 2.7V, D-电压 2V。 Ipad2 和 Iphone4 的 USB 电源的 D+ D-的电压是相反的, 一个 2V,一个 2.7V,这个 D+ D-的电压使机器会识别电源是 1A 的还是 2A 的,从而使机 器限流不会烧坏电源,机器会限制充电电流,所以 Ipad2 的充电器不会充坏 IPhone4,识别 电阻按大约比例使 D+ D-的电压符合就行了,有些移动电源的识别电阻是按 Iphone4 的,接Ipad2 同样显示充电,但机器识别为 1A 的电源,限流 1A 慢充电,所以电源电流够 2A 以上 的识别电阻要按 Ipad2 的配置,还有 D+ D-悬空时,完全不充电,连上都不提示。三星充电器一般只要 D+, D-即 USB 中间 2 脚短路就能以 1A 的电流充电。 HTC 手机 D+,D-短路并有 1.2V 电压的时候以满负荷充电 当然,目前的手机基本上只要 D+,D-短路,基本上都能充电,只是充电的电流不同,在 不是原装的充电器接线方式的充电器上充电,可能会以 500MA 的电流给手机充电。
基础篇:稳压二极管的应用 一、稳压二极管 稳压二极管,又名齐纳二极管,其工作原理一种用于稳定电压的单结二极管。此二极管是一种直到临界反向击穿电压前都具有很高电阻的半导体器件。 在这临界击穿点上,反向电阻降低到一个很小的数值,在这个低阻区中电流增加而电压则保持恒定,这样,当把稳压管接入电路以后,若由于电源电压发生波动,或其它原因造成电路中各点电压变动时,负载两端的电压将基本保持不变。稳压二极管是根据击穿电压来分档的,因为这种特性,稳压管主要被作为稳压器或电压基准元件使用。其伏安特性见图1,稳压二极管可以串联起来以便在较高的电压上使用,通过串联就可获得更多的稳定电压。二、稳压二极管稳压电路图分析 D1为稳压二极管,与负载R2并联,R1为限流电阻。若电网电压升高,即电路的输入电压Vin也随之升高,引起负载电压Vout升高。由于稳压管D1与负载R2并联,Vin只要有一点增长,就会使流过稳压管的电流急剧增加,使得I也增大,限流电阻R1上的电压降增大,从而抵消了Vout的升高,保持负载电压Vout基本不变。反之,若电网电压降低,引起Vin下降,造成Vout 也下降,则稳压管中的电流急剧减小,使得I减小,R1上的压降也减小,从而抵消了Vin的下降,保持负载电压Vout基本不变。 若Vin不变而负载电流增加,则R1上的压降增加,造成负载电压Vout下降。Vout只要下降一点点,稳压管中的电流就迅速减小,使R1上的压降再减小下来,从而保持R1上的压降基本不变,使负载电压Vout得以稳定。 综上所述可以看出,稳压管起着电流的自动调节作 用,而限流电阻起着电压调整作用。稳压管的动态电阻越小,限流电阻越大,输出电压的稳定性越好。 稳压二极管串联使用:三、稳压二极管的性能 稳压管稳压性能的好坏,可以用它的动态电阻r来 表示: r = (电压的变化量△U)/(电流的变化量△I) 显然,对于同样的电流变化量ΔI,稳压管两端的 电压变化量ΔU越小,动态电阻越小,稳压管性能就越好。 稳压管的动态电阻是随工作电流变化的,工作电流越大。动态电阻越小。因此,为使稳压效果好,工作电流要选得合适。工作电流选得大些,可以减小动态电阻,但不能超过管子的最大允许电流(或最大耗散功率)。 各种型号管子的工作电流和最大允许电流,可以从手册中查到。 稳压管的稳定性能受温度影响,当温度变化时,它 的稳定电压也要发生变化,常用稳定电压的温度系数来表示这种性能例如2CW19型稳压管的稳定电压Uw= 12伏,温度系数为0.095%℃ ,说明温度每升高1℃,其稳定电压升高11.4毫伏。为提高电路的稳定性能,往往采用适当的温度补偿措施。在稳定性能要求很高时,需使用具有温度补偿的稳 压,如2DW7A、2DW7W、2DW7C 等。 四、稳压二极管的主要参数 1.Vz— 稳定电压。 指稳压管通过额定电流时两端产生的稳定电压值。该值随工作电流和温度的不同而略有改变。由于制造工艺的差别,同一型号稳压管的稳压值也不完全一致。例如,2CW51型稳压管的Vzmin为3.0V, Vzmax则为3.6V。 2.Iz— 稳定电流。 指稳压管产生稳定电压时通过该管的电流值。低于此值时,稳压管虽并非不能稳压,但稳压效果会变差;高于此值时,只要不超过额定功率损耗,也是允许的,而且稳压性能会好一些,但要多消耗电能。 3.Rz— 动态电阻。 指稳压管两端电压变化与电流变化的比值。该比值随工作电流的不同而改变,一般是工作电流愈大,动态电阻则愈小。例如,2CW7C稳压管的工作电流为5mA时,Rz为18Ω;工作电流为1OmA时,Rz为8Ω;为20mA时,Rz为2Ω ; > 20mA则基本维持此数值。 4.Pz— 额定功耗。 由芯片允许温升决定,其数值为稳定电压Vz和允许最大电流Izm的乘积。例如2CW51稳压管的Vz为3V,Izm为20mA,则该管的Pz为60mW 5.Ctv— 电压温度系数。 是说明稳定电压值受温度影响的参数。例如2CW58稳压管的Ctv是+0.07%/°C,即温度每升高1°C,其稳压值将升高0.07%。 6.IR— 反向漏电流。 指稳压二极管在规定的反向电压下产生的漏电流。例如2CW58稳压管的VR=1V时,IR=O.1uA;在VR=6V时,IR=10uA。 五、选择稳压二极管的基本原则 1.要求导通电压低时选锗管;要求反向电流小时选硅管。 2.要求导通电流大时选面结合型;要求工作频率高时选点接触型。 3.要求反向击穿电压高时选硅管。 4.要求耐高温时选硅管。 注:稳压管与其它普通二极管不同之反向击穿是可逆性的,当去掉反向电压稳压管又恢复正常,但如果反向电流超过允许范围,二极管将会发热击穿,所以,与其配合的电阻往往起到限流作用。
直流电机正反转驱动电路 图4.12 一、H桥驱动电路 图4.12中所示为一个典型的直流电机控制电路。电路得名于“H桥驱动电路”是因为它的形状酷似字母H。4个三极管组成H的4条垂直腿,而电机就是H中的横杠(注意:图4.12及随后的两个图都只是示意图,而不是完整的电路图,其中三极管的驱动电路没有画出来)。 如图所示,H桥式电机驱动电路包括4个三极管和一个电机。要使电机运转,必须导通对角线上的一对三极管。根据不同三极管对的导通情况,电流可能会从左至右或从右至左流过电机,从而控制电机的转向。图4.12 H桥驱动电路 要使电机运转,必须使对角线上的一对三极管导通。例如,如图4.13所示,当Q1管和Q4管导通时,电流就从电源正极经Q1从左至右穿过电机,然后再经Q4回到电源负极。按图中电流箭头所示,该流向的电流将驱动电机顺时针转动。当三极管Q1和Q4导通时,电流将从左至右流过电机,从而驱动电机按特定方向转动(电机周围的箭头指示为顺时针方向)。图4.13 H桥电路驱动电机顺时针转动 图4.14所示为另一对三极管Q2和Q3导通的情况,电流将从右至左流过电机。当三极管Q2和Q3导通时,电流将从右至左流过电机,从而驱动电机沿另一方向转动(电机周围的箭头表示为逆时针方向)。图4.14 H桥驱动电机逆时针转动 二、使能控制和方向逻辑 驱动电机时,保证H桥上两个同侧的三极管不会同时导通非常重要。如果三极管Q1和Q2同时导通,那么电流就会从正极穿过两个三极管直接回到负极。此时,电路中除了三极管外没有其他任何负载,因此电路上的电流就可能达到最大值(该电流仅受电源性能限制),甚至烧坏三极管。基于上述原因,在实际驱动电路中通常要用硬件电路方便地控制三极管的开关。 图4.155 所示就是基于这种考虑的改进电路,它在基本H桥电路的基础上增加了4个与门和2个非门。4个与门同一个“使能”导通信号相接,这样,用这一个信号就能控制整个电路的开关。而2个非门通过提供一种方向输人,可以保证任何时候在H桥的同侧腿上都只有一个三极管能导通。(与本节前面的示意图一样,图4.15所示也不是一个完整的电路图,特别是图中与门和三极管直接连接是不能正常工作的。)图4.15 具有使能控制和方向逻辑的H桥电路 采用以上方法,电机的运转就只需要用三个信号控制:两个方向信号和一个使能信号。如果DIR-L信号为0,DIR-R信号为1,并且使能信号是1,那么三极管Q1和Q4导通,电流从左至右流经电机(如图4.16所示);如果DIR-L信号变为1,而DIR-R信号变为0,那么Q2和Q3将导通,电流则反向流过电机。图4.16 使能信号与方向信号的使用 实际使用的时候,用分立元件制作H桥是很麻烦的,好在现在市面上有很多封装好的H桥集成电路,接上电源、电机和控制信号就可以使用了,在额定的电压和电流内使用非常方便可靠。比如常用的L293D、L298N、TA7257P、SN754410等。 附一张分立元件的H桥驱动电路:
精品-软件滤波的10种方法 前言:本文转自程序匠人的博客,详细讲述了在软件滤波中常用的十种方法,是一篇难得的好文,解决了本人在软件滤波上的很多疑惑。网络上也有很多转载,但是本人是在程序匠人的书中看到的这篇文章,而且里面也是讲的最详细,大家如果有兴趣的话,建议还是去看书。 一、限幅滤波法 1、 先根据经验判断,确定两次采样允许的最大偏差值,设为A。 每次检测到新采样值时进行判断: (1)如果本次新采样值与上一次滤波效果之差<=A,则本次采样值有效,令本次滤波结果=新采样值; (2)如果本次采样值与上次滤波结果之差>A,则本次采样值无效,放弃本次采样值,本次滤波结果=上次滤波结果。 2、例程 #define A 10 uchar Value; //上次采样有效值 uchar AmplitudeLimiterFilter() { uchar NewValue,ReturnValue; NewValue=GetAD(); //本次采样值 if(((NewValue-Value)>A)||((Value-NewValue)>A))) ReturnValue=Value; else ReturnValue=NewValue; return(ReturnValue); } 二、中位值滤波法 1、连续采样N次值,把采样值按大小排列,取中间值为本次有效值。 2、例程 #define N 9 unchar MiddleValueFilter() { unchar i,j,k; uchar temp; uchar ArrDataBuffer[N]; for(i=0;i<N;i++) //一次采集N个数据放入数组中 { ArrDataBuffer[i]=GetAD(); Delay(); } for(j=0;j<N-1;j++)//采样值由小到大排列 { for(k=0;k<N-j-1;k++) { if(ArrDataBuffer[k]>ArrDataBuffer[k+1]) { temp=ArrDataBuffer[k]; ArrDataBuffer[k]=ArrDataBuffer[k+1]; ArrDataBuffer[k+1]=temp; } } } return(ArrDataBuffer[(N-1)/2]);//取中间值 } 三、算术平均滤波法 1、连续取N个值进行算术平均运算。 N较大时,信号平滑度较高,但灵敏度较低;N较小,信号平滑度低,但灵敏度较高。 2、例程 #define N 12 uchar ArithmeticalAverageValueFilter() { uchar i; uchar Value; uchar sum; sum=0; for(i=0;i<N;i++) { sum+=GetAD(); Delay(); } Value=sum/N; return(Value); } 四、递推平均滤波法 1、把连续N个采集值看成一个队列,每次采集到的新数据放入队尾,并扔掉原来队首的数据。把队列中的N个数据进行平均计算,即可获得新的滤波结果。 2、例程 #define N 12 uchar Data[]; uchar Gilde(Data[]) { ucahr i,Value,sum; sum=0; Data[N]=GetAD(); for(i=0;i<N;i++) { Data[i]=Data[i+1];//所有数据左移,低位仍掉 sum+=Data[i]; } Value=sum/N; return(Value); } 五、中位值平均滤波法 1、中位值平均滤波法又称脉冲干扰平均滤波法,相当于“中位值滤波法”+“算术平均滤波法”。 连续采集N个数据,去掉一个最大和最小值,然后计算N-2个数的平均值。 2、例程 #define N 12 uchar Middle() { ucahr i,j,k,l; uchar temp; uchar ArrDataBuffer[N]; uchar sum,Value; for(i=0;i<N;i++)//一次采集N个数据,存入数组 { ArrDataBuffer[i]=GetAD(); Delay(); } for(j=0;j<N-1;j++)//采样值由小到大排列 { for(k=0;k<N-j-1;k++) { if(ArrDataBuffer[k]>ArrDataBuffer[k+1]) { temp=ArrDataBuffer[k]; ArrDataBuffer[k]=ArrDataBuffer[k+1]; ArrDataBuffer[k+1]=temp; } } } for(l=0;l<N-1;l++) { sum=ArrDataBuffer[l]; } Value=Sum/(N-2); return(Value); } 六、递推中位值平均滤波法 1、相当于“中位值滤波法”+“递推平均滤波法”。这种方法把连续N个值看成一个队列,每次采集到一个新数据放入队尾,并扔掉原来队首的值。把队列中的N个数据先去掉一个最大值和最小值,然后计算N-2个数据的平均值。 2、例程 char Filter() { char max.min; int sum; char i; QUEUE[0]=NewData; max=QUEUE[0]; min=QUEUE[0]; sum=QUEUE[0]; for(i=n-1;i!=0;i--) { if(QUEUE[i]>max) max=QUEUE[i]; else if(QUEUE[i]<min) min=QUEUE[i]; sum+=QUEUE[i]; QUEUE[i]=QUEUE[i-1]; } i=n-2; sum=sum-max-min+i/2;//加入(n-2)/2目的为了四舍五入 sum=sum/i; return(sum); } 七、限幅平均滤波法 1、相当于“限幅滤波法”+“递推平均滤波法”。每次采样先进行限幅处理,再进行队列平均滤波处理。 2、例程 #define A 10 #define N 12 uchar Data[N]; uchar Limit() { ucahr i,Value,sum; Data[N]=GetAD(); if(((Data[N]-Data[N-1])>A)||((Data[N-1]-Data[N])>A))) Data[N]=Data[N-1]; else Data[N]=NewValue; for(i=0;i<N;i++) { Data[i]=Data[i+1]; sum+=Data[i]; } Value=sum/N; return(Value); } 八、一阶滞后滤波法 1、本次结果滤波结果=a*本次采样值+(1-a)*上次结果。 a代表滤波系数,a=0--1。 2、例程 #define a 128 uchar Value; ucahr OneFactorialFiler() { uchar NewValue; uchar ReturnValue; NewValue=GetAD(); ReturnValue=(255-a)*NewValue+a*Value; ReturnValue/=255; return(ReturnValue); } 九、加权递推平均滤波法 1、加权递推平均滤波法是对递推平均滤波法的改进,即不同时刻的数据加以不同的权。通常是越接近现时刻的数据,权取得越大。给予新采样值的权系数越大,则灵敏度越高,但信号的平滑度越低。 2、例程 #define N 10 #define CoeSum 55 constCoefficient[N]={1,2,3,4,5,6,7,8,9,10}; uchar Data[N]; uchar AAGAFilter() { uchar i,Value,sum; sum=0; Data[N]=GetAD(); for(i=0;i<N;i++) { Data[i]=Data[i+1]; sum+=Data[i]*Coefficient[i]; } Value=sum/CoeSum; return(Value); } 十、消抖滤波法 1、将每次采样值与当前有效值比较,如果采样值=当前有效值,则计数器清零,否则计数器加1。然后,判断计数器是否>=上限N(溢出)。如果溢出,将本次值替换当前有效值,并清计数器。 2、例程 #define N 20 uchar count; uchar Value; uchar Avoid() { uchar NewValue; if(NewValue==Value) count=0; else { count++; if(count>N) { count=0; Value=NewValue; } } return(Value); }
地心一号-超迷你自平衡小车 大家好,我是MCU起航,这几天跟大家聊聊平衡小车~~~ 大约是2016还是2017年,我在QQ空间发了一个视频,里面是一个刚调好速度环的小车。当时很多人盼着我能出教程,我也想! 但因为成本与技术问题,它被搁浅了! 有人会疑惑,位置环不难吧!确实,网上有很多例程,但如果使用现有的方案,电机的价格会让很多人望而却步!所以,我想了很长时间,来解决这个问题...............
51单片机的逆向学习 大家好,我是MCU起航。是的,就是那个《故事贴-我把单片机玩死了》的楼主。当时只是顺手写了个帖子,没想到引发了这么多单片机学习者的共鸣,也让我结交到了很多志同道合的朋友。这篇帖子现在的浏览量已经破50万了,如此高的浏览量,让我一直有些不敢相信。
玩一玩单片机-蓝牙模块 因为前几天看到吧里有人在玩蓝牙模块,看的我手痒,于是也买了一块来玩玩。结果空间里好多朋友问我是怎么调试的。简单的通信很容易建立,半天就能搞定。我简单的写一下,加上我当时面对这个模块时候的思考。
故事贴-我把单片机玩死了 大家好,我是 MCU起航,千千万万个苦逼的单片机从业者中的一个。电子工程师一枚,1986年生,09年毕业,在京工作四年。 简单讲下我当年学单片机的故事,注意:本贴只讲故事和经验,不讲技术和原理。那么现在,就让时间回到2009年的夏天。
模电资料集结号-共105篇资料,包括解决方案,应用电路,设计经验 行内公认:数电易,模电难!为什么? 因为数字电子太好学了,只是简单的高低电平信号。高电平是5V或者3.3V,用数字1代表,低电平是0V,用数字0表示。想要什么信号,就让MCU输出什么信号就是了。 计算起来也相对方便,0和1之间的加减乘除,你觉得能难到哪里?当然了,一些复杂的算法除外,因为它们要涉及到高等数学里面的一些公式,不是单纯的加减法能解决的。 咳咳,喝口水.....................
50个555定时器常用电路-中文版-免费送了!! 本来是想昨天发布,结果昨天不知道咋回事,帖子没法回复,结果被吧务删了,哎,好丢人。今天继续。这是网上流传最广的一部555定时器常用手册,不过貌似只有英文版
【BUG反馈】03-28丨无法回复 发贴失败 未知错误,错误号:230271 自己发的帖子,没有办法更新了,请问下这是怎么回事,求解决!
50个555定时器常用电路-中文版-免费送了!!!! 这是网上流传最广的一部555定时器常用手册,不过貌似只有英文版
【iPad反馈】升级了一次,之前添加的账号都没了 百度贴吧客户端:2.0.1,7.1. 硬件设备:iPad 4G. 网络环境:WiFi环境.
应欢欢成功了没?闲的蛋疼,我来猜一猜! 按照土豆的逻辑,每次冲击境界,都要半步轮回,半步符师什么的,所以这次欢欢妹子冲击符祖,估计也是半步。 林动这个时候渡劫,连续三劫,按照猪脚无敌的模式,应该也是成功了。虽然他身上有那个什么混沌什么太上,但是,距离真正的符祖,还差一些。 他们两个人,都很接近了,但是都差一半!两个一半,合起来,就是一个。方式么,按照土豆整天YY的低俗念头,肯定是XXOO。 最终的结果,肯定是林动小弟弟成为了符祖,然后可能的话欢欢也成了符祖。然后就是一场昏天黑地,哭爹喊娘的斗法,然后就皆大欢喜了。
后面的情节不用等了,一猜就是………… 根据土豆兄的思维模式,肯定是林动拼命往回赶,刚好在第三天赶到。刚好那几个老家伙在逼宫,刚好青檀快招架不住了,刚好心里绝望了,刚好一个大招就要打过来,刚好心里准备说遗言了,刚好林动出现了。 就是不知道土豆准备拖几章了
看了观主被砍的那一章………… 看了观主被砍的那一章,才发现原来狗血才是万能的道门法器!不管你是天魔境,寂灭境,无量境,不管你用什么刀,画什么符,都不如一盆狗血给力啊!
大师兄是什么? 大师兄就是这部戏里面镜头最多的一个NPC! 看了这么久 将夜,忽然脑子里蹦出个念头,大师兄就是NPC啊,玩过游戏的的都知道NPC是啥!平常的时候基本就是万能的,一旦到了关键时刻,很难指望!
不知道要强上多少???????? 土豆啊,你嘛比的能不能少写几句这个,老子每看一章至少要看见两句这种话,你烦不烦啊,老子都快烦吐了!!!!!!!
主机屋很强大 用了一年多了,没什么问题,很稳定!
主机屋,用了一年了 很给力,很稳定
首页
1
2
3
下一页