当前位置: 首页 > 编程日记 > 正文

adc采样的值跳动_嵌入式er必知:模数采样知多少(最全总结)

[导读]  生活环境周围信号万万千,对于一个嵌入式er。我们利用技术去了解世界、改变世界。而一个产品要与外界物理环境打交道,一个至关重要的触角就是采样真实模拟世界的信号,翻译成芯片可理解的数字信号,进而实现很多为人服务的应用产品。那么提到采样,ADC技术你绕不开,今天总结分享一下ADC的点点滴滴。

啥是ADC

在现代电子工业技术中,模数转换器(ADC, A/D,或A-to-D)是一种将模拟信号转换成数字信号的系统。ADC还可以提供隔离的测量,例如将输入模拟电压或电流转换为表示电压或电流大小的数字的电子设备。通常情况下,数字输出是一个与输入成比例的二进制补码,但也有其他的可能性。举些栗子:
  • KTV中麦克风将你唱歌的声音转成数字音频信号,经由信号处理,功放再播放出来
  • 数码相机将物体表面反射的光线转换为数字信号,从而成像
  • 疫情期间必用物资额温枪,将人体红外辐射经由光电转换成电压,最终转换为数字信号进行温度显示
  • .......举不胜举。
ADC将连续时间和连续幅度的模拟信号转换为离散时间和离散幅度的数字信号。转换涉及输入的量化,因此必然会引入少量的误差或噪声。此外,ADC不会连续执行转换,而是定期进行转换,对输入进行采样,从而限制了输入信号的允许带宽。
ADC的性能主要由其带宽和信噪比(SNR)来表征。
  • ADC带宽 (Band width):ADC的带宽主要由其采样率来表征。
  • ADC的SNR:SNR(signal noise ratio)是指信噪比,受许多因素影响,包括分辨率,线性度和准确性(量化级别与真实模拟信号的匹配程度),混叠和抖动。ADC的SNR通常以其有效位数( effective number of bits:ENOB),它返回的每个度量的位数平均来表示,而不是噪声。理想的ADC的ENOB等于其分辨率。
故,选择ADC以匹配待数字化信号的带宽和所需的SNR。如果ADC的采样率大于信号带宽的两倍,那么根据Nyquist–Shannon采样定理,就可以实现完美的重构。量化误差的存在甚至限制了理想ADC的SNR。但是,如果ADC的SNR超过输入信号的SNR,则其影响可能会被忽略,从而导致模拟输入信号的本质上是完美的数字表示。
整这么多文字还是不直观易懂,到底啥是ADC,来个会动的图吧:034882ab641062e414975399ecfaa8fd.gif

须理解的指标

分辨率

ADC看成一个黑匣子,基本的有一个模拟输入及其等效数字输出。下图 所示示例为一个N位ADC。N通常是6到24之间的任何值,常见的是8、10、12或16位。参考电压可能为单端电压,也可能为一个~,是一个正负电压参考源。17acb378771e77c003cf726aa29ea913.png输入是一个模拟电压,范围从0到参考电压,参考电压取决于实际ADC及外围电路。假设使用N位,则可能有个可能的数字输出值,则1位表示的值为。在很多书上也称这个指标为LSB(Least Significant Bit)。
这便是分辨率的概念。模数转换器的分辨率表示在模拟值范围内它可以产生的离散值的数量。该分辨率决定了量化误差的大小,因此决定了不使用过采样的理想ADC的最大平均信噪比。
举个栗子,如果给定ADC的最大输入值为5.0V,而ADC为10位类型,则每一位表示。这个ADC的分辨率,或者说量化步长,是4.89 mV。这是它的绝对理论分辨率。在这种特殊情况下,信号的分辨率不能高于。这个极限称为量化误差,所有的ADC,即使是完美的ADC,都有一定程度的量化误差,具体取决于ADC的分辨率。分辨率的数学定义为:其中及为ADC的参考电压,M为ADC的量化位数。可见M越大,Q数值越小,分辨率越高。
这个公式简单解读:就是将参考电压按照进行等分,比如10位ADC,就是将参考电压等分成1024份,输入电压与参考电压之比乘以1024,即为ADC的值。故

量化误差

量化误差是由理想ADC中的量化过程产生的。由于ADC的模拟输入电压与输出数字化值之间的存在舍入误差。 在理想的ADC中,量化误差均匀地分布在和之间,并且信号具有覆盖所有量化水平的均匀分布,因此信号量化噪声比SQNR(Signal-to-quantization-noise ratio)定义为:其中,M为ADC的位数,M位数越大或越高,SQNR也越大。

