在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

ADC的讀取調整

454398 ? 來源:網絡整理 ? 作者:網絡整理 ? 2019-11-13 09:03 ? 次閱讀

步驟1:什么是AD轉換器

AD轉換器是一種能夠將模擬(連續)量轉換為數字(離散)值的電路。這意味著什么?這意味著盡管數字值只能假設零和一的組合所形成的離散值,但模擬量可以假設范圍內的任何值。例如,如果我們測量理想AA電池的電壓,則可以找到0V至1.5V之間的任何值,因為這是模擬量。理想燈的輸出狀態必須僅假設兩個狀態(關閉或打開),這是一個離散的幅度。由于微控制器使用這種離散邏輯工作,因此我們需要一種能夠將模擬量轉換為數字量(或離散量)的電路。

步驟2:使用的資源

?一根Lolin32 Lite卡v1.0.0

?一臺用于捕獲的Tektronix TDS1001C示波器

?一根用于ESP32USB電纜

?將Hantek DSO4102C示波器用作信號發生器

步驟3:ESP32 ADC

根據Espressif數據,ESP32芯片可能在測量結果中,從一個芯片到另一個芯片的誤差為+/- 6%。

此外,該轉換對于每個可用的讀取范圍都沒有線性答案。樂鑫提供了一種校準方法,建議用戶在認為有必要達到所需精度時采用其他方法。

我們將進行數據采集,并從中顯示ADC響應和應用數學過程讀取調整的示例。

有幾種(更簡單或更復雜的)方法可以完成這些修正。由您決定最適合您的項目。

此處顯示的內容具有說明性目的,并嘗試解決在調整過程中可以觀察到的有趣點。

步驟4:使用的電路

我使用了示波器,其信號發生器的頻率高達25 MHz,即Hantek DSO4102C。我們產生了由ESP A/D和示波器讀取的波形。收集的數據記錄在csv和電子表格中,我將在文章末尾進行下載

第5步:使用過的符號

我們選擇了一個低頻梯形信號,該信號可以訪問整個轉換范圍內的斜坡。

步驟6:示波器獲得的數據

捕獲由示波器執行。數據存儲在csv文件中。請注意信號的上升和下降斜率上的輕微彎曲。

步驟7:示波器獲得的數據(Excel中的csv文件)

我們在這里進行采樣。

步驟8:ADC獲得的數據

通過更改傳輸串行速率,我們可以查看ADC捕獲的數據。觀察梯形信號的變形。

Arduino IDE串行繪圖儀上觀察到的數據

步驟9:ADC獲得的數據-Excel

使用更高的速率和串行終端,我們可以捕獲值并將其應用到Excel中進行比較。

步驟10:爬坡的比較

我們比較兩個擋塊的兩個攀登坡道。

請注意兩個坡道上出現的曲率。

請注意同樣,對于相同的斜坡,ESP32的采樣數要比示波器多。

步驟11:計算采樣數

由于ESP32提供的樣本數量比示波器多,因此我們需要將這些值均等化,因為它們將用作比較兩條曲線的指標。

為此,我們將進行直接比較。

我們有305個示波器斜坡樣本和2365個ADC斜坡樣本。

因為這些斜坡屬于在相同的范圍內,可以說每個示波器大約有7.75個ADC采樣。

將每個示波器采樣的索引乘以相同的曲線,但是索引等于ADC和重新分配的數據。

要填充新職位的缺失數據,我們將應用一條曲線,以統計方式擬合已知數據。

步驟12:填補空白-趨勢線

選擇已知數據(藍點),方法是單擊,然后用右鍵單擊,我們選擇:“添加趨勢線。. 。”

在出現的窗口中,我們選擇多項式類型(階數2就足夠了。)

我們還選中了“在圖表中查看方程式”和“顯示”圖表中的R平方值”。

我們單擊“關閉”。

步驟13:填補空白-2級多項式曲線

Excel為我們提供了兩條新信息:

請記住,距離1越近,方程越合適。

我們不需深入研究所涉及的數學,而僅將其用作工具即可。

步驟14:填補空白-評估函數

