目录

一、电流检测ADC采样值处理的高效方法

二、ADC转换N次采样去最大最小求平均算法

三、STM32关于使用定时器触发ADC转换

四、ADC过采样提高采样精度

五、高精度ADC转换设计注意

附录1、LSB

------------------------------------------------------------------------------------------------------------------------

一、电流检测AD采样值处理的高效方法

在电机控制软件的编写过程中,经常要处理由AD采样回来的电流值。由于电流有正有负,电流传感器输出地电压也是以0为中点,而一般AD的输入只能为正电压,所以电流传感器出来的电压量需要通过加减运算电路加上一个偏移值再送入AD,以保证进入AD的值恒为正。

这里AD以TI的2812的片内AD为例,其输入范围是0~3V,电流传感器以LEM的LA25NP为例,量程25A,通常采用的电路是将LEM传感器的输出经过一个100欧的电阻接到地,获得一个以0为中点的电压信号,然后在送入比例运算电路,在比例运算电路的另一个输入端加入1.5V的偏移量,这样在满量程范围内使输入AD的电压信号始终保持在0~3V之内。电流为0的时候送入AD的电压是1.5V

在程序中进行电流运算时,一般要把AD采样结果取回来,然后再减去1.5V的偏移值,这样的到一个有符号数,然后再进行运算。

今天在阅读TI提供的电机驱动库代码时,发现里边使用了一种高效的处理方法,代码很简单,是这样的:

DatQ15 = AdcRegs.ADCRESULT0^0x8000;

2812的AD是12位的,AD采样结果存储在高12位。因此当AD满量程时,ADCRESULT0中的值是0xfff0。

这段代码仅仅通过一个按位异或运算就将AD的值减去了1.5V的偏移,并变成了有符号数。

至于具体为什么,举例说明,当电压为3V时,采样值是0xfff0,异或运算后高位的1变成了0,其余位不变,其结果是7ff0,如果将最高位看做符号位,那么有效位是11位。

------------------------------------------------------------------------------------------------------------------------

二、AD转换N次采样去最大最小求平均算法

  1. #include "STC15.H"
  2. #include "delay.h"
  3. #include "STCAD.H"
  4. #include "IO.C"

    void AD_Init()     //AD初始化
    {
        P1M1=0xF0;     //设置相应的I/O口为高阻    P1.4-P1.5-P1.6-P1.7
        P1M0=0x00;
        ADC_RES=0;
        ADC_RESL=0;     //ADC转换结果寄存器清0
        P1ASF=0xF0;     //设置相应的I/O口为ADC模拟通道   P1.4-P1.5-P1.6-P1.7
        ADC_CONTR |= ADC_POWER;     //打开AD转换电源
        ADC_CONTR |= ADC_SPEEDH;    //设置AD转换速度
        delay(1);
    }

    uint ADC_result(uchar x)    //AD转换结果
    {
        uint result;
        ADC_CONTR &= 0xF8;    //清通道
        ADC_CONTR |= x;    //切换通道,x为通道,如x=5,就是P1.5
        delay_us(30);    //切换通道延时
        ADC_CONTR |= ADC_START;   //开启AD转换
        delay_us(4); 
        while(!(ADC_CONTR & ADC_FLAG));   //等待AD转换结束
        ADC_CONTR &= ~ADC_FLAG;    //清除AD转换结束标志位
        result = ADC_RES << 2;     //ADC高8位结果左移2位
        result = result | ADC_RESL;     //合成10位转换结果
        return result;    //返回转换结果
    }

    uint U(uchar x)    //测量电压40次去除最大最小求平均
    {
        uint U[40],min,max,S;
        uchar i;
        
        for(i=0;i<40;i++)
        {
            U[i]=ADC_result(x);   //获取x通道ADC结果
        }
        
        for(i=1,min=U[0];i<40;i++)
        {
              if(U[i]小于min)   min=U[i];
        }//求最小值
        
        for(i=1,max=U[0];i<40;i++)
        {
            if(U[i]>max)  max=U[i];
        }//求最大值
        
        for(i=0,S=0;i<40;i++)  S+=U[i];
        S=S-min-max;
        S /= 38 ;   //减去最大最小求平均
        return S;   //返回计算结果
    }

------------------------------------------------------------------------------------------------------------------------