精度

量化误差和非线性是模数转换器所固有的误差指标。用最低有效位(LSB)的单位进行度量。比如一个10位ADC,LSB为。

非线性度

实际使用的ADC除了上面说的量化误差外,还具有更多的误差源:
  • 差分非线性误差DNL(Differential Non-Linearity):当ADC输出在应该改变的时候没有改变,就会出现DNL误差。例如,假设给定输入的当前输出代码是01101100,并且输入值增加了半步量化。代码应该是01101100 + 1位,或者01101101。当输入电压低于当前输入电压时,也会发生相反的情况。此时由于种种原因,这种情况可能不会发生。在本例中,ADC的误差为±1位DNL。
  • 积分非线性误差INL(Integral Non-Linearity):如果量化水平在整个输入范围内分布不均匀,就会出现INL误差。例如,某ADC具有12位(4096个计数)分辨率和4.096V的参考电压。每个比特数正好表示输入电压变化的1.000mV,因此,输入电压为4096 mV,输出电压为1111 1111 1111,即0xFFF。对于某些adc,输入4095mV,甚至4094mV,仍然会得到0xFFF的数字输出。实际情况是,在整个输入范围内,1位的值发生了非常微小的变化,比如1.001mV或0.999mV。积累的误差会导致一个或两个比特精度的全量程误差。
在为特定应用指定ADC时必须考虑这些因素。6ec0919471c3da62d5f1cd46b0a1cadf.png所有ADC都存在由其物理缺陷引起的非线性误差,导致其输出偏离其输入的线性函数(或其他函数,在故意使用非线性ADC的情况下)。这些误差有时可以通过校准来减轻,或通过测试来避免。所谓校准,比如可以通过量点线性校准,假定y为ADC数值,x为输入模拟电压:其中:
应用实施策略:将上述k/b,利用两个点进行校准,将校准数据k/b存储在非易失存储器中。补充说一下:工程实践中需要校准的原因还因为选取的外围电阻、电容器件都有误差,所以这也是另一个需要标定的重要原因。

采样率

模拟信号在时间上是连续的,因此有必要将其转换为数字序列,这是数字信号处理的基础。因此,需要定义从模拟信号中采样数字序列的速率。该速率称为转换器的采样率或采样频率。可以采样连续变化的带限信号,然后可以通过重构滤波器从离散时间值中再现原始信号。奈奎斯特-香农采样定理表明,只有当采样率高于信号最高频率的两倍时,才可以忠实再现原始信号。个人在使用时,一般会选4倍以上。由于实际的ADC不能进行瞬时转换,因此在转换器执行转换期间(称为转换时间)输入值必须保持恒定。一个被称为采样保持电路——在大多数情况下,它使用一个电容来存储输入端的模拟电压,并使用一个电子开关或栅极来断开电容与输入端的连接。许多ADC集成电路包括内部的采样保持电路模块。图中的T为采样周期,其倒数就是采样频率。0d38924201102c4db572b536bec509fc.png

混叠

ADC通过在不连续时间间隔(离散的含义)内对输入值进行采样来工作。假设以高于奈奎斯特速率的频率对输入进行采样(定义为有用信号频率的两倍),则可以重构信号中的所有频率。如果对高于奈奎斯特速率一半的频率进行采样,则会将它们错误地检测为较低频率,这一过程称为混叠。之所以会出现混淆,是因为每个周期对函数进行两次或两次以下的瞬时采样会导致丢失周期,从而出现频率错误地降低的情况。例如,以1.5 kHz采样的2 kHz正弦波将重构为500 Hz正弦波。5859398652a3e588b7f71a7f6f2c58e3.png为了避免混叠,ADC的输入必须经过硬件低通滤波,最简单的实现形式为一阶无源RC滤波网络,以去除采样率一半以上的频率。这种滤波器被称为抗混叠滤波器,它对于实际的ADC系统至关重要,该系统适用于具有更高频率内容的模拟信号。在需要防止混叠的应用程序中,可以使用过采样来大大减少甚至消除混叠。例如:六种不同采样速率采集的数字序列重建的4种波形。其中两种波形在采样率足够情况下未出现混叠。另外两个说明了在较低速率下会失真(混叠增加)。68411c7937d272d8c2118273f438aa42.gif

过采样

为了经济起见,通常以所需的最小速率对信号进行采样,结果是引入的量化误差是白噪声在转换器整个通带上的扩散。如果以远高于奈奎斯特速率的速率采样信号,然后进行数字滤波以将其限制为信号带宽,则会产生以下优点:
  • 过采样可以更轻松地实现模拟抗混叠滤波器
  • 降低的噪声,尤其是在过采样之外还采用噪声整形处理后。