讓我們填補用等式生成的數據在采樣間隙中。然后,逐點比較它們。

y = -9E-08x2 + 0,0014x + 0,1505

R2= 0 ,9999

示波器電壓= -9E-08 * index2 + 0,0014 * index + 0,1505

步驟15:將示波器電壓轉換為等效值以與ADC進行比較

讓我們利用這一點還將示波器電壓的值轉換為等效ADC

由于在ESP32的ADP中獲得的最高值為4095,相當于相同索引的2.958V讀數,我們可以這樣說:

每個示波器的測量電壓大約等于AD的1384.4單位。因此,我們可以將示波器的所有測量值乘以該值。

步驟16:比較獲得的兩個斜坡

可視化

步驟17:ADC讀數差異的行為(錯誤)

下面的曲線顯示了ADC讀數的差異如何隨測量變化的行為。通過收集這些數據,我們可以找到校正函數。

要找到此曲線,我們只需繪制每個度量中的差異作為每個可能AD位置(0至4095)的函數即可。

p》

步驟18:ADC讀取差異行為-查找校正函數

我們可以在Excel中通過添加趨勢線來確定校正函數,現在已達到較高的程度,直到它完全適合我們的數據為止。

步驟19:使用其他軟件

用于確定曲線的其他有趣軟件是PolySolve,可直接在以下鏈接上使用:https://arachnoid.com/polysolve/或作為Java應用程序下載

它允許應用高級多項式回歸和格式化函數以及其他功能的交付。

要使用它,只需在第一行文本中輸入數據即可。框。數據必須遵循X,Y的順序,并以逗號或制表符分隔。請謹慎使用正確的點作為小數點。

如果正確設置了輸入數據的格式,則會在下一個框中顯示一個圖表。

這是我們ADC誤差曲線的變化方式。

此窗口將顯示回歸的結果,包括函數充足性數據,該數據可以用幾種方式格式化其輸出:作為C/C ++函數,系數列表,函數

注意:注意小數點分隔符

步驟20:常量和設置()

I在此處指出用于模擬捕獲的GPIO。我初始化了串行端口以及用于模擬捕獲的引腳。

const int pin_leitura = 36; //GPIO usado para captura analógica

void setup() {

Serial.begin(1000000); //Iniciciando a porta serial somente para debug

pinMode(pin_leitura, INPUT); //Pino utilizado para captura analógica

}

步驟21:循環()和校正函數

我們會捕獲調整后的電壓,然后打印帶有或不帶有正確校正的值。

void loop() {

int valor_analogico = analogRead(pin_leitura); //realiza a captura da tens?o ajustada

//Serial.print(valor_analogico + f(valor_analogico)); //imprime os valores para debug (COM CORRE??O)

Serial.print(valor_analogico); //imprimime os valores para debug (SEM CORRE??O)

Serial.print(“,”);

Serial.print(4095);//cria uma linha para marcar o valor máximo de 4095

Serial.print(“,”);

Serial.println(0); //cria uma linha para marcar o valor mínimo de 0

}

第12行中的通知中,我們可以選擇使用

步驟22:使用PolySolve校正函數

在這里,我們在Arduino IDE內部使用PolySolve函數

/*

Mode: normal

Polynomial degree 6, 2365 x,y data pairs

Correlation coefficient (r^2) = 9,907187626418e-01

Standard error = 1,353761109831e+01

Output form: C/C++ function:

Copyright ? 2012, P. Lutus -- http://www.arachnoid.com. All Rights Reserved.

*/

double f(double x) {

return 2.202196968876e+02

+ 3.561383996027e-01 * x

+ 1.276218788985e-04 * pow(x, 2)

+ -3.470360275448e-07 * pow(x, 3)

+ 2.082790802069e-10 * pow(x, 4)

+ -5.306931174991e-14 * pow(x, 5)

+ 4.787659214703e-18 * pow(x, 6);

}

注意逗號分隔作為小數點分隔符。

步驟23:帶有校正的捕獲-繪圖儀序列

步驟24:計算成本

要執行多項式計算,處理器必須處理此任務。這可能會導致執行延遲,具體取決于源代碼和可用的計算能力。