三、STM32关于使用定时器触发ADC转换

以STM32 ADC的常规通道为例(注入通道类似):

配合上ADC外设的框图:

如上图,STM32 ADC的常规通道可以由以上6个信号触发任何一个,我们以使用TIM2_CH2触发ADC1,独立模式,每次仅测一条通道,则ADC的配置如下:(以下代码使用STM32固件库V3.5)

void ADC_Configuration(void)

{

ADC_InitTypeDef ADC_InitStructure;

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

ADC_InitStructure.ADC_ScanConvMode = DISABLE;    //关闭通道扫描模式

ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;

//注意不要使用持续转换模式,否则只要触发一次,

//后续的转换就会永不停歇(除非CONT清0),这样第一次以后的ADC,就不是由TIM2_CC2来触发了

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC2;   //配置TIM2_CC2为触发源

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

ADC_InitStructure.ADC_NbrOfChannel = 1;

ADC_Init(ADC1, &ADC_InitStructure);

RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //配置时钟(12MHz),在RCC里面还应配置APB2=AHB时钟72MHz,

ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_1Cycles5);

ADC_Cmd(ADC1,ENABLE);

ADC_ResetCalibration(ADC1);

while(ADC_GetResetCalibrationStatus(ADC1));

ADC_StartCalibration(ADC1);   //Start Calibration register

while(ADC_GetCalibrationStatus(ADC1));   //waiting for finishing the calibration

ADC_ExternalTrigConvCmd(ADC1, ENABLE);

//设置外部触发模式使能(这个“外部“其实仅仅是相对于ADC模块的外部,实际上还是在STM32内部)

}

这里再注意一点上面左图最顶上的那句话:当外部触发信号被选为ADC规则或注入转换时,只有它的上升沿可以启动转换。这跟下面的定时器2的正确配置关系很大。

void TIM2_Configuration(void)

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_OCInitTypeDef TIM_OCInitStructure;

TIM_TimeBaseStructure.TIM_Period = 10000;   //设置100mS一次TIM2比较的周期

TIM_TimeBaseStructure.TIM_Prescaler = 719;   //系统主频72M,这里分频720,相当于100K的定时器2时钟

//采集时间 = TIM_Period/(系统主频/TIM_Prescaler) = 10000/(72*10^6/720) = 100mS

TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM2, & TIM_TimeBaseStructure);

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;   //下面详细说明

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//TIM_OutputState_Disable;

TIM_OCInitStructure.TIM_Pulse = 5000;   //TIM_Pulse < TIM_Period,也可直接置入10000,TIM_Period = TIM_Pulse

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;    //如果是PWM1要为Low,PWM2则为High

TIM_OC2Init(TIM2, & TIM_OCInitStructure);

TIM_Cmd(TIM2, ENABLE);

TIM_InternalClockConfig(TIM2);

TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);

TIM_UpdateDisableConfig(TIM2, DISABLE);

}

还是来引用参考手册的原图:(截图引自通用定时器一章)

上图中红蓝两个框中间部分,顶上是TIM2自动重装寄存器和计数器寄存器,下面4个Capture/compare x register是TIM2_CCRx寄存器。

要使用TIM2的CC2来触发ADC,看懂这个图是关键。

首先要明确,这个图的红框部分和蓝框部分,是不会同时工作的,红框是配置为输入捕捉模式才能生效,蓝框是配置为输出比较模式才能生效,通过配置TIM2_CCMR1_CC2S来控制TIM2_CC2究竟是处于哪种模式(CC2S=0为比较输出,>0为输入捕捉),请注意:这里蓝框的其中一个输出是TIMx_CH2,而TIM2_CH2又是ADC规则通道的触发源,也就是说如果要触发ADC,则需要每次比较匹配时,在TIM2_CH2上产生一次上升沿。

那么我们首先需要操作蓝框内的最左边部分也就是OC2REF,要使比较匹配时发生一次上升沿,(以定时器向上计数为例)就需要在TIM2_CNT时,通道2为低电平,TIM2_CNT>=TIM2_CCR2时,通道2为高电平。