白噪声长啥样?6c19f5c119a44753bec42493a55fb1cc.png过采样通常用于音频ADC中,与典型晶体管电路的时钟速度(> 1 MHz)相比,所需的采样率(通常为44.1或48 kHz)非常低。在这种情况下,可以以很少的成本或不增加成本就可以大大提高ADC的性能。此外,由于任何混叠信号通常也都在频带外,因此使用非常低成本的滤波器通常可以完全消除混叠。下图比较直观,可以看出提高采样频率,可以更为真实的重建原始信号,而采样频率低些,对于信号的细部则无法准确重建。b72be50cfe7e91c5e6e04941965dab9d.png

ADC类型

积分型ADC

优点
  • 积分型ADC分辨率高,位数可做到12位甚至更高
  • 线性度非常好。本质上,输入端与一个集成的参考电压相比较来决定输出端,所以线性度将取决于比较器的精度。
  • 电路实现拓扑简单,用于实现这些设备的元件相对较少,因此电路相对简单且生产成本较低。
缺点:
  • 主要缺点是转换速度慢。N位ADC,输出可能需要长达2个N的时钟周期来转换单个采样点
  • 转换原理都是基于对电压积分并将积分后电压与另一电压比较以控制计数,计数输出即为ADC输出。积分对象要么是基于参考电压,要么是基于参考电压和输入电压。
  • 主要用于传感器应用和诸如电压表和电流表等设备,在这些设备中,精度比速度更重要。换句话说积分型ADC采样速度比较低,但精度非常高
  • 积分型ADC有不同的种类,常见的有单、双斜率积分等。增加一个“斜率”,以牺牲转换时间为代价而增加精度。

单斜率积分ADC

9c734a32bcf53e1958f321915d0bd61f.png比较器将输入电压与集成基准电压的值进行比较(请注意,由于已连接至运算放大器的反相输入,因此我们将设为负)。同时计算时钟周期数。当积分器输出等于时,比较器输出逻辑“ 0”,触发计数器和积分器复位,锁存器保持数字输出。这就是转换时间,知道为啥说这种积分型ADC慢了吧。来看下最差的情况吧,假设输入电压,假定,假定是20位ADC,那么!

双斜率积分ADC

1bf75ad667e07fafad6069b603f072c1.png双斜率ADC与单斜率ADC的不同之处在于,现在将与地进行比较,并集成了两个电压和。刚开始时,负输入连接到积分器,使斜升直到计数器溢出。由于在反相输入会切换到一个负值进行积分,因此积分器输出将始终为正且大于零,因此计数器将继续运行直到溢出为止,这需要2N个时钟周期(= T1)。0efc02a571a84fd387935e8af9b868ff.png在T2时刻,将等于与之和,且为0,也即:则因此,即为ADC转换的原理,双斜率比单斜率ADC更慢,由于执行了两次积分, 与积分器斜率相关的误差将被抵消,从而从原理上提高了精度。

Sigma-Delta Σ-∆ ADC

99ca7a7d5eed6391b7c1571b6fa30cbc.png从输入端开始,差动放大器产生的输出为Vin与1位DAC输出之间的差。1位DAC的输出可以是以下两个值之一:或。在此拓扑结构中,可将积分器视为取前一个值和当前输入值的移动平均值。因此,假设刚开始时比较器正向段固定在高于0V的很小一值,比较器反转。其值将为高或1。然后,DAC输出将为。在下迭代中,将从的当前值中减去该值。由于先前的值为0V,因此积分器输出现在将为– Vref。此时,比较器输出将为0,而DAC输出将为。在下一个采样中,由于前一个值为,积分器输出将为0,并且差动放大器实际上将减去,从而将加到  .比较器输出将为1。此过程继续迭代进行,因此,对于0V输入,比较器输出将为101010…的稳定流。记住逻辑1表示,逻辑0表示,那么如对N个样本进行采样并取平均值,则很容易看出平均值为0V。比较器之后的处理块将简单地将其输出为单个值0000…,假设参考值为( ~)或2 x。现在,假设为1V,这是一个5V ADC。为±2.5V。按照与之前相同的步骤进行迭代操作,输出将为:1011101…输出为1.07V。概括起来:
Σ-∆ ADC 对所处理信号进行过采样(这个概念见模数采样知多少),并对待处理信号进行低通滤波。通常,在过滤器之后使用Flash ADC转换的比特数小于所需的比特数。所产生的信号连同由FLASH离散电平产生的误差,被反馈回并从输入中做差然后输入到滤波器。这个负反馈的可对噪声形成抑制作用,使它不出现在期望的信号频率。ADC之后的数字滤波器(利用抽取滤波器)可降低采样率,滤除不想要的噪声信号并提高输出分辨率(故称为sigma-delta调制,也称为delta-sigma调制)。

