ADC实验(读取引脚电压值)
目錄
- ADC 簡介
- 什么是ADC
- I.MX6ULL ADC 簡介
- ADC寄存器介紹
- 配置步驟
- 硬件原理分析
- 實驗程序編寫
- 編譯下載驗證
- 編寫Makefile 和鏈接腳本
- 編譯下載
ADC 是一種常見的外設,你可以在STM32 上見到它,在I.MX 6ULL 上依然能看到它的存在。通過讀取GPIO 引腳的高低電平我們可以知道輸入的是1 還0,但是我們并不能知道它實際的電壓是多少。ADC 的存在就是讓你知道的更加清楚,ADC 可以讓你知道某個IO 的具體電壓值。有很多傳感器都是模擬信號輸出的,也就是輸出電壓值,我們需要測量到其具體的電壓值,然后在使用對應的公式進行計算,得到最終的數字值。本章我們就來學習一下I.MX6ULL的ADC 外設。
ADC 簡介
什么是ADC
ADC,Analog to Digital Converter 的縮寫,中文名稱模數轉換器。它可以將外部的模擬信號轉化成數字信號。對于GPIO 口來說高于某個電壓值,它讀出來的只有高電平,低于就是低電平。假如我想知道具體的電壓數值就要借助于ADC 的幫助,它可以將一個范圍內的電壓精確的讀取出來。假設我們的GPIO 口只要高于1.7V 的都認為是高電平,例如,比如某個IO 口上外接了一個設備它能提供0-2V 的電壓變化,我們在這個IO 口上使用GPIO 模式去讀取的話我們只能獲得0 和1 兩個數據,但是我們使用ADC 模式去讀取就可以獲得0-2V 之間連續變化的數值。
ADC 有幾個比較重要的參數:
測量范圍:測量范圍對于ADC 來說就好比尺子的量程,ADC 測量范圍決定了你外接的設備其信號輸出電壓范圍,不能超過ADC 的測量范圍。如果所使用的外部傳感器輸出的電壓信號范圍和所使用的ADC 測量范圍不符合,那么就需要自行設計相關電壓轉換電路。
分辨率:就是尺子上的能量出來的最小測量刻度,例如我們常用的厘米尺它的最小刻度就是1 毫米,表示最小測量精度就是1 毫米。假如ADC 的測量范圍為0-5V,分辨率設置為12位,那么我們能測出來的最小電壓就是5V 除以2 的12 次方,也就是5/4096=0.00122V。很明顯,分辨率越高,采集到的信號越精確,所以分辨率是衡量ADC 的一個重要指標。
精度:是影響結果準確度的因素之一,比如在厘米尺上我們能測量出大概多少毫米的尺度但是毫米后一點點我們卻不能準確的量出。經過計算我們ADC 在12 位分辨率下的最小測量值是0.00122V 但是我們ADC 的精度最高只能到11 位也就是0.00244V。也就是ADC 測量出0.00244V 的結果是要比0.00122V 要可靠,也更準確。
采樣時間:當ADC 在某時刻采集外部電壓信號的時候,此時外部的信號應該保持不變,但實際上外部的信號是不停變化的。所以在ADC 內部有一個保持電路,保持某一時刻的外部信號,這樣ADC 就可以穩定采集了,保持這個信號的時間就是采樣時間。
采樣率:也就是在一秒的時間內采集多少次。很明顯,采樣率越高越好,當采樣率不夠的時候可能會丟失部分信息,所以ADC 采樣率是衡量ADC 性能的另一個重要指標總之,只要是需要模擬信號轉為數字信號的場合,那么肯定要用到ADC。很多數字傳感器內部會集成ADC,傳感器內部使用ADC 來處理原始的模擬信號,最終給用戶輸出數字信號。
I.MX6ULL ADC 簡介
I.MX6ULL 提供了兩個12 位ADC 通道和10 個輸入接口給我們使用。I.MX6ULL 的ADC外設特性如下:
1)、線性連續逼近算法,分辨率高達12 位。
2)、多達10 個通道可以選擇。
3)、最高采樣率1MS/s。
4)、多達8 個單端外部模擬輸入。
5)、單次或連續轉換(單次轉換后自動返回空閑狀態)。
6)、可以配置為12/10/8 位。
7)、可配置的采樣時間和轉換速度/功率
8)、支持轉換完成、硬件平均完成標志和中斷。
9)、自我校準模式
ADC 有三種工作狀態:禁止狀態(Disabled)、閑置狀態(Idle)、工作狀態(Performing conversions)
禁止狀態:ADC 模塊被禁止工作。
閑置狀態:當前轉換已經完成,下次轉換尚未準備時的狀態,當異步時鐘輸出被關閉,ADC進入該狀態時,ADC 此時處于最低功耗狀態。
工作狀態:當ADC 初始化完成后,并設置好輸入通道后,將進入的狀態。轉換過程中也一直保持在工作狀態。
我們來介紹一下ADC 對應的寄存器。讓我們了解如何使用它。這里我們拿ADC1 來進行一個介紹,ADC2 和ADC1有一點不同但在總體上來說是差不多的,想要深入了解的詳細去看參考手冊。
ADC寄存器介紹
我們接下來看一下ADC 的幾個重要的寄存器,首先看一下ADCx_CFG(x=1~2)寄存器,這是ADC1 的配置寄存器,此寄存器結構如圖C1.1.1.1 所示:
寄存器ADC1_CFG 用到的重要位如下:
OVWREN (bit16):數據復寫使能位,為1 的時候使能復寫功能,為0 的時候關閉復寫功能。
AVGS(bit15:14):硬件平均次數,只有當ADC1_GC 寄存器的AVGE 位為1 的時候才有效。
可選值表C1.1.1.1 所示:
| 00 | 4 次樣本求平均。 |
| 01 | 8 次樣本求平均。 |
| 10 | 16 次樣本求平均。 |
| 11 | 32 次樣本求平均。 |
ADTRG(bit13):轉換觸發選擇。為0 的時候選擇軟件觸發,為1 的時候,不選擇軟件觸發。
REFSEL(bit12:11):參考電壓選擇,為00 時選擇VREFH/VREFL 這兩個引腳上的電壓為參考電壓,正點原子ALPHA 開發板上VREFH 為3.3V,VREFL 為0V。
ADHSC(bit10):高速轉換使能位,當為0 時為正常模式,為1 時為高速模式。
ADSTS(bit9:8):設置ADC 的采樣周期,與ADLSMP 位一起決定采樣周期,如表C1.1.1.2所示:
| 00 | 當ADLSMP=0 時采樣一次需要2 個ADC clocks,ADLSMP=1 時需要12 個。 |
| 01 | 當ADLSMP=0 時采樣一次需要4 個ADC clocks,ADLSMP=1 時需要16 個。 |
| 10 | 當ADLSMP=0 時采樣一次需要6 個ADC clocks,ADLSMP=1 時需要20 個。 |
| 11 | 當ADLSMP=0 時采樣一次需要8 個ADC clocks,ADLSMP=1 時需要24 個。 |
ADIV(bit6:5):時鐘分頻選擇,為00 的時候不分頻,為01 的時候2 分頻,為10 的時候4分頻,為11 的時候8 分頻。
ADLSMP(bit4):長采樣周期使能位,當值為0 時為短采樣周期模式,為1 時為長采樣周期模式。搭配ADSTS 位一起控制ADC 的采樣周期,見表C1.1.2。
MODE(bit3:2):選擇轉換精度,設置如表C1.1.3:
| 00 | 8 位精度 |
| 01 | 10 位精度 |
| 10 | 12 位精度 |
| 11 | 無效 |
ADICLK(bit1:0):輸入時鐘源選擇,為00 的時候選擇IPG Clock,為01 的時候選擇IPG Clock/2,為10 的時候無效,為11 的時候選擇呢ADACK。本教程我們設置為11,也就是選擇ADACK 為ADC 的時鐘源。
接下來看一下通用控制寄存器ADCx_GC,寄存器結構如圖C1.1.1.2 所示:
此寄存器對應的位含義如下:
CAL(bit7):當該位寫入1 時,硬件校準功能將會啟動,校準過程中該位會一直保持1,校準完成后會清0,校準完成后需要檢查一下ADC_GS[CALF]位,確認校準結果。
ADCO(bit6):連續轉換使能位,只有在開啟了硬件平均功能時有效,為0 時只能轉換一次或一組,當ADCO 為1 時可以連續轉換或多組。
AVGE(bit5):硬件平均使能位。為0 時關閉,為1 時使能。
ACFE(bit4):比較功能使能位。為0 時關閉,為1 時使能。
ACFGT(bit3):配置比較方法,如果為0 的話就比較轉換結果是否小于ADC_CV 寄存器值,如果為1 的話就比較裝換結果是否大于或等于ADC_CV 寄存器值。
ACREN(bit2):范圍比較功能使能位。為0 的話僅和ADC_CV 里的CV1 比較,為1 的話和ADC_CV 里的CV1、CV2 比較。
ACREN(bit2):范圍比較功能使能位。為0 的話僅和ADC_CV 里的CV1 比較,為1 的話和ADC_CV 里的CV1、CV2 比較。
DMAEN(bit1):DMA 功能使能位,為0 是關閉,為1 是開啟。
ADACKEN(bit0):異步時鐘輸出使能位,為0 是關閉,為1 時開啟。
接下來看一下通用狀態寄存器ADCx_GS,寄存器結構如圖C1.1.1.3 所示:
此寄存器對應的位含義如下:
AWKST(bit2):異步喚醒中斷狀態,為1 時表示發生了異步喚醒中斷。為0 時沒有發生異步中斷。
CALF(bit1):校準失敗標志位,為0 的時候表示校準正常完成,為1 的時候表示校準失敗。
ADACT(bit0):轉換活動標志,為0 的時候表示轉換沒有進行,為1 的時候表示正在進行轉換。
接下來看一下狀態寄存器ADCx_HS,此寄存器結構如圖C1.1.1.4 所示:
此寄存器只有一個位COCO0,這是轉換完成標志位,此位為只讀位,當關閉比較功能和硬件平均以后每次轉換完整此位就會被置1。使能硬件平均以后,只有在設置的轉換次數達到以后此位才置1。
再來看一下控制寄存器ADCx_HC0,此寄存器結構如圖C1.1.1.5 所示:
來看一下此寄存器對應的位:
AIEN(bit7):轉換完成中斷控制位,為1 的時候打開轉換完成中斷,為0 的時候關閉。
ADCH(bit4:0):轉換通道選擇,可以設置為00000~01111 分別對應通道0~15。11001 為內部通道,用于ADC 自測。
最后看一下數據結果寄存器ADCx_R0,顧名思義,此寄存器保存ADC 數據結果,也就是轉換值,寄存器結構如圖C1.1.1.6 所示:
從圖C1.1.1.6 可以看出,只有bit11:0 這12 位有效,此12 位用來保存ADC 轉換結果。
配置步驟
關于ADC 有關的寄存器就介紹到這里,關于這些寄存器詳細的描述,請參考《I.MX6ULL參考手冊》第13.6 小節。本章我們使用I.MX6ULL 的ADC1 通道1,ADC1 通道1 的引腳為GPIO1_IO01,配置步驟如下:
1、初始化ADC1_CH1
初始化ADC1_CH1,配置ADC 位數,時鐘源,采樣時間等。
2、校準ADC
ADC 在使用之前需要校準一次。
4、使能ADC
配置好ADC 以后就可以開啟了。
5、讀取ADC 值
ADC 正常工作以后就可以讀取ADC 值。
硬件原理分析
本試驗用到的資源如下:
1)、指示燈LED0。
2)、RGB LCD 接口。
3)、GPIO1_IO01 引腳
本實驗主要用到I.MX6ULL 的GPIO1_IO01 引腳,將其作為ADC1 的通道1引腳,正點原子ALPHA 開發板上引出了GPIO1_IO01 引腳,如圖C1.2.1.1 所示:
圖C1.2.1.1 中的GPIO1 就是GPIO1_IO01 引腳,此引腳作為ADC1_CH1,我們可以使用杜邦線在此引腳上引入一個0~3.3V 的電壓,然后使用內部ADC 進行測量。
實驗程序編寫
本實驗對應的例程路徑為:開發板光盤-> 1、裸機例程-> 21_adc。
本章實驗在上一章例程的基礎上完成,更改工程名字為“adc”,然后在bsp 文件夾下創建名為“adc”的文件夾。在bsp/adc 中新建bsp_adc.c 和bsp_adc.h 這兩個文件。在bsp_adc.h 中輸入如下內容:
#ifndef __ADC_H #define __ADC_H /*************************************************************** Copyright ? zuozhongkai Co., Ltd. 1998-2019. All rights reserved. 文件名 : bsp_adc.h 作者 : 左忠凱 版本 : V1.0 描述 : ADC驅動頭文件。 其他 : 無 論壇 : www.openedv.com 日志 : 初版V1.0 2019/1/22 左忠凱創建 ***************************************************************/ #include "imx6ul.h"int adc1ch1_init(void); status_t adc1_autocalibration(void); uint32_t getadc_value(void); unsigned short getadc_average(unsigned char times); unsigned short getadc_volt(void);#endif文件bsp_adc.h 內容很簡單,都是一些函數聲明。接下來在文件bsp_backlight.c 中輸入如下內容:
#include "bsp_adc.h" #include "bsp_delay.h" #include "stdio.h"/** @description : 初始化ADC1_CH1,使用GPIO1_IO01這個引腳。* @param : 無* @return : 0 成功,其他值 錯誤代碼*/ int adc1ch1_init(void) {int ret = 0;/* 1、初始化ADC1 CH1 *//* CFG寄存器* bit16 0 關閉復寫功能* bit15:14 00 硬件平均設置為默認值,00的時候4次平均,* 但是得ADC_GC寄存器的AVGE位置1來使能硬件平均* bit13 0 軟件觸發* bit12:1 00 參考電壓為VREFH/VREFL,也就是3.3V/0V* bit10 0 正常轉換速度* bit9:8 00 采樣時間2/12,ADLSMP=0(短采樣)的時候為2個周期* ADLSMP=1(長采樣)的時候為12個周期* bit7 0 非低功耗模式* bit6:5 00 ADC時鐘源1分頻 * bit4 0 短采樣* bit3:2 10 12位ADC* bit1:0 11 ADC時鐘源選擇ADACK */ADC1->CFG = 0;ADC1->CFG |= (2 << 2) | (3 << 0);/* GC寄存器* bit7 0 先關閉校準功能,后面會校準* bit6 0 關閉持續轉換* bit5 0 關閉硬件平均功能* bit4 0 關閉比較功能* bit3 0 關閉比較的Greater Than功能* bit2 0 關閉比較的Range功能* bit1 0 關閉DMA* bit0 1 使能ADACK*/ADC1->GC = 0;ADC1->GC |= 1 << 0;/* 2、校準ADC */if(adc1_autocalibration() != kStatus_Success)ret = -1;return ret; }/** @description : 初始化ADC1校準* @param : 無* @return : kStatus_Success 成功,kStatus_Fail 失敗*/ status_t adc1_autocalibration(void) {status_t ret = kStatus_Success;ADC1->GS |= (1 << 2); /* 清除CALF位,寫1清零 */ADC1->GC |= (1 << 7); /* 使能校準功能 *//* 校準完成之前GC寄存器的CAL位會一直為1,直到校準完成此位自動清零 */while((ADC1->GC & (1 << 7)) != 0) { /* 如果GS寄存器的CALF位為1的話表示校準失敗 */if((ADC1->GS & (1 << 2)) != 0) {ret = kStatus_Fail;break;}}/* 校準成功以后HS寄存器的COCO0位會置1 */if((ADC1->HS & (1 << 0)) == 0) ret = kStatus_Fail;/* 如果GS寄存器的CALF位為1的話表示校準失敗 */if((ADC1->GS & (1 << 2)) != 0) ret = kStatus_Fail;return ret; }/** @description : 獲取ADC原始值* @param : 無* @return : 獲取到的ADC原始值*/ unsigned int getadc_value(void) {/* 配置ADC通道1 */ADC1->HC[0] = 0; /* 關閉轉換結束中斷 */ADC1->HC[0] |= (1 << 0); /* 通道1 */while((ADC1->HS & (1 << 0)) == 0); /* 等待轉換完成 */return ADC1->R[0]; /* 返回ADC值 */ }/** @description : 獲取ADC平均值* @param times : 獲取次數* @return : times次轉換結果平均值*/ unsigned short getadc_average(unsigned char times) {unsigned int temp_val = 0;unsigned char t;for(t = 0; t < times; t++){temp_val += getadc_value();delayms(5);}return temp_val / times; } /** @description : 獲取ADC對應的電壓值* @param : 無* @return : 獲取到的電壓值,單位為mV*/ unsigned short getadc_volt(void) {unsigned int adcvalue=0;unsigned int ret = 0;adcvalue = getadc_average(5);ret = (float)adcvalue * (3300.0f / 4096.0f); /* 獲取計算后的帶小數的實際電壓值 */return ret; }文件bsp_blacklight.c 一共有5 個函數,首先是函數adc1ch1_init,這個是ADC1 通道1 的初始化函數,在此函數里面會初始化ADC,比如設置ADC 時鐘源、設置參考電壓、ADC 位數等,初始化完成以后會調用adc1_autocalibration 函數校準一次ADC。第2 個函數就是
adc1_autocalibration,這個是ADC 校準函數,在使用ADC 之前最好校準一次。第3 個函數是getadc_value,這個函數用于獲取ADC 轉換值,也就是讀取ADCx_R0 寄存器。第4 個函數為getadc_average,這是軟件平均值,也就是軟件讀取多次ADC 值,然后進行平均,大家也可以直接使用ADC 自帶的硬件平均。最后一個函數就是getadc_volt,此函數用于將獲取到的原始
ADC 值轉換為對應的電壓值。
最后在上一章實驗的main.c 文件基礎上,將main 函數改為如下內容:
#include "bsp_clk.h" #include "bsp_delay.h" #include "bsp_led.h" #include "bsp_beep.h" #include "bsp_key.h" #include "bsp_int.h" #include "bsp_uart.h" #include "bsp_lcd.h" #include "bsp_lcdapi.h" #include "bsp_rtc.h" #include "bsp_backlight.h" #include "bsp_adc.h" #include "stdio.h"/** @description : 使能I.MX6U的硬件NEON和FPU* @param : 無* @return : 無*/void imx6ul_hardfpu_enable(void) {uint32_t cpacr;uint32_t fpexc;/* 使能NEON和FPU */cpacr = __get_CPACR();cpacr = (cpacr & ~(CPACR_ASEDIS_Msk | CPACR_D32DIS_Msk))| (3UL << CPACR_cp10_Pos) | (3UL << CPACR_cp11_Pos);__set_CPACR(cpacr);fpexc = __get_FPEXC();fpexc |= 0x40000000UL; __set_FPEXC(fpexc); }volatile /** @description : main函數* @param : 無* @return : 無*/ int main(void) {unsigned char i = 0;unsigned int adcvalue;unsigned char state = OFF;signed int integ; /* 整數部分 */signed int fract; /* 小數部分 */imx6ul_hardfpu_enable(); /* 使能I.MX6U的硬件浮點 */int_init(); /* 初始化中斷(一定要最先調用!) */imx6u_clkinit(); /* 初始化系統時鐘 */delay_init(); /* 初始化延時 */clk_enable(); /* 使能所有的時鐘 */led_init(); /* 初始化led */beep_init(); /* 初始化beep */uart_init(); /* 初始化串口,波特率115200 */lcd_init(); /* 初始化LCD */adc1ch1_init(); /* ADC1_CH1 */ tftlcd_dev.forecolor = LCD_RED;lcd_show_string(50, 10, 400, 24, 24, (char*)"ALPHA-IMX6U ADC TEST"); lcd_show_string(50, 40, 200, 16, 16, (char*)"ATOM@ALIENTEK"); lcd_show_string(50, 60, 200, 16, 16, (char*)"2019/12/16"); lcd_show_string(50, 90, 400, 16, 16, (char*)"ADC Ori Value:0000"); lcd_show_string(50, 110, 400, 16, 16,(char*)"ADC Val Value:0.00 V"); tftlcd_dev.forecolor = LCD_BLUE;while(1) {adcvalue = getadc_average(5);lcd_showxnum(162, 90, adcvalue, 4, 16, 0); /* ADC原始數據值 */printf("ADC orig value = %d\r\n", adcvalue);adcvalue = getadc_volt();integ = adcvalue / 1000;fract = adcvalue % 1000;lcd_showxnum(162, 110, integ, 1, 16, 0); /* 顯示電壓值的整數部分,3.1111的話,這里就是顯示3 */lcd_showxnum(178, 110, fract, 3, 16, 0X80); /* 顯示電壓值小數部分(前面轉換為了整形顯示),這里顯示的就是111. */printf("ADC vola = %d.%dV\r\n", integ, fract);delayms(50);i++;if(i == 10){ i = 0;state = !state;led_switch(LED0,state); }}return 0; }第18 行調用函數adc1ch1_init 初始化ADC1_CH1。第30 行調用getadc_average 函數獲取ADC 原始值,這里讀取5 次數據然后求平均。第34 行調用getadc_volt 函數獲取ADC 對應的電壓值。最后將原始值和電壓值都顯示在LCD 上。
編譯下載驗證
編寫Makefile 和鏈接腳本
修改Makefile 中的TARGET 為adc,然后在在INCDIRS 和SRCDIRS 中加入“bsp/adc”,修改后的Makefile 如下:
CROSS_COMPILE ?= arm-linux-gnueabihf- TARGET ?= adcCC := $(CROSS_COMPILE)gcc LD := $(CROSS_COMPILE)ld OBJCOPY := $(CROSS_COMPILE)objcopy OBJDUMP := $(CROSS_COMPILE)objdumpLIBPATH := -lgcc -L /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/lib/gcc/arm-linux-gnueabihf/4.9.4INCDIRS := imx6ul \stdio/include \bsp/clk \bsp/led \bsp/delay \bsp/beep \bsp/gpio \bsp/key \bsp/exit \bsp/int \bsp/epittimer \bsp/keyfilter \bsp/uart \bsp/lcd \bsp/rtc \bsp/i2c \bsp/ap3216c \bsp/spi \bsp/icm20608 \bsp/touchscreen \bsp/backlight \bsp/adc SRCDIRS := project \stdio/lib \bsp/clk \bsp/led \bsp/delay \bsp/beep \bsp/gpio \bsp/key \bsp/exit \bsp/int \bsp/epittimer \bsp/keyfilter \bsp/uart \bsp/lcd \bsp/rtc \bsp/i2c \bsp/ap3216c \bsp/spi \bsp/icm20608 \bsp/touchscreen \bsp/backlight \bsp/adc INCLUDE := $(patsubst %, -I %, $(INCDIRS))SFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S)) CFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))SFILENDIR := $(notdir $(SFILES)) CFILENDIR := $(notdir $(CFILES))SOBJS := $(patsubst %, obj/%, $(SFILENDIR:.S=.o)) COBJS := $(patsubst %, obj/%, $(CFILENDIR:.c=.o)) OBJS := $(SOBJS) $(COBJS)VPATH := $(SRCDIRS).PHONY: clean$(TARGET).bin : $(OBJS)$(LD) -Timx6ul.lds -o $(TARGET).elf $^ $(LIBPATH)$(OBJCOPY) -O binary -S $(TARGET).elf $@$(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis$(SOBJS) : obj/%.o : %.S$(CC) -Wall -nostdlib -fno-builtin -c -O2 $(INCLUDE) -o $@ $<$(COBJS) : obj/%.o : %.c$(CC) -Wall -march=armv7-a -mfpu=neon-vfpv4 -mfloat-abi=hard -Wa,-mimplicit-it=thumb -nostdlib -fno-builtin -c -O2 $(INCLUDE) -o $@ $<clean:rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)第2 行修改變量TARGET 為“adc”,也就是目標名稱為“adc”。
第33 行在變量INCDIRS 中添加ADC 驅動頭文件(.h)路徑。
第57 行在變量SRCDIRS 中添加ADC 驅動驅動文件(.c)路徑。
鏈接腳本保持不變。
編譯下載
使用Make 命令編譯代碼,編譯成功以后使用軟件imxdownload 將編譯完成的adc.bin 文件下載到SD 卡中,命令如下:
chmod 777 imxdownload //給予imxdownload 可執行權限,一次即可 ./imxdownload adc.bin /dev/sdd //燒寫到SD 卡中,不能燒寫到/dev/sda 或sda1 里面!燒寫成功以后將SD 卡插到開發板的SD 卡槽中,然后復位開發板。用杜邦線將圖C1.2.1中的GPIO1 引腳接到GND 上,那么此時測量到的電壓肯定就是0V,如圖C1.4.2.1 所示:
從圖C1.4.2.1 可以看出,當GPIO1_IO01 接到GND 的時候,此時ADC 原始數值為50,換算出來的實際電壓為0.045V,考慮到誤差已經電源的抖動,可以認為是0V。接下來大家可以將GPIO1_IO01 引腳接到3.3V 電源引腳上,此時測量值如圖C1.4.2.2 所示:
從圖C1.4.2.2 可以看出,此時的ADC 原始值為3945,對應的電壓值為3.18V。至此,I.MX6ULL 的ADC 就講解完成。
總結
以上是生活随笔為你收集整理的ADC实验(读取引脚电压值)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 曲线及其方程
- 下一篇: Windows Phone本地数据库(S