工具/软件:Code Composer Studio
您好!
我尝试处理 ADC_SoC 示例。 我计划生成 ADC_ISR 和 ePWM_ISR、这样 ADC_ISR 将为我提供平均10次连续读取、而 ePWM_ISR 将使用该平均值更新其 CMPA 寄存器。 代码看起来还可以 、但其性能相当糟糕。 我始终获得100%占空比。 就好像 cmpa 没有真正得到更新一样。 我已经反复遍读了代码、我根本不知道我哪里出错了... 但我觉得这个问题会很小。
顺便说一下、我在某个地方读出 ADC_ISR 的优先级高于 ePWM_ISR、 但是、由于 ADC 应由 ePWM SOCA 触发、这是否意味着在首次转换中、ADC 的输出将为零、因为它尚未合法触发、因此不会进行转换?
如果有任何建议和指示、我将不胜感激。
谢谢。
David
#include "DSP28x_Project.h" //设备头文件和示例包括文件 //此文件中找到的函数的原型语句。 _interrupt void ADC_ISR (void); __interrupt void epwm4_ISR (void); void GPIO_select (void); //void Setup_ePWM1A (void); //void Setup_ePWM2A (void); //void Setup_ePWM3A (void); void Setup_ePWM4A (void); //本示例中使用的全局变量: uint16 i; uint16 LoopCount; uint16 Voltage1[10]; float VoltageAve; main () { //步骤1。 初始化系统控制: // PLL、看门狗、启用外设时钟 //此示例函数位于 DSP2833x_sysctrl.c 文件中。 InitSysCtrl(); EALLOW; #IF (CPU_FRQ_150MHz) //默认- 150MHz SYSCLKOUT #define ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3)= 25.0MHz #endif (CPU_FRQ_100MHz) #define ADC_MODCLK 0x2 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 100/(2*2)= 25.0MHz #endif EDIS; //定义 ADCCLK 时钟频率(小于或等于25MHz) //假设 InitSysCtrl()已将 SYSCLKOUT/ 所有 ADCLK 设置为150MHz。 初始化 GPIO: //此示例函数位于 DSP2833x_GPIO.c 文件中, //说明了如何将 GPIO 设置为其默认状态。 // InitGpio();//针对本示例跳过 GPIO_select (); //步骤3。 清除所有中断并初始化 PIE 矢量表: //禁用 CPU 中断 DINT; //将 PIE 控制寄存器初始化为默认状态。 //默认状态是禁用所有 PIE 中断并 清除标志//。 //此函数位于 DSP2833x_PIECTRL.c 文件中。 InitPieCtrl(); //禁用 CPU 中断并清除所有 CPU 中断标志: IER = 0x0000; IFR = 0x0000; //使用指向 shell 中断 //服务例程(service routinese, ISR)的指针初始化 PIE 矢量表。 //这将填充整个表,即使在 本示例中未使用中断//也是如此。 这对于调试很有用。 //可以在 DSP2833x_DefaultIsr.c 中找到 shell ISR 例程 //此函数可在 DSP2833x_PieVect.c 中找到 InitPieVectTable(); //此示例中使用的中断被重新映射到 这个文件中的// ISR 函数。 EALLOW;//这是写入 EALLOW 受保护寄存 器 PieVectTable.ADCINT =&ADC_ISR; PieVectTable.EPWM4_INT =&epwm4_ISR; EDIS;//这是禁用写入 EALLOW 受保护寄存器 所必需的//步骤4。 初始化所有器件外设: //此函数可在 DSP2833x_InitPeripherals.c 中找到// InitPeripherals ();//此示例 InitAdc ()不需要;//对于此示例,初始化 ADC //步骤5。 用户特定代码、启用中断: //在 PIE PieCtrlRegs.PIEIER1.bit.INTx6 = 1; PieCtrlRegs.PIEIER3.bit.INTx4 = 1; IER |= 5;//启用 CPU 中断1和3 EINT;//启用全局中断 INTM ERTM;//启用全局实时中断 DBGM LoopCount = 0; //转换计数= 0; //配置 ADC AdcRegs.ADCMAXCONV.ALL = 0;//在 SEQ1上设置1个转换数- 1 个 AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x4;//将 ADCINA4设置为第一个 SEQ1转换数 AdcRegs.ADCTRL1.bit.ACQ_PS = 15;//多路复用器切换和样本冻结之间的时间 AdcRegs.ADCTRL1.bit.CONT_RUN = 1;//在第一次转换结束时重新开始全部等待另一个触发输入信号 AdcRegs.ADCTRL1.bit.SECLK=1MHz;ADCCLQ+ADCCLK=1MHz = ADCCLK+ADCCLK=1MHz;ADCCLK+ADCCLK=1MHz = ADCCLK+ADCCLK+ADCCLK=1MHz //从 ePWM 启用 SOCA 以启动 SEQ1 AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;//启用 SEQ1中断 AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1 = 0;//启用 SEQ1中断每个 EOS AdcRegs.ADCTRKPS.bit.SMOCLKS.bit.INCLK = 0;// 启用 ADCMOCLK=0;// ADCTRL = 0 = ADCTRL = 0;// ADCTRL = ADCTRL = 0;ADCTRL = ADCK_= 0;ADCTRL = ADCTRL = 0;ADCTRL = ADCTRL = 0;// ADCTRL = ADCTRL = ADCK_= ADCTRL = 0;ADCTRL = ADCTRL = ADCK_= //等待 ADC 中断 (;;) { LoopCount++; } }void GPIO_select (void) { EALLOW; GpioCtrlRegs.GPAMUX1.ALL = 0;// GPIO15... GPIO0 =通用向 控制器 I/O //GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;//GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1;//GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 1;GpioX1.Gpio1.GAMUX2.Gpio1.GAMUX2.Gpio1.GAMU6 = 1;GPAMUX1.Gpio1.Gpio1.Gpio1.Gpio1.GAMU2.GAMU2.GAMUX2.GAMUX1.GAM所有人 Gpio1.// GPIO31... GPIO16 =通用 I/O GpioCtrlRegs.GPBMUX1.ALL = 0;// GPIO47... GPIO32 =通用 I/O GpioCtrlRegs.GPBMUX2.ALL = 0;// GPIO63... GPIO48 =通用 I/O GpioCtrlRegs.GPCMUX1.ALL = 0;// GPIO79... GPIO64 =通用 I/O GpioCtrlRegs.GPCMUX2.ALL = 0;// GPIO87... GPIO80 =通用 I/O GpioCtrlRegs.GPADIR.ALL = 0; //GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;//外设资源管理器:GPIO0上的 LED LD1 //GpioCtrlRegs.GPADIR.bit.GPIO2 = 1;//外设资源管理器:GPIO1.bit/GPIO1.4=GPIO1.r.piDIR 1 上的 LED LDO1.GPIO1.GPIO1.GPIO1.bit.GPIO1.GPIO1.GPIO1.GPIO1.bit.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1. GPIO6 GpioCtrlRegs.GPBDIR.ALL = 0;// GPIO63-32作为输入 GpioCtrlRegs.GPCDIR.ALL = 0;// GPIO87-64作为输入 EDIS; } _ mirror_interrupt void ADC_ISR (void) { for (i=0;i<10;i<10;i_volageAve = 3*ADvoltagedr1+ ); // ADvoltvoltageR1+= 0[volt.ADC1+= 0* voltagedr1+;} //重置 SEQ1 AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; //清除 INT SEQ1位 PieCtrlRegs.PIEACK.all = PIEACK_Group1;//确认中断以返回 PIE ; } __INTERRUPT void epwm4_ISR (void) { EPwm4Regs.CMPA.half.CMPA = VoltageAve*(EPwm4Regs.TBPRD); //重新初始化下 一个 EPwm4Regs.TCLR 位;/EPwm4INT.Et //清除 INT SEQ1位 PieCtrlRegs.PIEACK.all = PIEACK_Group3;//确认中断以返回 PIE ; } void Setup_ePWM4A (void) { EPwm4Regs.TBCTL.bit.CLKDIV = 0;//SysClkOut/1 ie 默认 EPwm4Regs.TBCLT.TBRL =/SysClkOut/2 0 ;/TBRDCTRL = 0;/TBIT.TBIT.TBIT.TBIG 位数= 0;/TBR4TBIT.TBIT.TBIG = 0;/TBIT.TBIT.TBIT.TBIG = 0;/TBIT.TBIT.TBIT.TBIG = 0//禁用同步输出选择 EPwm4Regs.TBPRD = 4989/22;//330kHz EPwm4Regs.CMPA.half.CMPA = 0;//初始 CMPA = 0 EPwm4Regs.AQCTLA.all = 0x0012;//CTR = 0 (设置)、CTR = cmpa on up (up.EN.EPTL.TCASEL = 0);EPwm4Regs.ePl = 0x0012 (EPmCtcmpa) //在组 EPwm4Regs.ETSEL.bit.SOCASEL = 1上启用 SOC; //从 CTR=0 EPwm4Regs.ETPS.bit.SOCAPRD =1选择 SOC; //在发生第一个事件 EPwm4Regs.ETSEL.bit.INTEN 时生成脉冲= 1; //启用 PWM 中断 EPwm4Regs.ETSEL.bit.INTSEL = 2; //在 CTR = PRD EPwm4Regs.ETPS.bit.INTPRD = 1上启用中断; //第一个事件发生中断 }