This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具与软件:
我正在尝试使用 ePWM 的中断来测量 ADC 值。 ePWM 初始化良好、向上计数并执行其函数。 但不知何故、它不会触发 ADC 来采样。 附件是我要尝试运行的程序。 需要您的想法或改进、才能运行此代码。 我对 TI 的 DSP 非常陌生、我对它还不了解多少。
#include "DSP28x_Project.h" #if (CPU_FRQ_150MHZ) // Default - 150 MHz SYSCLKOUT // // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3) = 25.0 MHz // #define ADC_MODCLK 0x3 #endif #if (CPU_FRQ_100MHZ) // // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 100/(2*2) = 25.0 MHz // #define ADC_MODCLK 0x2 #endif // // ADC module clock = HSPCLK/2*ADC_CKPS = 25.0MHz/(1*2) = 12.5MHz // #define ADC_CKPS 0x1 // Prototype statements for functions found within this file. __interrupt void adc_isr(void); // Global variables used in this example: Uint16 LoopCount; Uint16 ConversionCount; Uint16 Voltage1[10]; Uint16 Voltage2[10]; void main(void) { Uint32 delay; /* Initialize the ADC Clocks*/ InitSysCtrl(); EALLOW; SysCtrlRegs.HISPCP.all = ADC_MODCLK; // HSPCLK = SYSCLKOUT/ADC_MODCLK EDIS; DINT; // Disable CPU interrupt // InitPieCtrl(); // Disable CPU interrupts and clear all CPU interrupt flags // IER = 0x0000; IFR = 0x0000; IER |= M_INT1; InitPieVectTable(); // Interrupts that are used in this example are re-mapped to // ISR functions found within this file. EALLOW; // This is needed to write to EALLOW protected register PieVectTable.ADCINT = &adc_isr; EDIS; // This is needed to disable write to EALLOW protected registers InitAdc(); // Configure ADC AdcRegs.ADCMAXCONV.all = 0x0001; // Setup 2 conv's on SEQ1 AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x3; // Setup ADCINA3 as 1st SEQ1 conv. AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x2; // Setup ADCINA2 as 2nd SEQ1 conv. 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) AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1 = 1; // Trigger Interrupt at every Sequence // Assumes ePWM1 clock is already enabled in InitSysCtrl(); EALLOW; // This is needed to write to EALLOW protected registers // Set up ePWM1 in up/down count mode EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up/down mode EPwm1Regs.TBPRD = 5000; // Set period for ePWM1 EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Disable phase loading EPwm1Regs.TBPHS.half.TBPHS = 0x0000; // Phase is 0 EPwm1Regs.TBCTR = 0x0001; // Clear counter // Set Compare values EPwm1Regs.CMPA.half.CMPA = 2500; // Set compare A value // Set actions EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; // Set PWM1A on event A, up count EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR; // Clear PWM1A on event A, down count // Trigger ADC EPwm1Regs.ETSEL.bit.SOCAEN = 1; // Enable SOC on A group EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTR_ZERO; // Select SOC from counter zero event EPwm1Regs.ETPS.bit.SOCAPRD = ET_1ST; // Generate pulse on 1st event EDIS; // Disable write to EALLOW protected registers AdcRegs.ADCTRL2.all = (1<<13); // Configure GPIO34 as a GPIO output pin EALLOW; GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0; GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1; EDIS; while(1) { // Toggle LED GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1; // Delay for a bit for(delay = 0; delay < 2000000; delay++); } } // Definition of ISR function for ADC interrupt __interrupt void adc_isr(void) { Voltage1[ConversionCount] = AdcRegs.ADCRESULT0 >>4; Voltage2[ConversionCount] = AdcRegs.ADCRESULT1 >>4; // If 9 conversions have been logged, start over if(ConversionCount == 9) { ConversionCount = 0; } else { ConversionCount++; } // 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; }
调试期间、我看到 ADCTRL1 = 0x0000;
我在 ADC_ISR 中放置了一个断点、以查看它是否到达那里、而不会命中该断点。