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.

[参考译文] TMDSCNCD28P65X:具有不同触发源的 F28P65x ADC SOC

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

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1396381/tmdscncd28p65x-f28p65x-adc-soc-with-different-triggers-sources

器件型号:TMDSCNCD28P65X
主题中讨论的其他器件:SysConfig

工具与软件:

大家好!

 我是德州仪器(TI) u 控制器和论坛的初学者、如果这个主题已经讨论过、很抱歉提前重复的请求。

按照  SPRUIZ1A - TMS320F28P65x 实时微控制器的第18.15.1章中列出的 SW 示例、我将测试 ADC 外设特性和性能。

我 可以如文件中所述转换 A0、A1、C2和 C3  adc_ex1_soc_software.c; 即使只有3.3和接地可通过使用 EVB 和相关对接进行测试、所有软件触发的转换也会在我的测试应用中的 FreeRTOS 空闲任务内正确执行。

之后、考虑到 ADC 触发器是可配置的

我尝试使用相同的 ADCA 添加另一个 SOC (我的应用中为 SOC2)、使用 ePWM 作为触发源;SOC 和 ISR 的设置和定义与 文件中用于 SOC0的相同  adc_ex2_soc_epwm.c .

我已经在 ADC ISR 中添加了一对调试变量

和 PWM TRIG 生成的 while 环路中

看起来 ADC 结果缓冲器似乎从未被填满、也就是说、从不设置外设 ISR

操作系统也锁定在空闲任务中。

我很确定这不是负责的操作系统(如果我禁用测试、空闲运行正常)、但可能有错误的 ADC 配置。

根据我的理解、应该允许 在同一 ADC 引擎中使用具有不同触发器的 SOC。

任何建议都应受到欢迎。

提前感谢

