Part Number: TMS320F28379D Tool/software: Code Composer Studio Hello, I want to measure output across a DACOUT pin which is given as input across a ADCIN pin. But I am not getting any output across the DACOUT, please suggest me where is the error in the following program. INPUT is given to PIN 30 and OUTPUT is taken across PIN70. #include "F28x_Project.h" // // Function Prototypes // void ConfigureADC(void); void ConfigureEPWM(void); void SetupADCEpwm(Uint16 channel); void configureDAC(Uint16 dac_num); interrupt void adca1_isr(void); volatile struct DAC_REGS* DAC_PTR[4] = {0x0,&DacaRegs,&DacbRegs,&DaccRegs}; //Uint16 dacval = 2048; // // Defines // #define RESULTS_BUFFER_SIZE 256 #define REFERENCE_VDAC 0 #define REFERENCE_VREF 1 #define DACA 1 #define DACB 2 #define DACC 3 #define REFERENCE REFERENCE_VDAC #define DAC_NUM DACB // // Globals // Uint16 AdcaResults[RESULTS_BUFFER_SIZE]; Uint16 resultsIndex; volatile Uint16 bufferFull; void main(void) { // // Step 1. Initialize System Control: // PLL, WatchDog, enable Peripheral Clocks // This example function is found in the F2837xD_SysCtrl.c file. // InitSysCtrl(); // // Step 2. Initialize GPIO: // This example function is found in the F2837xD_Gpio.c file and // illustrates how to set the GPIO to it's default state. // //InitGpio(); // Skipped for this example // // Step 3. Clear all interrupts and initialize PIE vector table: // Disable CPU interrupts // DINT; // // Initialize the PIE control registers to their default state. // The default state is all PIE interrupts disabled and flags // are cleared. // This function is found in the F2837xD_PieCtrl.c file. // InitPieCtrl(); // // Disable CPU interrupts and clear all CPU interrupt flags: // IER = 0x0000; IFR = 0x0000; // // Initialize the PIE vector table with pointers to the shell Interrupt // Service Routines (ISR). // This will populate the entire table, even if the interrupt // is not used in this example. This is useful for debug purposes. // The shell ISR routines are found in F2837xD_DefaultIsr.c. // This function is found in F2837xD_PieVect.c. // InitPieVectTable(); // // Map ISR functions // EALLOW; PieVectTable.ADCA1_INT = &adca1_isr; //function for ADCA interrupt 1 EDIS; // // Configure the ADC and power it up // ConfigureADC(); // // Configure the ePWM // ConfigureEPWM(); // // Setup the ADC for ePWM triggered conversions on channel 0 // SetupADCEpwm(0); configureDAC(DAC_NUM); // // Enable global Interrupts and higher priority real-time debug events: // IER |= M_INT1; //Enable group 1 interrupts EINT; // Enable Global interrupt INTM ERTM; // Enable Global realtime interrupt DBGM // // Initialize results buffer // for(resultsIndex = 0; resultsIndex < RESULTS_BUFFER_SIZE; resultsIndex++) { AdcaResults[resultsIndex] = 0; } resultsIndex = 0; // // enable PIE interrupt // PieCtrlRegs.PIEIER1.bit.INTx1 = 1; // // sync ePWM // EALLOW; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1; // //take conversions indefinitely in loop // while(1) { DacbRegs.DACVALS.all = AdcaResults; DELAY_US(1); } } void ConfigureEPWM(void) { // //start ePWM // EPwm1Regs.ETSEL.bit.SOCAEN = 1; //enable SOCA EPwm1Regs.TBCTL.bit.CTRMODE = 0; //unfreeze, and enter up count mode // //wait while ePWM causes ADC conversions, which then cause interrupts, //which fill the results buffer, eventually setting the bufferFull //flag // while(!bufferFull); bufferFull = 0; //clear the buffer full flag // //stop ePWM // EPwm1Regs.ETSEL.bit.SOCAEN = 0; //disable SOCA EPwm1Regs.TBCTL.bit.CTRMODE = 3; //freeze counter // //at this point, AdcaResults[] contains a sequence of conversions //from the selected channel // // //software breakpoint, hit run again to get updated conversions // asm(" ESTOP0"); while(1); } // // ConfigureADC - Write ADC configurations and power up the ADC for both // ADC A and ADC B // void configureDAC(Uint16 dac_num) { EALLOW; DacbRegs.DACCTL.bit.DACREFSEL = REFERENCE; DacbRegs.DACOUTEN.bit.DACOUTEN = 1; DacbRegs.DACVALS.bit.DACVALS = AdcaResults; EDIS; //int i = 0; //for(i=0;i<RESULTS_BUFFER_SIZE;i++) //{ // DacbRegs.DACVALS.bit.DACVALS = AdcaResults[i]; //} DELAY_US(10); // Delay for buffered DAC to power up } void ConfigureADC(void) { EALLOW; // //write configurations // AdcaRegs.ADCCTL2.bit.PRESCALE = 6; //set ADCCLK divider to /4 AdcSetMode(ADC_ADCA, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE); // //Set pulse positions to late // AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1; // //power up the ADC // AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1; // //delay for 1ms to allow ADC time to power up // DELAY_US(1000); EDIS; } void SetupADCEpwm(Uint16 channel) { Uint16 acqps; // // Determine minimum acquisition window (in SYSCLKS) based on resolution // if(ADC_RESOLUTION_12BIT == AdcaRegs.ADCCTL2.bit.RESOLUTION) { acqps = 14; //75ns } else //resolution is 16-bit { acqps = 63; //320ns } // //Select the channels to convert and end of conversion flag // EALLOW; AdcaRegs.ADCSOC0CTL.bit.CHSEL = channel; //SOC0 will convert pin A2 AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps; //sample window is 100 SYSCLK cycles AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5; //trigger on ePWM1 SOCA/C AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0; //end of SOC0 will set INT1 flag AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1; //enable INT1 flag AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //make sure INT1 flag is cleared EDIS; } interrupt void adca1_isr(void) { //DacbRegs.DACVALS.bit.DACVALS = ; // AdcaResults[resultsIndex++] = AdcaResultRegs.ADCRESULT0; //if(RESULTS_BUFFER_SIZE <= resultsIndex) //{ // resultsIndex = 0; //bufferFull = 1; // } AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //clear INT1 flag // // Check if overflow has occurred // if(1 == AdcaRegs.ADCINTOVF.bit.ADCINT1) { AdcaRegs.ADCINTOVFCLR.bit.ADCINT1 = 1; //clear INT1 overflow flag AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //clear INT1 flag } PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; }
↧