Flash ADC也称直接比较型

FLASH ADC的原理可能是最容易理解的。下图是一个两位ADC的示意图,由许多比较器组成,每个比较器都被提供了比上一个基准值高一个位值的基准电压。因此,对于一个8位ADC,需要256个这样的比较器。对于10位,则需要1024。e3a895f3241a0bf79592fcd9e182a9a5.pngFLASH ADC(直接比较型)速度很快。它直接转换输入,而不需要任何采样或繁重的后期处理。问题是,它需要很多比较器,而且很多比较器占用了芯片上的大量硅空间。因此,只有在需要其他ADC实现方法无法达到的极高速度时才使用Fash ADC。

二分法在硬件中体现

实际应用中,还有一个变种比较常用,半 FLASH ADC。它使用两步的过程来减少实际转换链中所需的转换器数量:
  • 首先,将输入信号与恰好位于半的电平集进行比较。如果它更低,那么最高有效的位MSB,被设置为0,输入被馈送到一个比较器链与参考电压设置为,以转换得到其余的位。
  • 如果输入信号高于,则将MSB设置为1,从输入信号中减去。比较器链再次用于获取剩余的位。所以,本质上,半步FLASH ADC,以牺牲一个额外的比较,来节省一半比较器。这种思路还可以继续推演扩展,比如4分 FLASH ADC等等。

逐次逼近寄存器SAR

逐次逼近寄存器(Successive Approximation Register):逐次逼近ADC使用比较器逐次缩小包含输入电压的范围。在每个连续的步骤中,转换器将输入电压与内部数字与模拟转换器的输出进行比较,后者可能表示所选电压范围的中点。在这个过程的每一步,近似都被存储在一个逐次逼近寄存器(SAR)中。例如,假设输入电压为6.3 V,初始范围为0到16v。对于第一步,输入6.3 V与8v (0-16V范围的中点)进行比较。比较器报告输入电压小于8v,因此SAR被更新为将范围缩小到0 - 8v。第二步,将输入电压与4v (0 - 8v的中点)进行比较,比较器报告输入电压高于4v,因此更新SAR以反映输入电压在4 - 8v范围内。第三步,输入电压与6v比较(4v与8v的一半);比较器报告输入电压大于6伏,搜索范围变为6 - 8伏。继续这些步骤,直到达到预期的解决方案为止。其拓扑结构如下,1c136fc7657d1ea779f719000291ec0e.png为了直观,看看前文的动图:c14947cfea701e4cd50fcb86211d81e2.gif

Pipelined ADC

流水线ADC(也称为子例程量化器)使用两个或多个流水线。首先,进行粗略的转换。第二步,用数模转换器(DAC)确定输入信号的差异。然后将这个差异转换为更细的值,并在最后一步中合并结果。这可以被认为是后续逼近ADC的一种改进,其中反馈参考信号由整个范围的比特(例如,4比特)的中间转换组成,而不仅仅是下一个最重要的比特。结合逐次逼近法和flash adc的优点,该类型具有速度快、分辨率高、模具尺寸小等优点。4613fdd19efdb78c5f69ef2fabfe332b.png在这个原理图中,模拟输入VIN首先被采样并由采样保持器(S&H)保持稳定,而第一阶段的flash ADC将其量化为三位。然后将3位输出馈给3位DAC(精确到12位),然后从输入中减去模拟输出。这个“剩余量”扩大4倍并被送入下一阶段(第二阶段)。这个增加的剩余量继续通过下级流水线,每一阶段提供3位,直到它到达4位flash ADC,将解析最后的4LSB位。因为每个阶段的位是在不同的时间点确定的,所以相同样本对应的所有位在被馈送到数字错误校正逻辑之前都与移位寄存器进行了时间对齐。请注意,当一个流水完成对输入样本的处理,确定本流水采集位并将残差传递到下一个流水时,它便可以开始处理从每个流水中嵌入的采样保持器接收到的下一个样本。这种流水线操作是高吞吐量的原因,这也是流水的概念。

先描述一下坑

