工具/软件:Code Composer Studio
你好。
我正在尝试了解 AD 转换器后处理块的操作。
通过 C2000多日技术讲座中的一个项目、即使用 AD 转换器(Lab6)的项目、我尝试将 PPB 块投入使用。
如果我将 PPB1与 SOC0关联、则无法正常工作、但如果我将其与 SOC1关联、则可以正常工作。
SOC0转换由 EPWM2触发。 转换后、调用一个中断来将转换结果放入 AdcBuf 和 AdcBuf2变量中。
AdcBuf 保存 AdcResultRegs.ADCRESULT0和 AdcBuf2保存 AdcResultRegs.ADCRESULT1。
为了测试 PPB 块、我进行了两次转换、一次是 SOC0启动的、另一次是 SOC1启动的、并首先关联了 PPB1到 SOC0。
此配置的代码部分如下所示。
//--SOC0和 SOC1配置 AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 7;// SOC0由 ePWM2 SOCA AdcRegs.ADCSOC0CTL.bit.CHSEL = 0触发;// SOC0转换单采样模式下的输入 ADCINA0 AdcocRegs.ADCOC0CTL.bit.CHSEL = 0;// ADCCOCLK 周期内的 ADC20位 ADCINA0;// ADCCO0CR.ADC20.ADCC.ADCCPS.ADCCPS.ADCCPS.ADCCPS = ADCCP.ADC AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 7; // SOC0由 ePWM2 SOCA 触发 AdcaRegs.ADCSOC1CTL.bit.CHSEL = 0; // SOC0在单采样模式下转换输入 ADCINA0 AdcaRegs.ADCSOC1CTL.bit.ACQPS = 19; //采集窗口有20个 SYSCLK 周期 // ADCA1中断配置 AdcaRegs.ADCINTSEL1N2.bit.INT1CONT = 1;//中断脉冲 AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;// ADC 中断使能 AdcaRegs.ADCSEL1INT1N2.bit/中断触发 INT1IREG1.EPIR1.EPI1; //中断触发 INT1INT1INT1INT1INT1R2.EPIR2.EPIR2.EPI= 1;/位 //在 PIE 组1 IER 中启用 ADCA1中断|= 0x0001; //在 IER 中启用 INT1以启用 PIE 组 //设置 PPB 偏移 AdcaRegs.ADCPPB1CONFIG.bit.config = 0; //PPB1与 SOC0关联 AdcaRegs.ADCPPB1OFFCAL.ALL = 400; //PPB1将减去 OFFCAL 值
如图所示、AdcBuf 和 AdcBuf2几乎相等、这表示 PPB1未修改 AdcaResultRegs.ADCRESULT0
当通过更改 AdcaRegs.ADCPPB1CONFIG.bit.CONFIG = 1将 PPB1与 SOC1关联时、如下图所示、这些值将被修改。
那么、我的问题是:当与 SOC0进行关联时、为什么 PPB1不会改变 AdcaResultRegs.ADCRESULT0值?
我将 Code Composer Studio v7.1.0与 C2000 Ware 和 LAUNCHXL-F28377S 搭配使用。
接下来是 AD CONFIG 和 ADCA 中断的完整代码。
void InitAdca (void) { asm (" EALLOW");//启用 EALLOW 受保护寄存 器访问//--重置 ADC。 这是一种良好的编程实践。 DevCfgRegs.SOFT13.bit.ADC_A = 1;// ADC 复位 DevCfgRegs.SOFT13.bit.ADC_A = 0;// ADC 从复位中释放 //---配置 ADC 基寄存 器 AdcaRegs.ADCCTL1.all = 0x0004;// ADC 配置 ADCCTL2.ADC000= 0xADC0006;// ADCCADCCADCCADCMT.ADCML = 0xADC000ADC000ADCM.ADCMP- 配置= 0xADC000ADC000ADCMP-所有时钟配置= 0xADCCADCM.ADC000ADCMP-配置= 0xADC000ADC000ADCM.ADCMP-配置;ADCMP-配置= 0xADC000ADCMP- //这也会对配置的模式执行正确的 ADC 校准。 AdcSetMode (ADC_ADCA、ADC_Resolution_12位、ADC_SIGNALMODE_SINGLE); //-- SOC0配置 AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 7;// SOC0由 ePWM2 SOCA AdcRegs.ADCOC0CTL.bit.ADC0触发 ;// ADC0采样转换为单周期输入/ ADCSOC0。ADCSOC0 = ADC0 = ADC0。ADCSOC0 = ADCSOC0 = ADC0。ADC0 = ADC0。ADC0 = ADC0 = ADC0。ADC0 = ADC0。ADC0 = ADC0。ADC0 = AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 7; // SOC0由 ePWM2 SOCA 触发 AdcaRegs.ADCSOC1CTL.bit.CHSEL = 0; // SOC0在单采样模式下转换输入 ADCINA0 AdcaRegs.ADCSOC1CTL.bit.ACQPS = 19; //采集窗口有20个 SYSCLK 周期 // ADCA1中断配置 AdcaRegs.ADCINTSEL1N2.bit.INT1CONT = 1;//中断脉冲 AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;// ADC 中断使能 AdcaRegs.ADCSEL1N2.bit.INT1IREP0 = 1;//中断触发 INT1INT1IREG2.E0;//中断 INT1INT1INT1INT1RINT1RID.ADC.E0 = 1 //在 PIE 组1 IER 中启用 ADCA1中断|= 0x0001; //在 IER 中启用 INT1以启用 PIE 组 //设置 PPB 偏移 AdcaRegs.ADCPPB1CONFIG.bit.config = 0; //PPB1与 SOC0关联 AdcaRegs.ADCPPB1OFFCAL.ALL = 400; //PPB1将减去 OFFCAL 值 //--完成 AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;//加电 ADC DELAY_US (1000);//加电后等待1ms,然后再使用 ADC asm (" EDIS");//禁用 EALLOW 受保护寄存器访问 }//终止
接下来是 adca 中断。
中断 void adca1_ISR (void) // PIE1.1 @ 0x000D40 ADC-A 中断#1 { static uint16 * AdcBufPtr = AdcBuf; //指向缓冲 器静态 uint16的指针*AdcBufPtr2 = AdcBuf2; //指向缓冲区2 的指针静态 uint16 iQuadratureTable = 0; //正交表索引 静态易失性 UINT16 GPIO34_count = 0; //引脚切换计数器 PieCtrlRegs.PIEACX.ALL = PIEACK_Group1; //必须确认 PIE 组 //-管理 ADC 寄存器 AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //清除 ADCINT1标志 //读取 ADC 结果 * AdcBufPtR++= AdcResultRegs.ADCRESULT0; //读取结果 *AdcBufPtr2++= AdcResultRegs.ADCRESULT1; //读取结果 //--强力强制循环缓冲区 if (AdcBufPtr ==(AdcBuf + ADC_BUF_LEN)) { AdcBufPtr = AdcBuf; //将指针回卷到开头 AdcBufPtr2 = AdcBuf2; } //--示例:切换 GPIO18,以便我们可以使用 ADC 读取它***/ if (debug_toggle = 1) { GpioDataRegs.GPATOGGLE.bit.GPIO18=1; //切换引脚 } //--示例:以0.5秒的速率切换 GPIO34 (连接到 controlCARD 上的 LED)。 // (1/50000秒/采样)*(1个采样/内部)*(x 个中断/切换)=(0.5秒/切换) // => x = 25000 if (GPIO34_count++> 25000) //缓慢切换以查看 LED 闪烁 { GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1;//切换引脚 GPIO34_count = 0; //重置计数 器} //---写入 DAC-B 以创建 ADC-A0的输入 if (sine_enable = 1) { DacOutput = DacOffset +((QuadratureTable[iQuadratureTable+]^ 0x8000)>> 5); } 其他 { DacOutput = DacOffset; } if (iQuadratureTable >(sine_PTs - 1)) //将索引打包 { iQuadratureTable = 0; } DacbRegs.DACVALS.ALL = DacOutput; }