ADC转换汇总(STM32、取平均、精度等)
目錄
一、電流檢測(cè)ADC采樣值處理的高效方法
二、ADC轉(zhuǎn)換N次采樣去最大最小求平均算法
三、STM32關(guān)于使用定時(shí)器觸發(fā)ADC轉(zhuǎn)換
四、ADC過采樣提高采樣精度
五、高精度ADC轉(zhuǎn)換設(shè)計(jì)注意
附錄1、LSB
------------------------------------------------------------------------------------------------------------------------
一、電流檢測(cè)AD采樣值處理的高效方法
在電機(jī)控制軟件的編寫過程中,經(jīng)常要處理由AD采樣回來的電流值。由于電流有正有負(fù),電流傳感器輸出地電壓也是以0為中點(diǎn),而一般AD的輸入只能為正電壓,所以電流傳感器出來的電壓量需要通過加減運(yùn)算電路加上一個(gè)偏移值再送入AD,以保證進(jìn)入AD的值恒為正。
這里AD以TI的2812的片內(nèi)AD為例,其輸入范圍是0~3V,電流傳感器以LEM的LA25NP為例,量程25A,通常采用的電路是將LEM傳感器的輸出經(jīng)過一個(gè)100歐的電阻接到地,獲得一個(gè)以0為中點(diǎn)的電壓信號(hào),然后在送入比例運(yùn)算電路,在比例運(yùn)算電路的另一個(gè)輸入端加入1.5V的偏移量,這樣在滿量程范圍內(nèi)使輸入AD的電壓信號(hào)始終保持在0~3V之內(nèi)。電流為0的時(shí)候送入AD的電壓是1.5V
在程序中進(jìn)行電流運(yùn)算時(shí),一般要把AD采樣結(jié)果取回來,然后再減去1.5V的偏移值,這樣的到一個(gè)有符號(hào)數(shù),然后再進(jìn)行運(yùn)算。
今天在閱讀TI提供的電機(jī)驅(qū)動(dòng)庫(kù)代碼時(shí),發(fā)現(xiàn)里邊使用了一種高效的處理方法,代碼很簡(jiǎn)單,是這樣的:
DatQ15 = AdcRegs.ADCRESULT0^0x8000;
2812的AD是12位的,AD采樣結(jié)果存儲(chǔ)在高12位。因此當(dāng)AD滿量程時(shí),ADCRESULT0中的值是0xfff0。
這段代碼僅僅通過一個(gè)按位異或運(yùn)算就將AD的值減去了1.5V的偏移,并變成了有符號(hào)數(shù)。
至于具體為什么,舉例說明,當(dāng)電壓為3V時(shí),采樣值是0xfff0,異或運(yùn)算后高位的1變成了0,其余位不變,其結(jié)果是7ff0,如果將最高位看做符號(hào)位,那么有效位是11位。
------------------------------------------------------------------------------------------------------------------------
二、AD轉(zhuǎn)換N次采樣去最大最小求平均算法
void AD_Init()? ? ?//AD初始化
{
????P1M1=0xF0;? ? ?//設(shè)置相應(yīng)的I/O口為高阻? ? P1.4-P1.5-P1.6-P1.7
????P1M0=0x00;
????ADC_RES=0;
????ADC_RESL=0;? ? ?//ADC轉(zhuǎn)換結(jié)果寄存器清0
????P1ASF=0xF0;? ? ?//設(shè)置相應(yīng)的I/O口為ADC模擬通道? ?P1.4-P1.5-P1.6-P1.7
????ADC_CONTR |= ADC_POWER;? ? ?//打開AD轉(zhuǎn)換電源
????ADC_CONTR |= ADC_SPEEDH;????//設(shè)置AD轉(zhuǎn)換速度
????delay(1);
}
uint ADC_result(uchar x)? ? //AD轉(zhuǎn)換結(jié)果
{
????uint result;
????ADC_CONTR &= 0xF8;? ? //清通道
????ADC_CONTR |= x;? ? //切換通道,x為通道,如x=5,就是P1.5
????delay_us(30);? ? //切換通道延時(shí)
????ADC_CONTR |= ADC_START;? ?//開啟AD轉(zhuǎn)換
????delay_us(4);?
????while(!(ADC_CONTR & ADC_FLAG));? ?//等待AD轉(zhuǎn)換結(jié)束
????ADC_CONTR &= ~ADC_FLAG;? ? //清除AD轉(zhuǎn)換結(jié)束標(biāo)志位
????result = ADC_RES << 2;? ? ?//ADC高8位結(jié)果左移2位
????result = result | ADC_RESL;? ? ?//合成10位轉(zhuǎn)換結(jié)果
????return result;? ? //返回轉(zhuǎn)換結(jié)果
}
uint U(uchar x)? ? //測(cè)量電壓40次去除最大最小求平均
{
????uint U[40],min,max,S;
????uchar i;
? ??
????for(i=0;i<40;i++)
????{
? ? ? ??U[i]=ADC_result(x);? ?//獲取x通道ADC結(jié)果
????}
? ??
????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;? ?//返回計(jì)算結(jié)果
}
------------------------------------------------------------------------------------------------------------------------
三、STM32關(guān)于使用定時(shí)器觸發(fā)ADC轉(zhuǎn)換
以STM32 ADC的常規(guī)通道為例(注入通道類似):
配合上ADC外設(shè)的框圖:
如上圖,STM32 ADC的常規(guī)通道可以由以上6個(gè)信號(hào)觸發(fā)任何一個(gè),我們以使用TIM2_CH2觸發(fā)ADC1,獨(dú)立模式,每次僅測(cè)一條通道,則ADC的配置如下:(以下代碼使用STM32固件庫(kù)V3.5)
void ADC_Configuration(void)
{
? ? ADC_InitTypeDef ADC_InitStructure;
? ? ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
? ? ADC_InitStructure.ADC_ScanConvMode = DISABLE;? ? //關(guān)閉通道掃描模式
? ? ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
//注意不要使用持續(xù)轉(zhuǎn)換模式,否則只要觸發(fā)一次,
//后續(xù)的轉(zhuǎn)換就會(huì)永不停歇(除非CONT清0),這樣第一次以后的ADC,就不是由TIM2_CC2來觸發(fā)了
? ? ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC2;? ?//配置TIM2_CC2為觸發(fā)源
? ? ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
? ? ADC_InitStructure.ADC_NbrOfChannel = 1;
? ? ADC_Init(ADC1, &ADC_InitStructure);
? ? RCC_ADCCLKConfig(RCC_PCLK2_Div6);? ?//配置時(shí)鐘(12MHz),在RCC里面還應(yīng)配置APB2=AHB時(shí)鐘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);
//設(shè)置外部觸發(fā)模式使能(這個(gè)“外部“其實(shí)僅僅是相對(duì)于ADC模塊的外部,實(shí)際上還是在STM32內(nèi)部)
}
這里再注意一點(diǎn)上面左圖最頂上的那句話:當(dāng)外部觸發(fā)信號(hào)被選為ADC規(guī)則或注入轉(zhuǎn)換時(shí),只有它的上升沿可以啟動(dòng)轉(zhuǎn)換。這跟下面的定時(shí)器2的正確配置關(guān)系很大。
void TIM2_Configuration(void)
{
? ? TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
? ? TIM_OCInitTypeDef TIM_OCInitStructure;
? ? TIM_TimeBaseStructure.TIM_Period = 10000;? ?//設(shè)置100mS一次TIM2比較的周期
? ? TIM_TimeBaseStructure.TIM_Prescaler = 719;? ?//系統(tǒng)主頻72M,這里分頻720,相當(dāng)于100K的定時(shí)器2時(shí)鐘
//采集時(shí)間 =?TIM_Period/(系統(tǒng)主頻/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;? ?//下面詳細(xì)說明
? ? 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要為L(zhǎng)ow,PWM2則為High
? ? TIM_OC2Init(TIM2, & TIM_OCInitStructure);
? ? TIM_Cmd(TIM2, ENABLE);
? ? TIM_InternalClockConfig(TIM2);
? ? TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);
? ? TIM_UpdateDisableConfig(TIM2, DISABLE);
}
還是來引用參考手冊(cè)的原圖:(截圖引自通用定時(shí)器一章)
上圖中紅藍(lán)兩個(gè)框中間部分,頂上是TIM2自動(dòng)重裝寄存器和計(jì)數(shù)器寄存器,下面4個(gè)Capture/compare x register是TIM2_CCRx寄存器。
要使用TIM2的CC2來觸發(fā)ADC,看懂這個(gè)圖是關(guān)鍵。
首先要明確,這個(gè)圖的紅框部分和藍(lán)框部分,是不會(huì)同時(shí)工作的,紅框是配置為輸入捕捉模式才能生效,藍(lán)框是配置為輸出比較模式才能生效,通過配置TIM2_CCMR1_CC2S來控制TIM2_CC2究竟是處于哪種模式(CC2S=0為比較輸出,>0為輸入捕捉),請(qǐng)注意:這里藍(lán)框的其中一個(gè)輸出是TIMx_CH2,而TIM2_CH2又是ADC規(guī)則通道的觸發(fā)源,也就是說如果要觸發(fā)ADC,則需要每次比較匹配時(shí),在TIM2_CH2上產(chǎn)生一次上升沿。
那么我們首先需要操作藍(lán)框內(nèi)的最左邊部分也就是OC2REF,要使比較匹配時(shí)發(fā)生一次上升沿,(以定時(shí)器向上計(jì)數(shù)為例)就需要在TIM2_CNT時(shí),通道2為低電平,TIM2_CNT>=TIM2_CCR2時(shí),通道2為高電平。
從參考手冊(cè)定時(shí)器一章4.7節(jié)的CCMR1寄存器中的0C2M[2:0]的介紹可以看出來,只有在PWM模式才能滿足上面所說的條件,任何單純的凍結(jié)、配置OC2REF為高或者為低、強(qiáng)制OC2REF為高或者為低,都無法滿足要求,不少同學(xué)就是死在這個(gè)上面,以為是配置TIMING模式,實(shí)際上這樣根本無法改變OC2REF的電平,就無從觸發(fā)ADC了。
CCMR1_CCxS(x為1、2、3、4,決定是哪個(gè)通道)是選擇為捕捉輸入還是比較輸出,這里我們需要配置為輸出。
以上兩段配置程序,可以以100ms的周期驅(qū)動(dòng)AD轉(zhuǎn)換一次,不再需要使用TIM和ADC中斷資源。
總結(jié):
想要使用STM32的定時(shí)器觸發(fā)ADC,必須將定時(shí)器配置為比較輸出PWM模式,并且一定要注意TIMx_CHx輸出上升沿才觸發(fā),若是在比較匹配的瞬時(shí)產(chǎn)生的不是上升沿而是下降沿,那么就不一定是在比較匹配的瞬間觸發(fā)ADC了,特別是在類似于電機(jī)控制的應(yīng)用中要注意這一點(diǎn)。
------------------------------------------------------------------------------------------------------------------------
四、AD過采樣提高采樣精度
過采樣技術(shù)是一種以犧牲采樣速度來提高ADC分辨率的技術(shù)。如果STM32的12位AD,每秒采集10個(gè)數(shù)據(jù),即采樣率為:10/秒。根據(jù)過采樣技術(shù),每提高1位ADC分辨率,需要增加4倍的采樣率。從12位AD提高到14位AD,一共提高了2位,所以需要把采樣率提高2 * 2 * 2 * 2 = 16倍。原來在100mS之內(nèi)只采集一個(gè)數(shù)據(jù),現(xiàn)在需要在100mS之內(nèi)采集16個(gè)數(shù)據(jù)了。然后,我們把這16個(gè)數(shù)據(jù)累加,再把累加值右移2位,這樣就得到STM32過采樣之后的14位ADC。
需要注意的是,過采樣技術(shù)會(huì)限制輸入信號(hào)的頻率。根據(jù)采樣定律,采樣率最少是輸入信號(hào)的2倍才能將信號(hào)還原。當(dāng)需要提高n位的ADC分辨率時(shí),采樣率又得提高4*n倍。STM32的12位ADC的最高采樣率為1MHz,如果要達(dá)到14位的ADC分辨率,那么輸入信號(hào)的頻率就不能超過:1M/2/15 = 31.25KHz。
最后提醒:分辨率的提升到14位并不是精度也能提升14位。我自己試過提升到16位的分辨率,但是精度大概只有13、14位的樣子。
STM32的精度不可能提高的太多,要提高只能在分辨率上想辦法,提高分辨率間接提高精度,但是這是由一個(gè)度的,跟你的要采樣的外部信號(hào)的頻率、CPU的處理速度等等都是有關(guān)系的。?過采樣只能提高分辨率,精度不是隨便可以提高的。要不然0832不就能替代所有的AD芯片了。?
精度通常是指準(zhǔn)確度。指測(cè)量值與實(shí)際值的差異性。影響精度的因素很多。如分辨力,線性度等。?
分辨率可以通過分辨力來理解。8bit的分辨力為1/256,10bit時(shí)為1/1024,但實(shí)際還要通過量程轉(zhuǎn)換成具體的值,不能沒有量綱或單位(量綱與單位是不同的概念)。?
分辨率通常用百分比來表示,而分辨力則用絕對(duì)值來表示。“5/256 =0.01953125V”指的是分辨力而不是分辨率。而這樣的分辨能力僅僅是指理論能力而不是實(shí)際能力。因?yàn)閷?shí)際能力還要包括非線性因素引起“干擾”。?
總結(jié):分辨率容易提升到24位,但是精度能到24位的要求就很高了。市面上的16、24位AD轉(zhuǎn)換芯片一般指的是分辨率,而不是精度。?
STM32的ADC如果要使用在精度要求高的地方,如3級(jí)電子稱、精準(zhǔn)計(jì)量?jī)x表的話,STM32就比較勉強(qiáng)了。建議換外置的ADC。
到底怎樣使用過采樣法來提高AD采樣精度?以下的思路使用于任何單片機(jī):?
比如設(shè)個(gè)定時(shí)器每個(gè)10us觸發(fā)下STM32的ADC的采用,采到256個(gè)后將256個(gè)數(shù)據(jù)累加求和,如果當(dāng)12位ADC用就除以256,13位用除以128,14位用除以64,15位用除以32,16位用除以16。得到結(jié)果后存放緩沖區(qū)中,再增加一段軟件濾波程序就OK了!?
例如下面這段程序:
#define? VccTmpAdcVal? ?16384//14位ADC
VREF_VAL=VccVal*ADC_FilterChannel[inrefv]/VccTmpAdcVal ; //內(nèi)部參考電壓對(duì)應(yīng)的電壓值? VREF_VAL=3.3*內(nèi)部基準(zhǔn)電壓的十六進(jìn)制ADC值/16384
------------------------------------------------------------------------------------------------------------------------
五、高精度ADC轉(zhuǎn)換設(shè)計(jì)注意
該模數(shù)ADC轉(zhuǎn)換芯片使用MCP3221,關(guān)心的幾個(gè)重要參數(shù):
(1)分辨率12bit,高精度,滿足大多數(shù)場(chǎng)合
(2)誤差I(lǐng)NL : ±2LSB(Integral Nonlinearity:積分非線性) ; DNL : ±1LSB(Differential Nonlinearity:微分非線性) ,主要看微分非線性這個(gè)參數(shù)
(3)Sampling switch resistor : Rs = 1K (內(nèi)部采樣的開關(guān)電阻)
(4)輸入范圍( VSS-0.3 ~ VDD+0.3 )V
------------------------------------------------------------
1、第一個(gè)注意
分辨率是12bit(2^12=4096),誤差I(lǐng)NL:±2LSB,DNL:±1LSB。為了后續(xù)更好的計(jì)算,VREF選擇4.096V的一個(gè)基準(zhǔn)電壓源,這樣INL:±2LSB = ±2mV,DNL:±1LSB = ±1mV,I2C讀取到的數(shù)據(jù),就不需要進(jìn)行換算了,讀出來的值直接是電壓值,單位是mV(如果要換算,就涉及到除法運(yùn)算,除不盡的時(shí)候,就會(huì)給結(jié)果帶進(jìn)了誤差)。
------------------------------------------------------------
2、第二個(gè)注意
ADC內(nèi)部采樣的開關(guān)電阻Rs = 1K, 阻抗比較小,所以要求外部的輸入阻抗Rss要比這個(gè)值小得多,小到認(rèn)為可以忽略外部的輸入阻抗,這樣采集到的電壓才更精準(zhǔn)。
如何保證輸入的阻抗極小呢?
一般在輸入前端加運(yùn)放跟隨,做一級(jí)隔離緩沖處理,因運(yùn)放具有輸入阻抗極高,閉環(huán)時(shí)輸出阻抗極小的特點(diǎn)。如上圖,在MCP3221模擬輸入前端加一級(jí)運(yùn)放跟隨WS72551EA-5/TR(SOT-23-5)。
------------------------------------------------------------
3、此時(shí)需要考慮第三個(gè)注意
運(yùn)放的選擇,如果要求測(cè)試的結(jié)果要達(dá)到文檔上所標(biāo)注的誤差范圍在±1mV內(nèi),那么選擇運(yùn)放時(shí)就有所考慮了,而不是隨便選一個(gè)運(yùn)放就行。這里看下WS72551EA-5/TR運(yùn)放這個(gè)參數(shù):
(1)首先盡量選擇較小的失調(diào)電壓Offset Voltage ,要在uV級(jí)別,如果這個(gè)參數(shù)在mV級(jí)別,那么測(cè)試結(jié)果與實(shí)際值會(huì)偏差比較大,根本達(dá)不到文檔所說的? DNL:±1LSB = ±1mV內(nèi)。
(2)偏置電流也選小點(diǎn)的,盡量選在pA級(jí)別,這樣就保證該運(yùn)放輸入的阻抗非常高,比如輸入的信號(hào)電壓5V, 其輸入阻抗 Z = Vs / IB = 5(V) / 10(pA) = 500GΩ,運(yùn)放的輸入阻抗越高,對(duì)前級(jí)電路的影響就越可以忽略不計(jì)。
滿足以上幾個(gè)要求,測(cè)試出來的精度肯定是跟文檔描述的一致。
-----------------------------------------------------------------------------------------------------------------------
附錄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.
增益誤差是數(shù)據(jù)轉(zhuǎn)換器的增益誤差,代表實(shí)際傳輸函數(shù)的斜率與理想傳輸函數(shù)的斜率的差別。
增益誤差通常用LSB或滿量程范圍的百分比表示。增益誤差可以利用硬件或軟件校準(zhǔn),是滿量程誤差減去失調(diào)誤差。
失調(diào)誤差是指在輸入為零電壓時(shí),采集獲得的數(shù)字量并不為零,它與理想轉(zhuǎn)移函數(shù)的零點(diǎn)總是差一個(gè)固定的量,這個(gè)量就是失調(diào)誤差。失調(diào)誤差是由信號(hào)調(diào)理電路、ADC內(nèi)部轉(zhuǎn)移電路和電源電壓等因素造成的。
LSB(LeastSignificant Bit)意為最低有效位;MSB(MostSignificant Bit)意為最高有效位,若MSB=1,則表示數(shù)據(jù)為負(fù)值,若MSB=0,則表示數(shù)據(jù)為正。
當(dāng)選擇模數(shù)轉(zhuǎn)換器(ADC)時(shí),最低有效位(LSB)這一參數(shù)的含義是什么?有位工程師告訴我某某生產(chǎn)商的某款12位轉(zhuǎn)換器只有7個(gè)可用位。也就是說,所謂12位的轉(zhuǎn)換器實(shí)際上只有7位。他的結(jié)論是根據(jù)器件的失調(diào)誤差和增益誤差參數(shù)得出的,這兩個(gè)參數(shù)的最大值如下:
失調(diào)誤差 =±3LSB,
增益誤差 =±5LSB,
乍一看,覺得他似乎是對(duì)的。從上面列出的參數(shù)可知最差的技術(shù)參數(shù)是增益誤差(±5 LSB)。進(jìn)行簡(jiǎn)單的數(shù)學(xué)運(yùn)算,12位減去5位分辨率等于7位,對(duì)嗎?果真如此的話,ADC生產(chǎn)商為何還要推出這樣的器件呢?增益誤差參數(shù)似乎表明只要購(gòu)買成本更低的8位轉(zhuǎn)換器就可以了,但看起來這又有點(diǎn)不對(duì)勁了。正如您所判斷的,上面的說法是錯(cuò)誤的。
讓我們重新來看一下LSB的定義。考慮一個(gè)12位串行轉(zhuǎn)換器,它會(huì)輸出由1或0組成的12位數(shù)串。通常,轉(zhuǎn)換器首先送出的是最高有效位(MSB)(即LSB + 11)。有些轉(zhuǎn)換器也會(huì)先送出LSB。在下面的討論中,我們假設(shè)先送出的是MSB(如圖1所示),然后依次送出MSB-1 (即 LSB + 10)和MSB -2(即LSB + 9)并依次類推。轉(zhuǎn)換器最終送出MSB -11(即LSB)作為位串的末位。
LSB這一術(shù)語(yǔ)有著特定的含義,它表示的是數(shù)字流中的最后一位,也表示組成滿量程輸入范圍的最小單位。對(duì)于12位轉(zhuǎn)換器來說,LSB的值相當(dāng)于模擬信號(hào)滿量程輸入范圍除以212 或 4,096的商。如果用真實(shí)的數(shù)字來表示的話,對(duì)于滿量程輸入范圍為4.096V的情況,一個(gè)12位轉(zhuǎn)換器對(duì)應(yīng)的LSB大小為1mV。但是,將LSB定義為4096個(gè)可能編碼中的一個(gè)編碼對(duì)于我們的理解是有好處的。
讓我們回到開頭的技術(shù)指標(biāo),并將其轉(zhuǎn)換到滿量程輸入范圍為4.096V的12位轉(zhuǎn)換器中:
失調(diào)誤差 = ±3LSB =±3mV,
增益誤差 =±5LSB = ±5mV,
這些技術(shù)參數(shù)表明轉(zhuǎn)換器轉(zhuǎn)換過程引入的誤差最大僅為8mV(或 8個(gè)編碼)。這絕不是說誤差發(fā)生在轉(zhuǎn)換器輸出位流的LSB、LSB-1、LSB-2、LSB-3、LSB-4、LSB-5、LSB-6和 LSB-7 八個(gè)位上,而是表示誤差最大是一個(gè)LSB的八倍(或8mV)。準(zhǔn)確地說,轉(zhuǎn)換器的傳遞函數(shù)可能造成在4,096個(gè)編碼中丟失最多8個(gè)編碼。丟失的只可能是最低端或最高端的編碼。例如,誤差為+8LSB ((+3LSB失調(diào)誤差) + (+5LSB增益誤差)) 的一個(gè)12位轉(zhuǎn)換器可能輸出的編碼范圍為0 至 4,088。丟失的編碼為4088至4095。相對(duì)于滿量程這一誤差很小僅為其0.2%。與此相對(duì),一個(gè)誤差為-3LSB((-3LSB失調(diào)誤差)(-5LSB增益誤差))的12位轉(zhuǎn)換器輸出的編碼范圍為3至4,095。此時(shí)增益誤差會(huì)造成精度下降,但不會(huì)使編碼丟失。丟失的編碼為0、1和2。這兩個(gè)例子給出的都是最壞情況。在實(shí)際的轉(zhuǎn)換器中,失調(diào)誤差和增益誤差很少會(huì)如此接近最大值。
在實(shí)際應(yīng)用中,由于ADC失調(diào)或增益參數(shù)的改進(jìn)而使性能提升的程度微不足道,甚至可以忽略。但是,對(duì)于那些將精度作為一項(xiàng)設(shè)計(jì)目標(biāo)的設(shè)計(jì)人員來說,這種假設(shè)太過絕對(duì)。利用固件設(shè)計(jì)可以很容易地實(shí)現(xiàn)數(shù)字校準(zhǔn)算法。但更重要的是,電路的前端放大/信號(hào)調(diào)理部分通常會(huì)產(chǎn)生比轉(zhuǎn)換器本身更大的誤差。
?MSB指二進(jìn)制中最高值的比特。在16比特的數(shù)字音頻中,其第1個(gè)比特便對(duì)16bit的字的數(shù)值有最大的影響。例如,在十進(jìn)制的15389這一數(shù)字中,相當(dāng)于萬數(shù)那1行(1)的數(shù)字便對(duì)數(shù)值的影響最大;比較與之相反的“最低有效位”(LSB)。
總結(jié):
“精度”是用來描述物理量的準(zhǔn)確程度,其反應(yīng)的是測(cè)量值與真實(shí)值之間的誤差;而“分辨率”是用來描述刻度劃分的,其反應(yīng)的是數(shù)值讀取過程中所能讀取的最小變化值。
ADC的分辨率=測(cè)量電壓范圍/(2^AD位數(shù)-1),精度取決于LSB失調(diào)誤差與增益誤差。
-----------------------------------------------------------------------------------------------------------------------
總結(jié)
以上是生活随笔為你收集整理的ADC转换汇总(STM32、取平均、精度等)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设置input隐藏并用js控制显示和隐藏
- 下一篇: Apollo简易制作地图