DSP之TMS320F28335学习总结与笔记(二)————ADC模块
F28335 ADC模塊
ADC轉(zhuǎn)換模塊
A/D轉(zhuǎn)換器(ADC)將模擬量轉(zhuǎn)換為數(shù)字量通常要經(jīng)過四個(gè)步驟:采樣、保持、量化和編碼。
采樣:將一個(gè)時(shí)間上連續(xù)變化的模擬量轉(zhuǎn)化為時(shí)間上離散變化的模擬量。
保持:將采樣結(jié)果存儲(chǔ)起來,直到下次采樣,這個(gè)過程稱作保持。一般,采樣器和保持電路一起總稱為采樣保持電路。
量化:將采樣電平歸化為與之接近的離散數(shù)字電平,這個(gè)過程稱作量化。
ADC關(guān)鍵指標(biāo)
分辨率:指數(shù)字量變化一個(gè)最小量時(shí)模擬信號(hào)的變化量,定義為滿刻度與2^n的比值。分辨率又稱為精度,通常以數(shù)字信號(hào)的位數(shù)來表示。通俗的解釋分辨率是決定采樣最小值,比如基準(zhǔn)電壓為1V,8位的采樣,最小值是1/256,1為采樣的最小值是1/1024,分辨率越高,采樣越精確。
轉(zhuǎn)換速率:也可以稱為AD采樣率,是AD轉(zhuǎn)換一次所需要的時(shí)間的倒數(shù)。
采樣時(shí)間:是指兩次轉(zhuǎn)換的間隔,為了保證轉(zhuǎn)換的正確完成,采樣速率必須小于或等于轉(zhuǎn)換速率。
量化誤差:由于AD的有限分辨率而引起的誤差,即有限分辨率AD的階梯狀轉(zhuǎn)移特性曲線與無限分辨率AD的轉(zhuǎn)移特性曲線之間的最大偏差。
舉例說明講解以上四個(gè)指標(biāo):
例如F28335的AD轉(zhuǎn)換模塊是12位的,AD的最大時(shí)鐘頻率為25MHz,采樣速率12.5Msps。
如果要對(duì)一個(gè)1V電壓進(jìn)行采樣,分辨率=1/2的12次方=1/4096,
轉(zhuǎn)換速率:在程序中根據(jù)自己需求設(shè)置的,
最大采樣速率=1/12.5M=80ns(也可通過設(shè)置時(shí)鐘設(shè)置)
量化誤差:每個(gè)代碼之間的電壓變換就代表1/4096V ,無法采到1/8192V電壓。換言之,產(chǎn)生指定代碼的實(shí)際電壓與代表該碼的電壓兩者之間存在誤差。
ADC單通道單次采樣? 代碼+注釋
1.?CON0口采樣
2.?輸出7位小數(shù)采樣電壓
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File #include "DSP2833x_Examples.h" // DSP2833x Examples Include File// Determine when the shift to right justify the data takes place // Only one of these should be defined as 1. // The other two should be defined as 0. #define POST_SHIFT 0 // Shift results after the entire sample table is full #define INLINE_SHIFT 1 // Shift results as the data is taken from the results regsiter #define NO_SHIFT 0 // Do not shift the results// ADC start parameters #if (CPU_FRQ_150MHZ) // Default - 150 MHz SYSCLKOUT#define ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3) = 25.0 MHz #endif #if (CPU_FRQ_100MHZ)#define ADC_MODCLK 0x2 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 100/(2*2) = 25.0 MHz #endif #define ADC_CKPS 0x0 // ADC module clock = HSPCLK/1 = 25.5MHz/(1) = 25.0 MHz #define ADC_SHCLK 0x1 // S/H width in ADC module periods = 2 ADC cycle #define AVG 1000 // Average sample limit #define ZOFFSET 0x00 // Average Zero offset #define BUF_SIZE 2 // Sample buffer size// Global variable for this example volatile Uint16 SampleTable[BUF_SIZE]; volatile float adc0=0; main() {Uint16 i;// Uint16 adc=0;Uint16 array_index;InitSysCtrl();EALLOW;SysCtrlRegs.HISPCP.all = ADC_MODCLK; // 系統(tǒng)外設(shè)時(shí)鐘6分頻,一般ADC就用6分頻// 這是因?yàn)锳DC最高只能配置25MHz的頻率// 所以最快轉(zhuǎn)換一次的時(shí)間使80nsEDIS;DINT;InitPieCtrl();IER = 0x0000;IFR = 0x0000;InitPieVectTable();InitAdc(); //這個(gè)初始化程序,必須添加DSP2833x_Adc.C文件AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK; //ADC采樣時(shí)間選擇AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS; //ADC內(nèi)核分頻AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; //級(jí)聯(lián)工作方式AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x1; //設(shè)置CONV0 為第一個(gè)通道AdcRegs.ADCTRL1.bit.CONT_RUN = 0; //連續(xù)運(yùn)行模式AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1; //完成排序后,排序器指針回到最初狀態(tài)AdcRegs.ADCCHSELSEQ1.all = 0x0; //初始化SEQ1排序寄存器AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x0; // 設(shè)置一對(duì)轉(zhuǎn)換,共16通道// Clear SampleTablefor (i=0; i<BUF_SIZE; i++){SampleTable[i] = 0;}// Start SEQ1AdcRegs.ADCTRL2.all = 0x2000; //軟件啟動(dòng)轉(zhuǎn)換功能while(1){if(array_index>2)array_index = 0;while(AdcRegs.ADCST.bit.INT_SEQ1 == 0); //等待ADC的中斷位為1AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; //清楚排序器中斷位SampleTable[array_index++]= ( (AdcRegs.ADCRESULT0)>>4); //將結(jié)果寄存器16位的值轉(zhuǎn)換位10進(jìn)制數(shù)adc0=(float)SampleTable[0] * 3.0 /4096.0; // 轉(zhuǎn)換為我們讀取的數(shù)據(jù)類型// 數(shù)據(jù)類型轉(zhuǎn)換另外一篇有說明DELAY_US(100);}}//=========================================================================== // No more. //===========================================================================ADC多通道連續(xù)采樣? 代碼+注釋
1.?CONV00?CONV01?CONV02?三個(gè)通道采樣
2.?連續(xù)采樣
和單通道只是配置和數(shù)據(jù)提取不同
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File #include "DSP2833x_Examples.h" // DSP2833x Examples Include File#define POST_SHIFT 0 // Shift results after the entire sample table is full #define INLINE_SHIFT 1 // Shift results as the data is taken from the results regsiter #define NO_SHIFT 0 // Do not shift the results#if (CPU_FRQ_150MHZ) // Default - 150 MHz SYSCLKOUT#define ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3) = 25.0 MHz #endif #if (CPU_FRQ_100MHZ)#define ADC_MODCLK 0x2 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 100/(2*2) = 25.0 MHz #endif #define ADC_CKPS 0x0 // ADC module clock = HSPCLK/1 = 25.5MHz/(1) = 25.0 MHz #define ADC_SHCLK 0x1 // S/H width in ADC module periods = 2 ADC cycle #define AVG 1000 // Average sample limit #define ZOFFSET 0x00 // Average Zero offset #define BUF_SIZE 6 // Sample buffer size// Global variable for this example volatile Uint16 SampleTable[BUF_SIZE]; volatile float adc0=0; volatile float adc1=0; volatile float adc2=0;main() {Uint16 i;Uint16 array_index;InitSysCtrl();EALLOW;SysCtrlRegs.HISPCP.all = ADC_MODCLK; // 系統(tǒng)外設(shè)時(shí)鐘6分頻,一般ADC就用6分頻// 這是因?yàn)锳DC最高只能配置25MHz的頻率// 所以最快轉(zhuǎn)換一次的時(shí)間使80nsEDIS;DINT;InitPieCtrl();IER = 0x0000;IFR = 0x0000;InitPieVectTable();InitAdc(); //這個(gè)初始化程序,必須添加DSP2833x_Adc.C文件AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK; //ADC采樣時(shí)間選擇AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS; //ADC內(nèi)核分頻AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; //級(jí)聯(lián)工作方式AdcRegs.ADCTRL3.bit.SMODE_SEL= 0; // 順序采樣AdcRegs.ADCTRL1.bit.CONT_RUN = 1; //連續(xù)采樣AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1 ; //完成排序后,排序器指針回到最初狀態(tài)AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x2;AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1 ;AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x2 ;AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 0x1; //允許向CPU發(fā)出中斷請(qǐng)求// Clear SampleTablefor (i=0; i<BUF_SIZE; i++){SampleTable[i] = 0;}AdcRegs.ADCTRL2.bit.SOC_SEQ1=1; //軟件啟動(dòng)轉(zhuǎn)換功能while(1){if(array_index>BUF_SIZE)array_index = 0;while(AdcRegs.ADCST.bit.INT_SEQ1 == 0); //等待ADC的中斷位為1AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; //清楚排序器中斷位SampleTable[array_index++]= ( (AdcRegs.ADCRESULT0)>>4);SampleTable[array_index++]= ( (AdcRegs.ADCRESULT1)>>4);SampleTable[array_index++]= ( (AdcRegs.ADCRESULT2)>>4);adc0=(float)SampleTable[0] * 3.0 /4096.0; // 轉(zhuǎn)換為我們讀取的數(shù)據(jù)類型adc1=(float)SampleTable[1] * 3.0 /4096.0; // 數(shù)據(jù)類型轉(zhuǎn)換另外一篇有說明adc2=(float)SampleTable[2] * 3.0 /4096.0;DELAY_US(100);}}//=========================================================================== // No more. //===========================================================================?
總結(jié)
以上是生活随笔為你收集整理的DSP之TMS320F28335学习总结与笔记(二)————ADC模块的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【计算机网络】 网关:即“默认网关”的作
- 下一篇: 分布式事务学习