Andrea  

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

    安德烈、您好!

    我假设您的代码基于 adc_ex1_soc_software、而且您已添加另一 SOC。  您通过 SysConfig 添加了此功能、并选择了由 ePWM 触发的 SOC、对吗?

    我看到与此相关的几个问题:

        -如果 ePWM 周期和比较计数(ePWM 初始化)未从 ADC_ex2_SoC_ePWM 复制到 ADC_ex1、则不会发生 EPWMSOC 触发

        -在 adc_ex1_soc_software 中的 ADC INT 配置部分将 SOC1的结束设置为触发 interrupt1、该中断1在 SOC1转换结束时轮询。  如果未将其修改为使用结束 SOC2、则 ADC 中断1将仅在 SOC1转换结束后立即发生。  您还应该修改此设置、以便您添加的 SOC2的结束会触发中断。

    此致、

    Joseph

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

    尊敬的 Joseph:

     是的、我添加了 SOC2 最终目的 ADCA 外设配置、如下所示

    中断1 在转换结束时轮询 SOC2 、正如您所建议的

    位置 initEPWM adcA1ISR  函数的 主体已直接从 adc_ex2示例代码中复制(当然、我只更改了 ISR 中轮询的 SOC)

      

    在此处初始化 PWM

    不会发生任何变化。

    您是否有 一个在同一引擎中具有2个(或更多) SOC 具有不同触发条件的 syscfg 文件?

    K.R.

    Andrea

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

    出于测试目的、我保留了 ADCA/C 及其 SOC、如所示  adc_ex1_soc_software 然后我又补充道 SOC0 ADCB 引擎(因此,相同的 SOC 预设,但不同的引擎).

    我已经在用于监视 SW 路径的源代码中添加了一对调试计数器

    在空闲循环中调用用于 ADC 触发的 PWM

    调试器不会工作

    1. CntTaskBkg debug00 具有相同的值;这意味着至少有一个由操作系统执行的后台/空闲任务(仅第一个任务);
    2. debug01 持续增加;这意味着 SW 保持在 while 环路中

       3. debug02 从未置位;这意味着从未触发 ADCB1ISR 例程。

    在这一点上,我没有 任何.. g 知道为什么它的行为不符合预期。

     

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

    安德烈、您好!

    我在您的代码片段中没有看到这一点、但我想检查您是否还包含并调用了注册和启用中断的函数、如下所示:

    //*****************************************************************************
    //
    // INTERRUPT Configurations
    //
    //*****************************************************************************
    void INTERRUPT_init(){
    	
    	// Interrupt Settings for INT_myADC0_1
    	Interrupt_register(INT_myADC0_1, &adcA1ISR);
    	Interrupt_enable(INT_myADC0_1);
    }
    

    我看到您在启动 ePWM 和启用 SOC 触发器、因此我怀疑中断可能没有注册/启用。

    此致、

    Joseph  

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

    尊敬的 Joseph:   

     我认为从 ISR 设置和使能的 角度来看、我是对的。

    函数定义和调用由 CCS 从 SysConfig 开始生成、并出现在 Board_Init 的函数调用列表中

    我想和大家分享这个项目、以便大家可以重现该应用程序。

    很简单:一个包含3个循环任务(实现了继承)的 FreeRTOS、以及空闲任务 、我在其中尝试使用 TI 自己提出的示例激励外设(CAN 和 GPIO 已测试)。

    • 静态 void ADC_ex1_SoC_software (void)是 SW 触发 ADC 的测试功能。
    • 静态 void ADC_ex2_SoC_EPWM (void)  ePWM 触发的 ADC 的测试功能。

    请注意您是否 正确收到压缩的项目。

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

    尊敬的 Andea:

    抱歉、我仍无法获取您的压缩项目。

    此致、

    Joseph

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

    尊敬的 Joseph:

    如果我 同时向您发送 main.c 和 SysConfig 文件、您认为我是否足以构建该工程?

    最后、列出了 main.c、所有其余内容都是从系统配置文件开始自动生成的

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

    安德烈、您好!

    main.c 和 SysConfig 文件就可以了。  此外、请告诉我您正在使用的 CCS 版本。

    此致、

    Joseph

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

    e2e.ti.com/.../freertos_5F00_ex1_5F00_c28x_5F00_led_5F00_blinky.syscfg.ce2e.ti.com/.../freertos_5F00_ex1_5F00_c28x_5F00_led_5F00_blinky.c

    尊敬的 Joseph:

     请重命名 de syscfg 文件(我无法使用其原始扩展名上传)。

    您将找到更多使用的外设(CAN、GPIO、ADC、SPI)。

    我只是想记住一下我的初始问题、即同一个 ADC 引擎中 dofferent SOC 触发的位置。

    CCS 版本: 12.8.0.00012  

    提前感谢您、

    B.R.

    Andrea

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

    安德烈、您好!

    出于某种原因、我无法重新使用您的 SysConfig 文件。  该操作与我的包含路径相关、但需要更多时间进行调试、因此我刚刚开始创建一个包含 ePWM 触发器和软件触发器的代码。  我相信这正是你正在努力实现的。  最终结果如下:

    - SOC0由 ePWM 触发、在每个 SOC0转换结束时进入 adcA1ISR、以存储在数组中的结果。  SW 触发在 SOC1和 SOC2的 ISR 中启动。

    -添加 SOC1、SOC2并从 adcA1ISR 触发。  SOC2的末尾进入 ADCA2ISR、以便存储/检查结果。

    我先使用示例 adc_ex2_soc_epwm、并使用 SysConfig 进行 SOC/中断添加。  请参阅以下代码段以供参考:

    1.) 添加 SOC1/SOC2、分配物理通道、采样时间并为 SOC 使用 SW 触发器:

    2.) 添加 ADC 中断、INT2并将中断2源分配为 SOC/EOC2 (SOC2转换结束)

    3.) 启用 PIE 并将中断处理程序添加为 ADC 的 adcA2ISR 中断2:

    4.) 在 PIE 中的 system->interrupt 下启用中断

    5.) 最后、修改现有 adcA1ISR 以添加语句 ADC_forceMultipleSOC (myADC0_BASE、(ADC_FORCE_SOC1 | ADC_FORCE_SOC2));对于 SOC1和 SOC2上的 SW 触发、然后为 SOC1/SOC2的中断2处理程序添加 ISR adcA2ISR:

    //
    // adcA1ISR - ADC A Interrupt 1 ISR
    //
    __interrupt void adcA1ISR(void)
    {
        //
        // Add the latest result to the buffer
        //
        myADC0Results[index++] = ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER0);
    
        //
        // Set the bufferFull flag if the buffer is full
        //
        if(RESULTS_BUFFER_SIZE <= index)
        {
            index = 0;
            bufferFull = 1;
        }
    
        //
        // Clear the interrupt flag
        //
        ADC_clearInterruptStatus(myADC0_BASE, ADC_INT_NUMBER1);
    
        //
        // Add SW trigger for SOC1 and SOC2
        //
        ADC_forceMultipleSOC(myADC0_BASE, (ADC_FORCE_SOC1 | ADC_FORCE_SOC2));
    
        //
        // Check if overflow has occurred
        //
        if(true == ADC_getInterruptOverflowStatus(myADC0_BASE, ADC_INT_NUMBER1))
        {
            ADC_clearInterruptOverflowStatus(myADC0_BASE, ADC_INT_NUMBER1);
            ADC_clearInterruptStatus(myADC0_BASE, ADC_INT_NUMBER1);
        }
    
        //
        // Acknowledge the interrupt
        //
        Interrupt_clearACKGroup(INT_myADC0_1_INTERRUPT_ACK_GROUP);
    }
    
    //
    // adcA1ISR - ADC A Interrupt 2 ISR
    //
    __interrupt void adcA2ISR(void)
    {
    
        uint16_t swtrigsoc1Result, swtrigsoc2Result;
    
        swtrigsoc1Result = ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER1);
        swtrigsoc2Result = ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER2);
    
        //
        // Clear the interrupt flag
        //
        ADC_clearInterruptStatus(myADC0_BASE, ADC_INT_NUMBER2);
    
        //
        // Check if overflow has occurred
        //
        if(true == ADC_getInterruptOverflowStatus(myADC0_BASE, ADC_INT_NUMBER2))
        {
            ADC_clearInterruptOverflowStatus(myADC0_BASE, ADC_INT_NUMBER2);
            ADC_clearInterruptStatus(myADC0_BASE, ADC_INT_NUMBER2);
        }
    
        //
        // Acknowledge the interrupt
        //
        Interrupt_clearACKGroup(INT_myADC0_2_INTERRUPT_ACK_GROUP);
    
    }
    

    代码的工作原理:EPWMSOC 根据示例中的默认 EPWM 时序每10us 触发一次。 EPWMSOC 会触发 SOC0转换、并在转换结束时执行 adcA1ISR。  在 ISR 内部、发出 SW 触发器、从而启动 SOC1、然后是 SOC2的转换。  在 SOC2结束时会执行 adcA2ISR、您可以在此处添加例程以检查/处理 SOC1/SOC2的结果。

    如果这是您尝试通过不同的触发源实现的目标、请告诉我。

    此致、

    Joseph