在這里,我們看到了使用多項式多項式的測試結果表。注意使用pow()函數的時間與不使用pow()函數的時間之間的時差。

步驟25:測試代碼-設置()和循環啟動()

在這里,我們有測試中使用的代碼。

void setup() {

Serial.begin(1000000); //Iniciando a porta serial somente para debug

}

void loop() {

float valor_analogico = 500.0; //um valor arbtrario

float quantidade = 10000.0; //quantidade de chamadas

float contador = 0.0; //contador de chamadas

步驟26:測試代碼-循環()和處理

我使用了micros()函數來獲取以微秒為單位的值。

//============= inicia o processo

float agora = micros(); //marca o instante inicial

while (contador 《 quantidade) {

//v(valor_analogico); //fun??o vazia

//r(valor_analogico); //fun??o com retorno

//f0(valor_analogico); //grau 0

//f1(valor_analogico); //grau 1

//f2(valor_analogico); //grau 2

//f3(valor_analogico); //grau 3

//f4(valor_analogico); //grau 4

//f5(valor_analogico); //grau 5

//f6(valor_analogico); //grau 6

//f13_semPow(valor_analogico); //grau 13o SEM a fun??o POW

//f13_comPow(valor_analogico); //grau 13o COM a fun??o POW

contador++;

}

agora = (micros() - agora) / quantidade; //determina o intervalo que se passou para cada itera??o

//============= finaliza o processo

步驟27:測試代碼-循環()-結果

我們打印從13級函數返回的值(帶有和不帶有POW進行比較)以及處理間隔。

//imprime o valor retornado da fun??o de grau 13 com e sem POW para compara??o

Serial.print(f13_semPow(valor_analogico)); //grau 13o SEM a fun??o POW

Serial.print(“ - ”);

Serial.print(f13_comPow(valor_analogico)); //grau 13o COM a fun??o POW

Serial.print(“ - ”);

//imprime o intervalo do processamento

Serial.println(agora, 6);

}

步驟28:測試代碼-使用的函數

空度為0和1的函數(僅帶返回)。

//FUN??O VAZIA

double v(double x) {

}

//FUN??O SOMENTE COM RETORNO

double r(double x) {

return x;

}

//FUN??O DE GRAU 0

double f0(double x) {

return 2.202196968876e+02;

}

//FUN??O DE GRAU 1

double f1(double x) {

return 2.202196968876e+02

+ 3.561383996027e-01 * x;

}

2、3和4級函數。

//FUN??O DE GRAU 2

double f2(double x) {

return 2.202196968876e+02

+ 3.561383996027e-01 * x

+ 1.276218788985e-04 * pow(x, 2);

}

//FUN??O DE GRAU 3

double f3(double x) {

return 2.202196968876e+02

+ 3.561383996027e-01 * x

+ 1.276218788985e-04 * pow(x, 2)

+ -3.470360275448e-07 * pow(x, 3);

}

//FUN??O DE GRAU 4

double f4(double x) {

return 2.202196968876e+02

+ 3.561383996027e-01 * x

+ 1.276218788985e-04 * pow(x, 2)

+ -3.470360275448e-07 * pow(x, 3)

+ 2.082790802069e-10 * pow(x, 4);

}

5和6級函數。

//FUN??O DE GRAU 5

double f5(double x) {

return 2.202196968876e+02

+ 3.561383996027e-01 * x

+ 1.276218788985e-04 * pow(x, 2)

+ -3.470360275448e-07 * pow(x, 3)

+ 2.082790802069e-10 * pow(x, 4)

+ -5.306931174991e-14 * pow(x, 5);

}

//FUN??O DE GRAU 6

double f6(double x) {

return 2.202196968876e+02

+ 3.561383996027e-01 * x

+ 1.276218788985e-04 * pow(x, 2)

+ -3.470360275448e-07 * pow(x, 3)

+ 2.082790802069e-10 * pow(x, 4)

+ -5.306931174991e-14 * pow(x, 5)

+ 4.787659214703e-18 * pow(x, 6);

}

使用POW的13級函數。

