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.

[参考译文] CCS/TMS320F28377S:与 SOC0搭配使用时、后处理块不能正常工作

Guru**** 2343950 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/591496/ccs-tms320f28377s-post-processing-block-doesn-t-work-when-asscoiated-with-soc0

器件型号:TMS320F28377S

工具/软件: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;
} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Jose、

    请参阅 TRM 中的此注释:

    我认为所有 PPB 都是以配置为指向 SOC0的默认值开始的。  由于 PPB4优先、如果您配置 PPB1、它将无法写入其 OFFCAL 值。  您可以将 PPB2到 PPB4指向其他一些 SOC、也可以改用 PPB4。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Devin Cottier、您好!

    非常感谢。
    你解释了情况、我明白了。