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.

[参考译文] TMS320F280025C:TMS320F280025C

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1071026/tms320f280025c-tms320f280025c

部件号:TMS320F280025C
“线程:sysconfig”中讨论的其它部分

尊敬的团队:

我设计了使用 F280025C 微控制器定制板。

我的问题:

我使用了 ADC 示例代码- SoC 继续模式(来自 F28002x 代码- C2000)

但调试代码时,我看不到 ADC 变量的任何变化(在监视表达式中-设置连续刷新模式)

它始终保持不变-对所有已用 ADC 引脚应用电位计,但结果相同!

请指导我错过了哪些步骤?

我还想知道,

-如何为特定 ADC 引脚选择 SOC 和中断(1,2,3,4)

——如何在对话完成时触发 ADC——自动触发

此致,

Shivam

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

    Shivam 您好,

    ADC SOC 连续示例将在单个通道或单个 ADC 上进行转换,因此您需要确保将其配置为使用应用了刺激的通道。

    否则,请在您的定制板上检查以下事项:

    • VDDA 电压是多少?  它是否在3.3V 的容差范围内?
    • VREFHI 电压是多少?  这是外部还是内部提供的?  软件中的参考配置设置是否与用于提供 VREFHI 的方法匹配? (您提到的示例使用3.3V 内部参考模式,预期该模式将输出1.65V 至 VREFHI 引脚)
    • VREFFLO 针脚是否连接到0伏/接地?
    • ADC 引脚是否按预期连接?  一种可能性是尝试使用 AIO 数字输入作为健全性检查以确保针脚连续性(使用 CMPSS 比较器输入也可以工作)。  
    • 您使用什么来设置设备的时钟? 如果提供外部时钟,逻辑电平和频率是否符合预期?  对于内部或外部时钟,如果在 XCLKOUT 上启用系统时钟输出,CPU 频率是否符合预期?
    • 是否所有 ADC 输入(即使是未使用的输入)都由 VSSA 到 VDDA (浮动也正常)范围内的电压驱动?  
    • 是否有任何 ADC 输入被 ESD 或 EOS 损坏?  您可以通过对引脚施加一些电压并确保泄漏电流非常小来检查这一点(请参阅设备数据表了解准确的引脚泄漏规格;我认为它应该远远低于1uA)。

    您还可以尝试一个更简单的示例,如软件强制 ADC 转换。   

    这是在多个主板上发生的,还是只在一个主板上发生的?

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

    您好,Devine,

    感谢您的回复!

    我使用 了 ADC_EX1_SOC_SOFTWARE.c  示例代码,我使用了 F280025C 的模拟 A3引脚,并对 A3引脚应用了3.3VDC。

    正如我在监视表达式中看到的那样,我只获得  myADC1Result0和 myADC1Result1中的值[ ADC 值波动很大 ,即2000到4095]

    myADC0Result0   myADC0Result1中的数据不可用,原因是什么?

    如何在 myADC1Result0 和 myADC1Result1中获得稳定值 ADC 值?

    为什么 myADC0Result0 和 myADC0Result1 显示为零?  

    请注意:  

    我已经从 LDO 获得了3.3VDC 电压, 在示波器中测得的电压非常稳定。

    此致,

    Shivam

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

    Shivam 您好,

    是为 VDDA,VREFHI 提供3.3V 电源,还是两者都提供? 您使用的是内部还是外部参考模式?

    ADC_ex1是将其设为 SW 断点(ESTOP0),还是卡在代码的其中一个循环中?

    您能否直接在“表达式”窗口中查看 ADC 结果寄存器? 这些有价值吗? 例如,AdcaResultRegs.ADCRESULT0  

    ADC-A 上的 SOC0和 SOC1是否都指向 A3 (这在 sysconfig 中配置)?  这些值对应于 ADC0 - Result0和 ADC0 - Result1。  (ADC1 - Result0和 ADC1 - Result1来自 ADC-C)

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

    德文:

    以下是我的代码 [ADC_EX13_SOC_oversampling] ADC 值波动,请告诉我 [我已为 VDDA 引脚提供了3.3VDC ]

    //########################################################
    //
    //文件:ADC_EX13_SOC_oversampling.c.
    //
    //标题:使用多个 SOC 的 ADC 逆向采样
    //
    //! \addtogroup driver_example_list
    //! H1>ADC SOC 反采样</H1>
    //!
    //! 此示例设置了 ePWM1以定期触发一组转换
    //! ADCA 包括多个 SOC,所有 SOC 都转换 A2以实现超采样
    //! 解答2.
    //!
    //! ADCA 中断 ISR 用于读取 ADCA 的结果。
    //!
    //! b 外部连接\n
    //! - A0,A1,A2应连接到要转换的信号。
    //!
    //! b 监视变量\n
    //! -\b\f4 adcAResult0 -针脚 A0上电压的数字表示
    //! -\b\f4 adcAResult1 -引脚 A1上电压的数字表示
    //! -/b adcAResult2 -针脚 A2上电压的数字表示
    //!
    //
    //########################################################
    //
    //
    //$版权:
    //版权所有(C) 2021 Texas Instruments Incorporated - http://www.ti.com/
    //
    //以源代码和二进制格式重新分发和使用,无论是否
    //修改,只要符合以下条件即可
    //符合:
    //
    //重新分发源代码必须保留上述版权
    //通知,此条件列表和以下免责声明。
    //
    //二进制形式的再发行必须复制上述版权
    //通知,此条件列表和中的以下免责声明
    //随提供的文档和/或其他材料
    //分布。
    //
    //德州仪器(TI)公司的名称和的名称都不相同
    //其贡献者可用于背书或推广衍生产品
    //未经事先书面许可,从该软件获得。
    //
    //本软件由版权所有者和贡献者提供
    //“原样”和任何明示或暗示的担保,包括但不包括
    //限于对适销性和适用性的暗示保证
    //没有特定目的。 在任何情况下,版权均不受限制
    //所有者或贡献者应对任何直接,间接,偶然,
    //特殊,模范或后果性损害(包括但不包括)
    //仅限于采购替代货物或服务;不使用,
    //数据或利润;或业务中断)
    //责任理论,无论是在合同中,严格责任还是侵权行为中
    //(包括疏忽或其他)因使用而产生的任何形式
    //,即使被告知可能会造成此类损坏,也是如此。
    //$
    //########################################################
    //

    //
    //包含的文件
    //
    #include "driverlib.h"
    #include "device.h"
    #包括"board.h"

    //
    //全球
    //
    UINT16_t adcAResult0;
    UINT16_t adcAResult1;
    UINT16_t adcAResult2;

    //
    //函数原型
    //
    void initEPWM();
    中断 void adcA1ISR (void);

    //
    //主页
    //

    void My_ADC_INIT();
    主无效(无效)

    //
    //初始化设备时钟和外围设备
    //
    device_init();

    //
    //禁用引脚锁定并启用内部上拉。
    //
    device_initGPIO ();

    //
    //初始化饼图并清除饼图寄存器。 禁用 CPU 中断。
    //
    interrup_initModule();

    //
    //使用指向 shell Interrupt 的指针初始化 PIE 矢量表
    //服务例程(ISR)。
    //
    interrup_initVectorTable();

    //
    //设置 ADC:
    //信号模式:单端
    //转换分辨率:12位;
    //
    //在循环模式下配置 SOC0-1以采样 A0和 A1通道
    //和 SOC2-SOC5分别对 EPWM1SOCA 上的通道 A2进行采样
    //触发器。
    //
    //注册并启用中断:
    //在的每个 PWM 触发器后读取 SOC0和 SOC1结果
    //通道0和1输出,而 SOC2-SOC5结果将为
    //对通道 A2结果采样过大的结果进行平均
    //
    // Board_init();
    my_ADC_INIT();
    //
    //初始化 PWM
    //
    initEPWM();

    //
    //启用全局中断(INTM)和实时中断(DBGM)
    //
    EINT;
    ERTM;

    //
    //启动 ePWM1,启用 SOCA,并将计数器置于计数模式
    //
    ePWM_enableADCTrigger (EPWM1_BASE,ePWM_SOC_A);
    ePWM_setTimeBaseCounterMode (EPWM1_BASE,ePWM_COUNT_MODE_UP);

    //
    //循环无限地进行转换
    //
    行动

    //
    //等待 ePWM 导致 ADC 转换。
    // ADCA1 ISR 处理每一组新的转换。
    //
    }
    While (1);
    }

    //
    //配置 ePWM1以生成 SOC 的功能。
    //
    使 initEPWM(void)无效

    //
    //禁用 SOCA
    //
    ePWM_disableADCTrigger (EPWM1_BASE,ePWM_SOC_A);

    //
    //将 SOC 配置为在第一次计数事件上发生
    //
    ePWM_setADC触发 源(EPWM1_BASE,ePWM_SOC_A,ePWM_SOC_TBCTR_U_CMPA);
    ePWM_setADCTriggerEventPrescale (EPWM1_BASE,ePWM_SOC_A,1);

    //
    //将比较值设置为1000,期间设置为1999
    //假设 ePWM 时钟为100MHz,这将提供50kHz 采样
    // 50MHz ePWM 时钟提供25kHz 采样等
    //也可以通过更改 ePWM 周期来调制采样率
    //直接(确保比较值小于期间)。
    //
    ePWM_setCounterCompareValue (EPWM1_BASE,ePWM_counter_compare_A,1000);
    ePWM_setTimeBasePeriod (EPWM1_BASE,1999);

    //
    //将本地 ePWM 模块时钟分配器设置为/1
    //
    ePWM_setClockPrescaler (EPWM1_BASE,
    ePWM_CLOCK_diver_1,
    ePWM_HSCLOCK 分隔符_1);

    //
    //冻结计数器
    //
    ePWM_setTimeBaseCounterMode (EPWM1_BASE,ePWM_counter_mode_stop_freeze);
    }

    //
    // adcA1ISR - ADC A Interrupt 1 ISR
    //
    _interrupt void adcA1ISR (void)

    //
    //存储 A0和 A1的结果
    //
    adcAResult0 = ADC_readResult (ADCARESULT_BASE,ADC_SOC_NUMBER0);
    // adcAResult1 = ADC_readResult (ADCARESULT_BASE,ADC_SOC_NUMBER1);
    //
    /////
    ////将4个过度采样的 A2结果平均在一起
    /////
    // adcAResult2 =
    //(ADC_readResult (ADCARESULT_BASE,ADC_SOC_NUMBER2)+
    // ADC_readResult (ADCARESULT_BASE,ADC_SOC_Number3)+
    // ADC_readResult (ADCARESULT_BASE,ADC_SOC_Number4)+
    // ADC_readResult (ADCARESULT_BASE,ADC_SOC_Number5)>> 2;

    //
    //清除中断标志
    //
    ADC_ClearInterruptStatus (ADCA_BASE,ADC_INT_NUMBER1);

    //
    //检查是否发生溢出
    //
    IF (TRUE == ADC_getInterruptOverflowStatus (ADCA_BASE,ADC_INT_NUMBER1)))

    ADC_ClearInterruptOverflowStatus (ADCA_BASE,ADC_INT_NUMBER1);
    ADC_ClearInterruptStatus (ADCA_BASE,ADC_INT_NUMBER1);
    }

    //
    //确认中断
    //
    interrup_clearACKGroup (interrup_ACK_GROUP1);
    }

    //
    //文件结尾
    //


    使 My_ADC_INIT()失效

    // A0/C15模拟比荷偶
    GPIO 设置引脚配置(GPIO_231_GPIO231);
    // AIO ->已选择模拟模式
    GPIO 设置模拟模式(231,GPIO 模拟启用);

    //myADC0初始化

    // ADC 初始化:写入 ADC 配置并启动 ADC
    //配置 ADC 模块的偏移调整
    ADC_setOffsetTrimAll (ADC_reference_internal,ADC_reference_3_3V);
    //配置模数转换器模块预校准器。
    ADC_setPrescaler (myADC0_base,ADC_CLK_DIV_2_0);
    //设置转换结束脉冲的时间
    ADC_setInterruptPulseMode (myADC0_base,ADC_PULL_END_of_CONV);
    //启动模数转换器内核。
    ADC_enableConverter (myADC0_base);
    //延迟1毫秒以允许 ADC 有时间通电
    DEVICE_DELAY _US (5000);

    // SOC 配置:设置 ADC ePWM 通道和触发器设置
    //禁用 SOC 突发模式。
    ADC_disableBurstMode (myADC0_BASE);
    //设置 SOC 的优先级模式。
    ADC_setSOCPriority (myADC0_BASE,ADC_PRI_All_ROUND);
    //转换0配置的开始
    //在 ADC 及其中断 SOC 触发器中配置转换开始(SOC)。
    // SOC 编号:0
    //触发器:ADC_TRIGID_EPWM1_SOCA
    //通道:ADC_CH_ADCIN0
    //示例窗口:8个 SYSCLK 周期
    //中断触发器:ADC_INT_SOC_TRIG_NONE
    ADC_setupSOC (myADC0_BASE,ADC_SOC_NUMBER0,ADC_TRIG_EPWM1_SOCA,ADC_CH_ADCIN0,8U);
    ADC_setInterruptSOCTRIGN (myADC0_BASE,ADC_SOC_NUMBER0,ADC_INT_SOC_TRIG_NONE);
    //转换1配置的开始
    //在 ADC 及其中断 SOC 触发器中配置转换开始(SOC)。
    // SOC 编号:1.
    //触发器:ADC_TRIGID_EPWM1_SOCA
    //通道:ADC_CH_ADCIN1.
    //示例窗口:8个 SYSCLK 周期
    //中断触发器:ADC_INT_SOC_TRIG_NONE
    ADC_setupSOC (myADC0_BASE,ADC_SOC_NUMBER1,ADC_TRIG_EPWM1_SOCA,ADC_CH_ADCIN1,8U);
    ADC_setInterruptSOCTRIGGER (myADC0_BASE,ADC_SOC_NUMBER1,ADC_INT_SOC_TRIG_NONE);
    //转换2配置的开始
    //在 ADC 及其中断 SOC 触发器中配置转换开始(SOC)。
    // SOC 编号:2.
    //触发器:ADC_TRIGID_EPWM1_SOCA
    //通道:ADC_CH_ADCIN2
    //示例窗口:8个 SYSCLK 周期
    //中断触发器:ADC_INT_SOC_TRIG_NONE
    ADC_setupSOC (myADC0_BASE,ADC_SOC_NUMBER2,ADC_TRIG_EPWM1_SOCA,ADC_CH_ADCIN2,8U);
    ADC_setInterruptSOCTRIGGER (myADC0_BASE,ADC_SOC_NUMBER2,ADC_INT_SOC_TRIG_NONE);
    //转换3配置的开始
    //在 ADC 及其中断 SOC 触发器中配置转换开始(SOC)。
    // SOC 编号:3.
    //触发器:ADC_TRIGID_EPWM1_SOCA
    //通道:ADC_CH_ADCIN2
    //示例窗口:8个 SYSCLK 周期
    //中断触发器:ADC_INT_SOC_TRIG_NONE
    ADC_setupSOC (myADC0_BASE,ADC_SOC_Number3,ADC_TRIG_EPWM1_SOCA,ADC_CH_ADCIN2,8U);
    ADC_setInterruptSOCTRIGGER (myADC0_BASE,ADC_SOC_Number3,ADC_INT_SOC_TRIG_NONE);
    //转换4配置的开始
    //在 ADC 及其中断 SOC 触发器中配置转换开始(SOC)。
    // SOC 编号:4.
    //触发器:ADC_TRIGID_EPWM1_SOCA
    //通道:ADC_CH_ADCIN2
    //示例窗口:8个 SYSCLK 周期
    //中断触发器:ADC_INT_SOC_TRIG_NONE
    ADC_setupSOC (myADC0_BASE,ADC_SOC_Number4,ADC_TRIG_EPWM1_SOCA,ADC_CH_ADCIN2,8U);
    ADC_setInterruptSOCTRIGGER (myADC0_BASE,ADC_SOC_Number4,ADC_INT_SOC_TRIG_NONE);
    //转换5配置的开始
    //在 ADC 及其中断 SOC 触发器中配置转换开始(SOC)。
    // SOC 编号:5.
    //触发器:ADC_TRIGID_EPWM1_SOCA
    //通道:ADC_CH_ADCIN2
    //示例窗口:8个 SYSCLK 周期
    //中断触发器:ADC_INT_SOC_TRIG_NONE
    ADC_setupSOC (myADC0_BASE,ADC_SOC_Number5,ADC_TRIG_EPWM1_SOCA,ADC_CH_ADCIN2,8U);
    ADC_setInterruptSOCTRIGGER (myADC0_BASE,ADC_SOC_Number5,ADC_INT_SOC_TRIG_NONE);
    // ADC 中断1配置
    // SOC/EOC 编号:5.
    //中断源:已启用
    //连续模式:已禁用
    ADC_setInterruptSource (myADC0_base,ADC_INT_NUMBER1,ADC_SOC_Number5);
    ADC_enableInterrupt (myADC0_base,ADC_INT_NUMBER1);
    ADC_ClearInterruptStatus (myADC0_base,ADC_INT_NUMBER1);
    ADC_disableContinuousMode (myADC0_base,ADC_INT_NUMBER1);


    // asysctl 初始化
    //禁用温度传感器到 ADC 的输出。
    ASysctl_disableTemperatureSensor();
    //将模拟电压参考选择设为内部。
    ASysctl_setAnalogReferenceInternal( ASYSCTL_VREFHIA | ASYSCTL_VREFHIC );
    //将内部模拟电压参考选择设置为1.65V。
    ASysctl_setAnalogReference1P65( ASYSCTL_VREFHIA | ASYSCTL_VREFHIC );

    // INT_myADC0_1的中断设置
    中断寄存器(INT_myADC0_1,&ADcA1ISR);
    Interrup_enable (INT_myADC0_1);

    }

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

    德文:

    我解决了这个问题!  

    我使用过内部参考,内部 参考没有连接到任何位置[但根据我的经验,我们可以使用内部参考作为 ADC ,它应该起作用]  

    我已经为内部参考设置了以下值, 并且 ADC 输出中的值波动[我仍然很困惑为什么它不起作用!]

    ASysctl_setAnalogReferenceInternal( ASYSCTL_VREFHIA | ASYSCTL_VREFHIC );

     ASysctl_setAnalogReference1P65( ASYSCTL_VREFHIA | ASYSCTL_VREFHIC );

    我的解决方案:  

    我已设置以下值,并对 VREFHI VREFFLO 应用了3.3VDC 和 GND

     ASysctl_setAnalogReferenceExternal (ASYSCTL_VREFHIA | ASYSCTL_VREFHIC);  

    通过这样做,我成功获得了输出!

    1)请解释为什么内部参考电压不工作?  

    2)请指导我如何使用 ePWMx 触发 ADC?

    我 在     ADC_ex3_temp_sensor 中将 epwm1基本值更改为 epwm5 ,但它不起作用为什么?

    此致,

    Shivam

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

    Shivam 您好,

    您可以尝试 将 VREFFLO 连接到电路板的其余部分(H5引脚1接地),然后再次尝试内部参考?  我认为这应该与 ADC 输入使用的相同接地。   

    对于 ePWM 触发,您只需要两件事:

    • 源 ePWM 需要运行并生成 SOCA 或 SOCB 触发器输出
    • 要转换的 ADC 中的 SOC 应配置其触发器设置,以根据需要使用正确的 ePWM,SOCA 或 SOCB (如果使用突发模式,则应配置突发触发器)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    德文:

    谢谢!

    根据您的建议,我的问题得到了解决,我已将 ADC 初始化中的 PWM 触发源[ADC_TRIG_EPWM1_SOCA 和 EPWM1_BASE 设置为 epwm7]

    此外,我已将 VREFFLO 连接到 GND,并获得了 ADC 结果[但数值波动-总体可接受的 ADC 值!]

    此致,

    Shivam

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

    德文:

    谢谢!

    根据您的建议,我的问题得到了解决,我已将 ADC 初始化中的 PWM 触发源[ADC_TRIG_EPWM1_SOCA 和 EPWM1_BASE 设置为 epwm7]

    此外,我已将 VREFFLO 连接到 GND,并获得了 ADC 结果[但数值波动-总体可接受的 ADC 值!]

    此致,

    Shivam