单片机的 adc 采集通常只能测量零到五伏,那如果我想测量两百伏,应该怎么做呢?很简单,只需要串联一个电阻分压就可以了,但实际应用中通常并不会这样做。 梁柏福对人的安全已经造成了影响,同时可能因外部的意外情况,高压会引入单片机从而导致损坏。所以我会想办法把高压隔离开,这样即保证人的安全, 又确保了电路的稳定。我找到一个 c 八七 x 隔离芯片就可以实现,它是一个光学隔离芯片,可以将一侧的零到二伏电压通过光电信号变送到另一侧的零到二伏差分信号, 只需要一个运算放大器调整到单片机合适的电压,就可以实现高压安全稳定的 adc 采集。并且我还做出来了电路板进行实际测试,这边是四 十倍的分压电阻,把零到八十伏的电压降至零到二伏,这边是一个隔离 dcdc 电源,这个就是 c 八七 a 隔离芯片,通过一个运放芯片 把差分零到二伏转换成对地得零到二伏,这样这个电路板就实现了将零到八十伏隔离变送乘零到二伏的电压。不过隔离芯片价格比较高,低成本的项目有没有其他的替代方案呢?欢迎评论区留言获悉更多电路知识,点个关注!
粉丝3448获赞1.0万

今天和大家讲一下 stm 三二具体如何实现对信号进行频谱分析。首先要知道什么是 fft, 也就是快速负利率变化,它的作用就是把信号从时域变为频域。 信号在时域里是一条随时间起伏的曲线,只能看到幅度的变化快慢。在频域视角,横轴变成频率各分量一目了然。 比如说电机轴承出现了磨损,整动里就会冒出本来没有的高频。 又比如打呼噜的声音,能量集中在一百五到四百五赫兹,这些特征在频域里能够很好的识别判断。这里使用信号发生器模拟产生的信号。使用 s t m 三二 f 四零七、 z g t 六的 adc 来采集数据, 通过 dma 缓冲和阿姆官方的 dsp 库来实现 fft 计算,最后把数据通过创口给上位机显示在图片 x 里面,就需要安装 dsp 库并起用,然后设置好 adc 的 时钟, dma 传输等 具体的代码实现可以直接看提供的源码。先启动 dma 和 adc 转换,再把 adc 的 数据进行归一化处理封装, 接着调用阿姆的 fft 函数进行处理,把处理的结果通过创口传给电脑上位机显示。如此反复不停的采集计算、上传。 在上位机上可以清晰的展示频谱分析的效果。比如一个一百一十千赫兹和二十千赫兹的混合信号,在矢域上很难进行分析,而在频域上一眼就能看到这个信号的组成。 直射对五百一十二个伏点数进行 f、 f t 和球模只需要一毫秒左右,增加到四零九六个伏点数也只需要三毫秒左右。

简直是天大的耻辱!你用 s、 g、 m 三二的内置十二位 a, 一 系读回一个参照值,问你这个数字代表着多少伏的电压。你居然说,等一下,我先去百度一下 a、 d、 c 的 参考电压接的是多少,你不知道十二位分辨率到底意味着什么你也不清楚。至于转换公式呢,更是直接朝一下历程里那个魔法的 除以四零九六,再乘三点三,让你换个五伏的参考员,你就彻底蒙了。让你启用内部参考员,你更傻眼了,你连 a、 d、 c 的 参考员与规则通道之间的区别都一概不知。等到面试时让你首推 a、 e、 c 的转换,结果你铁定搞不定。就这也配说自己会玩单片机?赶紧艾特你那个只会用现成历程却不懂背后原理的朋友,让他立刻算一下二点五伏输入在十二位 a、 c 里输出的数字量是多少。把模拟电路的基础给我补回来!一、吃透 adc 的 分辨率、参考电压和量化误差, 必须能做到把原始测量值手算成实际的电压值。或者弄明白测量率保持电容输入阻抗会怎样影响测量精度,别再拿几十千欧的输入阻抗去测量高速变化的信号。三、 学会用 g、 m 配合 edc 进行多通道连续踩样,再利用软件校准和滤波算法提升数据精度。不甘心摆烂想要翻身的,来三个六,我给你一整套迁入式入门学习路线图和资料包,千万别连着电压值都算不对,就喊自己是迁入式工程师。散会。

