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