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.

[参考译文] TMS320F28035:当 EPWM1触发 ADC 转换时、ADC 通道读数为4095 (0xFFF)

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/746692/tms320f28035-adc-channels-reading-4095-0xfff-randomly-when-epwm1-triggers-adc-conversion

器件型号:TMS320F28035

我使用此 TI 处理器和 TI 代码来旋转电机。

作为设计的一部分、添加了多个 ADC 通道(即测量电路板电压、电路板电流等)

TI 电机控制软件使用 EPWM1来触发 ADC 通道1、2和3。

包括4到14个通道是软件触发的、以大约30Hz 的速率读取。

通道0也配置为软件触发。  根据头文件中的文档、通道0存在问题、因此无法用于读取电压。

当 EPWM1触发器被禁用时、包含4到14个通道的运行正常。  未检测到异常。

当 EPWM1触发器被使能时、偶尔会出现2个不同但相似的故障。

第一个故障是、包含4到14个通道的随机 ADC 通道将读回4095的值。  这是不正确的读取。  这大约每秒发生一次。

第二个故障是随机 ADC 通道将读回错误的值。 这大约每2分钟发生一次。

通道4至14不会生成中断。  ADC 通道3在 EOC3上为 MainISR()生成中断。

以上所有内容都是电机未运转的情况。

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

    William、

    感谢您访问 E2E 论坛。  我将尽最大努力详细介绍下面的工作原理、但如果可能、您可以附加代码的 ADC 配置部分供我查看、这可能会有所帮助。

    我需要查看头文件示例中的措辞、但不使用通道(或 SOC0) 0的根本原因是 ADC 无法正确处理从空闲可预测性出发的第一次转换。  我们的大多数示例代码通过使用 SOC0对 ADC 输入进行"虚拟采样"(通常仅与 SOC1相同的 ADC 输入)来解决此问题。  因此、SOC0-3可能全部从 ePWM 触发、但代码中不使用 SOC0的结果。

    由于任何通道/SOC 都可能是空闲状态下的第一个通道、因此 SOC#并不重要。  

    这的另一个方面是 SOC 状态机如何处理并发转换请求。

    默认情况下、所有 SOC 以循环方式处理;最后处理的 SOC 是状态机查找"下一个"转换的位置。

    问题1:SOCPRIORITY 寄存器是否处于默认状态、或者代码是否已修改、以优先于更高阶的 SOC1-3?

    如果我们看一下您的工作案例、其中 SOC4-14是从 SW 强制启动的;ADC 会按照 SOC4到14之间的顺序对其进行处理。  状态机将以值15结束。  因为唯一的东西是4-14;我们可以确保订单被保留。  在这种情况下、如果您让 ADC 空闲(在一段时间内不转换)、那么 SOC4也可能受到与示例中 SOC0相同的影响。

    现在、当启用 ePWM 触发 SOC 时、如果默认为 SOCPRIORITY、则不会产生影响。  但是、由于确实如此、我怀疑您对 Q1的回答是 SOCPRIORITY 已被修改。  如果是这种情况、那么当触发 SOC0-3时、即使已经排队、它们也可能挤占 SOC4-14。

    导致问题的原因可能与另一个勘误表有关(如下)。  请告诉我这是否适用于您的系统代码、如果不适用于、我们可以从这里开始。

    建议 ADC:采样在前一转换的第14个周期结束时、ADC 结果转换、ACQPS = 6或7

    详细信息:在采样阶段结束后、片上 ADC 需要13个 ADC 时钟周期来完成转换。 然后、结果在采样后的第14个周期提供给 CPU、并在第15个周期锁存到 ADC 结果寄存器中。 如果下一个转换的采样阶段在第14个周期终止、CPU 锁存到结果寄存器的结果不能保证在所有运行条件下都有效。

    权变措施一些权变措施如下:•由于 ADC 采样和转换阶段的性质、只有两个 ACQPS 值(控制采样窗口)会导致出现上述情况- ACQPS = 6或7。 一种解决方案是避免在 ACQPS 中使用这些值。 •当使用 ADCNONOVERLAP 功能(ADCTRL2寄存器中的位1)时、将不会满足上述条件;因此用户可以随意使用所需的任何 ACQPS 值。 •根据系统中使用的 ADC 采样频率、如果系统要求使用 ACQPS = 6或7、用户可以确定其系统是否会达到上述条件。 例如、如果转换器在 ACQPS = 6时持续转换、则将永远不会满足上述条件、因为采样阶段的结束将始终处于进行中的电流转换的第13个周期。

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

    您好、Matthew、

    感谢您在这个问题上的帮助。

    以下是头文件中的措辞...

    AdcRegs.ADCSOC0CTL.bit.CHSEL = 15;/*虚拟测量值。 避免第一个样本问题 Rev0 Picolo*/\

    是否有可解决此问题的修订版1?

    我将通过 SOC14单独触发每个 SOC4。

    我从结果寄存器中读取该值、然后触发我 刚刚读取的 SOC。

    它们并非都同时触发。 这听起来可能是一个问题。

    我是否应该从 ePWM 触发所有 SOC?

    答案1: 我使用默认的 SOCPRIORITY 值。

    我在 ADCCTL2中启用了 ADCNONOVERLAP:      AdcRegs.ADCCTL2.bit.ADCNONOVERLAP = 1;

    我的默认 ACQPS 为0x07。 我尝试了8和6的 ACQPS、但 我在一个通道上遇到了相同的0xFFF 读取故障。 (全部为 ADCNONOVERLAP 真)

    我还有随机错误读取(仍在发生)

    请注意、我将 ACQPS 设置为8、0xFFF 的频率似乎已经降低。

    它不是每秒1次、而是 每秒1次;有时是几分钟。

    短期:

    00:00:15.77

    00:00:11.00

    00:00:17.54

    00:02:21.14

    00:00:09.43

    00:00:24.06

    00:01:21.83

    00:00:38.34

    下面是 TI 代码将 SOC0初始化为 SOC3 、然后是代码将 SOC4初始化为 SOC14

    #define ADC_MACROL_INIT ()\
    
    delay_US
    
    (ADC_USDELAY);\
    
    AdcRegs.ADCCTL1.all=ADC_RESET_FLAG;\
    
    asm (" NOP ");\
    
    asm (" NOP ");\
    
    
    
    EALLOW;\
    
    AdcRegs.ADCCTL1.bit.CBSRT*
    
    
    
    
    
    
    
    = ADCCESL.D*= ADCCTL1.ADCLT.ADC0;\ ADCLA.ADCR0 = ADCCEST.ADCL1 + ADCCEST.ADC0 *= ADCLT.ADC0 + ADCLT.ADC0 + ADCCEST.ADC0 + ADCR1 ADCR1 + ADCLT.ADAP*= ADAP/ ADCCEST.ADCR1 + ADCCEST.ADCR* ADCR*= ADCR1 + ADCCESD*
    
    /*上电基准*/\
    
    AdcRegs.ADCCTL1.bit.ADCPWDN = 1;/*为 ADC 的其余部分加电*/\
    
    AdcRegs.ADCCTL1.bit.ADCENABLE = 1;//启用 ADC */\
    
    
    
    \ asm (" RPT#100 || NOP");\AdcRegs.ADCLA.1=ADCCTL1.ADCCEST.ADC.E1.ADAPS.ADAPS.E1.DEPS.ADCMP0
    
    
    
    
    
    
    
    
    
    ;\ADCMP0
    
    
    
    信道选择******* /\/*****
    
    A0-B7 = ADC 通道0 - 15 ***/\
    
    \\ AdcRegs.ADCSOC0CTL.bit.CHSEL
    
    = 15;/*虚拟内存。 避免出现第1个采样问题 Rev0 Picolo*/\
    
    AdcRegs.ADCSO0CTL.bit.TRIGSEL = 5;\
    
    AdcRegs.ADCSO0CTL.bit.ACQPS = 6;\
    
    
    
    AdcRegs.ADCOC1CTL.bit.CHSEL = 15;// ChSelect:ADC B7->ADCSOC1*
    
    = 6、ADCSOC1RMC1.C0 = 1、ADCSOC1RMCTR0 *、ADC1CTRL = 6、ADCSOC1CTR0 = 1、ADCTR0 * 1。
    
    /*将 SOC0 S/H 窗口设置为7个 ADC 时钟周期、(6个 ACQPS 加1)*/\
    
    \\ AdcRegs.ADCSOC2CTL.bit.CHSEL
    
    = 7;//选择:ADC A7->V 相位 B */\
    
    AdcRegs.ADCOC2CTL.bit.TRIGSEL = 5;
    
    ADCSOC32.ADC32.ChCCL
    
    
    
    = 6位 ADC32.ADCCPL.ADCTIGSEL = 6;ADC32.ADCCL.ADC32.ADCTIGCCRC.ADCL.ADCTIGSEL = 6位 ADC B4->V 相位 C */\
    
    AdcRegs.ADCSOC3CTL.bit.TRIGSEL = 5;\
    
    AdcRegs.ADCSO3CTL.bit.ACQPS = 6;\ AdcRegs.INTSEL1N2.bit.TRIGSEL
    
    
    
    = 1;//启用 ADCINT1 */
    
    ADC1INT1.bit = 3
    
    ;\ ADC1INT1.INT1INT1INT1.INT1INT1.INT1INT1.INTn = 0;\ ADCINT1INT1INT1INT1INT1INT1INT1INT1INT1INT1.INT1INT1.INT1.INT1.INT1INTn = 0;*启用 ADCINT1INT1INT1INT1INT1INT1INT1INT1INT1INT1INT1INT1INT1INT1INT1INTn
    
    
    
    \
    
    
    
    //*为 EPWM1的时基设置启用 CNT_ZERO 的事件触发器*/\
    
    EPwm1Regs.ETSEL.bit.SOCAEN = 1;//启用 SOCA */\
    
    EPwm1Regs.ETSEL.bit.SOCASEL = 2;//启用 TBCNTR = SOCA 的 PRD 事件*
    
    = 1位/EEPwCAP1.SORD = 1;\ /*在发生第一个事件时生成 SOCA */\
    
    EPwm1Regs.ETCLR.bit.SOCA = 1;//清除 SOCA 标志*/\
    
    
    
    
    
    \我的代码.....
    
    int channelIndex = 0;
    
    int firstAvailableSOC = first_available_SOC; //(SOC4)
    
    
    
    EALLOW;
    
    DO
    
    {
    
    (AvailelMask & 0x01)
    
    {
    
    volatile ADCSOCxCTL_REG_ADCSOCxReg =(ADCSOCxCTL_REG*)((long)(&AdcRegs.ADCSOC0CTL)+(1 * firstfirstfirstSOC)));ADCSOCxCTL+
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    = 0x00+通道控制= ADCSOCxCLM+;ADCSOC0 +通道控制= 0x00+;ADCSOCSOC0 = ADCMCOCCS0 +通道控制= ADCSOC0 = ADC0 = ADCMCTRM = ADCMCL+通道控制寄存器0;ADCSOC0 = ADCMCL+通道控制寄存器= ADCSOC0 = ADC0 +通道;ADCSOC0 = ADCSOC0 +通道控制寄存器= ADC0 = ADCMCOCC0
    
    
    
    
    
    
    
    
    
    

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

    William、

    要启动 SOC4- 14、您是否执行以下操作:

    AdcRegs.ADCSOCFRC1.ALL = 0x7FF0; 

    根据您的观察结果、我认为我们最经常地进入第2个勘误表、尤其是 ACQ_PS 热升的值为8。   

    从同一 PWM 触发所有 SOC 也应解决您的问题;4-14的触发速率是否适用于您的系统?

    Matt

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

    您好、Matt、

    我将系统配置为使用 SOC4作为"虚拟"读取、然后将 SOC5至 SOC15分配给我的模拟输入。

    然后、我使用0xFFF0触发所有这些。  这似乎可以正常工作。 我没有检测到任何故障。

    我最初尝试使用 PWM 触发器、但当电机关闭时、PWM 似乎没有运行、并且我一直需要 ADC 值。

    我在 SOC4至 SOC15 (含 SOC15)的通道上使用的 ACQPS 为8。

    再次感谢您的帮助。

    我认为问题已经解决、除非我遗漏了其他东西。

    请告诉我。

    William C. Hayes