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/TMS320F28335:使用 ADC 需要多长时间?

Guru**** 2537590 points
Other Parts Discussed in Thread: TMS320F28335

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/613117/ccs-tms320f28335-how-long-does-it-take-to-use-adc

器件型号:TMS320F28335

工具/软件:Code Composer Studio

你好

我已使用 ADC_SOC 示例读取三个 A/D 通道、并使用两个函数"Start_Timer"和"Stop_Timer" 来测量读取这些通道所需的时间。 执行此操作几乎需要0.005s、但是在 TMS320F28335的数据表中、ADC 的转换时间为80ns。 请检查我的代码、看看为什么需要这么长的时间?

void main (void)
{
InitSysCtrl();




EALLOW;
#define ADC_MODCLK 0x3
EDIS;


EALLOW;
SysCtrlRegs.HISPCP。all = ADC_MODCLK;
EDIS;

Dint;
InitPieCtrl();

IER = 0x0000;
IFR = 0x0000;


InitPieVectTable();

InitCpuTimer();//对于此示例,只初始化 CPU 计时器

EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
PieVectTable.ADCINT =&ADC_ISR;
EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的


StartTimer(); 



InitAdc ();//对于此示例,初始化 ADC
PieCtrlRegs.PIEIER1.bit.INTx6=1;
IER |= M_INT1; //启用 CPU 中断1
EINT; //启用全局中断 INTM
ERTM; //启用全局实时中断 DBGM

//

LoopCount = 0;
ConversionCount = 0;

//
//配置 ADC
//
AdcRegs.ADCMAXCONV.ALL = 0x0003; //在 SEQ1上设置2 conv
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x2;//将 ADCINA2设置为第一个 SEQ1转换器
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x3;//将 ADCINA3设置为第2个 SEQ1转换器
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x4;
//
//从 ePWM 启用 SOCA 以启动 SEQ1
//
AdcRegs.ADCTRL2.bit.ePWM_SOCA_SEQ1 = 1;

AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;//启用 SEQ1中断(每个 EOS)

//
//假设 ePWM1时钟已在 InitSysCtrl()中启用;
//
EPwm1Regs.ETSEL.bit.SOCAEN = 1; //在组上启用 SOC
EPwm1Regs.ETSEL.bit.SOCASEL = 4;//从 CPMA 中选择 SOC、以进行递增计数
EPwm1Regs.ETPS.bit.SOCAPRD = 1; //在发生第一个事件时生成脉冲
EPwm1Regs.CMPA.half.CMPA = 0x0080;//设置比较值
EPwm1Regs.TBPRD = 0xFFFF; //为 ePWM1设置周期
EPwm1Regs.TBCTL.bit.CTRMODE = 0;//向上计数并启动

StopTimer();

Δ_time=cpuTime*6.66e-9;

void StartTimer (void)
{
// cpuTime1 = 0;

EALLOW;
CpuTimer2Regs.TCR.bit.TRB = 1; //将 CPU 定时器重置为周期值
CpuTimer2Regs.TCR.bit.TSS = 0; //启动或复位 CPU 定时器2.
cpuTime1 = CpuTimer2Regs.TIM.all; //在代码前获取 CPU 定时器2的值
EDIS;
}

void StopTimer (void)
{

EALLOW;
cpuTime2 = CpuTimer2Regs.TIM.all;//获取代码后 CPU 定时器2的值
cpuTime = cpuTime1 - cpuTime2; //使用 cpuTimer2计算时间
CpuTimer2Regs.TCR.bit.TSS = 1; //启动或复位 CPU 定时器2.
EDIS;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
_interrupt void
ADC_ISR (void)
{
Voltage1 = AdcRegs.ADCRESULT0 >>4;
Voltage2 = AdcRegs.ADCRESULT1 >>4;
Voltage3 = AdcRegs.ADCRESULT2 >>4;
电流=电压1 -电压2;
电压=电压2-电压3;

//
//如果记录了40次转换,则重新开始
//

//
//为下一个 ADC 序列重新初始化
//
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; //重置 SEQ1
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; //清除 INT SEQ1位
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;//确认 PIE 中断

返回;
}

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

    ATA、

    您的 StartTimer()和 StopTimer()放置不测量 ADC 转换的时间;它们测量执行硬件初始化代码的时间。

    实际的 EPWM-ADC SOC 触发器和转换序列通过后台的硬件状态机(与代码执行异步)进行。 我建议您参考 ADCePWM 参考指南、以查看示例中每个 AdcRegs 和 EPwm1Regs 指令所执行的操作。

    在该平台上使用 C 语言进行编码需要对数字设计和汇编编语言编程概念有一定的熟悉程度。  另一种选择是使用更高级别的开发环境  、例如 MathWorks、solidThinking 或 PSIM 的开发环境。

    Tommy

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Tommy。
    那么、无法测量 ADC 所需的时间吗?
    我需要能够每20us 触发一次 GPIO、因此我需要确保每次获得模拟信号时、我的 ADC 的工作时间小于20us。 我是否有办法做到这一点?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 USER="ATA Khiabani"]是否无法测量 ADC 所需的时间?

    通过从 ADC ISR 中读取 ePWM TBCTR、可以间接测量执行时间。

    [引用 user="ATA Khiabani">我需要每20秒触发一次 GPIO、因此我需要确保每次获得模拟信号时 ADC 的工作时间小于20us。 我是否有办法做到这一点?

    根据数据表中的时序图、这应该是可能的。 F28335技术讲座中的模块/实验6 看起来与您描述的内容类似。