先记住这条铁律,只要涉及高速, adc 裁样就必须上 dna。 没有例外,使用 cpu 轮询来裁样数据出错的问题只是时间问题。很多 初学者觉得轮询方式代码简单好理解,但背后藏着三个致命缺陷,第一, cpu 在 等待 adc 转换的过程当中完全被占用,其他任何任务都得靠边站,整个系统几乎抵败。 第二,这种方式的实际产量极其有限,受限于 cpu 的 等待和调度开销,往往只能够跑到几 k 赫兹, 根本谈不上高速。第三,一旦涉及到多通道采样,比如说同时采集八个通道, cpu 就 得创行等待八次转换完成。各通道数据之间的时间差越来越大,采集回来的数据根本对不起。 正确的方案是配置 adc 连续转换模式,同时开启 dna 传输。以采集正弦波信号为例,错误的写法是在电子系中断里触发一次 adc 裁样,然后原地等待转换结束再取值。这样一来,中断的执行时间被大幅拉长, 系统响应迟钝,采集出来的波形某次一堆完全失真。换成 dma 方案之后,整个流程就顺了。 adc 配置为连续转换模式,设定好合适的采样时间, dma 负责把每次转换的结果自动搬运到内存宿主里, 全程不需要 cpu 接入。另外取一个定时器,比如说每五毫秒触发一次中断。中断里只做一件事,把电源宿主里的最近数据快速拷贝到处理缓冲区,然后立即退出主循环,从缓冲区里取数据做滤波。 fft 或者波形显示,逻辑清晰,互不干扰。 这套 adc 加 dma 连续采用配合定制器定期搬运的架构是全是信号采集仪的标准模式, adc 和 dma 在 后台自主转运, cpu 的 占用率压到了接近零,采用率轻松突破七百 k 赫兹,两相对比差距一目了然。 如果你有不同的时间思路或者踩过类似的坑,欢迎在评论区交流,觉得有用的话呢,欢迎关注一下再走哦!

你要是连 adc 转换流程都搞不明白,那你去面试纯粹是浪费时间。在这个视频中,我将把 adc 转换的四个关键步骤一一讲明白,保证你听完就能记住,面试肯定对打如流。 adc 转换的第一步叫采用,你可以把模拟信号想象成一条平滑的曲线。采用,就是每隔一段时间在这条曲线上打一个点。比如说你录音的时候, adc 可能每秒钟要在声音波形上打四万四千一百个点, 这就是我们常说的四十四点一千赫兹测量率。为什么要这么频繁的去测量呢?因为测量越密集,你捕捉到的信息就越完整。就好比你拍视频, 每秒拍六十帧,肯定比拍二十四帧更流畅,对吧?这里有个重要的理论叫耐克斯特定律,简单说就是你的测量频率至少是信号最高频率的两倍,否则就会丢失信息。第二步是保持,你想啊,测量的那一瞬间,信号值就被抓取下来了,但模拟信号它一直在变化啊。 所以我们需要一个采用保持电路,把这个瞬间的值给动住,保持住不让他变好,让后面的电路有时间去测量他。这就像你给一个跑动的小孩拍照,得让他先定住那么一瞬间,照片才不会糊。 这个保持的时间很短,可能就几微秒,甚至更短,但非常关键。第三步是量化,这是这个流程里最核心的部分。刚才我们采用得到的值,理论上可以是任意一个数,比如说三点一四一五九这样的小数, 但数字电路没法表示这么精确的数啊,他只能用有限的几个数字来表示,比如说你用八位 adc, 那 么就只能表示二的八次方,等于两百五十六个不同的数字。 假设你输入的电压范围是零到五伏,那就要把这五伏分成两百五十六份,每份大约是零点零幺九五伏。 如果采用得到的电压是一点二三四伏, adc 就 会找到最近的那个档位,可能是一点二三零伏对应的数字六十三。你看这里就有误差了,这个误差叫做量化误差,位数越高,分的越细,误差就越小。 这就是为什么我们说十二位 adc 比八位 adc 精度更高,因为十二位能分成二到十二次方,等于四零九六个档位,精度提高了十六倍。 第四步是编码,量化完成之后得到一个数字,比如说刚才说的六十三,现在要把它转换成二金字代码,六十三,转换成二金字就是零零幺幺幺幺幺幺,这个金字数就可以被单面机或者说处理器读取和处理了。 不同的 adc 可能是不同的编码方式,比如说有的用圆码,有的用补码,有的用格雷码,但核心思想就是把数值转换成零和一的组合。说到这,你可能会问,那 adc 有 哪些类型呢?其实根据实践方式不同,常见的有好几种, 最简单的是逐次逼进行 adc, 它就像你拆数字游戏一样,先拆中间值,然后根据大了还是小了,一步步缩小范围,最后逼进真实值。这种 adc 速度适中也不错,用的最广泛。 在实际应用中, a、 d、 c 的 性能指标特别重要,除了刚才说的分辨率,还有位数,还有转换速度,用每秒测量次数来衡量,有的 a、 d、 c 一 秒能测量几百万次,有的可能只有几千次。 还有种指标叫信噪比,表示有用信号和照射的比例,这个值越高越好。另外还有信信度、失调、误差,这些参数 都会影响转换的准确性。现在的 adc 技术已经非常成熟了,从几毛钱的八位 adc 到几百块的二十四位高精度 adc 都有。在互联网智能硬件、音频处理、传感器采集这些领域, adc 都是不可或缺的。可以说, adc 就是 连接真实世界和数字世界的桥梁,没有它,我们的数字设备都是聋子瞎子, 感知不到外面的世界。所以啊,下次你用手机录音、测体温,玩游戏的时候,别忘了背后有个小小的 adc 在 默默工作,把模拟信号一个个转换成数字信号,让我们的智能设备真正智能起来,这就是 adc 转换的全部流程,是不是没你想的那么复杂?如果觉得有收获,记得点赞关注我们下期见!