本文来解析一个盆友在使用STM32采集电池电压踩过的坑。以STM32F4 的ADC属于逐次逼近SAR 型ADC为例进行分析,参考STM32F405xx  Datasheet,对于如何编写ADC程序就不做描述了。a57f6064112db49b4f1e21900eb14713.png3d37b6d5ca57e7df140bf7d682979129.png
采集电池电压,利用两个电阻将电池电压分压,然后送入单片机,当电阻如上分别取4M欧/1M欧时,ADC采集到的ADC值与万用表测得的ADC输入端相差很大,取30K欧以及10k欧时,则相差变小。
盆友咨询我这是为什么?我给出了建议,先卖个关子,先来看看应用最为广泛的STM32单片机的一些特性。

STM32 ADC:

STM32 12位ADC是逐次逼近型的模数转换器。它有多达19个多路复用通道,允许它测量来自16个外部源、2个内部源和VBAT通道的信号。通道的A/D转换可以在单次、连续、扫描或间断模式下进行。ADC的结果存储在左对齐或右对齐的16位数据寄存器中。模拟看门狗功能允许应用程序检测输入电压是否超过用户定义的、更高或更低的阈值。主要功能,具体操作,怎么编程这些细节,有大量的资料就不罗嗦了,主要来看看电气特性。

电气特性

94871439dff7ec35fa287fa7274b5145.png
  1. ADC 可支持采样频率受供电电压影响,供电电压高,可支持采样频率范围更高
  2. 可支持输入电压范围须在参考电压范围内
  3. 外部输入阻阻抗最大为
  4. 开关切换阻抗 最大为
  5. 内部采样保持电容 为4pF
3a63bf92adadf19b00a241e0ce97636f.png上面的公式用于确定误差小于1/4 LSB时允许的最大外阻抗。N = 12(12位分辨率),k是在ADC_SMPR1寄存器中定义的采样周期数。
ADC精度vs.负注入电流:应该避免在任何模拟输入引脚上注入负电流,因为这会显著降低在另一个模拟输入上执行转换的精度。建议在模拟引脚上增加一个肖特基二极管(引脚接地),这可能会注入负电流。
5a7fbc197d81ec2eac9e3fc2eb0374ee.png
Page 136 图例(上图中标识解释):
  1. 见表68
  2. 实际转移曲线的示例。
  3. 理想转移曲线
  4. 终点相关线
  5. ET =未调整总误差:实际和理想传递曲线之间的最大偏差。EO =偏移误差:第一个实际过渡与第一个理想过渡之间的偏差。EG =增益误差:最后一个理想过渡与最后一个实际过渡之间的偏差。ED =微分线性误差:实际步长与理想步长之间的最大偏差。EL =积分线性误差:任何实际过渡和终点相关线之间的最大偏差。
819a55412c99f32ce252e8d619dfb59c.png
寄生电容表示PCB的电容(取决于焊接和PCB布局质量)加上焊盘电容(大约5 pF)。寄生电容值高会降低转换精度。为了解决这个问题,应该减少fADC。

回到坑里

将盆友的电路等效绘制一下,忽略ADC采样通道内部ESD保护二极管,以及等效电流源,如下图:8dfa491d4971d1621fa62b8b2010ef77.png好了,这图一画出来,问题的原因就显而易见了,SAR ADC是将采样电容上的电压通过逐次逼近原理转换为数字量的,按上述图,由于R2为兆级电阻,那么等效加载在采样电容上的电压就不能简单的看成是R1/R2的分压了,此时ADC的输入阻抗在百50K欧级别,简化定性看一下,忽略分布电容影响,计算方便将输入阻抗看成50K直流电阻(实际深入动态分析的话则不可忽略,假定电池电压为5V),具体计算就不做了。为什么电阻选这么大呢?我想估计是为了将电池电压监控取样回路的电流降低,以节省电量。

跳出坑里

怎么办呢?我觉得这样应该可以:fc1ed3bebd90352745552e471b1cb39e.png找一个低功耗的运放做一个阻抗变换就可以兼顾两者需求,当然如果更完善一点,还可以考虑串入一个RC低通滤波环节,可以有效降低噪声。

总结一下