//FUN??O DE GRAU 13 USANDO O POW

double f13_comPow(double x) {

return 2, 161282383460e+02

+ 3, 944594843419e-01 * x

+ 5, 395439724295e-04 * pow(x, 2)

+ -3, 968558178426e-06 * pow(x, 3)

+ 1, 047910519933e-08 * pow(x, 4)

+ -1, 479271312313e-11 * pow(x, 5)

+ 1, 220894795714e-14 * pow(x, 6)

+ -6, 136200785076e-18 * pow(x, 7)

+ 1, 910015248179e-21 * pow(x, 8)

+ -3, 566607830903e-25 * pow(x, 9)

+ 5, 000280815521e-30 * pow(x, 10)

+ 3, 434515045670e-32 * pow(x, 11)

+ -1, 407635444704e-35 * pow(x, 12)

+ 9,871816383223e-40 * pow(x,13);

}

不使用13級函數POW。

//FUN??O DE GRAU SEM USAR O POW

double f13_semPow(double x) {

return 2, 161282383460e+02

+ 3, 944594843419e-01 * x

+ 5, 395439724295e-04 * x * x

+ -3, 968558178426e-06 * x * x * x

+ 1, 047910519933e-08 * x * x * x * x

+ -1, 479271312313e-11 * x * x * x * x * x

+ 1, 220894795714e-14 * x * x * x * x * x * x

+ -6, 136200785076e-18 * x * x * x * x * x * x * x

+ 1, 910015248179e-21 * x * x * x * x * x * x * x * x

+ -3, 566607830903e-25 * x * x * x * x * x * x * x * x * x

+ 5, 000280815521e-30 * x * x * x * x * x * x * x * x * x * x

+ 3, 434515045670e-32 * x * x * x * x * x * x * x * x * x * x * x

+ -1, 407635444704e-35 * x * x * x * x * x * x * x * x * x * x * x * x

+ 9, 871816383223e-40 * x * x * x * x * x * x * x * x * x * x * x * x * x;

}

責任編輯:wv

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 示波器
    +關注

    關注

    113

    文章

    6273

    瀏覽量

    185522
  • adc
    adc
    +關注

    關注

    98

    文章

    6525

    瀏覽量

    545232
