天天看點

【DSP】TMS320F28335的ADC子產品一、功能說明二、模式說明三、觸發源四、中斷源五、接收轉換結果六、其他設定七、疑問

一、功能說明

  • 12位内建采樣保持的模數轉換器
  • 模拟輸入電平:0~3V
  • 16個轉換通道
  • 最快轉換時鐘頻率12.5MHz(奈奎斯特定則,25MHz最高能采樣12.5MHz的信号)
  • 多觸發源:軟體、ePWM和GPIO
  • 兩種采樣模式:級聯和雙通道模式

軟體設定流程

//1.ADC時鐘使能
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;//在InitSysCtrl()函數裡
//2.時鐘分頻
EALLOW;
SysCtrlRegs.HISPCP.all = 0x3;//HSPCLK = SYSCLKOUT/2*HISPCP = 150/(2*3)   = 25.0 MHz
ADC_cal();
EDIS;
AdcRegs.ADCTRL3.all = 0x00E0;  // Power up bandgap/reference/ADC circuits
DELAY_US(ADC_usDELAY);         // Delay before converting ADC channels
AdcRegs.ADCTRL3.bit.ADCCLKPS = 0x0;//Fclk = HSPCLK/(2*ADCCLKPS),但當ADCCLKPS=0時,Fclk = HSPCLK
AdcRegs.ADCTRL1.bit.CPS = 0x0;//ADCCLK = Fclk / (CPS+1)
//3.通道設定
//4.觸發源設定
//5.中斷源設定
           

二、模式說明

2.1 級聯模式

//3.通道設定
AdcRegs.ADCTRL1.bit.SEQ_CASC = 0x1;//0-dual, 1-Cascaded
AdcRegs.ADCMAXCONV.all = 0x000F;       // Setup 16 conv's on SEQ
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // Setup ADCINA0 as 1st SEQ conv.
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1; // Setup ADCINA1 as 2nd SEQ conv.
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x2; // Setup ADCINA2 as 3rd SEQ conv.
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x3; // Setup ADCINA3 as 4th SEQ conv.
AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x4; // Setup ADCINA4 as 5th SEQ conv.
AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0x5; // Setup ADCINA5 as 6th SEQ conv.
AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 0x6; // Setup ADCINA6 as 7th SEQ conv.
AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 0x7; // Setup ADCINA7 as 8th SEQ conv.
AdcRegs.ADCCHSELSEQ3.bit.CONV08 = 0x8; // Setup ADCINB0 as 9th SEQ conv.
AdcRegs.ADCCHSELSEQ3.bit.CONV09 = 0x9; // Setup ADCINB1 as 10th SEQ conv.
AdcRegs.ADCCHSELSEQ3.bit.CONV10 = 0xA; // Setup ADCINB2 as 11th SEQ conv.
AdcRegs.ADCCHSELSEQ3.bit.CONV11 = 0xB; // Setup ADCINB3 as 12th SEQ conv.
AdcRegs.ADCCHSELSEQ4.bit.CONV12 = 0xC; // Setup ADCINB4 as 13th SEQ conv.
AdcRegs.ADCCHSELSEQ4.bit.CONV13 = 0xD; // Setup ADCINB5 as 14th SEQ conv.
AdcRegs.ADCCHSELSEQ4.bit.CONV14 = 0xE; // Setup ADCINB6 as 15th SEQ conv.
AdcRegs.ADCCHSELSEQ4.bit.CONV15 = 0xF; // Setup ADCINB7 as 16th SEQ conv.
           

2.2 雙通道模式

//3.通道設定
AdcRegs.ADCTRL1.bit.SEQ_CASC = 0x0;//0-dual, 1-Cascaded
AdcRegs.ADCMAXCONV.all = 0x0077;       // Setup 8 conv's on SEQ1 and 8 conv's on SEQ2
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // Setup ADCINA0 as 1st SEQ1 conv.
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1; // Setup ADCINA1 as 2nd SEQ1 conv.
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x2; // Setup ADCINA2 as 3rd SEQ1 conv.
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x3; // Setup ADCINA3 as 4th SEQ1 conv.
AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x4; // Setup ADCINA4 as 5th SEQ1 conv.
AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0x5; // Setup ADCINA5 as 6th SEQ1 conv.
AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 0x6; // Setup ADCINA6 as 7th SEQ1 conv.
AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 0x7; // Setup ADCINA7 as 8th SEQ1 conv.
AdcRegs.ADCCHSELSEQ3.bit.CONV08 = 0x8; // Setup ADCINB0 as 1st SEQ2 conv.
AdcRegs.ADCCHSELSEQ3.bit.CONV09 = 0x9; // Setup ADCINB1 as 2nd SEQ2 conv.
AdcRegs.ADCCHSELSEQ3.bit.CONV10 = 0xA; // Setup ADCINB2 as 3rd SEQ2 conv.
AdcRegs.ADCCHSELSEQ3.bit.CONV11 = 0xB; // Setup ADCINB3 as 4th SEQ2 conv.
AdcRegs.ADCCHSELSEQ4.bit.CONV12 = 0xC; // Setup ADCINB4 as 5th SEQ2 conv.
AdcRegs.ADCCHSELSEQ4.bit.CONV13 = 0xD; // Setup ADCINB5 as 6th SEQ2 conv.
AdcRegs.ADCCHSELSEQ4.bit.CONV14 = 0xE; // Setup ADCINB6 as 7th SEQ2 conv.
AdcRegs.ADCCHSELSEQ4.bit.CONV15 = 0xF; // Setup ADCINB7 as 8th SEQ2 conv.
           