从参考手册定时器一章4.7节的CCMR1寄存器中的0C2M[2:0]的介绍可以看出来,只有在PWM模式才能满足上面所说的条件,任何单纯的冻结、配置OC2REF为高或者为低、强制OC2REF为高或者为低,都无法满足要求,不少同学就是死在这个上面,以为是配置TIMING模式,实际上这样根本无法改变OC2REF的电平,就无从触发ADC了。

CCMR1_CCxS(x为1、2、3、4,决定是哪个通道)是选择为捕捉输入还是比较输出,这里我们需要配置为输出。

以上两段配置程序,可以以100ms的周期驱动AD转换一次,不再需要使用TIM和ADC中断资源。

总结:

想要使用STM32的定时器触发ADC,必须将定时器配置为比较输出PWM模式,并且一定要注意TIMx_CHx输出上升沿才触发,若是在比较匹配的瞬时产生的不是上升沿而是下降沿,那么就不一定是在比较匹配的瞬间触发ADC了,特别是在类似于电机控制的应用中要注意这一点。

------------------------------------------------------------------------------------------------------------------------

四、AD过采样提高采样精度

过采样技术是一种以牺牲采样速度来提高ADC分辨率的技术。如果STM32的12位AD,每秒采集10个数据,即采样率为:10/秒。根据过采样技术,每提高1位ADC分辨率,需要增加4倍的采样率。从12位AD提高到14位AD,一共提高了2位,所以需要把采样率提高2 * 2 * 2 * 2 = 16倍。原来在100mS之内只采集一个数据,现在需要在100mS之内采集16个数据了。然后,我们把这16个数据累加,再把累加值右移2位,这样就得到STM32过采样之后的14位ADC。

需要注意的是,过采样技术会限制输入信号的频率。根据采样定律,采样率最少是输入信号的2倍才能将信号还原。当需要提高n位的ADC分辨率时,采样率又得提高4*n倍。STM32的12位ADC的最高采样率为1MHz,如果要达到14位的ADC分辨率,那么输入信号的频率就不能超过:1M/2/15 = 31.25KHz。

最后提醒:分辨率的提升到14位并不是精度也能提升14位。我自己试过提升到16位的分辨率,但是精度大概只有13、14位的样子。

STM32的精度不可能提高的太多,要提高只能在分辨率上想办法,提高分辨率间接提高精度,但是这是由一个度的,跟你的要采样的外部信号的频率、CPU的处理速度等等都是有关系的。 过采样只能提高分辨率,精度不是随便可以提高的。要不然0832不就能替代所有的AD芯片了。

精度通常是指准确度。指测量值与实际值的差异性。影响精度的因素很多。如分辨力,线性度等。

分辨率可以通过分辨力来理解。8bit的分辨力为1/256,10bit时为1/1024,但实际还要通过量程转换成具体的值,不能没有量纲或单位(量纲与单位是不同的概念)。

分辨率通常用百分比来表示,而分辨力则用绝对值来表示。“5/256 =0.01953125V”指的是分辨力而不是分辨率。而这样的分辨能力仅仅是指理论能力而不是实际能力。因为实际能力还要包括非线性因素引起“干扰”。

总结:分辨率容易提升到24位,但是精度能到24位的要求就很高了。市面上的16、24位AD转换芯片一般指的是分辨率,而不是精度。

STM32的ADC如果要使用在精度要求高的地方,如3级电子称、精准计量仪表的话,STM32就比较勉强了。建议换外置的ADC。

到底怎样使用过采样法来提高AD采样精度?以下的思路使用于任何单片机:

比如设个定时器每个10us触发下STM32的ADC的采用,采到256个后将256个数据累加求和,如果当12位ADC用就除以256,13位用除以128,14位用除以64,15位用除以32,16位用除以16。得到结果后存放缓冲区中,再增加一段软件滤波程序就OK了!

例如下面这段程序:

#define  VccTmpAdcVal   16384//14位ADC

VREF_VAL=VccVal*ADC_FilterChannel[inrefv]/VccTmpAdcVal ; //内部参考电压对应的电压值  VREF_VAL=3.3*内部基准电压的十六进制ADC值/16384

------------------------------------------------------------------------------------------------------------------------

五、高精度ADC转换设计注意

该模数ADC转换芯片使用MCP3221,关心的几个重要参数:

(1)分辨率12bit,高精度,满足大多数场合

