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.

[参考译文] TMS320F28069:是否可以对16个 ADC 通道进行100kHz 采样?

Guru**** 2595805 points
Other Parts Discussed in Thread: TMS320F28069, CONTROLSUITE, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/672964/tms320f28069-is-it-possible-100-khz-sampling-16-adc-channel

器件型号:TMS320F28069
Thread 中讨论的其他器件: controlSUITEC2000WARE

我正在处理整流器项目。 我正在使用所有 ADC 通道。 我想使用我的 TMS320F28069高性能。

因此、当我尝试以100kHz 的频率对所有 ADC 通道进行采样时、它在100kHz 下并不稳定。 它的频率会发生变化。 在 TMS320F2806X 技术参考手册中、一个采样时间为 444.44ns。

因此在 同步采样模式下,8*444.44ns = ~ 3.555us。 因此、最大采样频率为 281kHz。 但我不会以该速率进行采样。 我将添加我的 ADC 设置代码。 问题是什么??

请帮帮我。

EALLOW;


SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;
(*Device_cal)();




AdcRegs.ADCCTL1.bit.ADCBGPWD=1; //电源 ADC BG
AdcRegs.ADCCTL1.bit.ADCREFPWD=1; //电源基准
AdcRegs.ADCCTL1.bit.ADCPWDN = 1; //功率 ADC
AdcRegs.ADCCTL1.bit.ADCENABLE = 1; //启用 ADC
AdcRegs.ADCCTL1.bit.ADCREFSEL = 0; //选择内部 BG



AdcRegs.ADCCTL2.bit.CLKDIV2EN = 0;



//ADC 选择
GpioDataRegs.GPACLEAR.bit.GPIO29 = 1;


AdcRegs.ADCSAMPLEMODE.All=0x00FF;

AdcRegs.ADCCTL2.bit.ADCNONOVERLAP = 1;//启用非重叠模式
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1;// ADCINT1在 AdcResults 锁存后跳闸
AdcRegs.INTSEL1N2.bit.INT1E = 1;//启用 ADCINT1
AdcRegs.INTSEL1N2.bit.INT1CONT = 0;//禁用 ADCINT1连续模式
AdcRegs.INTSEL1N2.bit.INT1SEL = 0x0F;//设置 EOC1以触发 ADCINT1触发



AdcRegs.ADCSOC0CTL.bit.CHSEL = 0x0;//将 SOC0通道选择设置为 ADCINA0
// AdcRegs.ADCSO1CTL.bit.CHSEL = 0x0;
AdcRegs.ADCSOC2CTL.bit.CHSEL = 0x1;
// AdcRegs.ADCSOC3CTL.bit.CHSEL = 0x1;
AdcRegs.ADCSOC4CTL.bit.CHSEL = 0x2;
// AdcRegs.ADCSOC5CTL.bit.CHSEL = 0x2;
AdcRegs.ADCSOC6CTL.bit.CHSEL = 0x3;
// AdcRegs.ADCSOC7CTL.bit.CHSEL = 0x3;
AdcRegs.ADCSOC8CTL.bit.CHSEL = 0x4;
// AdcRegs.ADCSOC9CTL.bit.CHSEL = 0x4;
AdcRegs.ADCSOC10CTL.bit.CHSEL = 0x5;
// AdcRegs.ADCSOC11CTL.bit.CHSEL = 0x5;
AdcRegs.ADCSOC12CTL.bit.CHSEL = 0x6;
// AdcRegs.ADCSOC13CTL.bit.CHSEL = 0x6;
AdcRegs.ADCSOC14CTL.bit.CHSEL = 0x7;
// AdcRegs.ADCSOC15CTL.bit.CHSEL = 0x7;

AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 0;//设置 SOC0在 EPWM1A 上启动触发器,因为轮询 SOC0首先转换 SOC
AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 0;//设置 EPWM1A 上的 SOC1启动触发器,因为 SOC0先转换,然后 SOC1
AdcRegs.ADCSOC2CTL.bit.TRIGSEL = 0;//设置 SOC0在 EPWM1A 上启动触发器,因为轮询 SOC0首先转换 SOC
AdcRegs.ADCSOC3CTL.bit.TRIGSEL = 0;//设置 EPWM1A 上的 SOC1启动触发器,因为 SOC0先转换,然后 SOC1
AdcRegs.ADCSOC4CTL.bit.TRIGSEL = 0;//设置 SOC0在 EPWM1A 上启动触发器,因为轮询 SOC0首先转换 SOC
AdcRegs.ADCSOC5CTL.bit.TRIGSEL = 0;//设置 EPWM1A 上的 SOC1启动触发器,因为 SOC0先转换,然后 SOC1
AdcRegs.ADCSOC6CTL.bit.TRIGSEL = 0;//设置 SOC0在 EPWM1A 上启动触发器,因为轮询 SOC0首先转换 SOC
AdcRegs.ADCSOC7CTL.bit.TRIGSEL = 0;//设置 EPWM1A 上的 SOC1启动触发器,因为 SOC0先转换,然后 SOC1
AdcRegs.ADCSOC8CTL.bit.TRIGSEL = 0;//设置 SOC0在 EPWM1A 上启动触发器,因为轮询 SOC0首先转换 SOC
AdcRegs.ADCSOC9CTL.bit.TRIGSEL = 0;//设置 EPWM1A 上的 SOC1启动触发器,因为 SOC0先转换,然后 SOC1
AdcRegs.ADCSOC10CTL.bit.TRIGSEL = 0;//设置 SOC0在 EPWM1A 上启动触发器,因为轮询 SOC0首先转换 SOC
AdcRegs.ADCSOC11CTL.bit.TRIGSEL = 0;//设置 EPWM1A 上的 SOC1启动触发器,因为 SOC0先转换,然后 SOC1
AdcRegs.ADCSOC12CTL.bit.TRIGSEL = 0;//设置 SOC0在 EPWM1A 上启动触发器,因为轮询 SOC0首先转换 SOC
AdcRegs.ADCSOC13CTL.bit.TRIGSEL = 0;//设置 EPWM1A 上的 SOC1启动触发器,因为 SOC0先转换,然后 SOC1
AdcRegs.ADCSOC14CTL.bit.TRIGSEL = 0;//设置 SOC0在 EPWM1A 上启动触发器,因为轮询 SOC0首先转换 SOC
AdcRegs.ADCSOC15CTL.bit.TRIGSEL = 0;//设置 EPWM1A 上的 SOC1启动触发器,因为 SOC0先转换,然后 SOC1

AdcRegs.ADCSOC0CTL.bit.ACQPS = 6;//将 SOC0 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
AdcRegs.ADCSOC1CTL.bit.ACQPS = 6;//将 SOC1 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
AdcRegs.ADCSOC2CTL.bit.ACQPS = 6;//将 SOC0 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
AdcRegs.ADCSOC3CTL.bit.ACQPS = 6;//将 SOC1 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
AdcRegs.ADCSOC4CTL.bit.ACQPS = 6;//将 SOC0 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
AdcRegs.ADCSOC5CTL.bit.ACQPS = 6;//将 SOC1 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
AdcRegs.ADCSOC6CTL.bit.ACQPS = 6;//将 SOC0 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
AdcRegs.ADCSOC7CTL.bit.ACQPS = 6;//将 SOC1 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
AdcRegs.ADCSOC8CTL.bit.ACQPS = 6;//将 SOC0 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
AdcRegs.ADCSOC9CTL.bit.ACQPS = 6;//将 SOC1 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
AdcRegs.ADCSOC10CTL.bit.ACQPS = 6;//将 SOC0 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
AdcRegs.ADCSOC11CTL.bit.ACQPS = 6;//将 SOC1 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
AdcRegs.ADCSOC12CTL.bit.ACQPS = 6;//将 SOC0 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
AdcRegs.ADCSOC13CTL.bit.ACQPS = 6;//将 SOC1 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
AdcRegs.ADCSOC14CTL.bit.ACQPS = 6;//将 SOC0 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
AdcRegs.ADCSOC15CTL.bit.ACQPS = 6;//将 SOC1 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)