三、觸發源

//4.觸發源設定
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1;//軟觸發(用于級聯、雙通道1#)
AdcRegs.ADCTRL2.bit.SOC_SEQ2 = 1;//軟觸發(用于雙通道2#)
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;//ePWM觸發(用于雙通道1#)
AdcRegs.ADCTRL2.bit.EPWM_SOCB_SEQ2 = 1;//ePWM觸發(用于雙通道2#)
AdcRegs.ADCTRL2.bit.EPWM_SOCB_SEQ = 1;//ePWM觸發(用于級聯)
           

四、中斷源

//5.中斷源設定
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; //用于級聯、雙通道1#
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2 = 1; //雙通道2#
           

五、接收轉換結果

5.1 中斷式

/*
 * AD的外部中斷程式【中等優先級】
 * 中斷觸發信号:EPWM
*/
interrupt void ADC_ISR(void)
{
  Voltage[0] = AdcRegs.ADCRESULT0 >>4;
  Voltage[1] = AdcRegs.ADCRESULT1 >>4;
  Voltage[2] = AdcRegs.ADCRESULT2 >>4;
  Voltage[3] = AdcRegs.ADCRESULT3 >>4;
  Voltage[4] = AdcRegs.ADCRESULT4 >>4;
  Voltage[5] = AdcRegs.ADCRESULT5 >>4;
  Voltage[6] = AdcRegs.ADCRESULT6 >>4;
  Voltage[7] = AdcRegs.ADCRESULT7 >>4;
  Voltage[8] = AdcRegs.ADCRESULT8 >>4;
  Voltage[9] = AdcRegs.ADCRESULT9 >>4;
  Voltage[10] = AdcRegs.ADCRESULT10 >>4;
  Voltage[11] = AdcRegs.ADCRESULT11 >>4;
  Voltage[12] = AdcRegs.ADCRESULT12 >>4;
  Voltage[13] = AdcRegs.ADCRESULT13 >>4;
  Voltage[14] = AdcRegs.ADCRESULT14 >>4;
  Voltage[15] = AdcRegs.ADCRESULT15 >>4;

  // Reinitialize for next ADC sequence
  AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;         // Reset SEQ1
  AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;       // Clear INT SEQ1 bit
  PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;   // Acknowledge interrupt to PIE
  
  return;
}
           

5.2 查詢式

while(AdcRegs.ADCST.bit.INT_SEQ1 == 0);
test[0] = AdcRegs.ADCRESULT0 >>4;
test[1] = AdcRegs.ADCRESULT1 >>4;
test[2] = AdcRegs.ADCRESULT2 >>4;
test[3] = AdcRegs.ADCRESULT3 >>4;
test[4] = AdcRegs.ADCRESULT4 >>4;
test[5] = AdcRegs.ADCRESULT5 >>4;
test[6] = AdcRegs.ADCRESULT6 >>4;
test[7] = AdcRegs.ADCRESULT7 >>4;
test[8] = AdcRegs.ADCRESULT8 >>4;
test[9] = AdcRegs.ADCRESULT9 >>4;
test[10] = AdcRegs.ADCRESULT10 >>4;
test[11] = AdcRegs.ADCRESULT11 >>4;
test[12] = AdcRegs.ADCRESULT12 >>4;
test[13] = AdcRegs.ADCRESULT13 >>4;
test[14] = AdcRegs.ADCRESULT14 >>4;
test[15] = AdcRegs.ADCRESULT15 >>4;
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;// Reset SEQ1
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;
           

六、其他設定

6.1 運作模式

運作模式分為start-stop和continuous兩種模式,通過以下代碼配置:

AdcRegs.ADCTRL1.bit.CONT_RUN = 0x0; //0-start stop mode; 1-Continuous conversion mode
           

start-stop模式下,AD轉換結束後等待觸發信号,才開始進行下一次的AD轉換;

continuous模式下,AD轉換結束後無需等待觸發信号,立即開始下一次的AD轉換。

6.2 SOC脈寬設定

AdcRegs.ADCTRL1.bit.ACQ_PS = 0xF;//Acquisition window size
           

SOC脈寬是(ACQ_PS + 1)倍的ADCLK周期。

6.3 複位啟動

AdcRegs.ADCTRL1.bit.SEQ_OVRD = 0x0;
           

僅用在continuous模式裡面,如果該位為0,則新的SOC來時從複位狀态啟動,如SEQ1和級聯模式下,重新從CONV00開始;如果該位為1,則不會從複位狀态開始,直接從現在的轉換序列開始,直到最後停止。

七、疑問

  1. 什麼時候觸發中斷?

    答:當SEQ_CNTR = 0時,INT_SEQ = 1,且産生中斷。否則,INT_SEQ = 0。

  2. ePWM觸發雙通道ADC,隻能轉換一個通道,什麼原因?

    答:ACQ_PS的值太大,改小後,觸發脈沖變小,可實作雙通道。