前言
- 12位ADC
- 2個(gè)采樣保持器
- 同步采樣或順序采樣,使用順序采樣
- 輸入范圍0-3V
- 時(shí)鐘配置為最高25MHz
- 級聯(lián)模式或雙排序模式,采用級聯(lián)模式,8狀態(tài)排序器SEQ1和SEQ2構(gòu)成16狀態(tài)的SEQ
- 選擇EPWMxSOCA作為觸發(fā)源啟動ADC轉(zhuǎn)換,采樣頻率為10K
主要內(nèi)容:
1、ADC原理+DSP的ADC原理
2、具體程序
1、ADC轉(zhuǎn)換原理
ADC就是模數(shù)轉(zhuǎn)換器,將模擬量轉(zhuǎn)換為數(shù)字量,通常就是對電流、電壓等進(jìn)行采樣,然后進(jìn)行轉(zhuǎn)換,得到數(shù)字量,再在軟件中進(jìn)行編程換算得到實(shí)際的值。
A/D轉(zhuǎn)換一般要經(jīng)過取樣、保持、量化及編碼4個(gè)過程。28335的ADC模塊如Figure1-1所示。采樣數(shù)據(jù)通過通過傳輸至Analog MUX,然后送到EPWM SOCA處理,然后送至12位ADC轉(zhuǎn)換器模組進(jìn)行轉(zhuǎn)換,輸出到結(jié)果寄存器。
轉(zhuǎn)換公式如下:
RealValue= SampleValue * 3.0f / 4096.0f
2、觸發(fā)方式
三種觸發(fā)方式可以開始ADC轉(zhuǎn)換,具體如下:
- S/W軟件立即啟動
- EPWM SOCA、SOCB轉(zhuǎn)換啟動
- XINT2 ADC轉(zhuǎn)換開始
采用EPWM SOCA啟動方式
3、如何觸發(fā)ADC?
1、使用EPWM的SOCA觸發(fā);
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;// Enable SOCA from ePWM to start SEQ1
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // Enable SEQ1 interrupt (every EOS)
2、使能EPWMxSOCA信號的產(chǎn)生,以何種方式何時(shí)產(chǎn)生;
EPwm1Regs.ETSEL.bit.SOCAEN = 1; // Enable SOC on A group
EPwm1Regs.ETSEL.bit.SOCASEL = 4; // Select SOC from from CPMA on upcount CTR = CMPA且為向上計(jì)數(shù)是產(chǎn)生觸發(fā)事件
EPwm1Regs.ETPS.bit.SOCAPRD = 1; // Generate pulse on 1st event 在第一個(gè)事件時(shí)產(chǎn)生SOCA信號
EPwm1Regs.CMPA.half.CMPA = 0x0080; // Set compare A value
3、EPWM為up-down模式,觸發(fā)頻率為10K,時(shí)鐘為150MHz;
EPwm1Regs.TBPRD = 0x1D4C; // Set period for ePWM1 7500 10K
EPwm1Regs.TBCTR = 0x0000U; //
EPwm1Regs.TBCTL.bit.CTRMODE = 2; // up-down模式
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0x00; // 使用系統(tǒng)時(shí)鐘
EPwm1Regs.TBCTL.bit.CLKDIV = 0x00;
4、ADC初始化配置程序如下:
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
#include "DSP2833x_Adc.h"
#define ADC_usDELAY 5000L
Uint16 Sample_I = 0U;
float Real_I = 0.0f;
float Base_Current = 3.0f / 4096.0f;
void init_28335ADC_CLK(void)
{
EALLOW;
#define ADC_MODCLK 0x03
SysCtrlRegs.HISPCP.all = ADC_MODCLK;
EDIS;
}
// ADC初始化
void init_adc_config(void)
{
extern void DSP28x_usDelay(Uint32 Count);
EALLOW;
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;
ADC_cal();
EDIS;
AdcRegs.ADCTRL3.all = 0x00E0; // Power up bandgap/reference/ADC circuits
DELAY_US(ADC_usDELAY); // Delay before converting ADC channels
// Configure ADC
AdcRegs.ADCMAXCONV.all = 0x000F; // Setup 1 conv's on SEQ1 16個(gè)通道
AdcRegs.ADCTRL1.bit.ACQ_PS = 0x1;
AdcRegs.ADCTRL3.bit.SMODE_SEL = 0; // 順序采樣
AdcRegs.ADCTRL1.bit.CPS = 0; // 對外設(shè)時(shí)鐘HSPCLK不分頻
AdcRegs.ADCTRL3.bit.ADCCLKPS = 0x0; // ADC內(nèi)核時(shí)鐘不分頻 ADCCLK = HSPCLK / (CPS + 1) = 25MHz
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; // 級聯(lián)排序模式
AdcRegs.ADCTRL1.bit.CONT_RUN = 1; // 連續(xù)模式
AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1; // 排序覆蓋
// 轉(zhuǎn)換順序
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x00U; // Setup ADCINA0 as 1st SEQ1 conv.
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x01U;
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x02U;
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x03U;
AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x04U;
AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0x05U;
AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 0x06U;
AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 0x07U;
AdcRegs.ADCCHSELSEQ3.bit.CONV08 = 0x08U;
AdcRegs.ADCCHSELSEQ3.bit.CONV09 = 0x09U;
AdcRegs.ADCCHSELSEQ3.bit.CONV10 = 0x0AU;
AdcRegs.ADCCHSELSEQ3.bit.CONV11 = 0x0BU;
AdcRegs.ADCCHSELSEQ4.bit.CONV12 = 0x0CU;
AdcRegs.ADCCHSELSEQ4.bit.CONV13 = 0x0DU;
AdcRegs.ADCCHSELSEQ4.bit.CONV14 = 0x0EU;
AdcRegs.ADCCHSELSEQ4.bit.CONV15 = 0x0FU;
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;// Enable SOCA from ePWM to start SEQ1
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // Enable SEQ1 interrupt (every EOS)
// Assumes ePWM1 clock is already enabled in InitSysCtrl();
EPwm1Regs.ETSEL.bit.SOCAEN = 1; // Enable SOC on A group
EPwm1Regs.ETSEL.bit.SOCASEL = 4; // Select SOC from from CPMA on upcount CTR = CMPA且為向上計(jì)數(shù)是產(chǎn)生觸發(fā)事件
EPwm1Regs.ETPS.bit.SOCAPRD = 1; // Generate pulse on 1st event 在第一個(gè)事件時(shí)產(chǎn)生SOCA信號
EPwm1Regs.CMPA.half.CMPA = 0x0080; // Set compare A value
// 設(shè)置EPWM觸發(fā)源
EPwm1Regs.TBPRD = 0x1D4C; // Set period for ePWM1 7500 10K
EPwm1Regs.TBCTR = 0x0000U; //
EPwm1Regs.TBCTL.bit.CTRMODE = 2; // up-down模式
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0x00; // 使用系統(tǒng)時(shí)鐘
EPwm1Regs.TBCTL.bit.CLKDIV = 0x00;
}
// 轉(zhuǎn)換計(jì)算
interrupt void adc_isr(void)
{
Sample_I = AdcRegs.ADCRESULT0 > >4; // 采樣數(shù)據(jù)
Real_I = (float)Sample_I * Base_Current;// 實(shí)際電流
}
注意
1、ADC通道、結(jié)果寄存器對應(yīng)關(guān)系:
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x02U; // Setup ADCINA0 as 1st SEQ1 conv.
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x03U;
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x00U;
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x01U;
ADCINA2 - > AdcRegs.ADCRESULT0;
ADCINA3 - > AdcRegs.ADCRESULT1;
ADCINA0 - > AdcRegs.ADCRESULT2;
ADCINA1 - > AdcRegs.ADCRESULT3;
由上面的代碼可知,你的通道對應(yīng)哪個(gè)CONVxx,則結(jié)果就存在哪個(gè)結(jié)果寄存器AdcRegs.ADCRESULTxx:
CONV00------------------AdcRegs.ADCRESULT0
CONV01------------------AdcRegs.ADCRESULT1
…
CONV15------------------AdcRegs.ADCRESULT15
這個(gè)對應(yīng)關(guān)系是固定不變的,而A/D輸入通道,可以根據(jù)自己選擇排序控制寄存器的哪四位即CONVxx輸入,然后進(jìn)行轉(zhuǎn)換。
2、為什么結(jié)果寄存器的值由進(jìn)行右移4位
結(jié)果寄存器是16位的,而28335的ADC模塊是12位的,一般使用的是映射在外設(shè)幀2,左對齊方式,,故前4位是保留的,所以需要右移4位才能得到實(shí)際值。
ADC結(jié)果寄存器是雙映射。外設(shè)幀2(0x7108-0x7117)中的位置為2等待狀態(tài),且為左對齊。外設(shè)幀0空間(0x0B00-0x0B0F)的位置對CPU訪問是1等待狀態(tài)和對于DMA訪問是0等待狀態(tài),右對齊。在ADC的高速/連續(xù)轉(zhuǎn)換使用期間,使用0等待狀態(tài)位置進(jìn)行ADC結(jié)果到用戶內(nèi)存的快速轉(zhuǎn)換。
DSP2833x_Headers_nonBIOS.cmd中
ADC_MIRROR : origin = 0x000B00, length = 0x000010 /* ADC Results register mirror /
ADC : origin = 0x007100, length = 0x000020 / ADC registers */
-
寄存器
+關(guān)注
關(guān)注
31文章
5336瀏覽量
120230 -
DSP28335
+關(guān)注
關(guān)注
22文章
59瀏覽量
40640 -
采樣保持器
+關(guān)注
關(guān)注
0文章
5瀏覽量
8978 -
ADC模塊
+關(guān)注
關(guān)注
1文章
19瀏覽量
11068 -
EPWM模塊
+關(guān)注
關(guān)注
1文章
4瀏覽量
1871
發(fā)布評論請先 登錄
相關(guān)推薦
評論