開發(fā)-ADC)
目錄一.背景二.寄存器HC0HSR0CFGGCGS三.實現(xiàn)復(fù)用功能電氣屬性完整初始化校準(zhǔn)函數(shù)讀取傳感器一.背景ADC是模擬到數(shù)字轉(zhuǎn)換器Analog-to-Digital Converter的縮寫。它是一種電子設(shè)備或模塊2440內(nèi)部擁有一個ADC外設(shè)。用于將連續(xù)變化的模擬信號轉(zhuǎn)換為離散的數(shù)字信號以便數(shù)字系統(tǒng)如微處理器、微控制器等能夠?qū)ζ溥M(jìn)行處理和分析。?模擬信號一般是指連續(xù)變化的電壓信號其數(shù)值在一定范圍內(nèi)變化。而數(shù)字信號是由一系列離散的數(shù)字表示只能取有限的值通常以二進(jìn)制形式表示。?ADC的工作原理是將模擬信號分割成一系列離散的取樣并將每個取樣值轉(zhuǎn)換為相應(yīng)的數(shù)字表示。這個過程涉及到兩個主要步驟采樣和量化。?采樣ADC將連續(xù)變化的模擬信號在一定時間間隔內(nèi)進(jìn)行取樣。取樣頻率決定了每秒采集的樣本數(shù)通常以赫茲Hz表示。采樣過程通過保持并測量模擬信號在每個采樣時間點(diǎn)的電壓值來實現(xiàn)。?量化采樣得到的連續(xù)模擬信號經(jīng)過量化轉(zhuǎn)換為數(shù)字形式。量化是將每個采樣值映射到一個離散的數(shù)字值的過程。這通常通過比較采樣值與參考電壓之間的差異并將其轉(zhuǎn)換為數(shù)字表示。?ADC量化的過程是相對于一個基準(zhǔn)值的這個基準(zhǔn)值稱之為基準(zhǔn)電壓。一般采用逐次逼近法ADC會先拿采用電壓Vadc跟基準(zhǔn)電壓Vref的1/2進(jìn)行比較如果VadcVref則結(jié)果為1否則結(jié)果為0。之后繼續(xù)拿Vadc和Vref的1/4或Vref的3/4繼續(xù)比較。這個過程有點(diǎn)像二分法每次比較都會使量化的結(jié)果逼近真實值。很明顯比較的次數(shù)決定了測量的精度這個精度被稱之為ADC的分辨率。比如一個比較了8次的ADC外設(shè)它就稱為8位ADC其結(jié)果是0~255之間的一個數(shù)值設(shè)該數(shù)值為n那么實際電壓就是Vref * (n/255)。如果把比較次數(shù)增加到10次結(jié)果就是0~1023之間的一個數(shù)。常見的分辨率包括8位10位12位和16位。相機(jī)麥克風(fēng)是ADC設(shè)備喇叭是DACADC最高頻率限制20MHZ,ADACK為ADC內(nèi)部時鐘imx6ull專門為ADC配置的時鐘默認(rèn)20MHZ所以經(jīng)過分頻器選擇一分頻即可將運(yùn)行速度拉滿二.寄存器HC0AIEN:轉(zhuǎn)換完成中斷使能或禁止控制位轉(zhuǎn)換完成會引發(fā)中斷置0表示禁止采用輪詢方式檢測是否轉(zhuǎn)換完成。ADCH:輸入通道選擇如下有通道0到9HS轉(zhuǎn)換完成標(biāo)記位在R0寄存器中存儲R0CFGOVWREN:數(shù)據(jù)覆寫使能位置0表示不覆蓋上一次轉(zhuǎn)換的結(jié)果置1則表示覆蓋置0置1都可因為本次轉(zhuǎn)換一次讀一次所以無影響。AVGS:硬件平均濾波選擇位選擇在幾次采樣后進(jìn)行濾波默認(rèn)即可后續(xù)自己寫一個濾波函數(shù)ADTRG:轉(zhuǎn)換觸發(fā)選擇位清零軟件觸發(fā)ADC轉(zhuǎn)換開始干活。REFSEL:選擇基準(zhǔn)電壓VREFH-VREFL得到基準(zhǔn)電壓ADC_VREFH接了3.3V電壓3P3)所以VREFL理論接地為0V電壓。ADHSC:高速配置設(shè)置轉(zhuǎn)換速度。ADSTS:采樣周期00表示一次采樣消耗2個時鐘周期越久越精準(zhǔn)ADLPC低功耗模式置0表示不在低功耗。ADIV:時鐘分頻位00表示輸入時鐘不分頻。ADLSMP:長采樣或者短采樣默認(rèn)即可。MODE:設(shè)置ADC分辨率設(shè)置最高12位ADICLK:選擇輸入時鐘11為上述提及的專用時鐘20MHZ。GCCAL:使用ADC之前校準(zhǔn)將CAL置1ADCO:持續(xù)轉(zhuǎn)換使能位0表示單次轉(zhuǎn)換1表示持續(xù)轉(zhuǎn)換本次采用單次轉(zhuǎn)換。而要開啟ADC轉(zhuǎn)換要先切換一次通道比如從ADC1通道0切換到ADC1通道1開啟轉(zhuǎn)換。AVGE:硬件平均功能使能位清零表示硬件平均濾波失能因為要自己寫濾波所以置零。ACFE設(shè)置中斷閾值根據(jù)結(jié)果觸發(fā)中斷本次不用中斷置0ACFGT:對中斷比較結(jié)果的判斷大于小于置0ACREN:開啟ACFE位DMA:DMA位本次不用。對ADACK的使能配置置1表示時鐘輸出使能。GS0表示校準(zhǔn)成功1失敗失敗清零三.實現(xiàn)復(fù)用功能// 配置引腳復(fù)用功能 IOMUXC_SetPinMux(IOMUXC_GPIO1_IO01_GPIO1_IO01, 0);電氣屬性PUE位配0為保持電壓若置1則為拉可能改變傳感器輸入的電壓PKE置1為保持功能使能// 配置電氣屬性 IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO01_GPIO1_IO01, IOMUXC_SW_PAD_CTL_PAD_PKE(1)); IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO01_GPIO1_IO01, IOMUXC_SW_PAD_CTL_PAD_PUE(0));完整初始化void adc1_channel1_init(void) { // 配置引腳復(fù)用功能 IOMUXC_SetPinMux(IOMUXC_GPIO1_IO01_GPIO1_IO01, 0); // 配置電氣屬性 IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO01_GPIO1_IO01, IOMUXC_SW_PAD_CTL_PAD_PKE(1)); IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO01_GPIO1_IO01, IOMUXC_SW_PAD_CTL_PAD_PUE(0)); ADC1-HC[0] ~(1 7);//置0表示禁止采用輪詢方式檢測是否轉(zhuǎn)換完成。 ADC1-CFG 0; ADC1-CFG | (1 3) | (3 0); //23位MODE:設(shè)置ADC分辨率設(shè)置最高12位 //01位ADICLK:選擇輸入時鐘11為上述提及的專用時鐘20MHZ。 ADC1-GC 0; ADC1-GC | (1 0);//對ADACK的使能配置置1表示時鐘輸出使能。 // 校準(zhǔn) printf(adc1_calibration() ? calibration completed normally!\n : calibration completed failed!\n); }校準(zhǔn)函數(shù)內(nèi)部對電壓校準(zhǔn)校準(zhǔn)之后產(chǎn)生誤差下次調(diào)用會自動減去誤差int adc1_calibration(void) { // 校準(zhǔn) ADC1-GC | (1 7); while ((ADC1-GC (1 7)) ! 0);//校準(zhǔn)需要過一段時間校準(zhǔn)完成后此位會自動清零所以卡住等校準(zhǔn)成功 if ((ADC1-GS (1 1)) 0) //GSbit1位清零說明校準(zhǔn)通過 { return 1; } else { return 0; } }讀取傳感器unsigned short adc1_get_origin_value(void)//數(shù)字信號 { ADC1-HC[0] 0; ADC1-HC[0] 1;//切換通道開啟轉(zhuǎn)換 while ((ADC1-HS (1 0)) 0); return ADC1-R[0] 0xFFF; //讀取ADC轉(zhuǎn)換完成后的數(shù)據(jù) } float adc1_get_value(void) //轉(zhuǎn)換為模擬信號 { return adc1_get_origin_value() / 4095.0 * 3.3; }