我们今天来讲一下单片机的 adc 踩压, 然后这节课哈学习的内容是呃他的采样以及数据转换,然后我们通过呃 usb 转二三二的串口来进行数据打印,然后可以很直观的把这个采集到并转换的数据和转换 在我们的那个串口上进行打印。然后我们首先来讲一下他的那个 adc 的一个简单的概数,然后我们用的是 astc 八 a 七 哎,然后这个单系列的单片机,然后我给大家看一下我们的那个原理图哈,我们开发版呃这个简单的原理图,然后这个是一般精度哈,一般精 精度就是用的这个,嗯,这个图,然后型号是 stc 八 h 三 k 四百 s 二这个型号,这个型号性价比很高哈,四五块钱一个,然后功能很强大,他有两个串口, 两个两个串口,然后十二位的 adc, 然后应该是有十五个通道的 adc, 嗯,然后我们这个地方是根据他的那个呃官方手册哈,嗯,做的他的,做的他的这个, 嗯,他那个急诊电压,对吧?我们 vcc 就是电脑供电 五福,然后过来通过一个电杆,然后立一下波,然后把这个呃再给基准基准,他的那个呃调到那个基准菱角上, 然后我们现在不看原理图了,我们来继续看一下我们的介绍,他是这个这款,我们选的这款呢就是十二位的高速 a d 啊, a d 转换器,他是集成的,直接吃这个 把它数据的我们数据采集出来过后哈,有两种对齐格式,要么是左对齐,要么是右对齐, 然后我们接下来看一下哈,这个就是他的那个 adc 一般精度的哈,一般精度的图是这个,然后我们跟他的类似 四号加一点啊绿波,然后让他的那个基准电压更更,那个更更稳定, 然后我们后边哈,我们后边是要对他计算器进行配置,对吧?说实话,然后就是数据转换,然后我们先简单的看一下他的那个,他的简单的看一下他的手册,因为这个还是需要了解一下的 啊,了解一下他的那个计算器哈,嗯,大家来看一下他的这个计算器,然后对照咱们的那个例子来看一下他的那个,嗯,季节配置应该怎么配置啊? 我们直接来讲一下他这个查询方式啊,我们一般是用的查询方式,然后然后这个地方哈,他这个前面哈,他这个,嗯,选的是 一点零,然后进行他的那个啊,一个配置,对吧?这个是他的配置,然后进来过后哈他, 嗯,启动转换,然后应该是选择的的,选择通道过后哈,选择通道启动转换,然后有两个空操作过后哈,等待他的那个,一直等待他的那个, 等待他的那个啊,比一个标志位,然后,呃,转换完成过后,然后把那个清除过后,再把这个转换的数据他是不给 p 二的啊,他这个哈太简单了,咱们初学者 这个这样看不看不出什么效果,然后我基本上是我紧,我基本上是按照他的这个例子哈来进行延伸的,延伸的,然后, 嗯,给他做了一个优化调整这个程序,让大家能够更直观的看到他这个,对吧?也是个初始化啊,这个是创可的初始化,然后发送数据,然后这个是他 adc 的,对吧? init 他的一个初始化, 这个是他的初始化,然后这一个哈,这个他的数据转换,然后是等待转换完成,然后启动转换,这个是等待转换完成过后清除标志位,然后把这个高位哈左一往左移动八位, 然后跟第一位相货,然后两个加起来,然后再把这个数再反 啊,再做一个返回执法给他,然后过后,好,我们就可以在主程序里你进行来识别读取,然后我们看一下我们的程序哈, 他这个程序,呃,我我我感觉我的相对写的比他的还更简单,还更容易看哈,更容易看,然后我们看一下我 ppt 上哈,我已经把他那个配置出已经给他敲出来了,然后我们首先是要配置他的计算器哈,也就是他的初始化,对吧? 然后我们要选择,因为我们用的是零点零这一个通道,所以说 p 零的话,我们零点零,对吧?啊?零点一他就要给他弄成那个输入模式, 输入模式就是双向,双向,双向,双向口,然后呢?呃,然后呢?我们来啊,下边这个哈是他那个官方的例子上,然后 粘贴过来的,然后这个是你把设置他的持续 内部四驱,然后这个是一个配置,然后后边是他的一个转换哈, 对吧?然后我们这个呢是可以选择他的通道编号的,对吧?零到十五,零到十五,这个是他的高位,这个是他的低位,然后这一个号就是启动转换,然后呢我们做了一个通道编号的选择,对吧? 启动的时候选择还可以选择他的通道编号,然后然后几个空操作过后,我们就来等待他的那个 adc 的那个采样完成过后,我们再清除他的标志,然后我们再,嗯,再进行那个 打高位和低位的数哈,就给他进行一个一一,一位一位过后,嗯,然后给他弄成一个十二位的一个整形的一个数, 你给他强制转换成一个整形的数,然后我们再返回给我们的那个,对吧?返回给这给这一个函数 还是木?然后我们看一下程序哈,程序,因为为了节约大家的时间后,我已经提前把这个程序写好了,然后已经写好了,然后我们来看一下哈,我来理理一理我们这个程序啊,嗯,这个程序,呃, 首先是配置,这是发光二极管哈,两个运行的指示灯,然后呢一个延时函数,然后这里呢是串口哈,串口前面讲了我就不讲了哈,这是串口打印哈,串口打印说白了就是我们的单片机,对吧? 通过这个串口打一函数,把我们采集的那数发到串口上边,然后中段我是屏蔽了,因为我们这个不需要中断,然后,对吧?这里是也是我把刚才的那个复制过来了,这个就是他的一个初始化,我们配置计算器的一个初始化,这个是,呃必要的步骤哈, 嗯,这个没有死记实,没有必要去死记硬背哈,这个拿来,这拿来知道怎么用就行了。然后首先就是这个,是啊,配置我们的这个这个通道,对吧?然后配置成那个双向啊,标准 iv 口, 然后再进行持续的一个设置,嗯,然后起床,然后下边,哎,也是这个,然后主函数里边哈,主函数里边, 我们这里也是定义了,定义了变量,然后,呃,然后,对吧?然后这里也是上天过后哈,等待三秒,然后在窗口打印, 然后再等待一秒,然后进入那个主打那个循环体,然后,呃,然后呢?每差不多是一千个亿,一千个一毫秒就是一秒钟,那个我们的呼吸灯,把运行灯,然后闪一下,然后取一下反, 取下反,对吧?就这个字是零,那么取反就是一,然后一再去反就是零,所以说他在交替闪烁,然后我们同样也是间隔一秒, 从,然后我们来,哎,我们这个变量哈,这个变量 ad, 对吧?对,成零,然后然后我们调用了这个这个 adc 的那个 采集,并且转换到那个函数,然后第八,第八那个通道哈,通道编号是第八,第八,我们看一下,是 看这个吧?看,我,看我的原理图啊,第八是多少? adc? 八, adc 八,看一下好, p 零点零,对吧?是不是 p 零点零? 然后我们开发板上这个 p 零点零这个端口哈,我们就引一根线,要么插到他这个五幅上,要么插到零幅上,我们就可以看数,看,就可以看到数据,然后的变化,然后我们再来,哎,再来看一下程序 啊,程序好,我们没采集吃好,我们得到这个数,得到这个数过后哈,我们来进行,怎么啦?穿个打印,因为他这个,他这个 不能直接打印一串哈,他只能一个一个的打印哈, a d, 对吧?这是通道好,我们这是第八通道哈,到时候我们就可以显示 a d 八,然后等于是不是等于多少了?这个地方好,我们采集的这个数先除以一千,对吧? 先显示地显示那个千位,把他给计算出来,然后发送,然后再来再来取他的那个,呃,百位的数, 对吧?然后在十位,各位哈,我们依次那个来取,取出来过后一个一个打印哈, 对吧?个十百千号,然后这个就取出来了,过后哈分别一个一个的往窗口上发, 然后过后我们再给他发一个那个划横的一个指令,然后刷新一下,然后我们稍入一下 看一下。啊。好的,微信型号选了好,打开,然后我们来下载进去哈,我现在是把那个 p 零点零这一个端口是引到灵符上的哈, 啊?下载进去,我们采集到的数据应该是零才对, 好,出刷成功,对吧?零零零零零零零,对,然后我们现在又来怎么弄呢?我现在要把这个 查到五福上,看是不是四四千多,对,四千零九十五,对,四零九六,他从零零开始,对吧? 零九六,然后现在是四零九五哈,差不多,好,那说明我们这个程序是没有问题的, 然后,然后我们这节课就就讲到这里哈,因为提前做了准备,所以说讲的时间就比较短。 嗯,如果实在不知道怎么写的啊?到时候可以详细的看一下 啊,详细的看一下这个这个官方的手册,这个历历程哈,可以看一下。