在单片机、DSP信号处理系统中,我们免不了要对物理信号进行采样,需要运用到模数转换器件,模数转换器万万千,那么要用好ADC器件,或者使用单片机、DSP内置ADC,了解这些技术指标以及其描述的真实含义,是非常必要的。熟悉各类ADC的意义,因为如前文所说,嵌入式设备免不了需要采集物理世界的模拟信号。信号各具特点,有的频率高,有的噪声多,有的需要精度高但速度可能不要很快等等。这里整理几种常见ADC(当然还有其他种类比如电荷平衡原理ADC、分时ADC、FM ADC、时间拉伸ADC、增量编码ADC、Wilkinson ADC等等)的原理及特点,了解各类ADC的基本特点,有助于进行器件选型、系统设计。对于单片机ADC的使用,个人总结了这几点:
  • 将输入短路,可测量热噪声。实际应用时,将输入端短路,采集一定数量的样本,由于热噪声符合高斯分布,可计算出其期望、方差,接入真实信号可以利用统计规律进行相应的噪声滤波处理。
  • 量化噪声,可以通过输入一定幅度及频率的正弦波,进行度量系统的量化噪声。
  • 设计ADC采样电路时,需要注意阅读芯片手册的电气特性参数,这个对于设计一个稳定的模数采集系统至关重要。
本文主要参考wikipedia, 加入了个人的理解,总结这个也是出于系统梳理知识的目的,并分享给小伙伴们,有喜欢的不妨点个在看,或者转发给需要的朋友。文中如有错误,也请联系我指出错误,不胜感激!本文授权转载自公众号“嵌入式客栈”,作者逸珺

-END-

推荐阅读

【01】单片机软件模拟SPI接口【02】不用买开发板, 使用 SkyEye 模拟 ARM Linux【03】加深理解SPI总线协议,单片机软件模拟SPI接口【04】牛人在Ubuntu上模拟ARM开发环境【05】单片机软件模拟SPI接口—加深理解SPI总线协议免责声明:整理文章为传播相关技术,版权归原作者所有,如有侵权,请联系删除1c965c53e3fb812c3d496cbd5acc8a8f.png

相关文章:

Swift泛型

泛型是为Swift编程灵活性的一种语法&#xff0c;在函数、枚举、结构体、类中都得到充分的应用&#xff0c;它的引入可以起到占位符的作用&#xff0c;当类型暂时不确定的&#xff0c;只有等到调用函数时才能确定具体类型的时候可以引入泛型。 泛型函数 定义 fun 函数名<T,S&…

02、在层级未知情况下通过递归查找子物体

1、在在层级未知情况下通过递归查找子物体 &#xff0c;这个主要是用于UI的的层级查找中 2、代码&#xff1a; 1 using System.Collections;2 using System.Collections.Generic;3 using UnityEngine;4 5 public class EnemyManager : MonoBehaviour6 {7 8 private GameOb…

CentOS装机必备-基本设置以及缺失文件

SecureCRT中注意不要使用以Ascii方式上传文件&#xff0c;只有在需要的地方才使用。主要是虚拟机中安装CentOS每次总会做一些设置&#xff0c;记录下来方便以后。 纯粹基本设置&#xff0c;比如本地SecureCRT可以连接虚拟机中的CentOS。 复杂的非基本设置见&#xff1a;Linux …

unity替换mesh测试

直接替换SkinnedMeshRender的Mesh&#xff0c;实现所谓断肢效果(不过最近发现&#xff0c;绑定多mesh似乎更好实现这样的效果。有时间准备写一篇)&#xff1a; 只要不改变两个Mesh原始文件的层级&#xff0c;就不会出现权重的错乱问题。 权重映射的测试&#xff1a;http://www.…

matlab中patch命令_matlab 放大平移图形是超出边界问题的处理

matlab提供的图形放大和平移函数zoom和pan可以通过鼠标来控制图形&#xff0c;非常方便&#xff0c;在工具条toolbar上也有对应的按钮。但是在放大或平移自己画的数据图是&#xff0c;有时会出现部分图形超出了坐标系的边界的问题&#xff0c;非常奇怪。经分析和试验&#xff0…

关于虚拟化技术软硬件兼容问题的探讨

VMware十几年前就已经出现&#xff0c;个人最早使用VMware的时间似乎是2001年或者2002年&#xff0c;当时可以在个人电脑上通过VMware虚拟多套系统&#xff0c;用于学习研究&#xff08;做实验往往会破坏系统&#xff0c;当时VMware在一些场景下还是比较流行的&#xff09;。由…

自己开发操作系统

算是《30天自制操作系统》的读书笔记吧&#xff0c;但是我觉得原书不少地方啰嗦&#xff0c;某些做法值得商榷 http://product.china-pub.com/36828381.二进制编译器 首先下载Bzl1621.lzh&#xff0c;这个可以把二进制数编辑的软件。 BZ启动画面打开img文件2.使用虚拟机加载IMG…