// PieVectTable.ADCINT1 =&adcHwiISR;

//PieCtrlRegs.PIEIER1.bit.INTx1 = 1;
IER |= M_INT1;//启用 CPU 中断1

EDIS; 

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

    感谢您访问 TI C2000 E2E 论坛。  尽管您的主要问题是如何使 ADC 在同步模式下以100kHz 的频率进行采样、但我想将其分解成一些更基本的问题、以便获得更好的答案:

    1)一般最大转换时间/转换时间

    2)将 ADC 设置为同步模式

    3)以所需的采样率触发 ADC

    我假设您已使用其中一个 controlSUITE 或 C2000Ware 示例作为起点、根据随附的代码片段、时钟树如下所示:

    F28069 CPU 时钟= 90MHz

    F28069 ADC 时钟= 45MHz

    1)片上 ADC 的转换时间可分为两个主要部分:

    a)采样时间(由 ADC_ACQPS 位域控制)、最小值= 7个 ADC 时钟

    b)转换时间(始终13个 ADC 时钟)

    但是、如果我们保持 ADC 完全加载、那么我们可以在当前转换正在进行时对下一个通道进行采样。 这样、我们就可以在6个 ADC 时钟进入电流转换后开始下一个采样、这意味着我们每13个 ADC 时钟就会得到一个 ADC 结果

    1个 ADC 采样从空闲状态开始的时间=(7+13)* 1/45MHz = 444.44ns

    如果 ADC 保持加载、则后续 ADC 转换的时间=((采样时钟- 7)+13)* 1/45MHz = 288.89ns (在本例中、采样时钟= 7)

    在您的情况下、使用同步采样可以计算所有16个通道触发后的总时间=((7+13)* 1/45MHz)+(15*(13*1/45MHz))= 4.78us (从触发到16个通道的 ADC 数据)。

    假设您正在处理100kHz 所需的控制环路速度、这意味着您必须在10us 内获取数据、应用控制律、其中几乎一半将仅用于获取 ADC 数据、 如果适用、您使用 ADC 数据的时间将略长于5us。  如果 CPU 速度为90MHz、则可在 ADC 结果输入后完成~4500个 CPU 周期的工作。   

    2)将 ADC 设置为同步模式

    您的代码在大多数情况下是正确的。  正如您正确注释的那样、不需要为奇数 SOC 字段定义任何 ADC 参数、因为在这种模式下、偶数 SOC 会考虑这种情况。  但是、这也适用于触发器、因此您需要确保无论使用哪种触发源、它都不会应用于奇数 SOCTRIG 字段。  在示例代码中、您提供了所有触发器都来自 SW;在这种情况下、您可以写入 SW、以便它不会设置任何奇数 SOC FRC 位。

    3)以所需的采样率触发 ADC

    我怀疑这是不能正常工作的部件、但可能会受到上面第1或第2项的影响、这就是我想更深入地探讨的原因。  假设以上所有内容都是可以接受的;那么要以100kHz 的间隔触发 ADC、只需以100kHz 的间隔写入 ADCFRC 位(请记住、只有奇数 SOC)。  您可以使用 CPU 计时器和 ISR 来执行此操作、也可以只使用具有正确等待时间的 for 循环。

    我认为最简单的方法是使用 PWM 来触发 ADC、因为 PWM 频率很可能也是100kHz。  基本 ADC 示例显示了如何以这种方式使用 PWM、您只需将其定制为100kHz 周期、 以及将触发源改回您选择的 PWM (在这种情况下、请记住不要配置奇数 SOC)。

    此致、

    Matthew