(2)误差INL : ±2LSB(Integral Nonlinearity:积分非线性) ; DNL : ±1LSB(Differential Nonlinearity:微分非线性) ,主要看微分非线性这个参数

(3)Sampling switch resistor : Rs = 1K (内部采样的开关电阻)

(4)输入范围( VSS-0.3 ~ VDD+0.3 )V

------------------------------------------------------------

1、第一个注意

分辨率是12bit(2^12=4096),误差INL:±2LSB,DNL:±1LSB。为了后续更好的计算,VREF选择4.096V的一个基准电压源,这样INL:±2LSB = ±2mV,DNL:±1LSB = ±1mV,I2C读取到的数据,就不需要进行换算了,读出来的值直接是电压值,单位是mV(如果要换算,就涉及到除法运算,除不尽的时候,就会给结果带进了误差)。

------------------------------------------------------------

2、第二个注意

ADC内部采样的开关电阻Rs = 1K, 阻抗比较小,所以要求外部的输入阻抗Rss要比这个值小得多,小到认为可以忽略外部的输入阻抗,这样采集到的电压才更精准。

如何保证输入的阻抗极小呢?

一般在输入前端加运放跟随,做一级隔离缓冲处理,因运放具有输入阻抗极高,闭环时输出阻抗极小的特点。如上图,在MCP3221模拟输入前端加一级运放跟随WS72551EA-5/TR(SOT-23-5)。

------------------------------------------------------------

3、此时需要考虑第三个注意

运放的选择,如果要求测试的结果要达到文档上所标注的误差范围在±1mV内,那么选择运放时就有所考虑了,而不是随便选一个运放就行。这里看下WS72551EA-5/TR运放这个参数:

(1)首先尽量选择较小的失调电压Offset Voltage ,要在uV级别,如果这个参数在mV级别,那么测试结果与实际值会偏差比较大,根本达不到文档所说的  DNL:±1LSB = ±1mV内。

(2)偏置电流也选小点的,尽量选在pA级别,这样就保证该运放输入的阻抗非常高,比如输入的信号电压5V, 其输入阻抗 Z = Vs / IB = 5(V) / 10(pA) = 500GΩ,运放的输入阻抗越高,对前级电路的影响就越可以忽略不计。

满足以上几个要求,测试出来的精度肯定是跟文档描述的一致。

-----------------------------------------------------------------------------------------------------------------------

附录1、LSB

Articles on Internet and books show how to calculate the Least Significant Bit (LSB), but they take into consideration either the voltage reference (Vref) or the full scale (FS) of the ADC or DAC.  Many times this leads to confusion, as a few messages I received from my readers show. Therefore, this article shows both ways of defining the LSB, so that people will have a clear understanding how to treat an ADC’s (Analog-to-Digital-Converter) or DAC’s (Digital-to-Analog-Converter) LSB.
What is an LSB? The LSB is the smallest level that an ADC can convert, or is the smallest increment a DAC outputs.  Both converters are used at the boundaries between the analog and digital realms, making it possible for the analog circuits to talk to the digital ones and backwards.

增益误差是数据转换器的增益误差,代表实际传输函数的斜率与理想传输函数的斜率的差别。

增益误差通常用LSB或满量程范围的百分比表示。增益误差可以利用硬件或软件校准,是满量程误差减去失调误差。

失调误差是指在输入为零电压时,采集获得的数字量并不为零,它与理想转移函数的零点总是差一个固定的量,这个量就是失调误差。失调误差是由信号调理电路、ADC内部转移电路和电源电压等因素造成的。

LSB(LeastSignificant Bit)意为最低有效位;MSB(MostSignificant Bit)意为最高有效位,若MSB=1,则表示数据为负值,若MSB=0,则表示数据为正。

