www.pudn.com > DSP2812formotorcontrol.rar > DSP281x_ADC04U.c


/* ================================================================================== 
File name:       DSP281x_ADC04U.C 
                     
Originator:	Digital Control Systems Group 
			Texas Instruments 
 
Description: This file contains source for the F281X general purpose  
4 conversions ADC driver for unipolar signals 
 
Target: TMS320F281x family 
 
===================================================================================== 
History: 
------------------------------------------------------------------------------------- 
 04-15-2005	Version 3.20: Using DSP281x v. 1.00 or higher  
----------------------------------------------------------------------------------*/ 
 
#include "DSP281x_Device.h" 
#include "DSP281x_ADC04U.h" 
 
#define CPU_CLOCK_SPEED      6.6667L   // for a 150MHz CPU clock speed 
#define ADC_usDELAY 5000L 
#define DELAY_US(A)  DSP28x_usDelay(((((long double) A * 1000.0L) / (long double)CPU_CLOCK_SPEED) - 9.0L) / 5.0L) 
 
extern void DSP28x_usDelay(unsigned long Count); 
 
void F281X_adc04u_drv_init(ADCVALS *p) 
{ 
    DELAY_US(ADC_usDELAY);	 
   
    AdcRegs.ADCTRL1.all = ADC_RESET_FLAG; 		// Reset the ADC Module    
	asm(" NOP "); 
	asm(" NOP ");     
 
    AdcRegs.ADCTRL3.bit.ADCBGRFDN = 0x3;		// Power up bandgap/reference circuitry  
	DELAY_US(ADC_usDELAY);			    		// Delay before powering up rest of ADC  
     
    AdcRegs.ADCTRL3.bit.ADCPWDN = 1;	   		// Power up rest of ADC 
    AdcRegs.ADCTRL3.bit.ADCCLKPS = 6;     		// Set up ADCTRL3 register  
	DELAY_US(ADC_usDELAY);	 
 
    AdcRegs.ADCTRL1.all = ADCTRL1_INIT_STATE_UNIPOLAR;	// Set up ADCTRL1 register  
    AdcRegs.ADCTRL2.all = ADCTRL2_INIT_STATE_UNIPOLAR; 	// Set up ADCTRL2 register  
	AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 3;               // Specify four conversions  
    AdcRegs.ADCCHSELSEQ1.all = p->ChSelect;      	    // Configure channel selection  
 
	EvaRegs.GPTCONA.bit.T1TOADC = 1;      		        // Set up EV Trigger with Timer1 UF 
}   
 
void F281X_adc04u_drv_read(ADCVALS *p) 
{ 
       int16 DatQ15; 
       int32 Tmp; 
 
        // Wait until ADC conversion is completed 
        while (AdcRegs.ADCST.bit.SEQ1_BSY == 1) 
        {}; 
 
        DatQ15 = (AdcRegs.ADCRESULT0>>1)&0x7FFF;   	// Convert raw result to Q15 (unipolar signal) 
        Tmp = (int32)p->Ch1Gain*(int32)DatQ15;      // Tmp = gain*dat => Q28 = Q13*Q15 
        p->Ch1Out = (int16)(Tmp>>13);               // Convert Q28 to Q15 
 
        DatQ15 = (AdcRegs.ADCRESULT1>>1)&0x7FFF;   	// Convert raw result to Q15 (unipolar signal) 
        Tmp = (int32)p->Ch2Gain*(int32)DatQ15;      // Tmp = gain*dat => Q28 = Q13*Q15 
        p->Ch2Out = (int16)(Tmp>>13);               // Convert Q28 to Q15 
 
        DatQ15 = (AdcRegs.ADCRESULT2>>1)&0x7FFF;   	// Convert raw result to Q15 (unipolar signal) 
        Tmp = (int32)p->Ch3Gain*(int32)DatQ15;      // Tmp = gain*dat => Q28 = Q13*Q15 
        p->Ch3Out = (int16)(Tmp>>13);               // Convert Q28 to Q15 
 
        DatQ15 = (AdcRegs.ADCRESULT3>>1)&0x7FFF;   	// Convert raw result to Q15 (unipolar signal) 
        Tmp = (int32)p->Ch4Gain*(int32)DatQ15;      // Tmp = gain*dat => Q28 = Q13*Q15 
        p->Ch4Out = (int16)(Tmp>>13);               // Convert Q28 to Q15 
 
        AdcRegs.ADCTRL2.all |= 0x4040;       	    // Reset the sequence 
 
}