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.

[参考译文] TMS570LS1227:ADC FIFO ID 转换错误

Guru**** 2481935 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/693761/tms570ls1227-adc-fifo-id-conversion-error

器件型号:TMS570LS1227
主题中讨论的其他器件:HALCOGEN

你(们)好。

对于电机控制软件、我在 PWM (Cntr Zero 和 PRD;每个周期两次测量)上触发了 ADC MesasureMnt。 总共有7个通道可在 PWM Cntr Zero 和 PRD (3倍电流;4倍电压)上测量。 ADC 组1的 FIFO 大小设置为14、因此每个 PWM 周期调用一次 ADC_notifaction。 (查看以下图片)

使用以下代码读取 ADC 结果(在 ADC_notification 中输入代码):

       静态 adcData_t bufferRawAdcData[14]={0};
       静态 uint32_t AdcCnt = 0;
       AdcCnt = adcGetData (adcREG1、adcGROUP1、bufferRawAdcData);

由于有14个 ADC 值、因此 AdcCnt 始终为14。 通道 ID 8位于 bufferRawAdcData[0] (当 PWM =零时)和 bufferRawAdcData[8](当 PWM=PRD 时)中、这种方法有效、但不可靠! 主要问题是、在 bufferRawAdcData[0]上、有时是通道 ID 14、后跟通道 ID 15。 在 sevral 测量之后、整个东西恢复、 bufferRawAdcData[0]再次为 ID 8。 这种行为绝不能发生! 存在偏移! 发生这种情况时、它不是确定性的! 有时在5秒后;有时每秒多次...

对 HalCoGen 函数(文件 ADC.c)的以下修改解决了这个问题:

uint32 adcGetData (adcBASE-t * ADC、uint32组、adcData_t * data)

   uint32 i;
   uint32 buf;
   uint32 模式;    
   uint32 索引=(ADC = adcREG1)? 0U:1U;

   uint32 intcr_reg = adc->GxINTCR[组];
   uint32 count =(intcr_reg >=256U)? s_adcFoSize[index][group]:(s_adcFoS[index][group]-(uint32)(intcr_reg & 0xFFU);
   adcData_t * ptr =数据;

/*用户代码开始(16)*/
/*用户代码结束*/

   MODE =(ADC->OPMODECR & ADC_12_bit_MODE);

   IF (MODE = ADC_12_bit_MODE)
     {
       /**- 获取转换数据和通道/引脚 ID */
       对于(I = 0U;I < count;I++)
       {
         BUF       = ADC->GxBUF[group].BUF0;
       /*SAFETYMCUSW 45 D MR:21.1 "仅此驱动程序允许有效的非 NULL 输入参数"*/
         ptr ->值=(uint16)(buf & 0xFFFU);
         ptr -> id   =(uint32)((buf >> 16U)& 0x1FU);
         /*SAFETYMCUSW 567 S MR:17.1,17.4 "需要指针增量"*/
       PTR++;
       }
     }
     其他
     {
       /**- 获取转换数据和通道/引脚 ID */
       对于(I = 0U;I < count;I++)
       {
         BUF       = ADC->GxBUF[group].BUF0;
       /*SAFETYMCUSW 45 D MR:21.1 "仅此驱动程序允许有效的非 NULL 输入参数"*/
         ptr ->值=(uint16)(buf & 0x3FFU);
         ptr -> id   =(uint32)((buf >> 10U)& 0x1FU);
         /*SAFETYMCUSW 567 S MR:17.1,17.4 "需要指针增量"*/
       PTR++;
       }
     }


   ADC->GxINTFLG[组]=9U;

   /**  @请注意,必须先调用 adcInit 函数,然后才能使用此函数。\n
   *          用户负责初始化消息框。
   *

/*用户代码开始(17)*/

   while (!(adc -> GxINTFlg[组]和0x04)
   {
       index =(ADC =adcREG1)? 0U:1U;
       adcData_t * ptr =数据;

       IF (MODE = ADC_12_bit_MODE)
         {
           /**- 获取转换数据和通道/引脚 ID */
           对于(I = 0U;I < count;I++)
           {
             BUF       = ADC->GxBUF[group].BUF0;
             /*SAFETYMCUSW 45 D MR:21.1 "仅此驱动程序允许有效的非 NULL 输入参数"*/
             ptr ->值=(uint16)(buf & 0xFFFU);
             ptr -> id   =(uint32)((buf >> 16U)& 0x1FU);
             /*SAFETYMCUSW 567 S MR:17.1,17.4 "需要指针增量"*/
             PTR++;
           }
         }
         其他
         {
           /**- 获取转换数据和通道/引脚 ID */
           对于(I = 0U;I < count;I++)
           {
             BUF       = ADC->GxBUF[group].BUF0;
             /*SAFETYMCUSW 45 D MR:21.1 "仅此驱动程序允许有效的非 NULL 输入参数"*/
             ptr ->值=(uint16)(buf & 0x3FFU);
             ptr -> id   =(uint32)((buf >> 10U)& 0x1FU);
             /*SAFETYMCUSW 567 S MR:17.1,17.4 "需要指针增量"*/
             PTR++;
           }
         }


       ADC->GxINTFLG[组]=9U;
   }
/*用户代码结束*/

   返回计数;

是否有更好的解决方案? while 循环 whitlin adcGetData 占空缓冲区、这看起来像是一个时序问题。 在开始下一次转换之前是否必须复位标志?

感谢你的帮助。

此致、

Patrick

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

    它看起来像是一个时序问题:您使用 ePWM 事件触发 ADC 组1的频率如何? 是否有足够的时间完成转换并在触发器之间完全读取数据? 如果您发现时间不够、则可以选择使用两个组而不是一个组进行转换。 当然、您必须识别两个单独的触发事件、但您可以管理计时、以便在另一个转换组转换时读取和处理一个转换组的结果。

    如果在每个中断例程中读出的转换结果数为14、那么所有可用结果都必须被读出、而无需显式检查存储器空标志。

    明天我在办公室时、我也会在工作台上尝试您的设置。 您是否还可以包含您的 ePWM 配置?

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

    你(们)好,Sunil

    ADC 通知以16kHz 的 PWM 设置执行、用于 ETPWM1:

    ETPWM2/3的设置:

    如何检查 ADC 在一个 PWM 周期内是否被清空? PWM 周期为62.5us、转换时间为6us。 这不应该是问题。

    感谢你的帮助。

    此致、

    Patrick

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

    你(们)好,Sunil

    我没有听到您的任何进一步答复。 遗憾的是、这仍然是一个问题。

    您可以在测试台上尝试我的设置吗?

    是否需要进一步的文档/设置?

    谢谢、此致、

    Patrick

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

    ePWM 设置显示 PWM 周期为31.25us。 这是您在上一帖子中所述内容的一半。 哪一个是所需的设置?

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

    您可以上传 CCS 代码项目吗?

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

    尊敬的 Sunil

    这是一个由我们公司执行的项目、它使用了一个经过许可的安全 RTOS。 是否可以私下向您发送 CCS 项目?

    我不想在论坛中上传。

    谢谢、此致、

    Patrick

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

    是的、这是由于 PWM 计数器设置为递增-递减、因此其周期是31.25us 的两倍。 (我在初始化时通过软件配置了此项)

    此致、
    Patrick