请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TMS320F28377S 大家好、TI 社区、
目前、我能够使用在每个周期上生成 SOCA 的 EPwm1通过 SOC0转换两个不同的 ADC 引脚/通道。 我能够使用基于 SOCA 转换结束的中断来填充两个单独的数组、每个通道一个数组(A2和 B2)。 我目前正在尝试使用自己的触发源和中断例程来实现第三个 ADC 通道。 我尝试使用 EPwm3作为 SOCA 触发源和 SOC1模块。 在尝试调试后、我放弃了位并注释了一些内容。 当我具有以下代码(使用 SOC0)时、我能够获取 EPwm3为引脚 ADCINB0生成 SOCA。
EALLOW; PieVectTable.ADCB1_INT =&generic_ISR_2; EDIS; CONFIG_ADC (ADC[ADC_ADCB]、ADC_ADCB); CONFIG_EPWM_SOCA (ePWM[3]); setup_ADC_SOC0 (0、ADC[ADC_ADCB]、9); setup_ADC_INT_TRIG (ADC[ADC_ADCB]、 0); IER |= M_INT1; PieCtrlRegs.PIEIER1.bit.INTx2 = 1; EINT; ERTM; //--interrupts-// 中断 void general_isr_2 (void) { ADC_SAMPLE_BUFFER[bufferIndex]= AdcbResultRegs.ADCRESULT0;//测试缓冲器以保持电池的直流值 bufferIndex++; if (ADC_BUF_LEN <= bufferIndex) { bufferIndex = 0; bufferFull = 1; } AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; PieCtrlRegs.PIEACK.all = PIEACK_Group1; } //--functions-//// config_ADC -写入 ADC 配置并为 ADC 空 CONFIG_ADC (volatile struct adc_regs * ADC、uint16 ADC) { EALLOW; //写入配置 (* ADC).ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4 ADCCLK 的最大速度为50MHz = 200MHz/4 AdcSetMode (ADC、ADC_Resolution_16BIT、ADC_SIGNALMODE_differential); //将脉冲位置设置为晚期 (* ADC).ADCCTL1.bit.INTPULSEPOS = 1; //为 ADC 加电 (* ADC).ADCCTL1.bit.ADCPWDNZ = 1; //延迟1ms 以允许 ADC 加电时间 DELAY_US (1000); EDIS; } // CONFIG_EPWM_SOCA 在 SOCA 上生成事件 void CONFIG_EPWM_SOCA (volatile struct ePWM_regs * ePWM) { EALLOW; //计数器时钟 TBCLK 的计算方法如下:"TBCLK = EPWMCLK /(HSPCLKDIV * CLKDIV)" // EPWMCLK 应等于 SYSCLK/2、即100MHz (* ePWM).TBCTL.bit.CLKDIV=0; //将分频器配置为/1 (* ePWM).TBCTL.bit.HSPCLKDIV=0; //将高速分频器配置为/1 //假设 ePWM 时钟已启用 (* ePWM).ETSEL.bit.SOCAEN = 0; //禁用组上的 SOC (* ePWM).ETSEL.bit.SOCASEL = 4; //在向上计数时选择 SOC (* ePWM).ETPS.bit.SOCAPRD = 1; //在发生第一个事件时生成脉冲 //EPwm1Regs.CMPA.bit.CMPA = 195; //生成 CMPA 值事件 //不需要 (* ePWM).TBPRD = 194; // TBPRD = ePWM 周期值- 1. (* ePWM).TBCTL.bit.CTRMODE = TB_FREEZE; //冻结计数器 EDIS; } void setup_ADC_SOC0 (uint16 adc_channel、volatile struct adc_regs * adc、uint16 trigger) { uint16 acqps; //根据分辨率确定最小采集窗口(在 SYSCLKS 中) if (adc_resolution_12bit ==(* adc).adCCTL2.bit.resolution) { acqps = 14;//75ns } 否则、//分辨率为16位 { acqps = 63;//320ns } EALLOW; (* ADC).ADCSOC0CTL.bit.CHSEL = ADC_CHANNEL;//SOCx 将转换所选 ADC 的选定 ADC_CHANNEL (* ADC).ADCSOC0CTL.bit.ACQPS = acqps; //采样窗口为100个 SYSCLK 周期 (* adc).adcsOC0CTL.bit.TRIGSEL =触发;//5; //触发 EDIS; } void setup_ADC_INT_TRIG (volatile struct adc_regs * adc、uint16 end_for_conversion) { EALLOW; (* ADC).ADCINTSEL1N2.bit.INT1SEL = END_OUT_COLUM变换; // EOCx 将设置所选 ADC 的 INT1标志 (* ADC).ADCINTSEL1N2.bit.INT1E = 1; //启用 INT1标志 (* ADC).ADCINTFLGCLR.bit.ADCINT1 = 1; //确保清除 INT1标志 EDIS; }
当我将 SOC0更改为 SOC1时、它停止工作-有人知道如何解决此问题、还是我对 SOC0和 SOC1差异的理解不正确?