当选择模数转换器(ADC)时,最低有效位(LSB)这一参数的含义是什么?有位工程师告诉我某某生产商的某款12位转换器只有7个可用位。也就是说,所谓12位的转换器实际上只有7位。他的结论是根据器件的失调误差和增益误差参数得出的,这两个参数的最大值如下:

  失调误差 =±3LSB,

  增益误差 =±5LSB,

  乍一看,觉得他似乎是对的。从上面列出的参数可知最差的技术参数是增益误差(±5 LSB)。进行简单的数学运算,12位减去5位分辨率等于7位,对吗?果真如此的话,ADC生产商为何还要推出这样的器件呢?增益误差参数似乎表明只要购买成本更低的8位转换器就可以了,但看起来这又有点不对劲了。正如您所判断的,上面的说法是错误的。

  让我们重新来看一下LSB的定义。考虑一个12位串行转换器,它会输出由1或0组成的12位数串。通常,转换器首先送出的是最高有效位(MSB)(即LSB + 11)。有些转换器也会先送出LSB。在下面的讨论中,我们假设先送出的是MSB(如图1所示),然后依次送出MSB-1 (即 LSB + 10)和MSB -2(即LSB + 9)并依次类推。转换器最终送出MSB -11(即LSB)作为位串的末位。

  LSB这一术语有着特定的含义,它表示的是数字流中的最后一位,也表示组成满量程输入范围的最小单位。对于12位转换器来说,LSB的值相当于模拟信号满量程输入范围除以212 或 4,096的商。如果用真实的数字来表示的话,对于满量程输入范围为4.096V的情况,一个12位转换器对应的LSB大小为1mV。但是,将LSB定义为4096个可能编码中的一个编码对于我们的理解是有好处的。

  让我们回到开头的技术指标,并将其转换到满量程输入范围为4.096V的12位转换器中:

  失调误差 = ±3LSB =±3mV,

  增益误差 =±5LSB = ±5mV,

  这些技术参数表明转换器转换过程引入的误差最大仅为8mV(或 8个编码)。这绝不是说误差发生在转换器输出位流的LSB、LSB-1、LSB-2、LSB-3、LSB-4、LSB-5、LSB-6和 LSB-7 八个位上,而是表示误差最大是一个LSB的八倍(或8mV)。准确地说,转换器的传递函数可能造成在4,096个编码中丢失最多8个编码。丢失的只可能是最低端或最高端的编码。例如,误差为+8LSB ((+3LSB失调误差) + (+5LSB增益误差)) 的一个12位转换器可能输出的编码范围为0 至 4,088。丢失的编码为4088至4095。相对于满量程这一误差很小仅为其0.2%。与此相对,一个误差为-3LSB((-3LSB失调误差)(-5LSB增益误差))的12位转换器输出的编码范围为3至4,095。此时增益误差会造成精度下降,但不会使编码丢失。丢失的编码为0、1和2。这两个例子给出的都是最坏情况。在实际的转换器中,失调误差和增益误差很少会如此接近最大值。

在实际应用中,由于ADC失调或增益参数的改进而使性能提升的程度微不足道,甚至可以忽略。但是,对于那些将精度作为一项设计目标的设计人员来说,这种假设太过绝对。利用固件设计可以很容易地实现数字校准算法。但更重要的是,电路的前端放大/信号调理部分通常会产生比转换器本身更大的误差。

MSB指二进制中最高值的比特。在16比特的数字音频中,其第1个比特便对16bit的字的数值有最大的影响。例如,在十进制的15389这一数字中,相当于万数那1行(1)的数字便对数值的影响最大;比较与之相反的“最低有效位”(LSB)。

总结

“精度”是用来描述物理量的准确程度,其反应的是测量值与真实值之间的误差;而“分辨率”是用来描述刻度划分的,其反应的是数值读取过程中所能读取的最小变化值。

ADC的分辨率=测量电压范围/(2^AD位数-1),精度取决于LSB失调误差与增益误差。

-----------------------------------------------------------------------------------------------------------------------

