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.

[参考译文] TMDSCNCD28379D:使用14个具有 F28379D 控制卡的 ADC

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1339580/tmdscncd28379d-using-14-adcs-with-f28379d-control-card

器件型号:TMDSCNCD28379D
主题中讨论的其他器件:C2000WARE

我希望我的问题不是那么幼稚。 我想对 F28379D 控制卡使用14种不同的 ADC、为此、我要使用 ADCA、B 和 C、 并接收 EPWM6SOCA 的触发、以确保所有    ADC 结果最终为 I 正在使用 通道 A 的6个 ADC、通道 B 的5个 ADC 和通道 C 的3个 ADC、并使用 SOC5发送 EOC 触发。 由于我正在进行编码、因此我只想确保我已正确理解架构  

""

void ConfigureAdc (void){
EALLOW;
//*****
AdcaRegs.ADCCTL2.bit.prescale = 14;//将 ADCCLK 分频器设置为/8 ADCCLK = 25MHz
AdcbRegs.ADCCTL2.bit.prescale = 14;//将 ADCCLK 分频器设置为/8 ADCCLK = 25MHz
AdccRegs.ADCCTL2.bit.prescale = 14;//将 ADCCLK 分频器设置为/8 ADCCLK = 25MHz
AdcSetMode (ADC_ADCA、ADC_Resolution_12bit、ADC_SIGNALMODE_SINGLE);
AdcSetMode (ADC_ADCB、ADC_Resolution_12位、ADC_SIGNALMODE_SINGLE);
AdcSetMode (ADC_ADCC、ADC_Resolution_12bit、ADC_SIGNALMODE_single);
//将脉冲位置设置为延迟
AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;
AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1;
ADccRegs.ADCCTL1.bit.INTPULSEPOS = 1;
//给 ADC 加电
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;//低电平有效
AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1;//低电平有效
ADccRegs.ADCCTL1.bit.ADCPWDNZ = 1;//低电平有效
//*****
EDIS;

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

EALLOW;
//*****
//模数












































 
























转换器 AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0;//SOC0将转换引脚 A0 AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps;//采样窗口是 acqps+1个 SYSCLK 周期 AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 0xF;//ADCTRIG15 - ePWM6、ADCSOCA 触发 ADC AdcaRegs.ADCSOC1CTL.bit.CHSEL = 1;//SOC1将转换引脚 A1 AdcaRegs.ADCSOC1CTL.bit.ACQPS = acqps;//采样窗口是 acqps+1个 SYSCLK 周期 AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 0xF;//ADCTRIG15 - ePWM6、ADCSOCA 触发 ADC AdcaRegs.ADCSOC2CTL.bit.CHSEL = 2;//SOC2将转换引脚 A2 AdcaRegs.ADCSOC2CTL.bit.ACQPS = acqps;//采样窗口是 acqps+1个 SYSCLK 周期 AdcaRegs.ADCSOC2CTL.bit.TRIGSEL = 0xF;//ADCTRIG15 - ePWM6、ADCSOCA 触发 ADC AdcaRegs.ADCSOC3CTL.bit.CHSEL = 3;//SOC3将转换引脚 A3 AdcaRegs.ADCSOC3CTL.bit.ACQPS = acqps;//采样窗口是 acqps+1个 SYSCLK 周期 AdcaRegs.ADCSOC3CTL.bit.TRIGSEL = 0xF;//ADCTRIG15 - ePWM6、ADCSOCA 触发 ADC AdcaRegs.ADCSOC4CTL.bit.CHSEL = 4;//SOC4将转换引脚 A4 AdcaRegs.ADCSOC4CTL.bit.ACQPS = acqps;//采样窗口是 acqps+1个 SYSCLK 周期 AdcaRegs.ADCSOC4CTL.bit.TRIGSEL = 0xF;//ADCTRIG15 - ePWM6、ADCSOCA 触发 ADC AdcaRegs.ADCSOC5CTL.bit.CHSEL = 5;//SOC5将转换引脚 A5 AdcaRegs.ADCSOC5CTL.bit.ACQPS = acqps;//采样窗口是 acqps+1个 SYSCLK 周期 AdcaRegs.ADCSOC5CTL.bit.TRIGSEL = 0xF;//ADCTRIG15 - ePWM6、ADCSOCA 触发 ADC // ADCB AdcbRegs.ADCSOC0CTL.bit.CHSEL = 0;//SOC0将转换引脚 B0 AdcbRegs.ADCSOC0CTL.bit.ACQPS = acqps;//采样窗口是 acqps+1个 SYSCLK 周期 AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 0xF;//ADCTRIG15 - ePWM6、ADCSOCA 触发 ADC AdcbRegs.ADCSOC1CTL.bit.CHSEL = 1;//SOC1将转换引脚 B1 AdcbRegs.ADCSOC1CTL.bit.ACQPS = acqps;//采样窗口是 acqps+1个 SYSCLK 周期 AdcbRegs.ADCSOC1CTL.bit.TRIGSEL = 0xF;//ADCTRIG15 - ePWM6、ADCSOCA 触发 ADC AdcbRegs.ADCSOC2CTL.bit.CHSEL = 2;//SOC2将转换引脚 B2 AdcbRegs.ADCSOC2CTL.bit.ACQPS = acqps;//采样窗口是 acqps+1个 SYSCLK 周期 AdcbRegs.ADCSOC2CTL.bit.TRIGSEL = 0xF;//ADCTRIG15 - ePWM6、ADCSOCA 触发 ADC AdcbRegs.ADCSOC3CTL.bit.CHSEL = 3;//SOC3将转换引脚 B3 AdcbRegs.ADCSOC3CTL.bit.ACQPS = acqps;//采样窗口是 acqps+1个 SYSCLK 周期 AdcbRegs.ADCSOC3CTL.bit.TRIGSEL = 0xF;//ADCTRIG15 - ePWM6、ADCSOCA 触发 ADC AdcbRegs.ADCSOC4CTL.bit.CHSEL = 4;//SOC4将转换引脚 B4 AdcbRegs.ADCSOC4CTL.bit.ACQPS = acqps;//采样窗口是 acqps+1个 SYSCLK 周期 AdcbRegs.ADCSOC4CTL.bit.TRIGSEL = 0xF;//ADCTRIG15 - ePWM6、ADCSOCA 触发 ADC // ADCC AdccRegs.ADCSOC0CTL.bit.CHSEL = 0;//SOC0将转换引脚 C0 AdccRegs.ADCSOC0CTL.bit.ACQPS = acqps;//采样窗口是 acqps+1个 SYSCLK 周期 ADccRegs.ADCSOC0CTL.bit.TRIGSEL = 0xF;//ADCTRIG15 - ePWM6、ADCSOCA 触发 ADC ADccRegs.ADCSOC1CTL.bit.CHSEL = 1;//SOC1将转换引脚 C1 AdccRegs.ADCSOC1CTL.bit.ACQPS = acqps;//采样窗口是 acqps+1 SYSCLK 周期 ADccRegs.ADCSOC1CTL.bit.TRIGSEL = 0xF;//ADCTRIG15 - ePWM6、ADCSOCA 触发 ADC ADccRegs.ADCSOC2CTL.bit.CHSEL = 2;//SOC2将转换引脚 C1 AdccRegs.ADCSOC2CTL.bit.ACQPS = acqps;//采样窗口是 acqps+1个 SYSCLK 周期 ADccRegs.ADCSOC2CTL.bit.TRIGSEL = 0xF;//ADCTRIG15 - ePWM6、ADCSOCA 触发 ADC AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 5;// SOC5结束将设置 INT1标志 AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 INT1标志 AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除 //***** EDIS; } //为 ADC 转换触发器启动配置 ePWM6 void ConfigureEpwm6ADC (void){ // TB (时基)设置 EPwm6Regs.TBPRD = switching_frequency;// 1999->50kHz、设置计时器周期、10位分辨率 EPwm6Regs.TBPHS.bit.TBPHS = 0x0000;//将相移设置为零 EPwm6Regs.TBCTR = 0x0000;//清除计数器 EPwm6Regs.TBCTL.bit.PHSEN = TB_ENABLE;//启用相位加载、从模式 EPwm6Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率 EPwm6Regs.TBCTL.bit.CLKDIV = TB_DIV1; EPwm6Regs.CMPCTL.bit.SHDWAMODE = CC_HOLD;//每0加载一次寄存器 EPwm6Regs.CMPCTL.bit.SHDWBMODE = CC_影子; EPwm6Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; EPwm6Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; EPwm6Regs.ETSEL.bit.SOCAEN = 0;//禁用组上的 SOC (将在主循环中启用) EPwm6Regs.ETSEL.bit.SOCASEL = 4;//在计时器递增时启用等于 CMPA 的事件时基计数器 EPwm6Regs.ETPS.bit.SOCAPRD = 1;//在发生第1个事件时生成脉冲 EPwm6Regs.CMPA.bit.CMPA = EPwm6Regs.TBPRD >> 4;//将比较 A 值设置为2048个计数 EPwm6Regs.TBCTL.bit.CTRMODE = TB_FREEZE;//冻结计数器 } ""
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    暹罗,

    以下几点:

    F28379D 中的 ADC 可以在最高频率50MHz 下工作。  我注意到您将其配置为最大额定速度的一半。  您可能希望以最大频率运行 ADC、以尽可能提高吞吐量。

    2. 在通道设置中,CHSEL = SOC#。  可能您不打算这样做、因为 ADCC SOC 分配也遵循    CHSEL = SOC#顺序。  F28379D 没有外部通道 ADCINC0和 ADCINC1键合。  请注意、该器件的 ADC 设置按 SOC 进行。  F28379D 有16个 SOC (0-15)。  这与通道编号不同。  ADC 的配置通过 SOC 单元完成。  默认情况下、如果不使用轮询模式并且设置了所有 SOC、则转换顺序从 SOC0开始到 SOC15。

    3.每个 SOC 都可以使用不同的外部通道或通道混合进行编程。  例如、您可以将所有 SOC 分配到通道2:  

       AdcaRegs.ADCSOC0CTL.bit.CHSEL = 2;//ADCINA2    

       AdcaRegs.ADCSOC1CTL.bit.CHSEL = 2;//ADCINA2

       :

       :

    4.全部的 ADC 触发一个源的转换是正确的方法、就像你设置的一样。

    5.将 EOC 设置为切换 ADCINT1是正确的、但是根据您的设置、您需要对 ADCB 和 ADCC 进行相同的配置、以便每个 ADC 都有自己的中断处理程序来读取已完成的转换。  如果您希望转换同时发生并完成、那么您应该使用相同数量的 SOC、但是读取结果必须由每个 ADC 的单独 ISR 进行管理、并将根据中断优先级发生、这本质上使此方案成为序列。  如果您的目的是同时将全部3个 ADC 的结果转储到存储器中、则可以选择 DMA 选项、该选项的传输可以由 SOC 转换的结果触发。  请参阅 ADC DMA 示例。

    C2000Ware 中还有几个示例可以供您尝试、以便了解 C2000 ADC 中的 SOC 原理如何工作。

    希望上述指针能让您更好地了解 C2000 ADC 的操作。

    此致、

    约瑟夫

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

    非常感谢您提供了详尽的回答、  

    为了澄清一下、使用下面3行代码时、当我使用 EPwm6ADCSOCA 触发 ADC 转换时、所有 ADC (ADCA、B 和 C)都按照轮循指定顺序同时为每个 SOC 数启动转换?

    ""

    AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0;//SOC0将转换引脚 A0

    AdcbRegs.ADCSOC0CTL.bit.CHSEL = 0;//SOC0将转换引脚 B0

    ADccRegs.ADCSOC0CTL.bit.CHSEL = 2;//SOC0将转换引脚 C2

    ""



    我可能会误解这一部分、但我的想法是 我对 ADCA 使用了 SOC0到 SOC5 (其中6个)、对 ADCB 使用了5个 SOC、对 ADCC 使用了3个 SOC。 当我接收到 EOC 表格 ADCASOC5时、所有其他转换都已完成、可通过相应的 ADCRESULS 访问结果。

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

    您好、Sam、

    问得好。  所有3个 ADC 都将同时转换。  在你上面捕捉的图表上、你可以添加一个 ADC C 行、虽然我们正在讨论同步转换的这个主题、我想强调你上面复制的图表的重要性。  在该模式下、所有 ADC 模块都处于 同步 因此、如果您注意到:

       -触发只来自一个来源,在你的情况下 EPWMSOCA 为所有3个 ADC

       - SOC S+H (绿色相位-采样时间为[ACQPS + 1]*SYSCLK)对齐所有 ADC

       -所有 ADC 的 SOC0转换(蓝色相位-量化时间、ADCCLK 的函数)一致

    如果这些阶段中的任何一个彼此重叠、则会将转换操作置于 异步 模式、在该模式下、如果量化阶段进入也在主动转换的任何其他 ADC 上的采样保持阶段、则会有来自该阶段的内部噪声耦合。  如果您查看规范、某些 ADC 参数将具有降级的规格或由于异步转换根本不受支持。

    此致、

    约瑟夫

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

    因此、如果我们 同步 我们可以仅使用"  AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 5;"并确保我们得到了所有结果、 因为 ADC_A 的通道5的转换结束是顺序的最后一个结果。

    对于 ADC_A、我们 将使用  

    SOC0、SOC1、SOC2、SOC3、SOC4和 SOC5

    对于 ADC_B、我们 将使用  

    SOC0、SOC1、SOC2、SOC3 和 SOC4

    对于 ADC_C、我们 将使用  

    SOC0、SOC1 和 SOC2

    触发来自全部3个 ADC 的一个源、它们都具有相同的 ACQPS

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

    您好、Sam、

    是的、您的假设是正确的。

    此致、

    约瑟夫