收藏 人收藏

    評論

    相關推薦

    ADC108s022 DIN是在SCLK上升沿向ADC寫參數,而DOUT在SCLK的下降沿從ADC讀取轉換后的數據?

    是用的是SPI接口的ADC芯片,時序如下 是不是說,DIN是在SCLK上升沿向ADC寫參數,而DOUT在SCLK的下降沿從ADC讀取轉換后的數據??
    發表于 01-09 07:14

    讀取AFE4403的ADC計算后都是負值,是對的嗎?

    讀取AFE4403的ADC計算后都是負值,這對嗎?
    發表于 12-20 08:13

    讀取不到ADC0123通道的值,為什么?

    請問我的代碼由什么問題嗎?我讀取不到ADC0123通道的值。 已經通過示波器查看SPI接口 Data changed on SCK 1st edge, captured on 2nd, SCK
    發表于 11-28 07:12

    用28035如何讀取ADC128S022的數據?

    請問用28035如何讀取ADC128S022的數據,或者說是該怎么配置
    發表于 11-18 08:34

    adc讀取電壓值時,顯示的電壓值是亂碼怎么解決?

    您好,我在用adc讀取電壓值時,顯示的電壓值是亂碼,第一次接觸rtthread,不清楚如何這個問題如何下手,求指導,感謝
    發表于 09-27 08:09

    adc讀取電壓值時,顯示的電壓值是亂碼,如何解決?

    您好,我在用adc讀取電壓值時,顯示的電壓值是亂碼,第一次接觸rtthread,不清楚如何這個問題如何下手,求指導,感謝
    發表于 09-13 06:31

    如何在MCS中實現ADC數據讀取

    ,而且也路由至RES15的寄存器上,但是一直讀的為0 ,而且MHB讀出來也是0;如果需要在MCS中實現ADC數據讀取,還有其他注意地方嗎?
    發表于 07-24 07:59

    使用RTOS_SDK_V1.0.4版本system_adc_read讀取錯誤的問題求解

    使用目的: 使用RTOS_SDK_V1.0.4版本,每秒鐘讀取adc值,主要是用來讀取熱敏電阻的兩端的電壓值,根據電壓來計算環境溫度。 測試方法: 1. 在能連接路由器的情況下,每秒鐘調用一次
    發表于 07-18 08:13

    ESP8285 ADC可以讀取的最大電壓是多少?

    我想將溫度傳感器連接到ADC(TOUT)引腳。ADC可以讀取的最大電壓是多少?是1V嗎?如果是,向ADC施加2V電壓是否會損壞ESP8285?在 0oC 和 80oC 之間,電壓將從
    發表于 07-08 06:55

    基于TC36x讓MCS讀取ADC的轉換結果,請問ADC可以映射到GTM的MCS模塊嗎?

    基于TC36x,想要讓MCS讀取ADC的轉換結果,請問ADC可以映射到GTM的MCS模塊嗎?
    發表于 07-03 08:09

    ESP32S3 ADC連續單次讀取時剛開始的某次讀取可能需要幾十毫秒,為什么?

    如上圖示,我們的操作邏輯是,在一個中斷中標記需要讀取ADC,然后退出中斷去讀取ADC。每次在剛開始的幾次中斷中讀取的時候有某一次轉換時間會
    發表于 06-13 07:37

    ESP32連續讀取ADC,每次讀取ADC數據都不一樣,怎么解決?

    esp32 模組通過spi總線驅動外部ADC,,ADC為1khz 的采樣率,連續轉換模式,遇到的問題是,當ESP32 收到ADC的轉換完成信號后,在外部中斷(將轉換完成信號配置為外部中斷)里面
    發表于 06-11 06:36

    ESP32-S3能否直接用DMA通過SPI讀取ADC數據?

    項目中需從SPI的ADC讀取數據。目前是用ADC的DRDY信號觸發GPIO中斷,在中斷中讀取SPI數據,這樣會占用較多內核時間,無法提高ADC
    發表于 06-06 06:51

    STM32F407讀取掛在FSMC上的外部ADC數據,開啟DMA的Mem to Mem模式時只能讀取一次FSMC數據,為什么?

    大家好,我現在使用STM32F407,想要讀取掛在FSMC上的外部ADC的數據,我利用NOE產生一個時鐘信號給ADC。 現在的問題是,當我開啟DMA的Mem to Mem 模式時,只能讀取
    發表于 05-29 07:20

    CYT2B9使用沒有偏移和增益調整ADCADC誤差會出現A_TEB (+/-12LSB) 嗎?

    非線性度)都被反射出來? 2、A_TE 和 A_TEB 有什么區別? 如果我使用沒有偏移和增益調整ADCADC 誤差會出現 A_TEB (+/-12LSB) 嗎? 3、請在下面查看。 例如 如果
    發表于 01-22 06:21
    主站蜘蛛池模板: 91aaa免费观看在线观看资源| 999久久久国产精品| 国产精品久久久久久久久kt| 国模私拍福利一区二区| 黄色毛片儿| 国产欧美一区二区三区观看| 不卡一级毛片免费高清| 亚洲天天| 国产内地激情精品毛片在线一| 欧美1024| 中文字幕第11页| 制服丝袜在线一区| 男女刺激性视频大片| xxxxxxxxxxx性bbbb| 亚洲成人在线网站| 色视频欧美| 久久51| 91在线色| 久久刺激| 四虎影视入口| 日本精品一在线观看视频| 久久性色| 亚洲精品久久久久午夜| 免费福利影院| 4455四色永久免费| 一区二区视频在线| 日韩免费网站| 丁香婷婷电影| 日本加勒比高清一本大道| 啪啪小视频网站| 在线免费观看黄色小视频| 色多多在线观看播放| 黄页网址免费观看18网站| 免费看特级淫片日本| 国产成在线人视频免费视频| 天天久| 好大好硬好爽免费视频| 正在播放91| 国产网站在线免费观看| 手机看片午夜| 日日操夜夜骑|