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/TMS320F28379D:CCS/TMS320F28379D

Guru**** 2609955 points
Other Parts Discussed in Thread: CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/688360/ccs-tms320f28379d-ccs-tms320f28379d

器件型号:TMS320F28379D
Thread 中讨论的其他器件:controlSUITE

工具/软件:Code Composer Studio

您好!

我正在尝试向信号提供一个移位(例如延迟100个样本)。 我正在使用 controlSUITE 中的 adc_soc_ePWM_cpu01.c 示例来实现我的算法、并对代码进行了一些更改。  

CCS 不会显示任何错误。 但我看到信号采用了一些错误的值、而不是采用延迟。 请查看以下代码、并告知我是否有任何更改。

我使用的 ADC 频率为12kHz。

//######################################################################################################################
//
//文件:adc_soc_ePWM_cpu01.c
//
//标题:针对 F2837xD 通过 ePWM 触发 ADC。
//
//! addtogroup cpu01_example_list
//!

ADC ePWM 触发(ADC_SoC_ePWM)


//!
//! 此示例设置 EPWM 以定期触发 ADC。
//!
//! 程序运行后,内存将包含:\n
//! -\b 结果:一系列的模数转换样本
//! 引脚 A0。 采样之间的时间根据周期确定
//! PWM 计时器的功能。
//
//######################################################################################################################
//$TI 版本:F2837xD 支持库 V210 $
//$Release Date:Tue Nov1 14:46:15 CDT 2016 $
//版权所有:版权所有(C) 2013-2016 Texas Instruments Incorporated -
// http://www.ti.com/ 保留所有权利$
//######################################################################################################################

//
//包含的文件
//
#include "F28x_Project.h"
#include "math.h"

//
//函数原型
//
void ConfigureADC (void);
void ConfigureEPWM (void);
void SetupADCepwm (uint16通道);
中断 void adca1_ISR (void);

//
//定义
//
#define results_buffer_size 960

//
//全局
//
uint16 AdcaResults[results_buffer_size];
unsigned int y2[results_buffer_size];
unsigned int Y3[results_buffer_size];
unsigned int y4[results_buffer_size];
uint16结果索引;
易失性 uint16 bufferFull;


#define DELAY_1 100
#define DELAY_2 34.
#define DELAY_3 20.
#define size results_buffer_size


void main (void)

//
//步骤1. 初始化系统控制:
// PLL、安全装置、启用外设时钟
//此示例函数位于 F2837xD_SYSCTRL.c 文件中。
//
InitSysCtrl();

//
//步骤2. 初始化 GPIO:
//此示例函数位于 F2837xD_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
//
InitGpio();//针对此示例跳过

//
//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
//
Dint;

//
//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 F2837xD_PIECTRL.c 文件中。
//
InitPieCtrl();

//
//禁用 CPU 中断并清除所有 CPU 中断标志:
//
IER = 0x0000;
IFR = 0x0000;

//
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。 这对于调试很有用。
//可以在 F2837xD_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 F2837xD_PieVect.c 中找到
//
InitPieVectTable();

//
//映射 ISR 函数
//
EALLOW;
PieVectTable.ADCA1_INT =&adca1_ISR;//针对 ADCA 中断1的函数
EDIS;

//
//配置 ADC 并为其加电
//
ConfigureADC();

//
//配置 ePWM
//
ConfigureEPWM();

//
//在通道0上设置用于 ePWM 触发转换的 ADC
//
SetupADCepwm (0);

//
//启用全局中断和更高优先级的实时调试事件:
//
IER |= M_INT1;//启用组1中断
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM

//
//初始化结果缓冲区
//
for (resultsIndex = 0;resultsIndex < results_buffer_size;resultsIndex++)

AdcaResults[resultsIndex]=0;
y2[结果索引]=0;
y3[resultsIndex]=0;
y4[resultsIndex]=0;

resultsIndex = 0;
bufferFull = 0;

//
//启用 PIE 中断
//
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;

//
//同步 ePWM
//
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;

//
//循环无限地进行转换
//
操作

//
//启动 ePWM
//
EPwm1Regs.ETSEL.bit.SOCAEN = 1;//启用 SOCA
EPwm1Regs.TBCTL.bit.CTRMODE = 0;//取消冻结、并进入递增计数模式

//
//等待、而 ePWM 导致 ADC 转换、然后导致中断、
//填充结果缓冲区,最终设置 bufferFull
//flag
//
while (!bufferFull);
bufferFull = 0;//清除缓冲区已满标志

//
//停止 ePWM
//
EPwm1Regs.ETSEL.bit.SOCAEN = 0;//禁用 SOCA
EPwm1Regs.TBCTL.bit.CTRMODE = 3;//冻结计数器

//
//此时,AdcaResults[]包含一系列转换
//从所选通道
//

//
//软件断点,再次点击运行以获取更新的转换
//
//asm (" ESTOP0");
} while (1);

//
// ConfigureADC -写入 ADC 配置并为两者加电
// ADC A 和 ADC B
//
空配置 ADC (空)

