DSP28377S - ADC學習編程筆記


DSP28377S -  ADC學習編程筆記

彭會鋒

2016-08-04  20:19:52

1 ADC類型導致的配置區別

     F28377S的ADC類型是Type 4類型,我的理解是不同類型的ADC采樣方式是不一樣的:F28335ADC 采樣序列可以配置為順序采樣和同步采樣模式,而F28377S采樣序列可以配置為round-robin or burst模式,這兩種模式下面再講解。


 2 ADC上電配置步驟

  • 首先明確一點,ADC是專用管腳,不需要配置GPIO,所以可以直接配置ADC的寄存器
//Write ADC configurations and power up the ADC for both ADC A and ADC B
void ConfigureADC(void)
{
    EALLOW;

    //write configurations
    AdcaRegs.ADCCTL2.bit.PRESCALE = 6; //set ADCCLK divider to /4      //配置ADC時鍾,ADC時鍾有系統時鍾直接提供參考時鍾,計算的時候需要注意
    AdcSetMode(ADC_ADCA, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE); // 設置ADC的采樣分辨率為12bit,單輸入模式(區別於差分模式)

    AdcbRegs.ADCCTL2.bit.PRESCALE = 6; //set ADCCLK divider to /4
    AdcSetMode(ADC_ADCB, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE);

    //Set pulse positions to late
    AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;     //設置ADC的中斷產生時機在轉換完成后產生中斷(Interrupt pulse generation occurs at the end of the conversion)
    AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1;

    //power up the ADC
    AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;  //給ADC上電,注意需要延時1ms左右等待上電完成
AdcbRegs.ADCCTL1.bit.ADCPWDNZ
= 1; //delay for 1ms to allow ADC time to power up DELAY_US(1000); EDIS; }

3 ADC采樣通道、保持時間和觸發信號配置,這里和中斷配置在一起講了!

    AdcbRegs.ADCSOC7CTL.bit.CHSEL = 14;  //SOC0 will convert internal connection B0
    AdcbRegs.ADCSOC7CTL.bit.ACQPS = tempsensor_acqps; //sample window is 100 SYSCLK cycles
    AdcbRegs.ADCSOC7CTL.bit.TRIGSEL = 5; //trigger on ePWM1 SOCA/C,這里根據需要進行配置
    AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 7; //end of SOC0 will set INT1 flag (這里一般配置為最后一個優先級的SOC即可!注意要隨時修改,這里栽跟頭了)(優先級放最后講解,可以不用理解!)
    AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;   //enable INT1 flag (如果不配置這里,那么ADC采樣完成后中斷flag不會置位,所以必須配置為1)
    AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //make sure INT1 flag is cleared

在配置過程中需要注意的是:

為了進行測試,有時候會使用13 temp sensor做測試用(需要注意必須先初始化此溫度端口,然后在使用,否則ADC采樣會被卡在這個地方導致莫名其妙問題

      //Initialize the temperature sensor
      //Note: The argument needs to change if using a VREFHI voltage other than 3.0V
      InitTempSensor(3.0); (這里已經有現成的封裝函數可以使用,直接調用即可!)(如果不初始化,會導致采樣無法正常順序進行,切記切記!)

    AdcaRegs.ADCSOC6CTL.bit.CHSEL = 13;  //SOC0 will convert internal connection A13
    AdcaRegs.ADCSOC6CTL.bit.ACQPS = tempsensor_acqps; //sample window is 100 SYSCLK cycles
    AdcaRegs.ADCSOC6CTL.bit.TRIGSEL = 5; //trigger on ePWM1 SOCA/C

 4 epwm觸發配置

注意:epwm可以配置為在ZERO和PERIOD兩個時刻都可以觸發SOCA采樣信號,所以在逆變器中可以連續采樣兩次,這個對於編程很重要,差點有栽跟頭了,所以一定要看官方文檔!

void ConfigureEPWM(void)
{
    EALLOW;
    // Assumes ePWM clock is already enabled
    EPwm1Regs.ETSEL.bit.SOCAEN    = 0;             // Disable SOC on A group
    EPwm1Regs.ETSEL.bit.SOCASEL    = 1;            // Select SOC on up-count
    EPwm1Regs.ETPS.bit.SOCAPRD = ET_CTR_PRDZERO;   // Generate pulse on 1st event(注意這里EPWM可以配置為在ZERO 和 PERIOD時觸發ADC采樣,這和F28335不一樣!又差點栽跟頭了!
    EPwm1Regs.CMPA.bit.CMPA = 0x0800;              // Set compare A value to 2048 counts
    EPwm1Regs.TBPRD = 0x1000;                      // Set period to 4096 counts
    EPwm1Regs.TBCTL.bit.CTRMODE = 3;               // freeze counter
    EDIS;
}

最后還有關於EOC  轉換優先級 和 ADC采樣結構等內容,作為了解性質,晚點補充,今天先到次為止!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM