6.1. ADC基礎(chǔ)知識(shí)
6.1.1. 什么是ADC
模擬數(shù)字轉(zhuǎn)換器即A/D轉(zhuǎn)換器,或簡(jiǎn)稱ADC,通常是指一個(gè)將模擬信號(hào)轉(zhuǎn)變?yōu)?a target="_blank">數(shù)字信號(hào)的電子元件。通常的模數(shù)轉(zhuǎn)換器是將一個(gè)輸入電壓信號(hào)轉(zhuǎn)換為一個(gè)輸出的數(shù)字信號(hào)。由于數(shù)字信號(hào)本身不具有實(shí)際意義,僅僅表示一個(gè)相對(duì)大小。故任何一個(gè)模數(shù)轉(zhuǎn)換器都需要一個(gè)參考模擬量作為轉(zhuǎn)換的標(biāo)準(zhǔn),比較常見(jiàn)的參考標(biāo)準(zhǔn)為最大的可轉(zhuǎn)換信號(hào)大小。而輸出的數(shù)字量則表示輸入信號(hào)相對(duì)于參考信號(hào)的大小。
6.1.2. CW32的ADC介紹
CW32F003 內(nèi)部集成一個(gè) 12 位精度、最高 1M SPS 轉(zhuǎn)換速度的逐次逼近型模數(shù)轉(zhuǎn)換器 (SAR ADC),最多可將 16 路模擬信號(hào)轉(zhuǎn)換為數(shù)字信號(hào)。現(xiàn)實(shí)世界中的絕大多數(shù)信號(hào)都是模擬量,如光、電、聲、圖像信號(hào)等,都要由 ADC 轉(zhuǎn)換成數(shù)字信號(hào),才能由 MCU 進(jìn)行數(shù)字化處理。
主要特性
12 位精度
可編程轉(zhuǎn)換速度,最高達(dá) 1M SPS
16 路輸入轉(zhuǎn)換通道
- 13 路外部引腳輸入
- 內(nèi)置溫度傳感器
- 內(nèi)置 BGR 1.2V 基準(zhǔn)
- 1/3 VDD 電源電壓
4 路參考電壓源(Vref)
- VDD 電源電壓
- ExRef(PB04)引腳電壓
- 內(nèi)置 1.5V 參考電壓
- 內(nèi)置 2.5V 參考電壓
采樣電壓輸入范圍:0 ~ Vref
多種轉(zhuǎn)換模式,全部支持轉(zhuǎn)換累加功能
- 單次轉(zhuǎn)換
- 多次轉(zhuǎn)換
- 連續(xù)轉(zhuǎn)換
- 序列掃描轉(zhuǎn)換
- 序列斷續(xù)轉(zhuǎn)換
支持單通道、序列通道兩種通道選擇,最大同時(shí)支持 4 個(gè)序列
支持輸入通道電壓閾值監(jiān)測(cè)
內(nèi)置信號(hào)跟隨器,可轉(zhuǎn)換高阻抗輸入信號(hào)
支持片內(nèi)外設(shè)自動(dòng)觸發(fā) ADC 轉(zhuǎn)換
6.1.3. ADC基本參數(shù)
分辨率:表示ADC轉(zhuǎn)換器的輸出精度,通常以位數(shù)(bit)表示,比如8位、10位、12位等,位數(shù)越高,精度越高。
采樣率:表示ADC對(duì)模擬輸入信號(hào)進(jìn)行采樣的速率,通常以每秒采樣次數(shù)(samples per second,SPS)表示,也稱為轉(zhuǎn)換速率,表示ADC能夠進(jìn)行多少次模擬到數(shù)字的轉(zhuǎn)換。
采樣范圍:指ADC可以采集到的模擬輸入信號(hào)的電壓范圍,范圍見(jiàn)下:
0 ≤ ADC ≤ Vref
Vref 為參考電壓,CW32F003有四路電壓參考源見(jiàn)上文。
6.1.4. 基本原理
CW32F003采用的是逐次逼近型的12位ADC,逐次逼近型ADC是一種常見(jiàn)的ADC工作原理,它的思想是通過(guò)比較模擬信號(hào)與參考電壓之間的大小關(guān)系來(lái)逐步逼近輸入信號(hào)的數(shù)字表示。在逐次逼近型ADC中,輸入信號(hào)和參考電壓被加入一個(gè)差分放大器中,產(chǎn)生一個(gè)差分電壓。
然后,這個(gè)差分電壓被輸入到一個(gè)逐步逼近的數(shù)字量化器中,該量化器以逐步遞減的方式將其與一系列參考電壓進(jìn)行比較。具體來(lái)說(shuō),在每個(gè)逼近階段,量化器將輸入信號(hào)與一個(gè)中間電壓點(diǎn)進(jìn)行比較,將該電壓點(diǎn)上方或下方的參考電壓作為下一個(gè)逼近階段的參考電壓。這個(gè)過(guò)程一直持續(xù)到量化器逼近到最終的數(shù)字輸出值為止。
圖6-1 電壓采樣電路原理圖
如果使用1.5V作為參考電壓,根據(jù)R8和R7的阻值配比可以得到最高采樣電壓為:
1.5 / 10 * (220 + 10)= 34.5V
電流采樣的電路原理圖見(jiàn)圖6-2,對(duì)電流采樣本質(zhì)上是對(duì)檢流電阻的電壓進(jìn)行采樣。
圖6-2 電流采樣原理圖
6.2. ADC優(yōu)點(diǎn)
1.數(shù)字信號(hào)具有良好的抗干擾性。數(shù)字信號(hào)是由一系列離散的數(shù)字表示,因此可以抵抗模擬信號(hào)受到的各種干擾,如噪聲、漂移等。
2.方便數(shù)字信號(hào)的存儲(chǔ)、處理和傳輸。由于數(shù)字信號(hào)是離散的,因此它們可以輕松存儲(chǔ)在計(jì)算機(jī)內(nèi)存或其他數(shù)字設(shè)備中,方便進(jìn)行處理和傳輸。
3.具有可編程性。現(xiàn)代的ADC出現(xiàn)了很多可編程的功能,例如可編程增益、采樣率和濾波器等,可以根據(jù)不同的應(yīng)用場(chǎng)景進(jìn)行優(yōu)化。
4.適用性廣泛。ADC被廣泛應(yīng)用于工業(yè)、通信、醫(yī)療、電子測(cè)量、音頻、視頻等領(lǐng)域,可轉(zhuǎn)換各種不同類型的模擬信號(hào),包括電壓、電流、聲音、光信號(hào)等。
6.3. ADC應(yīng)用
ADC的應(yīng)用非常廣泛。例如,我們可以用ADC將傳感器的模擬信號(hào)轉(zhuǎn)換為數(shù)字信號(hào),然后通過(guò)計(jì)算機(jī)進(jìn)行處理和分析;ADC在音頻處理中也起著重要的作用,將模擬聲音信號(hào)轉(zhuǎn)換為數(shù)字信號(hào),并接下來(lái)進(jìn)行數(shù)字信號(hào)處理;無(wú)線電通信中的信號(hào)調(diào)制也需要使用ADC等。總的來(lái)說(shuō),ADC在現(xiàn)代電子工程中非常重要,是數(shù)字信號(hào)處理和控制技術(shù)的關(guān)鍵部分。
6.4. ADC采樣顯示
在下面我們對(duì)CW32F003的ADC通道進(jìn)行配置,輸入5V電壓給電壓表,CW32將采樣得到的值輸入數(shù)碼管顯示,對(duì)ADC通道的配置代碼如下;
#include "ADC.h" uint16_t Volt_Buffer; //存放ADC采樣值 void ADC_init(void) { ADC_InitTypeDef ADC_InitStructure; //ADC配置結(jié)構(gòu)體 ADC_SerialChTypeDef ADC_SerialChStructure; //ADC序列通道結(jié)構(gòu)體 GPIO_InitTypeDef GPIO_Init_Struct; __RCC_GPIOB_CLK_ENABLE(); //打開(kāi)ADC對(duì)應(yīng)引腳時(shí)鐘 __RCC_ADC_CLK_ENABLE(); // 打開(kāi)ADC時(shí)鐘 GPIO_Init_Struct.IT = GPIO_IT_NONE; GPIO_Init_Struct.Mode = GPIO_MODE_ANALOG;//將GPIO的模式配置成模擬功能 GPIO_Init_Struct.Pins = GPIO_PIN_1; // PB01是電壓采集引腳 GPIO_Init(CW_GPIOB, &GPIO_Init_Struct); PB01_ANALOG_ENABLE(); //使能模擬引腳 ADC_StructInit(&ADC_InitStructure); // ADC默認(rèn)值初始化 ADC_InitStructure.ADC_ClkDiv = ADC_Clk_Div4; //ADC工作時(shí)鐘配置 PCLK/4 = 6/4 = 1.5Mhz /*信號(hào)電壓較低時(shí),可以降低參考電壓來(lái)提高分辨率。改變參考電壓后,同樣二進(jìn)制表示的電壓值就會(huì)不一樣, 最大的二進(jìn)制(全1)表示的就是你的參考電壓,在計(jì)算實(shí)際電壓時(shí),就需要將參考電壓考慮進(jìn)去。*/ ADC_InitStructure.ADC_VrefSel = ADC_Vref_BGR1p5;//參考電壓設(shè)置為1.5V //由于電壓信號(hào)為慢速信號(hào),ADC采樣時(shí)間為十個(gè)ADC采樣周期以確保準(zhǔn)確 ADC_InitStructure.ADC_SampleTime = ADC_SampTime10Clk; //Sqr為序列配置寄存器,這里只用到了序列0的通道,所以配置成0表示只轉(zhuǎn)換Sqr0序列 ADC_SerialChStructure.ADC_SqrEns = ADC_SqrEns0; ADC_SerialChStructure.ADC_Sqr0Chmux = ADC_SqrCh9;//配置ADC序列,PB01是ADC的第9通道 ADC_SerialChStructure.ADC_InitStruct = ADC_InitStructure; //ADC初始化 ADC_SerialChContinuousModeCfg(&ADC_SerialChStructure); //ADC序列連續(xù)轉(zhuǎn)換模式配置 ADC_ClearITPendingAll(); //清除ADC所有中斷狀態(tài) ADC_Enable(); // ADC使能 ADC_SoftwareStartConvCmd(ENABLE); //ADC轉(zhuǎn)換軟件啟動(dòng)命令 } void Get_ADC_Value(void) //取得ADC采樣的值傳給全局變量Volt_Buffer { ADC_GetSqr0Result(&Volt_Buffer); }
在主函數(shù)中初始化ADC后在BTIM1的中斷服務(wù)程序中調(diào)用 Get_ADC_Value 得到ADC采樣的值,再在主函數(shù)的 while 循環(huán)中調(diào)用數(shù)碼管顯示函數(shù) Display 將ADC采樣值顯示到數(shù)碼管上。下圖為數(shù)字電壓電流表接入5V電壓時(shí)的采樣顯示圖。可以看到接入5V時(shí)ADC采樣得到669,我們可以計(jì)算:
(669/4096)* [(1.5/10)*(200+10)] = 5.145 V
其中4096代表CW32的ADC采樣精度12位為2^12=4096,由于我們的測(cè)試樣品中220KΩ的電阻被替換成了200KΩ,所以計(jì)算公式如上,與萬(wàn)用表測(cè)量數(shù)值相符。(各位學(xué)員最終收到的版本是220KΩ的電阻)
圖6-3 ADC采樣顯示
圖6-4 萬(wàn)用表測(cè)量5V
6.5. ADC采樣計(jì)算
根據(jù)上文,ADC所采樣的值雖然準(zhǔn)確地顯示在數(shù)碼管上,但采樣值仍需要轉(zhuǎn)換成標(biāo)準(zhǔn)值。計(jì)算思路與上述公式類似,只是顯示到數(shù)碼管上需要將數(shù)值擴(kuò)大100倍。因此采樣計(jì)算的思路為:將采樣得到的值(比如在5V輸入的情況下ADC采樣得到668)用上述計(jì)算公式計(jì)算得到的結(jié)果后乘以100:
(668/4096)* [(1.5/10)*(200+10)] * 100 = 513.7 V
由于變量為整形,最終輸入給顯示函數(shù) Display 的值為513,在 Display 函數(shù)里對(duì)輸入的值進(jìn)行判定,如果輸入值大于1000,則數(shù)碼管只能顯示xx.x V,所以我們只取輸入值的千百十位;如果輸入值小于1000,比如現(xiàn)在輸入值為513,則數(shù)碼管可顯示x.xx V,分別將513的百十個(gè)位存入 Seg_Reg 數(shù)組中。
最終需要添加一個(gè) Cal_Buffer 變量來(lái)存儲(chǔ) Volt_Buffer 的值、一個(gè)電壓計(jì)算函數(shù),再修改 Display 函數(shù)見(jiàn)下文:
uint16_t Cal_Buffer; //存儲(chǔ) Volt_Buffer 的值 #define ADC_REF_VALUE (1500) //擴(kuò)大1000倍 1.5 * 1000 = 1500 #define R2 (200) //單位:KΩ #define R1 (10) void Volt_Cal(void) //將ADC采樣值轉(zhuǎn)化為標(biāo)準(zhǔn)值 { Cal_Buffer = Volt_Buffer; //存儲(chǔ)中斷服務(wù)程序中取得的ADC采樣值 Cal_Buffer = (Cal_Buffer * ADC_REF_VALUE >> 12) * (R2 + R1)/R1;//計(jì)算得到的值為標(biāo)準(zhǔn)值的1000倍 if(Cal_Buffer % 10 >= 5) // 四舍五入 { Cal_Buffer = Cal_Buffer / 10 + 1; } else { Cal_Buffer = Cal_Buffer / 10; //此時(shí)的值為標(biāo)準(zhǔn)值的100倍 } }
在 while 循環(huán)中調(diào)用數(shù)碼管顯示函數(shù) Display 之前先調(diào)用 Volt_Cal 函數(shù)。
int main() { RCC_Configuration(); Seg_Init(); Btim1_Init(); ADC_init(); while(1) { Volt_Cal(); Display(Cal_Buffer); } }
Display 函數(shù)的更新如下:
void Display(uint32_t value) { uint8_t Thousands; //千位 uint8_t Hundreds; //百位 uint8_t Tens; //十位 uint8_t Units; //個(gè)位 Thousands = value / 1000; //如果輸入值大于1000,只取輸入值的千百十位 if(Thousands > 0) //大于0則說(shuō)明輸入值的千位有值 { Units = value % 10; value = Units > 5 ? (value + 10) : value; // 根據(jù)后一位四舍五入 Thousands = value / 1000 % 10; //只取千百十位 Hundreds = value / 100 % 10; Tens = value / 10 % 10; // 顯示xx.x伏 Seg_Reg[0] = Thousands; Seg_Reg[1] = Hundreds + 10; // 加dp顯示 Seg_Reg[2] = Tens; } else //如果輸入值的千位沒(méi)有值,則取百十個(gè)位 { Units = value % 10; Tens = value / 10 % 10; Hundreds = value / 100 % 10; // 顯示x.xx伏 Seg_Reg[0] = Hundreds + 10; // 加dp顯示 Seg_Reg[1] = Tens; Seg_Reg[2] = Units; } }最終顯示效果如下圖(輸入接5V):
圖6-5 采樣計(jì)算后顯示值 此時(shí)萬(wàn)用表測(cè)得電壓如下:
圖6-6 萬(wàn)用表測(cè)量值(5V)
審核編輯:劉清
-
差分放大器
+關(guān)注
關(guān)注
8文章
434瀏覽量
51910 -
電源電壓
+關(guān)注
關(guān)注
2文章
966瀏覽量
23763 -
ADC采樣
+關(guān)注
關(guān)注
0文章
134瀏覽量
12791 -
模擬數(shù)字轉(zhuǎn)換器
+關(guān)注
關(guān)注
1文章
74瀏覽量
12437 -
電壓電流表
+關(guān)注
關(guān)注
0文章
24瀏覽量
2049
原文標(biāo)題:CW32數(shù)字電壓電流表軟件教程-實(shí)驗(yàn)五:ADC采樣及顯示
文章出處:【微信號(hào):武漢芯源半導(dǎo)體,微信公眾號(hào):武漢芯源半導(dǎo)體】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論