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.

[参考译文] TMS320F28386S:帮助配置 ADC、我是否需要突发模式?

Guru**** 2533040 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1064228/tms320f28386s-help-configuring-adc-do-i-need-burst-mode

器件型号:TMS320F28386S
Thread 中讨论的其他器件:SysConfig

您好!

C2000器件上的外设变得非常复杂,有时很难理解如何充分利用它:-)

我有6个模拟信号。

3连接到 ADCA、3连接到 ADCB

我需要同时采样所有6个信号、或尽可能接近彼此。

我已配置为 fifows:

SOC0 -> ADCA CH2、TRIG EPWM1

SOC1 -> ADCA CH3、TRIG EPWM1

SOC2 -> ADCA CH4、TRIG EPWM1

SOC0 -> ADCB CH2、TRIG EPWM1

SOC1 -> ADCB ch3、TRIG EPWM1

SOC2 -> ADCB CH4、TRIG EPWM1

ADCA 中断。

采集 时间设置为60个时钟。 60 * 5ns = 300ns。

我有2个问题:

1:此当前配置中发生了什么情况?

我猜在 EPWM1触发时、转换将在所有通道上启动?

是否在每个 ePWM 事件中对所有6个通道进行采样?

我是否需要使用突发模式来使其正常工作?

2:在 示波器上进行性能评测时、EPWM1触发器和 ADC ISR 之间的时间为1.5us

转换时间为5 * 300ns。

我不理解这一结果。
我预期、(如果 ADC A 和 B 同时采样)转换时间将为3个样本* 300ns。

我希望获得有关最佳配置的一些指导。

谢谢!

请参阅 SysConfig 的配置