广东科技学院专插本c语言考卷_广东科技学院第二届红色文化节之红色影视经典配音大赛决赛...

红色经典影视配音大赛追忆革命岁月&#xff0c;传承红色文化&#xff0c;激扬青春生命&#xff0c;传承红色精神&#xff0c;为了让广大师生感受到红色影视经典的魅力和配音的乐趣&#xff0c;加深对红色文化的理解&#xff0c;提高师生们的爱国情怀。2020年12月16日19&#xf…

Social regularizations

trust-aware &#xff1a;如何从隐式信任中导出显示信任。链接预测就是搞这一方面的么&#xff1f; 和类似谱聚类的拉普拉斯矩阵结合在一起&#xff0c;没怎么看。

阿里P7架构师的成长之路

前言 系统架构师是近几年来在国内外迅速成长并发展良好的一个职位&#xff0c;它的重要性及给互联网行业所带来的影响是不言而喻的。很多程序员把成为一名优秀的架构师作为自己职业生涯奋斗的目标&#xff0c;但很多人努力却用不对地方&#xff0c;前段时间我与在阿里的P7架构师…

cad的文字嵌入线条_带你玩转CAD!

CAD画图已经成为化工人的必备技能。什么&#xff0c;这么多CAD必备技巧你居然还不知道&#xff1f;我该拿什么拯救你&#xff0c;我最最最最最最亲爱的旁友&#xff01;&#xff01;&#xff01;下面给大家整理了50个相见恨晚的CAD技巧&#xff0c;带你玩转CAD&#xff01;&…

BZOJ1315 : Ural1557Network Attack

找到一棵dfs搜索树&#xff0c;给每条非树边一个随机非0权值&#xff0c;每条树边为所有经过它的树边的权值的异或。 那么有2种情况是合法的&#xff1a; 1.一条边权值为0&#xff0c;一条边权值非0。 2.两条边异或和为0。 排序后统计即可&#xff0c;时间复杂度$O(m\log m)$。…

android原生跳转到外网

