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.
工具/软件:Code Composer Studio
尊敬的先生:
当 ADC 中断 发生时、我已经编写了一个代码来使用 EPwm1转换开始来读取 ADC 样本、并且我想在 epwminterrupt ISR 中使用这些值。 但 ADC 未显示任何值、但两个 ISR 都在执行。 请建议对所附代码进行任何更正。
#include "DSP28x_Project.h" //器件头文件和示例包括文件 #include #include void InitEPwm1Example (void); void GPIO_Setup1 (void); float sum=0.0f; float pi=2.0f*3.141592f; float input1、 Sin_Out1、input2、Sin_Out2; long GlobalQ=global_Q; float A1、B1、C1、A2、B2、C2;float theta=0.0f;//float deltheta=0.31415926f; //float deltheta=(float)(1.8f*ploat pi/180);//float deltheta=0.0400=0.40float float d=0.40f ;dfloat float float d=0.0400=0.40float d=0.40f=0.40f=0.40fdf ;dfloat float float float f=0.40d=0.40f=0.40d=0.40f=0.40df;d=0.40float f=0.40d=0.40f=0.40f=0. float VM=0.15f;float offtrim=1.4434f; float A[10]; long b[10]; float VACT、IACt; float Iaref、VDref、VQref、VZref、 vgd、vgq、vgZ; float ukD、ukQ、ukZ、ukIg; // 函数原型 // _中断 void ADC_ISR (void); _中断 void ePWM1A_COMPARE_ISR (void); UINT16 LoopCount; UINT16 ConversionCount; UINT16 Voltage1[400]; uint16 CURRENT[400]; // // Main // void main (void) { InitSysCtrl(); EALLOW; #IF (CPU_FRQ_150MHz) //默认- 150MHz SYSCLKOUT // // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3)= 25.0MHz // #define ADC_MODCLK 0x3 #endif #IF (CPU_FRQ_100MHz) // // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 100/(2*2)= 25.0MHz // #define ADC_MODCLK 0x2 #endif EDIS; EALLOW; SysCtrlRegs.HISPCP。all = ADC_MODCLK; EDIS; Dint; InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitPieVectTable(); EALLOW; //写入 EALLOW 受保护的寄存器需要此操作 PieVectTable.EPWM1_INT =&ePWM1A_COMPARE_ISR; PieVectTable.ADCINT =&ADC_ISR; EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的 GPIO_Setup1 (); InitEPwm1Examples(); AdcRegs.ADCMAXCONV.ALL = 0x0001; //在 SEQ1上设置2 conv AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x3;//将 ADCINA3设置为第1个 SEQ1转换器 AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x2;//将 ADCINA2设置为第2个 SEQ1转换器 AdcRegs.ADCTRL2.bit.ePWM_SOCA_SEQ1 = 1; AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;//启用 SEQ1中断(每个 EOS) PieCtrlRegs.PIEIER1.bit.INTx6=1; PieCtrlRegs.PIEIER3.bit.INTx1 = 1; IER |=(4|1); EINT; //启用全局中断 INTM ERTM; //启用全局实时中断 DBGM for (;;); } void GPIO_Setup1 (void){ EALLOW; GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;//启用 GPIO0上的上拉 GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0;//启用 GPIO1上的上拉 GpioCtrlRegs.GPAPUD.bit.GPIO2 = 0;//启用 GPIO2上的上拉 GpioCtrlRegs.GPAPUD.bit.GPIO3 = 0;//启用 GPIO3上的上拉 GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;// GPIO0 = PWM1A GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1;// GPIO1 = PWM1B GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1;// GPIO2 = PWM2A GpioCtrlRegs.GPAMUX1.bit.GPIO3=1;// GPIO3=PWM2B GpioCtrlRegs.GPADIR.bit.GPIO24=0; GpioCtrlRegs.GPAMUX2.bit.GPIO24=0; GpioCtrlRegs.GPAPUD.bit.GPIO24=0; GpioCtrlRegs.GPAQSEL2.bit.GPIO24=0; GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 0; GpioCtrlRegs.GPBDIR.bit.GPIO32 = 1; EDIS; } void InitEPwm1Examples() { // //设置 TBCLK // //EPWM1 A 和 B 为 GPIO 0和1 EPwm1Regs.TBCTL.bit.CTRMODE = 2;//向上计数递减 EPwm1Regs.TBPRD = 1875; //设置计时器周期 EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载 EPwm1Regs.TBPHS.Half.TBPHS = 0x0000; //相位为0 EPwm1Regs.TBCTR = 0x0000; //清除计数器 EPwm1Regs.TBCTL.bit.HSPCLKDIV = 001;//时钟与 SYSCLKOUT 之比 EPwm1Regs.TBCTL.bit.CLKDIV = 000; EPwm1Regs.TBCTL.bit.SYNCOSEL=1; EPwm1Regs.CMPA.half.CMPA =937;//设置比较值 EPwm1Regs.CMPB = 937; //设置比较 B 值 EPwm1Regs.DBCTL.bit.out_mode=3; EPwm1Regs.DBCTL.bit.POLSEL=2; EPwm1Regs.DBCTL.bit.in_mode=0; EPwm1Regs.DBRED=20; EPwm1Regs.DBFED=20; EPwm1Regs.AQCTLA.bit.CAU=2;//将 PWM1A 设置为零 EPwm1Regs.AQCTLA.bit.CAD=1; EPwm1Regs.AQCTLB.bit.CBU=2; EPwm1Regs.AQCTLB.bit.CBD = 1; EPwm1Regs.ETSEL.bit.INTEN = 1; EPwm1Regs.ETSEL.bit.INTSEL=1; EPwm1Regs.ETPS.bit.INTPRD=1; EPwm1Regs.ETSEL.bit.SOCAEN = 1; //在组上启用 SOC EPwm1Regs.ETSEL.bit.SOCASEL = 4;//从 CPMA 中选择 SOC、以进行递增计数 EPwm1Regs.ETPS.bit.SOCAPRD = 1; //在发生第一个事件时生成脉冲 EPwm2Regs.TBCTL.bit.CTRMODE = 2;//向上计数递减 EPwm2Regs.TBPRD = 1875; //设置计时器周期 EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载 EPwm2Regs.TBPHS.Half.TBPHS = 0x0000; //相位为0 EPwm2Regs.TBCTR = 0x0000; //清除计数器 EPwm2Regs.TBCTL.bit.HSPCLKDIV = 001;//时钟与 SYSCLKOUT 之比 EPwm2Regs.TBCTL.bit.CLKDIV = 000; EPwm2Regs.TBCTL.bit.SYNCOSEL=1; EPwm2Regs.CMPA.half.CMPA =937;//设置比较值 EPwm2Regs.CMPB = 937; //设置比较 B 值 EPwm2Regs.DBCTL.bit.OUT_MODE=3; EPwm2Regs.DBCTL.bit.POLSEL=2; EPwm2Regs.DBCTL.bit.IN_MODE=0; EPwm2Regs.DBRED=20; EPwm2Regs.DBFED=20; EPwm2Regs.AQCTLA.bit.CAU=2;//将 PWM1A 设置为零 EPwm2Regs.AQCTLA.bit.CAD=1; EPwm2Regs.AQCTLB.bit.CBU=2; EPwm2Regs.AQCTLB.bit.CBD = 1; } __interrupt void ePWM1A_COMPARE_ISR (void) { postate=GpioDataRegs.GPADAT.bit.GPIO24; if (postate> prestate){ v2[count]=1; Theta=0.0f; GpioDataRegs.GPBTOGGLE.bit.GPIO32=1; } prestate=postate; M=Voltage1[ConversionCount]; b1=0.5f+(m-0.5f)*sin (theta); b2=0.5f+(m-0.5f)*sin (theta+3.141592f); EPwm1Regs.CMPA.half.CMPA =EPwm1Regs.TBPRD-(UINT16)(B1*EPwm1Regs.TBPRD);//设置比较值 EPwm1Regs.CMPB = EPwm1Regs.TBPRD-(UINT16)(B1*EPwm1Regs.TBPRD); //设置比较 B 值 EPwm2Regs.CMPA.half.CMPA =EPwm1Regs.TBPRD-(UINT16)(B2*EPwm1Regs.TBPRD); //设置比较 A 值 EPwm2Regs.CMPB = EPwm1Regs.TBPRD-(UINT16)(B2*EPwm1Regs.TBPRD); //设置比较 B 值 V1[count]=EPwm1Regs.CMPA.half-CMPA; //v2[count]=EPwm2Regs.CMPA.half-CMPA; // v1[count]=b;*/ //EPwm1Regs.CMPA.half.CMPA=EPwm1Regs.TBPRD-_IQsat (_IQ28mpy (b、EPwm1Regs.TBPRD)、EPwm1Regs.TBPRD、0); // v1[count]=b; 计数=计数+ 1; Theta=theta+deltheta; IF (theta->PI){ 计数= 0; Theta=0.0f; } d1[计数]=b1; EPwm1Regs.ETCLR.bit.INT=1; PieCtrlRegs.PIEACK.All=4; // //确认此中断以从组1接收更多中断 // //PieCtrlRegs.PIEACX.ALL = PIEACK_Group1; return; } _interrupt void ADC_ISR (void) { Voltage1[ConversionCount]= AdcRegs.ADCRESULT0 >> 4; Current[ConversionCount]= AdcRegs.ADCRESULT1 >>4; A[ConversionCount]=(float)(Voltage1[ConversionCount]*0.000732600f);//增益为3/4095 b[ConversionCount]=(float)(Current[ConversionCount]*0.000732600f);//增益为3/4095 VACL=a[转换计数]-1.4434f; IACt=b[转换计数]-1.4434f; if (ConversionCount = 400) { ConversionCount = 0; sum=0.0f; } 其他 { ConversionCount++; } AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; //重置 SEQ1 AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; //清除 INT SEQ1位 PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;//确认 PIE 中断 返回; }
[引用 USER="Bala Naga lingaiah"]是的、ADC SoC 示例正常工作。 但在我的程序中、它显示了一些随机值。 大部分为1和0混合。[/引号]
恐怕我无法对问题描述有任何有用的理解。 如果 ADC_SoC 示例正常工作、最好将工作 ADC 配置与程序进行比较。
对于调试、我建议对程序中的数据流进行自下而上的分析。 首先确定 ADCRESULT 值与预期输入信号的偏离程度。 必要时使用静态直流信号以简化过程。