EALLOW;

//
//写入配置
//
AdcaRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
AdcSetMode (ADC_ADCA、ADC_Resolution_16BIT、ADC_SIGNALMODE_differential);//ADC_Resolution_12位、ADC_SIGNALMODE_SINGLE

//
//将脉冲位置设置为晚期
//
AdcaRegs.ADCCTL1.bit.INTPULSEPOS=1;

//
//为 ADC 加电
//
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;

//
//延迟1ms 以允许 ADC 加电时间
//
DELAY_US (1000);

EDIS;

//
// ConfigureEPWM -配置 ePWM SOC 并比较值
//
空配置 EPWM (空)

EALLOW;
//假设 ePWM 时钟已启用
EPwm1Regs.ETSEL.bit.SOCAEN = 0;//禁用组上的 SOC
EPwm1Regs.ETSEL.bit.SOCASEL = 4;//在递增计数时选择 SOC
EPwm1Regs.ETPS.bit.SOCAPRD = 1;//在发生第一个事件时生成脉冲
EPwm1Regs.CMPA.bit.CMPA = 0x208C;//将比较 A 值设置为2048个计数
EPwm1Regs.TBPRD = 0x4119;//将周期设置为4096个计数//1000
EPwm1Regs.TBCTL.bit.CTRMODE = 3;//冻结计数器
EDIS;

//
// SetupADCepwm -设置 ADC ePWM 采集窗口
//
void SetupADCepwm (uint16通道)

uint16 acqps;

//
//根据分辨率确定最小采集窗口(在 SYSCLKS 中)
//
if (adc_resolution_12bit = AdcaRegs.ADCCTL2.bit.resolution)

acqps = 14;//75ns

否则、//分辨率为16位

acqps = 63;//320ns

//
//选择要转换的通道和转换结束标志
//
EALLOW;
AdcaRegs.ADCSOC0CTL.bit.CHSEL =通道;//SOC0将转换引脚 A0
AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps;//采样窗口为100个 SYSCLK 周期
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5;// ePWM1 SOCA/C 上的触发
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// SOC0结束将设置 INT1标志
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 INT1标志
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除
EDIS;

//
// adca1_ISR -在 ISR 中读取 ADC 缓冲器
//
中断 void adca1_ISR (void)

AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT0;


if (resultsIndexx <DELAY_1)
y2[结果索引]=0.5*(AdcResults[resultsIndex]-AdcResults Results[resultsIndex-delay_1+size]);
其他
y2[结果索引]=0.5*(AdcResults[resultsIndex]-AdcResults Results[resultsIndex-delay_1]);

if (resultsIndexx <DELAY_2)
y3[结果索引]=0.5*(y2[结果索引]+y2[结果索引-delay_2+size]);
其他
y3[结果索引]=0.5*(y2[结果索引]+y2[结果索引-delay_2]);

if (resultsIndexx <DELAY_3)
y4[resultsIndex]=0.5*(y3[resultsIndex]+y3[resultsIndex-delay_3+size]);
其他
y4[resultsIndex]=0.5*(y3[resultsIndex]+y3[resultsIndex-delay_3]);

//y2[结果索引]=0.5*(AdcaResults[resultsIndex]-AdcaResults[resultsIndex-100]);
//y3[结果索引]=0.5*(y2[结果索引]+y2[结果索引-34]);
//y4[resultsIndex]=0.5*(y3[resultsIndex]+y3[resultsIndex-20]);


if (results_buffer_size <= resultsIndex)

resultsIndex = 0;
bufferFull = 1;

AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 INT1标志
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;

//
//文件结束
//

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

    粗略看一下您的代码后、您是否确定始终访问已初始化的数据、并且您的数组索引始终处于范围内? 最好单步执行、考虑代码(尤其是前几次迭代)并检查每个步骤的数据是否合理以及阵列访问是否合理。

    如果没有时间延迟、ADC 结果是否看起来不错?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Devin、

    在给出延时时间之前、我的 ADC 结果看起来不错。 就我所知、数据也很有意义。 我指定了与延迟信号相同的缓冲器大小、因为我只需要一个时间偏移。   

    当我能够 读取 ADC 信号时、我是否可以直接提供时间偏移并将延迟信号添加到 ADC 信号中? 如果我可以添加它们、我在绘制新信号(延迟+ ADC 信号)时能否仅查看该信号?  我担心的是、当我添加这两个信号时、我的处理器会采用一些错误的值。 相反、如果我给出一个时间偏移、 那么我会看到信号以某种方式延迟。

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

    调试您的自定义处理代码略超出了我们通常提供的服务范围。 我的直觉告诉我、在进行计算时、未初始化的值会出现一些问题。 我认为最好的调试策略是制作一个电子表格或表格、其中列出了阵列前5个或6个元素在每个步骤中的预期值、 然后手动单步执行所实施的算法、并在每个步骤中将您的期望值与存储器中变量的实际值进行比较。 这应该可以很快地告诉您问题发生的地方。