ADC转换汇总(STM32、取平均、精度等)相关推荐

  1. STM32 ADC转换速度与精度

    文章目录 系统时间查看 ADC转换时间 采集精度 提高稳定性 示例代码 系统时间查看 ADC挂在APB2上,对应的时钟为PCLK2,由系统时钟SYSCLK 分频得到,一般不做分频,也就是说ADC模块的 ...

  2. 单片机外围模块漫谈之二,如何提高ADC转换精度

    在此我们简要总结一下ADC的各种指标如何理解,以及从硬件到软件都有哪些可以采用的手段来提高ADC的转换精度. 1.ADC指标 除了分辨率,速度,输入范围这些基本指标外,衡量一个ADC好坏通常会用到以下 ...

  3. adc量化单位_单片机外围模块漫谈之二,如何提高ADC转换精度

    在此我们简要总结一下ADC的各种指标如何理解,以及从硬件到软件都有哪些可以采用的手段来提高ADC的转换精度. 1. ADC指标 除了分辨率,速度,输入范围这些基本指标外,衡量一个ADC好坏通常会用到以 ...

  4. STM32 ADC转换实验

    摘自:STM32 ADC转换实验 作者:追兮兮 发布时间: 2020-10-29 09:42:24 网址:https://blog.csdn.net/weixin_44234294/article/d ...

  5. 使用轮询方式进行ADC转换(野火STM32 MINI开发板)

    实验器材:野火STM32 MINI开发板 任务目标:利用ADC采集电位器的电压,并通过串口调试助手输出变化的电压值 任务内容:调整开发板上的滑动变阻器,将电压值通过开发板到PC进行显示 开发板原理图: ...

  6. ADC模数转换器(STM32系列)

    Cortex-M4-模数转换器 模数转换器概述 模数转换器用途 MCU(单片机)种只能处理数字量,但当外界输入模拟量信号时,单片机会通过模数转换器将模拟量信号转化成数字量信号供MCU处理,并且当MCU ...

  7. 分享一个stm8s003单片机的ADC转换,附加一个冒泡算法(用于减少误差)

    1.先上脚位图,不要问我为什么是stm8f103,stm8f103和stm8s003只有内存的不同. 2.上代码,选用PC4(AIN2)为ADC转换引脚,只提供函数,自己选择调用,不追求精度的话可以不 ...

  8. NTC热敏电阻温度采集与adc转换

    前言: ntc热敏电阻的R值是10k,B值是3950 使用的是STM32F103RCT6的ADC 文章目录 1.电路理论 2. NTC热敏电阻阻值与温度之间的转换 3.NTC热敏电阻温度采集与adc转 ...

  9. 关于ADC转换设计中的基本问题(82问)

    1.如何选择高速模数转换之前的信号调理器件;如何解决多路模数转换的同步问题? ADC之前的信号调理,最根本的原则就是信号调理引起的噪声和误差要在ADC的1个LSB之内.根据这个原则,可以选择指标合适的 ...

最新文章

  1. java jprofile安装与使用
  2. quirks 模式是什么?它和 standards 模式有什么区别_什么是二级分销模式
  3. 一行代码制作你的专属动态二维码-Python实现
  4. 七、Go 语言面向对象编程
  5. idea 一直在build_CEO季度表彰团队| 我们一直在做最酷的事
  6. webpack 配置 react-pro
  7. LeetCode开心刷题二十七天——51. N-Queens
  8. 三个梯度磁场_第二节 梯度磁场系统
  9. 用管道pipe实现程序与shell/bash脚本之间的通路
  10. ManjarorLinux操作笔记
  11. 德鲁伊druid数据库明文密码加密
  12. .xyz文件_Orca.xyz:除了银行系统瑞士还有同样安全的数字保险箱
  13. bzoj1293: [SCOI2009]生日礼物
  14. IntelliJ IDEA 配置svn及使用
  15. springboot实现查询手机号归属地
  16. 文学杂谈001--《遥远的救世主》
  17. 【Linux应用】Clonezilla使用指南
  18. 咖啡技能培训 | 成为咖啡师需要注意哪些方面?
  19. 天津大学计算机学院杜朴风,PseAAC-Builder 2.0 一种从蛋白质序列数据快速生成伪氨基酸组分表示的软件.doc...
  20. 【前端17_JS】ES 6:Let 、Const、对象冻结、解构赋值、暂时性死区 TDZ、惰性求值、模板字符串

热门文章

  1. 基于赫优讯COMX嵌入式模块开发EtherCAT从站设备
  2. 微信小程序证件照正反面上传
  3. python编译软件和编译环境选择(Windows下,新手看)
  4. Arcgis添加经纬坐标
  5. 无法初始化SFTP协议。主机是SFTP服务器吗
  6. macOS如何修改默认打开方式
  7. 用层次分析法选择一个旅游地
  8. slf4j-log4j12加log4j自定义配置包路径日志输出
  9. Android Studio打包apk后手机无法安装 提示 “解析软件包时出现问题”
  10. set的用法及短语_英语语法知识:短语set out的用法