void adc_init(){
//M_PAN_ADCA 初始化

// ADC 初始化:写入 ADC 配置并为 ADC 加电
//配置模数转换器模块预分频器。
ADC_setPrescaler (M_PAN_ADCA_BASE、ADC_CLK_DIV_4_0);
//配置模数转换器分辨率和信号模式。
ADC_setMode (M_PAN_ADCA_BASE、ADC_RESolution_12位、ADC_MODE_SINGLE_ENDLE);
//设置转换结束脉冲的时序
ADC_setInterruptPulseMode (M_PAN_ADCA_BASE、ADC_PULSE_END_of _CONV);
//为模数转换器内核加电。
ADC_enableConverter (M_PAN_ADCA_BASE);
//延迟1ms 以允许 ADC 加电时间
DEVICE_DELAY_US (500);

// SOC 配置:设置 ADC ePWM 通道和触发器设置
//禁用 SOC 突发模式。
ADC_DisableBurstMode (M_PAN_ADCA_BASE);
//设置 SOC 的优先级模式。
ADC_setSOCPPriority (M_PAN_ADCA_BASE、ADC_PRI_All_ROUND);
//转换0配置开始
//在 ADC 及其中断 SOC 触发器中配置转换开始(SOC)。
// SOC 编号:0
//触发:ADC_TRIGGER_EPWM1_SOCA
//通道:ADC_CH_ADCIN2
//示例窗口:60个 SYSCLK 周期
//中断触发:ADC_INT_SOC_TRIGGER_NONE
ADC_setupSOC (M_PAN_ADCA_BASE、ADC_SOC_NUMBER0、ADC_TRIGGER_EPWM1_SOCA、ADC_CH_ADCIN2、60U);
ADC_setInterruptSOCtrigger (M_PAN_ADCA_BASE、ADC_SOC_NUMBER0、ADC_INT_SOC_TRIGGER_NONE);
//转换1配置开始
//在 ADC 及其中断 SOC 触发器中配置转换开始(SOC)。
// SOC 编号:1.
//触发:ADC_TRIGGER_EPWM1_SOCA
//通道:ADC_CH_ADCIN3
//示例窗口:60个 SYSCLK 周期
//中断触发:ADC_INT_SOC_TRIGGER_NONE
ADC_setupSOC (M_PAN_ADCA_BASE、ADC_SOC_NUMBER1、ADC_TRIGGER_EPWM1_SOCA、ADC_CH_ADCIN3、60U);
ADC_setInterruptSOCtrigger (M_PAN_ADCA_BASE、ADC_SOC_NUMBER1、ADC_INT_SOC_TRIGGER_NONE);
//转换2配置开始
//在 ADC 及其中断 SOC 触发器中配置转换开始(SOC)。
// SOC 编号:2.
//触发:ADC_TRIGGER_EPWM1_SOCA
//通道:ADC_CH_ADCIN4
//示例窗口:60个 SYSCLK 周期
//中断触发:ADC_INT_SOC_TRIGGER_NONE
ADC_setupSOC (M_PAN_ADCA_BASE、ADC_SOC_NUMBER2、ADC_TRIGGER_EPWM1_SOCA、ADC_CH_ADCIN4、60U);
ADC_setInterruptSOCtrigger (M_PAN_ADCA_BASE、ADC_SOC_NUMBER2、ADC_INT_SOC_TRIGGER_NONE);
// ADC 中断1配置
// SOC/EOC 编号:2.
//中断源:启用
//连续模式:已禁用
ADC_setInterruptSource (M_PAN_ADCA_BASE、ADC_INT_NUMBER1、ADC_SOC_NUMBER2);
ADC_enableInterrupt (M_PAN_ADCA_BASE、ADC_INT_NUMBER1);
ADC_clearInterruptStatus (M_PAN_ADCA_BASE、ADC_INT_NUMBER1);
ADC_DisableContinuousMode (M_PAN_ADCA_BASE、ADC_INT_NUMBER1);

// PPB 配置:为 ADCPPB 配置上限和下限检测
//后处理块1配置
//在 ADC 中配置后处理块(PPB)。
// PPB 编号:1.
// SOC/EOC 编号:0
//校准偏移量:0
//参考偏移量:0
//二进制补码:已禁用
//行程上限:0
//行程下限:0
//清除 PPB 事件标志:已禁用
ADC_setupPPB (M_PAN_ADCA_BASE、ADC_PPB_NUMBER1、ADC_SOC_NUMBER0);
ADC_DisablePPBEvent (M_PAN_ADCA_BASE、ADC_PPB_number1、(ADC_EVT_TRIPHI | ADC_EVT_TRIPLO | ADC_EVT_ZERO);
ADC_DisablePPBEventInterrupt (M_PAN_ADCA_BASE、ADC_PPB_number1、(ADC_EVT_TRIPHI | ADC_EVT_TRIPLO | ADC_EVT_ZERO);
ADC_setPPBCalibrationOffset (M_PAN_ADCA_BASE、ADC_PPB_NUMBER1、0);
ADC_setPPBReferenceOffset (M_PAN_ADCA_BASE、ADC_PPB_NUMBER1、0);
ADC_DisablePPBTwosComplement (M_PAN_ADCA_BASE、ADC_PPB_NUMBER1);
ADC_setPPBTripLimits (M_PAN_ADCA_BASE、ADC_PPB_NUMBER1、0、0);
ADC_DisablePPBEventCBCClear (M_PAN_ADCA_BASE、ADC_PPB_NUMBER1);
//后处理块2配置
//在 ADC 中配置后处理块(PPB)。
// PPB 编号:2.
// SOC/EOC 编号:1.
//校准偏移量:0
//参考偏移量:0
//二进制补码:已禁用
//行程上限:0
//行程下限:0
//清除 PPB 事件标志:已禁用
ADC_setupPPB (M_PAN_ADCA_BASE、ADC_PPB_NUMBER2、ADC_SOC_NUMBER1);
ADC_DisablePPBEvent (M_PAN_ADCA_BASE、ADC_PPB_number2、(ADC_EVT_TRIPHI | ADC_EVT_TRIPLO | ADC_EVT_ZERO);
ADC_DisablePPBEventInterrupt (M_PAN_ADCA_BASE、ADC_PPB_NUMBER2、(ADC_EVT_TRIPHI | ADC_EVT_TRIPLO | ADC_EVT_ZERO);
ADC_setPPBCalibrationOffset (M_PAN_ADCA_BASE、ADC_PPB_NUMBER2、0);
ADC_setPPBReferenceOffset (M_PAN_ADCA_BASE、ADC_PPB_NUMBER2、0);
ADC_DisablePPBTwosComplement (M_PAN_ADCA_BASE、ADC_PPB_NUMBER2);
ADC_setPPBTripLimits (M_PAN_ADCA_BASE、ADC_PPB_NUMBER2、0、0);
ADC_DisablePPBEventCBCClear (M_PAN_ADCA_BASE、ADC_PPB_NUMBER2);
//后处理块3配置
//在 ADC 中配置后处理块(PPB)。
// PPB 编号:3.
// SOC/EOC 编号:2.
//校准偏移量:0
//参考偏移量:0
//二进制补码:已禁用
//行程上限:0
//行程下限:0
//清除 PPB 事件标志:已禁用
ADC_setupPPB (M_PAN_ADCA_BASE、ADC_PPB_Number3、ADC_SOC_Number2);
ADC_DisablePPBEvent (M_PAN_ADCA_BASE、ADC_PPB_Number3、(ADC_EVT_TRIPHI | ADC_EVT_TRIPLO | ADC_EVT_ZERO));
ADC_DisablePPBEventInterrupt (M_PAN_ADCA_BASE、ADC_PPB_Number3、(ADC_EVT_TRIPHI | ADC_EVT_TRIPLO | ADC_EVT_ZERO);
ADC_setPPBCalibrationOffset (M_PAN_ADCA_BASE、ADC_PPB_Number3、0);
ADC_setPPBReferenceOffset (M_PAN_ADCA_BASE、ADC_PPB_Number3、0);
ADC_DisablePPBTwosComplement (M_PAN_ADCA_BASE、ADC_PPB_Number3);
ADC_setPPBTripLimits (M_PAN_ADCA_BASE、ADC_PPB_Number3、0、0);
ADC_DisablePPBEventCBCClear (M_PAN_ADCA_BASE、ADC_PPB_Number3);

//M_tilt_ADCB 初始化

// ADC 初始化:写入 ADC 配置并为 ADC 加电
//配置模数转换器模块预分频器。
ADC_setPrescaler (M_tile_ADCB_BASE、ADC_CLK_DIV_4_0);
//配置模数转换器分辨率和信号模式。
ADC_setMode (M_tilt_ADCB_BASE、ADC_resolution_12位、ADC_mode_single_ended);
//设置转换结束脉冲的时序
ADC_setInterruptPulseMode (M_tile_ADCB_BASE、ADC_PULSE_END_of _CONV);
//为模数转换器内核加电。
ADC_enableConverter (M_tile_ADCB_BASE);
//延迟1ms 以允许 ADC 加电时间
DEVICE_DELAY_US (500);

// SOC 配置:设置 ADC ePWM 通道和触发器设置
//禁用 SOC 突发模式。
ADC_DisableBurstMode (M_tile_ADCB_BASE);
//设置 SOC 的优先级模式。
ADC_setSOCPPriority (M_tilt_ADCB_BASE、ADC_PRI_All_ROUND);
//转换0配置开始
//在 ADC 及其中断 SOC 触发器中配置转换开始(SOC)。
// SOC 编号:0
//触发:ADC_TRIGGER_EPWM1_SOCA
//通道:ADC_CH_ADCIN2
//示例窗口:60个 SYSCLK 周期
//中断触发:ADC_INT_SOC_TRIGGER_NONE
ADC_setupSOC (M_tilt_ADCB_BASE、ADC_SOC_NUMBER0、ADC_TRIGGER_EPWM1_SOCA、ADC_CH_ADCIN2、60U);
ADC_setInterruptSOCtrigger (M_tile_ADCB_BASE、ADC_SOC_NUMBER0、ADC_INT_SOC_TRIGGER_NONE);
//转换1配置开始
//在 ADC 及其中断 SOC 触发器中配置转换开始(SOC)。
// SOC 编号:1.
//触发:ADC_TRIGGER_EPWM1_SOCA
//通道:ADC_CH_ADCIN3
//示例窗口:60个 SYSCLK 周期
//中断触发:ADC_INT_SOC_TRIGGER_NONE
ADC_setupSOC (M_tilt_ADCB_BASE、ADC_SOC_number1、ADC_TRIGGER_EPWM1_SOCA、ADC_CH_ADCIN3、60U);
ADC_setInterruptSOCtrigger (M_tile_ADCB_BASE、ADC_SOC_number1、ADC_INT_SOC_TRIGGER_NONE);
//转换2配置开始
//在 ADC 及其中断 SOC 触发器中配置转换开始(SOC)。
// SOC 编号:2.
//触发:ADC_TRIGGER_EPWM1_SOCA
//通道:ADC_CH_ADCIN4
//示例窗口:60个 SYSCLK 周期
//中断触发:ADC_INT_SOC_TRIGGER_NONE
ADC_setupSOC (M_tilt_ADCB_BASE、ADC_SOC_number2、ADC_TRIGGER_EPWM1_SOCA、ADC_CH_ADCIN4、60U);
ADC_setInterruptSOCtrigger (M_tile_ADCB_BASE、ADC_SOC_number2、ADC_INT_SOC_TRIGGER_NONE);

// PPB 配置:为 ADCPPB 配置上限和下限检测
//后处理块1配置
//在 ADC 中配置后处理块(PPB)。
// PPB 编号:1.
// SOC/EOC 编号:0
//校准偏移量:0
//参考偏移量:0
//二进制补码:已禁用
//行程上限:0
//行程下限:0
//清除 PPB 事件标志:已禁用
ADC_setupPPB (M_tile_ADCB_BASE、ADC_PPB_number1、ADC_SOC_NUMBER0);
ADC_DisablePPBEvent (M_tilt_ADCB_BASE、ADC_PPB_number1、(ADC_EVT_TRIPHI | ADC_EVT_TRIPLO | ADC_EVT_ZERO);
ADC_DisablePPBEventInterrupt (M_tile_ADCB_BASE、ADC_PPB_number1、(ADC_EVT_TRIPHI | ADC_EVT_TRIPLO | ADC_EVT_ZERO);
ADC_setPPBCalibrationOffset (M_tile_ADCB_BASE、ADC_PPB_number1、0);
ADC_setPPBReferenceOffset (M_tile_ADCB_BASE、ADC_PPB_number1、0);
ADC_DisablePPBTwosComplement (M_tile_ADCB_BASE、ADC_PPB_number1);
ADC_setPPBTripLimits (M_tile_ADCB_BASE、ADC_PPB_number1、0、0);
ADC_DisablePPBEventCBCClear (M_tile_ADCB_BASE、ADC_PPB_number1);
//后处理块2配置
//在 ADC 中配置后处理块(PPB)。
// PPB 编号:2.
// SOC/EOC 编号:1.
//校准偏移量:0
//参考偏移量:0
//二进制补码:已禁用
//行程上限:0
//行程下限:0
//清除 PPB 事件标志:已禁用
ADC_setupPPB (M_tile_ADCB_BASE、ADC_PPB_number2、ADC_SOC_number1);
ADC_DisablePPBEvent (M_tile_ADCB_BASE、ADC_PPB_number2、(ADC_EVT_TRIPHI | ADC_EVT_TRIPLO | ADC_EVT_ZERO);
ADC_DisablePPBEventInterrupt (M_tile_ADCB_BASE、ADC_PPB_number2、(ADC_EVT_TRIPHI | ADC_EVT_TRIPLO | ADC_EVT_ZERO);
ADC_setPPBCalibrationOffset (M_tile_ADCB_BASE、ADC_PPB_number2、0);
ADC_setPPBReferenceOffset (M_tile_ADCB_BASE、ADC_PPB_number2、0);
ADC_DisablePPBTwosComplement (M_tile_ADCB_BASE、ADC_PPB_number2);
ADC_setPPBTripLimits (M_tile_ADCB_BASE、ADC_PPB_number2、0、0);
ADC_DisablePPBEventCBCClear (M_tile_ADCB_BASE、ADC_PPB_number2);
//后处理块3配置
//在 ADC 中配置后处理块(PPB)。
// PPB 编号:3.
// SOC/EOC 编号:2.
//校准偏移量:0
//参考偏移量:0
//二进制补码:已禁用
//行程上限:0
//行程下限:0
//清除 PPB 事件标志:已禁用
ADC_setupPPB (M_tile_ADCB_BASE、ADC_PPB_Number3、ADC_SOC_number2);
ADC_DisablePPBEvent (M_tile_ADCB_BASE、ADC_PPB_Number3、(ADC_EVT_TRIPHI | ADC_EVT_TRIPLO | ADC_EVT_ZERO));
ADC_DisablePPBEventInterrupt (M_tilt_ADCB_BASE、ADC_PPB_Number3、(ADC_EVT_TRIPHI | ADC_EVT_TRIPLO | ADC_EVT_ZERO));
ADC_setPPBCalibrationOffset (M_tile_ADCB_BASE、ADC_PPB_Number3、0);
ADC_setPPBReferenceOffset (M_tile_ADCB_BASE、ADC_PPB_Number3、0);
ADC_DisablePPBTwosComplement (M_tile_ADCB_BASE、ADC_PPB_Number3);
ADC_setPPBTripLimits (M_tile_ADCB_BASE、ADC_PPB_Number3、0、0);
ADC_DisablePPBEventCBCClear (M_tile_ADCB_BASE、ADC_PPB_Number3);

void interrupt_init(){

// INT_M_PAN_ADCA_1的中断设置
INTERRUPT_REGISTER (INT_M_PAN_ADCA_1、&INT_M_PAN_ADCA_1_ISR);
INTERRUPT_ENABLE (INT_M_PAN_ADCA_1);

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

    NIR、您好!

    当 ePWM 触发到达时、所有3个 SOC 在每个 ADC 上都设置为挂起。  然后、每个 ADC 根据优先级方案处理挂起的转换。  默认优先级方案将导致 SOC0转换、然后是 SOC1和 SOC2转换。  每次转换都由采样电压的 S+H 相(60 x 5ns = 300ns 看起来是正确的)和转换相组成、其中电压转换为数字结果(时间取决于 SYSCLK 到 ADCCLK 分频器和分辨率)。  

    您可以使用器件数据表和 TRM 中提供的" ADC 时序图"部分来计算确切的转换时间。  对于一个转换序列、重要的时间将是 t (SH)-采样和保持时间、 以及 t (EOC)-从 S+H 结束转换之前的时间(也是直到下一个 S+H 可以开始的时间)。  因此、在这种情况下、总转换时间将是60个 SYSCLK + 41个 SYSCLK = 101个 SYSCLK = 505ns。  由于每个序列中有3次转换、我们希望最后一次转换在大约1.5 μ s 后完成、并且 ISR 在1.5 μ s 后切换 GPIO +任何上下文切换开销。  请注意、如果您并行使用3个(或4个) ADC 而不是仅使用2个 ADC、则可能会降低接收到的触发器和完成转换之间的延迟。   

    突发模式允许您让每个 ePWM 触发一组不同的 SOC。  例如、如果突发大小为4次转换、则第一个 ePWM 触发器将 SOC0至 SOC3设置为挂起、然后它们将按顺序转换。  第二个触发器将导致设置 SOC4到 SOC7、第三个触发 SOC8到 SOC11、第四个触发 SOC12到 SOC15、以及第五个触发 SOC0到 SOC3等 这些 SOC 可以对应于不同的通道(以便部分或所有通道采样速度慢于 ePWM 触发速率)或相同的通道(以便结果寄存器充当多组转换的循环缓冲器)或某种组合。  在任何情况下、对于"ADC 时序图"部分中的信息、突发模式下的转换时间都是不修改的。   

      

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

    感谢您的快速而详细的重播!
    这对我帮助很大。