2019独角兽企业重金招聘Python工程师标准>>> super.onCreate(savedInstanceState); setContentView(R.layout.main); Intent intent new Intent(); intent.setAction("android.intent.action.VIEW"); Uri uri Uri.parse("…

linux上使用strace查看C语言级别的php源码【一种方法】

如果你希望看到C语言级别的php代码就需要使用strace 这个默认是安装了的&#xff0c;如果没有安装可以 #yum install strace查看httpd进程 #ps auxw | grep httpd有多个&#xff0c;必须停止apache [rootlocalhost usr]# /usr/local/webserver/apache2/bin/apachectl stop启动…

iphone8p百度云认证_探秘百度数据工厂Pingo的多存储后端数据联合查询技术

作者介绍&#xff1a;张志宏&#xff0c;2013年加入百度大数据部&#xff0c;曾作为核心成员参与百度大数据平台的搭建。目前是百度数据工厂Pingo核心团队的技术负责人。Pingo是来自百度的离线大数据集成开发平台&#xff0c;使用Spark作为计算引擎&#xff0c;深度整合了资源调…

JavaScript文件中调用AngularJS内部方法或改变$scope变量

需要在其他JavaScript文件中调用AngularJS内部方法或改变$scope变量&#xff0c;同时还要保持双向数据绑定&#xff1b; 首先获取AngularJS application&#xff1a; 方法一&#xff1a;通过controller来获取app var appElement document.querySelector([ng-controllermainCon…

web类协议脚本-飞机订票系统示例

以下是LR自带的飞机订票系统的Demo&#xff0c;希望能帮助大家。 Action() {int iRand;int iTmp;char *strTmpA;char *strTmpB;char *strTmpC;char *position;if ((strTmpA (char *)malloc(100 * sizeof(char))) NULL) { lr_output_message ("Insufficient memory avail…

ACCEPT()和ACCEPT4()

ACCEPT章节&#xff1a;Linux 程序员手册 (2) 更新&#xff1a;2010-09-10到 易美翻译 翻译名字accept - 通过套接口接受一个连接 概要 #include Esys/types.h> /* 参看 “注意小节” */ #include Esys/socket.h>int accept(int sockfd, struct sockaddr *addr, socklen…

没有提示_华为手机发出莫名的提示音,打开什么也没有?原来是它们在作怪

不知道你们有没有遇到过这样的情况&#xff0c;在使用手机的过程中会出现一个非常奇怪的现象&#xff1a;当你听到手机发出声音&#xff0c;打开手机却发现什么通知也没有&#xff1f;这一度让我感到很困扰&#xff0c;本着“打破砂锅问到底”的精神&#xff0c;终于让我找到了…

近段时间佛我就偶尔无

jo建瓯市金佛玩手机欧力紧凑度 我株型紧凑我阿九倨傲四局李嘉诚转载于:https://juejin.im/post/5b8e5263e51d4538e2278c9b

php内核探索方法与资源

PHP内核探索 TIPI深入理解PHP内核 风雪之隅PHP源码分析 《php扩展开发及内核应用》 百度XLQ Gods blog codinglabsPHP内核探索&#xff1a;从SAPI接口开始PHP内核探索&#xff1a;一次请求的开始与结束PHP内核探索&#xff1a;一次请求生命周期PHP内核探索&#xff1a;单进程SA…

feign调用走不走网关全局拦截_feign服务端出异常客户端处理的方法

在使用feign进行远程方法调用时&#xff0c;如果远程服务端方法出现异常&#xff0c;客户端有时需要捕获&#xff0c;并且把异常信息返回给前端&#xff0c;而如果在开启熔断之后&#xff0c;这个异常会被消化&#xff0c;所以说&#xff0c;如果希望拿到服务端异常&#xff0c…

配置Cesium编译环境

1、安装node.js https://nodejs.org/en/ 2、配置node.js 在node.js安装目录下新建node_global、node_cache两个文件夹&#xff0c;并把node_global添加到环境变量 eg.D:\app\nodejs npm config set prefix D:\app\nodejs\node_global npm config set cache D:\app\nodejs\node_…

迷你世界电锯机器人_迷你世界:三分钟制作超简单飞翔石像机器人报道!

更多游戏资讯&#xff0c;请点击上方蓝字查询&#xff01;哈喽&#xff0c;大家好&#xff0c;还记得我之前分享的超简单的石像机器人吗&#xff1f;不记得了吗&#xff1f;我再帮助大家回忆回忆&#xff0c;之前研游酱分享的石像机器人总共是分两篇文章&#xff0c;一个是不会…

J2EE 第二阶段项目之编写代码(四)

我的任务就是项目统计。 1 效益统计 1 教育效益统计表 &#xff08;教育效益统计表&#xff0c;增,改&#xff0c;查看&#xff0c;查&#xff09; 2 农牧林效益统计表 &#xff08;农牧林效益统计表&#xff0c;增&#xff0c;改&#xff0c;查看&#xff0c;查&#xff09; 3…

PHP安装扩展mcrypt以及相关依赖项 【PHP安装PECL扩展的方法】

一&#xff1a;Mcrypt简介 Mcrypt是PHP的一个扩展&#xff0c;完成了常用加密算法的封装。其实该扩展是对mcrypt标准类库的封装&#xff0c;mcrypt完成了相当多的常用加密算法&#xff0c;如DES, TripleDES, Blowfish (default), 3-WAY, SAFER-SK64, SAFER-SK128, TWOFISH, TEA…

Javascript到PHP加密通讯的简单实现

互联网上大多数网站&#xff0c;用户的数据都是以明文形式直接提交到后端CGI&#xff0c;服务器之间的访问也大都是明文传输&#xff0c;这样可被一些别有用心之人通过一些手段监听到。对安全性要求较高的网站&#xff0c;比如银行和大型企业等都会使用HTTPS对通讯过程进行加密…

MYSQL添加新用户 MYSQL为用户创建数据库 MYSQL为新用户分配权限

2019独角兽企业重金招聘Python工程师标准>>> 1.新建用户 //登录MYSQL >mysql -u root -p >密码 //创建用户 mysql> insert into mysql.user&#xff08;Host,User,Password&#xff09; values&#xff08;‘localhost’&#xff0c;jeecn’&#xff0c;pa…

uml具有多种视图_UML建模与架构文档化

UML(统一建模语言) 是用元模型描述的&#xff0c;元模型是4层元模型体系结构模式中的一层。此模式的其他层次分别是元-元模型层、模型层和用户对象层。在原模型层&#xff0c;UML元模型 又被分解为三个子逻辑包&#xff1a;基础包(核心、扩展机制和数据模型)、行为元素包(描述模…

insert into与insert ignore以及replace into的区别

insert ignore表示&#xff0c;如果表中已经存在相同的记录&#xff0c;则忽略当前新数据&#xff1b; INSERT INTO有无数据都插入&#xff0c;如果主键则不插入; REPLACE INTO 如果是主键插入则会替换以前的数据; 例 1.insert语句一次可以插入多组值&#xff0c;每组值用一对…