天天看點

DSP C2000系列TMS320F28335學習之ADC

前言

DSP28335的ADC子產品使用介紹:

  • 12位ADC
  • 2個采樣保持器
  • 同步采樣或順序采樣,使用順序采樣
  • 輸入範圍0-3V
  • 時鐘配置為最高25MHz
  • 級聯模式或雙排序模式,采用級聯模式,8狀态排序器SEQ1和SEQ2構成16狀态的SEQ
  • 選擇EPWMxSOCA作為觸發源啟動ADC轉換,采樣頻率為10K

主要内容:

1、ADC原理+DSP的ADC原理

2、具體程式

ADC轉換原理

ADC就是模數轉換器,将模拟量轉換為數字量,通常就是對電流、電壓等進行采樣,然後進行轉換,得到數字量,再在軟體中進行程式設計換算得到實際的值。

A/D轉換一般要經過取樣、保持、量化及編碼4個過程。28335的ADC子產品如Figure1-1所示。采樣資料通過通過傳輸至Analog MUX,然後送到EPWM SOCA處理,然後送至12位ADC轉換器模組進行轉換,輸出到結果寄存器。

轉換公式如下:

RealValue= SampleValue * 3.0f / 4096.0f

觸發方式

三種觸發方式可以開始ADC轉換,具體如下:

  1. S/W軟體立即啟動
  2. EPWM SOCA、SOCB轉換啟動
  3. XINT2 ADC轉換開始

采用EPWM SOCA啟動方式

DSP C2000系列TMS320F28335學習之ADC

如何觸發ADC?

1、使用EPWM的SOCA觸發;

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信号的産生,以何種方式何時産生;

EPwm1Regs.ETSEL.bit.SOCAEN = 1;        // Enable SOC on A group
EPwm1Regs.ETSEL.bit.SOCASEL = 4;       // Select SOC from from CPMA on upcount CTR = CMPA且為向上計數是産生觸發事件
EPwm1Regs.ETPS.bit.SOCAPRD = 1;        // Generate pulse on 1st event  在第一個事件時産生SOCA信号
EPwm1Regs.CMPA.half.CMPA = 0x0080;	  // Set compare A value
           

3、EPWM為up-down模式,觸發頻率為10K,時鐘為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;  // 	使用系統時鐘
EPwm1Regs.TBCTL.bit.CLKDIV = 0x00;
           

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個通道
   AdcRegs.ADCTRL1.bit.ACQ_PS = 0x1;

   AdcRegs.ADCTRL3.bit.SMODE_SEL = 0;	// 順序采樣
   AdcRegs.ADCTRL1.bit.CPS = 0;			// 對外設時鐘HSPCLK不分頻
   AdcRegs.ADCTRL3.bit.ADCCLKPS = 0x0;	// ADC核心時鐘不分頻 ADCCLK = HSPCLK / (CPS + 1) = 25MHz
   AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;	// 級聯排序模式
   AdcRegs.ADCTRL1.bit.CONT_RUN = 1;	// 連續模式
   AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1;	// 排序覆寫

	// 轉換順序
   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且為向上計數是産生觸發事件
   EPwm1Regs.ETPS.bit.SOCAPRD = 1;        // Generate pulse on 1st event  在第一個事件時産生SOCA信号
   EPwm1Regs.CMPA.half.CMPA = 0x0080;	  // Set compare A value

   // 設定EPWM觸發源
   EPwm1Regs.TBPRD = 0x1D4C;              // Set period for ePWM1  7500  10K
   EPwm1Regs.TBCTR = 0x0000U;			  // 
   EPwm1Regs.TBCTL.bit.CTRMODE = 2;		  // up-down模式
   EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0x00;  // 	使用系統時鐘
   EPwm1Regs.TBCTL.bit.CLKDIV = 0x00;
}
// 轉換計算
interrupt void adc_isr(void)
{
	Sample_I = AdcRegs.ADCRESULT0 >>4;		// 采樣資料
	Real_I = (float)Sample_I * Base_Current;// 實際電流
}
           

注意

1、ADC通道、結果寄存器對應關系:

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;
           

由上面的代碼可知,你的通道對應哪個CONVxx,則結果就存在哪個結果寄存器AdcRegs.ADCRESULTxx:

CONV00------------------AdcRegs.ADCRESULT0

CONV01------------------AdcRegs.ADCRESULT1

CONV15------------------AdcRegs.ADCRESULT15

這個對應關系是固定不變的,而A/D輸入通道,可以根據自己選擇排序控制寄存器的哪四位即CONVxx輸入,然後進行轉換。

2、為什麼結果寄存器的值由進行右移4位

結果寄存器是16位的,而28335的ADC子產品是12位的,一般使用的是映射在外設幀2,左對齊方式,,故前4位是保留的,是以需要右移4位才能得到實際值。

DSP C2000系列TMS320F28335學習之ADC

ADC結果寄存器是雙映射。外設幀2(0x7108-0x7117)中的位置為2等待狀态,且為左對齊。外設幀0空間(0x0B00-0x0B0F)的位置對CPU通路是1等待狀态和對于DMA通路是0等待狀态,右對齊。在ADC的高速/連續轉換使用期間,使用0等待狀态位置進行ADC結果到使用者記憶體的快速轉換。

DSP2833x_Headers_nonBIOS.cmd中

ADC_MIRROR : origin = 0x000B00, length = 0x000010

如何選擇使用外設幀0?

繼續閱讀